Merge "API: Allow to pass whitespaces in MultiValue"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 29 Jan 2018 15:31:43 +0000 (15:31 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 29 Jan 2018 15:31:43 +0000 (15:31 +0000)
651 files changed:
.mailmap
CREDITS
RELEASE-NOTES-1.31
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/Feed.php
includes/GlobalFunctions.php
includes/MediaWikiServices.php
includes/MergeHistory.php
includes/Preferences.php
includes/Revision.php
includes/ServiceWiring.php
includes/Setup.php
includes/Storage/RevisionStore.php
includes/Title.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiCheckToken.php
includes/api/ApiClearHasMsg.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatFeedWrapper.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatNone.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiHelpParamValueMessage.php
includes/api/ApiImageRotate.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMergeHistory.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDisabled.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryGeneratorBase.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiSerializable.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiSetPageLanguage.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/api/i18n/he.json
includes/api/i18n/ru.json
includes/collation/AbkhazUppercaseCollation.php [new file with mode: 0644]
includes/collation/Collation.php
includes/collation/CustomUppercaseCollation.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/MutableContext.php
includes/context/RequestContext.php
includes/edit/PreparedEdit.php
includes/gallery/ImageGalleryBase.php
includes/http/HttpRequestFactory.php [new file with mode: 0644]
includes/http/MWHttpRequest.php
includes/installer/i18n/he.json
includes/installer/i18n/sr-ec.json
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/poolcounter/PoolWorkArticleView.php
includes/preferences/DefaultPreferencesFactory.php
includes/registration/ExtensionRegistry.php
includes/search/SearchEngine.php
includes/skins/SkinApi.php
includes/skins/SkinApiTemplate.php
includes/specialpage/SpecialPage.php
includes/widget/ComplexNamespaceInputWidget.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/DateInputWidget.php
includes/widget/DateTimeInputWidget.php
includes/widget/NamespaceInputWidget.php
includes/widget/SearchInputWidget.php
includes/widget/SelectWithInputWidget.php
includes/widget/TitleInputWidget.php
includes/widget/UserInputWidget.php
includes/widget/UsersMultiselectWidget.php
languages/LanguageConverter.php
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/da.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sh.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/yo.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/7zip.inc
maintenance/Maintenance.php
maintenance/addRFCandPMIDInterwiki.php
maintenance/addSite.php
maintenance/attachLatest.php
maintenance/backup.inc
maintenance/benchmarks/README [deleted file]
maintenance/benchmarks/README.md [new file with mode: 0644]
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_Wikimedia_base_convert.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkCSSMin.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkJSMinPlus.php
maintenance/benchmarks/benchmarkLruHash.php
maintenance/benchmarks/benchmarkParse.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/benchmarks/benchmarkTidy.php
maintenance/changePassword.php
maintenance/checkBadRedirects.php
maintenance/checkComposerLockUpToDate.php
maintenance/checkImages.php
maintenance/checkLess.php
maintenance/checkUsernames.php
maintenance/cleanupAncientTables.php
maintenance/cleanupBlocks.php
maintenance/cleanupCaps.php
maintenance/cleanupEmptyCategories.php
maintenance/cleanupImages.php
maintenance/cleanupInvalidDbKeys.php
maintenance/cleanupPreferences.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupSpam.php
maintenance/cleanupTitles.php
maintenance/cleanupUploadStash.php
maintenance/cleanupUsersWithNoId.php
maintenance/cleanupWatchlist.php
maintenance/clearInterwikiCache.php
maintenance/commandLine.inc
maintenance/compareParserCache.php
maintenance/compareParsers.php
maintenance/convertExtensionToRegistration.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php
maintenance/copyJobQueue.php
maintenance/createAndPromote.php
maintenance/createCommonPasswordCdb.php
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.php
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/deleteOldRevisions.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteSelfExternals.php
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpCategoriesAsRdf.php
maintenance/dumpIterator.php
maintenance/dumpLinks.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/edit.php
maintenance/eraseArchivedFile.php
maintenance/exportSites.php
maintenance/fetchText.php
maintenance/fileOpPerfTest.php
maintenance/findDeprecated.php
maintenance/findHooks.php
maintenance/findMissingFiles.php
maintenance/findOrphanedFiles.php
maintenance/fixDefaultJsonContentPages.php
maintenance/fixDoubleRedirects.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/fixTimestamps.php
maintenance/fixUserRegistration.php
maintenance/formatInstallDoc.php
maintenance/generateJsonI18n.php
maintenance/generateSitemap.php
maintenance/getConfiguration.php
maintenance/getLagTimes.php
maintenance/getReplicaServer.php
maintenance/getText.php
maintenance/hhvm/makeRepo.php
maintenance/hhvm/run-server
maintenance/importDump.php
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importSites.php
maintenance/importTextFiles.php
maintenance/initEditCount.php
maintenance/initSiteStats.php
maintenance/initUserPreference.php
maintenance/install.php
maintenance/invalidateUserSessions.php
maintenance/jsparse.php
maintenance/lag.php
maintenance/language/alltrans.php
maintenance/language/date-formats.php
maintenance/language/digit2html.php
maintenance/language/dumpMessages.php
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerDataAr.php
maintenance/language/generateNormalizerDataMl.php
maintenance/language/langmemusage.php
maintenance/language/listVariants.php
maintenance/makeTestEdits.php
maintenance/manageJobs.php
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/migrateArchiveText.php
maintenance/migrateComments.php
maintenance/migrateFileRepoLayout.php
maintenance/migrateUserGroup.php
maintenance/minify.php
maintenance/moveBatch.php
maintenance/mwdocgen.php
maintenance/namespaceDupes.php
maintenance/nukeNS.php
maintenance/nukePage.php
maintenance/oracle/alterSharedConstraints.php
maintenance/orphans.php
maintenance/pageExists.php
maintenance/parse.php
maintenance/patchSql.php
maintenance/populateBacklinkNamespace.php
maintenance/populateCategory.php
maintenance/populateContentModel.php
maintenance/populateFilearchiveSha1.php
maintenance/populateImageSha1.php
maintenance/populateIpChanges.php
maintenance/populateLogSearch.php
maintenance/populateLogUsertext.php
maintenance/populatePPSortKey.php
maintenance/populateParentId.php
maintenance/populateRecentChangesSource.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/preprocessDump.php
maintenance/protect.php
maintenance/pruneFileCache.php
maintenance/purgeChangedFiles.php
maintenance/purgeChangedPages.php
maintenance/purgeExpiredUserrights.php
maintenance/purgeList.php
maintenance/purgeModuleDeps.php
maintenance/purgeOldText.php
maintenance/purgePage.php
maintenance/purgeParserCache.php
maintenance/reassignEdits.php
maintenance/rebuildFileCache.php
maintenance/rebuildImages.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildSitesCache.php
maintenance/rebuildall.php
maintenance/rebuildmessages.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/recountCategories.php
maintenance/refreshFileHeaders.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/removeInvalidEmails.php
maintenance/removeUnusedAccounts.php
maintenance/renameDbPrefix.php
maintenance/renderDump.php
maintenance/resetUserEmail.php
maintenance/resetUserTokens.php
maintenance/rollbackEdits.php
maintenance/runBatchedQuery.php
maintenance/runJobs.php
maintenance/shell.php
maintenance/showJobs.php
maintenance/showSiteStats.php
maintenance/sql.php
maintenance/sqlite.php
maintenance/storage/compressOld.php
maintenance/storage/dumpRev.php
maintenance/storage/fixT22757.php
maintenance/storage/orphanStats.php
maintenance/storage/recompressTracked.php
maintenance/storage/storageTypeStats.php
maintenance/storage/testCompression.php
maintenance/syncFileBackend.php
maintenance/tidyUpBug37714.php
maintenance/undelete.php
maintenance/update.php
maintenance/updateArticleCount.php
maintenance/updateCollation.php
maintenance/updateDoubleWidthSearch.php
maintenance/updateExtensionJsonSchema.php
maintenance/updateRestrictions.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
maintenance/userOptions.php
maintenance/validateRegistrationFile.php
maintenance/view.php
maintenance/wrapOldPasswords.php
resources/Resources.php
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.special/mediawiki.special.block.js
resources/src/mediawiki.special/mediawiki.special.changecredentials.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki/api/category.js
resources/src/mediawiki/api/messages.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/multiselect.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.template.js
tests/common/TestSetup.php
tests/common/TestsAutoLoader.php
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phan/config.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/autoload.ide.php
tests/phpunit/includes/AutopromoteTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LicensesTest.php
tests/phpunit/includes/ListToggleTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/Storage/SqlBlobStoreTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiModuleManagerTest.php
tests/phpunit/includes/api/ApiOpenSearchTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/format/ApiFormatRawTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/auth/AbstractAuthenticationProviderTest.php
tests/phpunit/includes/auth/AbstractPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthenticationRequestTest.php
tests/phpunit/includes/auth/AuthenticationRequestTestCase.php
tests/phpunit/includes/auth/CheckBlocksSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/auth/PasswordAuthenticationRequestTest.php
tests/phpunit/includes/auth/PasswordDomainAuthenticationRequestTest.php
tests/phpunit/includes/auth/TemporaryPasswordAuthenticationRequestTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php
tests/phpunit/includes/cache/LocalisationCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/collation/CustomUppercaseCollationTest.php
tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/config/GlobalVarConfigTest.php
tests/phpunit/includes/config/HashConfigTest.php
tests/phpunit/includes/config/MultiConfigTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentHandlerTest.php
tests/phpunit/includes/content/FileContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
tests/phpunit/includes/content/JsonContentTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/diff/ArrayDiffFormatterTest.php
tests/phpunit/includes/exception/BadTitleErrorTest.php
tests/phpunit/includes/exception/ErrorPageErrorTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/exception/ThrottledErrorTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/FileRepoTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/RepoGroupTest.php
tests/phpunit/includes/filerepo/file/FileTest.php
tests/phpunit/includes/filerepo/file/LocalFileTest.php
tests/phpunit/includes/htmlform/HTMLCheckMatrixTest.php
tests/phpunit/includes/interwiki/ClassicInterwikiLookupTest.php
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/DeferredStringifierTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/XhprofTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/logging/NewUsersLogFormatterTest.php
tests/phpunit/includes/logging/PageLangLogFormatterTest.php
tests/phpunit/includes/mail/MailAddressTest.php
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php
tests/phpunit/includes/objectcache/ObjectCacheTest.php
tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
tests/phpunit/includes/objectcache/RedisBagOStuffTest.php
tests/phpunit/includes/page/WikiPageContentHandlerDbTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/pager/RangeChronologicalPagerTest.php
tests/phpunit/includes/pager/ReverseChronologicalPagerTest.php
tests/phpunit/includes/parser/CoreParserFunctionsTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/password/BcryptPasswordTest.php
tests/phpunit/includes/password/EncryptedPasswordTest.php
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
tests/phpunit/includes/password/MWOldPasswordTest.php
tests/phpunit/includes/password/MWSaltedPasswordTest.php
tests/phpunit/includes/password/PasswordFactoryTest.php
tests/phpunit/includes/password/PasswordTest.php
tests/phpunit/includes/password/Pbkdf2PasswordFallbackTest.php
tests/phpunit/includes/password/Pbkdf2PasswordTest.php
tests/phpunit/includes/poolcounter/PoolCounterTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/ExtensionRegistryTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/services/ServiceContainerTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php
tests/phpunit/includes/session/MetadataMergeExceptionTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/session/UserInfoTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/FileBasedSiteLookupTest.php
tests/phpunit/includes/site/SiteExporterTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/site/SitesCacheFileBuilderTest.php
tests/phpunit/includes/skins/SkinFactoryTest.php
tests/phpunit/includes/skins/SkinTemplateTest.php
tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php
tests/phpunit/includes/specialpage/SpecialPageTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialEditWatchlistTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php
tests/phpunit/includes/specials/SpecialWatchlistTest.php
tests/phpunit/includes/title/ForeignTitleTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/title/SubpageImportTitleFactoryTest.php
tests/phpunit/includes/title/TitleValueTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/includes/user/CentralIdLookupTest.php
tests/phpunit/includes/user/UserArrayFromResultTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/utils/MWRestrictionsTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/maintenance/MaintenanceBaseTestCase.php [new file with mode: 0644]
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/structure/ApiStructureTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/phpunit/tests/MediaWikiTestCaseTest.php
tests/selenium/pageobjects/delete.page.js [new file with mode: 0644]
tests/selenium/pageobjects/restore.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogin.page.js
tests/selenium/pageobjects/usermessage.page.js [new file with mode: 0644]
tests/selenium/specs/page.js
tests/selenium/specs/user.js
thumb.php

index c101be3..c2337c8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -167,6 +167,7 @@ Gabriel Wicke <gwicke@wikimedia.org>
 Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
 Gabriel Wicke <gwicke@wikimedia.org> <wicke@wikidev.net>
 Geoffrey Mon <geofbot@gmail.com>
+Geoffrey Trang <geoffreytrang@gmail.com>
 Gergő Tisza <gtisza@wikimedia.org>
 Gergő Tisza <gtisza@wikimedia.org> <tgr.huwiki@gmail.com>
 Giftpflanze <gifti@tools.wmflabs.org>
@@ -278,6 +279,7 @@ Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
 Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
 Matthew Flaschen <mflaschen@wikimedia.org>
 Matthew Walker <mwalker@wikimedia.org>
+MatthiasDD <Matthias_K2@gmx.de>
 Matthias Mullie <git@mullie.eu>
 Matthias Mullie <git@mullie.eu> <mmullie@wikimedia.org>
 Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
@@ -330,6 +332,7 @@ Philip Tzou <philip.npc@gmail.com> <philip@users.mediawiki.org>
 physikerwelt (Moritz Schubotz) <wiki@physikerwelt.de>
 PiRSquared17 <pirsquared@tools.wmflabs.org>
 Platonides <platonides@gmail.com> <platonides@users.mediawiki.org>
+pppery <mapreader@olum.org>
 PranavK <pranavmk98@gmail.com>
 Prateek Saxena <psaxena@wikimedia.org>
 Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
@@ -451,6 +454,7 @@ Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
 Victor Vasiliev <vasilvv@mit.edu> <vasilvv@gmail.com>
 Vikas S Yaligar <vikasyaligar.it@gmail.com>
 Vivek Ghaisas <v.a.ghaisas@gmail.com>
+Volker E <volker.e@wikimedia.org>
 wctaiwan <wctaiwan@gmail.com>
 withoutaname <drevitchi@gmail.com>
 X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
diff --git a/CREDITS b/CREDITS
index ea011e8..a8ca294 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,5 +1,5 @@
 {{int:version-credits-summary}} <!--
-MediaWiki 1.29 is a collaborative project released under the
+MediaWiki 1.31 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 
@@ -38,6 +38,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Alex Z.
 * Alexander I. Mashin
 * Alexander Lehmann
+* Alexander Mashin
 * Alexander Monk
 * Alexander Sigachov
 * Alexandre Emsenhuber
@@ -62,6 +63,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Angela Beesley Starling
 * ankur
 * Antoine Musso
+* Antoni Siek
 * Antonio Ospite
 * apexkid
 * April King
@@ -134,6 +136,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Cindy Cicalese
 * ckoerner
 * Conrad Irwin
+* Cormac Parle
 * cryptocoryne
 * Dan Barrett
 * Dan Collins
@@ -156,6 +159,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Darkdragon09
 * DaSch
 * datguy
+* David Barratt
 * David Baumgarten
 * David Causse
 * David Chan
@@ -163,6 +167,8 @@ The following list can be found parsed under Special:Version/Credits -->
 * David Lynch
 * David McCabe
 * David Mudrák
+* David Sn
+* Dayllan Maza
 * dcausse
 * dennisroczek
 * Denny Vrandecic
@@ -170,10 +176,12 @@ The following list can be found parsed under Special:Version/Credits -->
 * Derk-Jan Hartman
 * Derric Atzrott
 * Derrick Coetzee
+* Deskana
 * Dévai Tamás
 * Devi Krishnan
 * Diederik van Liere
 * divadsn
+* Dmaza
 * Domas Mituzas
 * Douglas Gardner
 * DPStokesNZ
@@ -183,6 +191,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Eddie Greiner-Petter
 * Edward Chernenko
 * Edward Z. Yang
+* Egbe Eugene
 * Elisabeth Bauer
 * Elliott Eggleston
 * Elvis Stansvik
@@ -194,6 +203,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Emufarmers
 * enigmaeth
 * Entlinkt
+* Envel Le Hir
 * Eranroz
 * Eric Evans
 * Eric Schneider
@@ -209,10 +219,13 @@ The following list can be found parsed under Special:Version/Credits -->
 * ExplosiveHippo
 * Faidon Liambotis
 * Federico Leva
+* Felipe L. Ewald
 * Fenzik Joseph
+* Filippo Giunchedi
 * firebus
 * Florian Schmidt
 * fomafix
+* Framawiki
 * Fran Rogers
 * Fred Emmott
 * FunPika
@@ -220,6 +233,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Gary Guo
 * gbt248
 * Geoffrey Mon
+* GeoffreyT2000
 * georggi
 * Gergő Tisza
 * Gero Scholz
@@ -231,6 +245,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Giuseppe Lavagetto
 * gladoscc
 * glaisher
+* golopot
 * Greg Maxwell
 * Greg Sabino Mullane
 * Gregory Szorc
@@ -246,9 +261,11 @@ The following list can be found parsed under Special:Version/Credits -->
 * Helder
 * Henning Snater
 * Hojjat
+* Hoto Cocoa
 * Huji
 * Hydriz
 * Ian Baker
+* Ian Marlier
 * Ilmari Karonen
 * Inez Korczyński
 * IoannisKydonis
@@ -277,6 +294,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * jarry1250
 * Jaska Zedlik
 * Jason Richey
+* Jayprakash12345
 * jeblad
 * Jeff Hobson
 * Jeff Janes
@@ -291,6 +309,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Jerome Jamnicky
 * Jesús Martínez Novo
 * jhobs
+* jhsoby
 * Jiabao
 * Jidanni
 * Jimmy Collins
@@ -307,11 +326,13 @@ The following list can be found parsed under Special:Version/Credits -->
 * John N
 * Jon Harald Søby
 * Jon Robson
+* Jonathan
 * Jonathan Wiltshire
 * Jools Wills
 * jsahleen
 * Julian Ostrow
 * Juliano F. Ravasi
+* Julien Girault
 * Juliusz Gonera
 * Jure Kajzer
 * Justin Du
@@ -321,6 +342,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Kartik Mistry
 * Karun Dambiec
 * Katie Filbert
+* KeerthanaS
 * Kevin Israel
 * Kghbln
 * Kim Eik
@@ -372,6 +394,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * madurangasiriwardena
 * Magnus Manske
 * mainframe98
+* Mako Bates
 * Manuel Menal
 * Manuel Schneider
 * Marc Ordinas i Llopis
@@ -381,6 +404,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Marco Schuster
 * MarcoAurelio
 * Marcus Buck
+* Margaret Epps
 * Marius Hoch
 * Mark Bergsma
 * Mark Clements
@@ -410,6 +434,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Max Semenik
 * Max Sikström
 * mayankmadan
+* Mehmet Mert Yıldıran
 * Meno25
 * merl
 * Merlijn S. van Deen
@@ -473,6 +498,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * nullspoon
 * Nuria Ruiz
 * Nx.devnull
+* Obaid Raza
 * Ocean behind ears
 * Od1n
 * Olaf Lenz
@@ -496,6 +522,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Pavel Selitskas
 * Pcoombe
 * Perside Rosalie
+* petarpetkovic
 * Peter Coombe
 * Peter Gehres
 * Peter Hedenskog
@@ -509,6 +536,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * physikerwelt (Moritz Schubotz)
 * PieRRoMaN
 * Pikne
+* Piotr Miazga
 * PiRSquared17
 * Platonides
 * Pmlineditor
@@ -529,6 +557,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * rahul21
 * Raimond Spekking
 * Ramunas Geciauskas
+* RazeSoldier
 * Remember the dot
 * René Kijewski
 * Reza
@@ -564,6 +593,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Ryan Kaldari
 * Ryan Lane
 * Ryan Schmidt
+* ryan10145
 * S Page
 * Salvatore Ingala
 * Sam Reed
@@ -583,6 +613,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Sébastien Santoro
 * Sergio Santoro
 * Sethakill
+* Sfic
 * Shahyar
 * Shane Gibbons
 * Shane King
@@ -591,6 +622,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * shirayuki
 * Sidhant Gupta
 * Siebrand Mazeland
+* Simeon Dahl
 * Simon Walker
 * Smriti Singh
 * Solitarius
@@ -614,6 +646,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Subin Siby
 * Subramanya Sastry
 * Sumit Asthana
+* Suriyaa Kudo
 * svip
 * Szymon Świerkosz
 * T.D. Corell
@@ -663,12 +696,14 @@ The following list can be found parsed under Special:Version/Credits -->
 * UltrasonicNXT
 * Umherirrender
 * utkarsh95
+* Valerio Bozzolan
 * Van de Bugger
 * Viačeslav
 * Victor Barbu
 * Victor Porton
 * Victor Vasiliev
 * Ville Stadista
+* vinithegit
 * vishnu
 * Vitaliy Filippov
 * Vivek Ghaisas
@@ -700,6 +735,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Zhaofeng Li
 * Zhengzhu Feng
 * Zhuyifei1999
+* zoranzoki21
 * Zppix
 * محمد شعیب
 <!-- END CONTRIBUTOR LIST -->
index a17c64b..264113e 100644 (file)
@@ -21,6 +21,9 @@ production.
   were removed (deprecated since 1.27).
 * (T180921) $wgReferrerPolicy now supports having fallbacks for browsers that are not
   using the latest version of the Referrer Policy specification.
+* $wgFragmentMode is now set to [ 'legacy', 'html5' ] by default. This is a first step of
+  migration to human-readable section IDs that will later result in 'html5' being the
+  default mode.
 
 === New features in 1.31 ===
 * Wikimedia\Rdbms\IDatabase->select() and similar methods now support
@@ -39,7 +42,7 @@ production.
   the ParserOutput::getText() post-cache transformations.
 * Added a hook, UploadForm:getInitialPageText, to allow extensions to alter the
   initial page text for file uploads.
-* (T181651) The info page for File pages now displays the file's base-36 SHA1
+* (T181651) The info page for File pages now displays the file's base-16 SHA1
   hash value in the table of basic information.
 
 === External library changes in 1.31 ===
@@ -183,6 +186,10 @@ changes to languages because of Phabricator reports.
 * The driver 'mysql' for MySQL, deprecated in MediaWiki 1.30, has been removed.
   The driver has been deprecated since PHP 5.5 and was removed in PHP 7.0. The
   default driver for MySQL has been 'mysqli' since MediaWiki 1.22.
+* The following properties of PreparedEdit were deprecated in 1.21 and have been removed:
+  * PreparedEdit->newText
+  * PreparedEdit->oldText
+  * PreparedEdit->pst
 
 == Compatibility ==
 MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
index 9e557e1..6fb2cc4 100644 (file)
@@ -6,6 +6,7 @@ global $wgAutoloadLocalClasses;
 $wgAutoloadLocalClasses = [
        'APCBagOStuff' => __DIR__ . '/includes/libs/objectcache/APCBagOStuff.php',
        'APCUBagOStuff' => __DIR__ . '/includes/libs/objectcache/APCUBagOStuff.php',
+       'AbkhazUppercaseCollation' => __DIR__ . '/includes/collation/AbkhazUppercaseCollation.php',
        'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php',
        'Action' => __DIR__ . '/includes/actions/Action.php',
        'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
@@ -878,6 +879,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\EditPage\\TextboxBuilder' => __DIR__ . '/includes/editpage/TextboxBuilder.php',
        'MediaWiki\\Edit\\PreparedEdit' => __DIR__ . '/includes/edit/PreparedEdit.php',
        'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php',
+       'MediaWiki\\Http\\HttpRequestFactory' => __DIR__ . '/includes/http/HttpRequestFactory.php',
        'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
index d497884..7084b51 100644 (file)
@@ -1666,6 +1666,13 @@ $query: query options passed to Title::getInternalURL()
 'GetIP': modify the ip of the current user (called only once).
 &$ip: string holding the ip as determined so far
 
+'GetLangPreferredVariant': Called in LanguageConverter#getPreferredVariant() to
+  allow fetching the language variant code from cookies or other such
+  alternative storage.
+&$req: language variant from the URL (string) or boolean false if no variant
+  was specified in the URL; the value of this variable comes from
+  LanguageConverter#getURLVariant()
+
 'GetLinkColours': modify the CSS class of an array of page links.
 $linkcolour_ids: array of prefixed DB keys of the pages linked to,
   indexed by page_id.
index 9208dec..2b2695c 100644 (file)
@@ -3411,7 +3411,7 @@ $wgExperimentalHtmlIds = false;
  *
  * @since 1.30
  */
-$wgFragmentMode = [ 'legacy' ];
+$wgFragmentMode = [ 'legacy', 'html5' ];
 
 /**
  * Which ID escaping mode should be used for external interwiki links? See documentation
@@ -3936,9 +3936,6 @@ $wgNamespaceAliases = [];
  * because articles can be created such that they are hard to view or edit.
  *
  * In some rare cases you may wish to remove + for compatibility with old links.
- *
- * Theoretically 0x80-0x9F of ISO 8859-1 should be disallowed, but
- * this breaks interlanguage links
  */
 $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
 
index 72c3c14..d49f205 100644 (file)
@@ -1717,7 +1717,7 @@ class EditPage {
                                // being set. This is used by ConfirmEdit to display a captcha
                                // without any error message cruft.
                        } else {
-                               $this->hookError = $status->getWikiText();
+                               $this->hookError = $this->formatStatusErrors( $status );
                        }
                        // Use the existing $status->value if the hook set it
                        if ( !$status->value ) {
@@ -1727,7 +1727,7 @@ class EditPage {
                } elseif ( !$status->isOK() ) {
                        # ...or the hook could be expecting us to produce an error
                        // FIXME this sucks, we should just use the Status object throughout
-                       $this->hookError = $status->getWikiText();
+                       $this->hookError = $this->formatStatusErrors( $status );
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
                        return false;
@@ -1736,6 +1736,26 @@ class EditPage {
                return true;
        }
 
+       /**
+        * Wrap status errors in an errorbox for increased visiblity
+        *
+        * @param Status $status
+        * @return string Wikitext
+        */
+       private function formatStatusErrors( Status $status ) {
+               $errmsg = $status->getWikiText(
+                       'edit-error-short',
+                       'edit-error-long',
+                       $this->context->getLanguage()
+               );
+               return <<<ERROR
+<div class="errorbox">
+{$errmsg}
+</div>
+<br clear="all" />
+ERROR;
+       }
+
        /**
         * Return the summary to be used for a new section.
         *
@@ -3727,7 +3747,7 @@ class EditPage {
 
                return new OOUI\ButtonWidget( [
                        'id' => 'mw-editform-cancel',
-                       'href' => $this->getContextTitle()->getLinkUrl( $cancelParams ),
+                       'href' => $this->getContextTitle()->getLinkURL( $cancelParams ),
                        'label' => new OOUI\HtmlSnippet( $this->context->msg( 'cancel' )->parse() ),
                        'framed' => false,
                        'infusable' => true,
index 92eec08..86e9bee 100644 (file)
@@ -88,7 +88,7 @@ class FeedItem {
         * @return string
         */
        public function getUniqueID() {
-               $id = $this->getUniqueIDUnescaped();
+               $id = $this->getUniqueIdUnescaped();
                if ( $id ) {
                        return $this->xmlEncode( $id );
                }
@@ -383,7 +383,7 @@ class RSSFeed extends ChannelFeed {
                        "title" => $item->getTitle(),
                        "url" => $this->xmlEncode( wfExpandUrl( $item->getUrlUnescaped(), PROTO_CURRENT ) ),
                        "permalink" => $item->rssIsPermalink,
-                       "uniqueID" => $item->getUniqueId(),
+                       "uniqueID" => $item->getUniqueID(),
                        "description" => $item->getDescription(),
                        "date" => $this->xmlEncode( $this->formatTime( $item->getDate() ) ),
                        "author" => $item->getAuthor()
@@ -433,7 +433,7 @@ class AtomFeed extends ChannelFeed {
                // uses htmlentities, which does not work with XML
                $templateParams = [
                        'language' => $this->xmlEncode( $this->getLanguage() ),
-                       'feedID' => $this->getFeedID(),
+                       'feedID' => $this->getFeedId(),
                        'title' => $this->getTitle(),
                        'url' => $this->xmlEncode( wfExpandUrl( $this->getUrlUnescaped(), PROTO_CURRENT ) ),
                        'selfUrl' => $this->getSelfUrl(),
@@ -474,7 +474,7 @@ class AtomFeed extends ChannelFeed {
                // Manually escaping rather than letting Mustache do it because Mustache
                // uses htmlentities, which does not work with XML
                $templateParams = [
-                       "uniqueID" => $item->getUniqueId(),
+                       "uniqueID" => $item->getUniqueID(),
                        "title" => $item->getTitle(),
                        "mimeType" => $this->xmlEncode( $wgMimeType ),
                        "url" => $this->xmlEncode( wfExpandUrl( $item->getUrlUnescaped(), PROTO_CURRENT ) ),
index b181628..a06d721 100644 (file)
@@ -2021,7 +2021,7 @@ function wfSuppressWarnings( $end = false ) {
  * Restore error level to previous value
  */
 function wfRestoreWarnings() {
-       MediaWiki\suppressWarnings( true );
+       MediaWiki\restoreWarnings();
 }
 
 /**
index 5b173cd..c283793 100644 (file)
@@ -10,10 +10,13 @@ use GenderCache;
 use GlobalVarConfig;
 use Hooks;
 use IBufferingStatsdDataFactory;
+use MediaWiki\Http\HttpRequestFactory;
 use MediaWiki\Preferences\PreferencesFactory;
 use MediaWiki\Shell\CommandFactory;
 use MediaWiki\Storage\BlobStore;
 use MediaWiki\Storage\BlobStoreFactory;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
 use MediaWiki\Storage\RevisionStore;
 use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
@@ -726,6 +729,22 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'RevisionStore' );
        }
 
+       /**
+        * @since 1.31
+        * @return RevisionLookup
+        */
+       public function getRevisionLookup() {
+               return $this->getService( 'RevisionLookup' );
+       }
+
+       /**
+        * @since 1.31
+        * @return RevisionFactory
+        */
+       public function getRevisionFactory() {
+               return $this->getService( 'RevisionFactory' );
+       }
+
        /**
         * @since 1.31
         * @return PreferencesFactory
@@ -734,6 +753,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'PreferencesFactory' );
        }
 
+       /**
+        * @since 1.31
+        * @return HttpRequestFactory
+        */
+       public function getHttpRequestFactory() {
+               return $this->getService( 'HttpRequestFactory' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index b969e03..0e9bb46 100644 (file)
@@ -1,10 +1,6 @@
 <?php
 
 /**
- *
- *
- * Created on Dec 29, 2015
- *
  * Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
index f08b155..f65b2ce 100644 (file)
@@ -303,6 +303,8 @@ class Preferences {
        /**
         * Handle the form submission if everything validated properly
         *
+        * @deprecated since 1.31, use PreferencesFactory
+        *
         * @param array $formData
         * @param PreferencesForm $form
         * @return bool|Status|string
index 510c1ee..d5449b4 100644 (file)
@@ -22,6 +22,8 @@
 
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionAccessException;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\RevisionStoreRecord;
@@ -64,6 +66,20 @@ class Revision implements IDBAccessObject {
                return MediaWikiServices::getInstance()->getRevisionStore();
        }
 
+       /**
+        * @return RevisionLookup
+        */
+       protected static function getRevisionLookup() {
+               return MediaWikiServices::getInstance()->getRevisionLookup();
+       }
+
+       /**
+        * @return RevisionFactory
+        */
+       protected static function getRevisionFactory() {
+               return MediaWikiServices::getInstance()->getRevisionFactory();
+       }
+
        /**
         * @param bool|string $wiki The ID of the target wiki database. Use false for the local wiki.
         *
@@ -97,7 +113,7 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public static function newFromId( $id, $flags = 0 ) {
-               $rec = self::getRevisionStore()->getRevisionById( $id, $flags );
+               $rec = self::getRevisionLookup()->getRevisionById( $id, $flags );
                return $rec === null ? null : new Revision( $rec, $flags );
        }
 
@@ -116,7 +132,7 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public static function newFromTitle( LinkTarget $linkTarget, $id = 0, $flags = 0 ) {
-               $rec = self::getRevisionStore()->getRevisionByTitle( $linkTarget, $id, $flags );
+               $rec = self::getRevisionLookup()->getRevisionByTitle( $linkTarget, $id, $flags );
                return $rec === null ? null : new Revision( $rec, $flags );
        }
 
@@ -135,7 +151,7 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
-               $rec = self::getRevisionStore()->getRevisionByPageId( $pageId, $revId, $flags );
+               $rec = self::getRevisionLookup()->getRevisionByPageId( $pageId, $revId, $flags );
                return $rec === null ? null : new Revision( $rec, $flags );
        }
 
@@ -184,7 +200,7 @@ class Revision implements IDBAccessObject {
                        }
                }
 
-               $rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
+               $rec = self::getRevisionFactory()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
                return new Revision( $rec, self::READ_NORMAL, $title );
        }
 
@@ -202,9 +218,9 @@ class Revision implements IDBAccessObject {
         */
        public static function newFromRow( $row ) {
                if ( is_array( $row ) ) {
-                       $rec = self::getRevisionStore()->newMutableRevisionFromArray( $row );
+                       $rec = self::getRevisionFactory()->newMutableRevisionFromArray( $row );
                } else {
-                       $rec = self::getRevisionStore()->newRevisionFromRow( $row );
+                       $rec = self::getRevisionFactory()->newRevisionFromRow( $row );
                }
 
                return new Revision( $rec );
@@ -492,13 +508,13 @@ class Revision implements IDBAccessObject {
                                $row['user'] = $wgUser;
                        }
 
-                       $this->mRecord = self::getRevisionStore()->newMutableRevisionFromArray(
+                       $this->mRecord = self::getRevisionFactory()->newMutableRevisionFromArray(
                                $row,
                                $queryFlags,
                                $this->ensureTitle( $row, $queryFlags, $title )
                        );
                } elseif ( is_object( $row ) ) {
-                       $this->mRecord = self::getRevisionStore()->newRevisionFromRow(
+                       $this->mRecord = self::getRevisionFactory()->newRevisionFromRow(
                                $row,
                                $queryFlags,
                                $this->ensureTitle( $row, $queryFlags, $title )
@@ -976,7 +992,7 @@ class Revision implements IDBAccessObject {
         */
        public function getPrevious() {
                $title = $this->getTitle();
-               $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord, $title );
+               $rec = self::getRevisionLookup()->getPreviousRevision( $this->mRecord, $title );
                return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
        }
 
@@ -987,7 +1003,7 @@ class Revision implements IDBAccessObject {
         */
        public function getNext() {
                $title = $this->getTitle();
-               $rec = self::getRevisionStore()->getNextRevision( $this->mRecord, $title );
+               $rec = self::getRevisionLookup()->getNextRevision( $this->mRecord, $title );
                return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
        }
 
@@ -1247,7 +1263,7 @@ class Revision implements IDBAccessObject {
                        return false;
                }
 
-               $record = self::getRevisionStore()->getKnownCurrentRevision( $title, $revId );
+               $record = self::getRevisionLookup()->getKnownCurrentRevision( $title, $revId );
                return $record ? new Revision( $record ) : false;
        }
 }
index 79e5b84..a89619f 100644 (file)
@@ -482,6 +482,14 @@ return [
                return $store;
        },
 
+       'RevisionLookup' => function ( MediaWikiServices $services ) {
+               return $services->getRevisionStore();
+       },
+
+       'RevisionFactory' => function ( MediaWikiServices $services ) {
+               return $services->getRevisionStore();
+       },
+
        'BlobStoreFactory' => function ( MediaWikiServices $services ) {
                global $wgContLang;
                return new BlobStoreFactory(
@@ -508,6 +516,10 @@ return [
                return new DefaultPreferencesFactory( $config, $wgContLang, $authManager, $linkRenderer );
        },
 
+       'HttpRequestFactory' => function ( MediaWikiServices $services ) {
+               return new \MediaWiki\Http\HttpRequestFactory();
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index d1f225b..3e37c9c 100644 (file)
@@ -360,6 +360,7 @@ unset( $repo ); // no global pollution; destroy reference
 
 // Convert this deprecated setting to modern system
 if ( $wgExperimentalHtmlIds ) {
+       wfDeprecated( '$wgExperimentalHtmlIds', '1.30' );
        $wgFragmentMode = [ 'html5-legacy', 'html5' ];
 }
 
index f8481fe..79ecec6 100644 (file)
@@ -190,7 +190,7 @@ class RevisionStore implements IDBAccessObject, RevisionFactory, RevisionLookup
 
                // rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                if ( !$title && $revId !== null && $revId > 0 ) {
-                       $dbr = $this->getDbConnectionRef( $dbMode );
+                       $dbr = $this->getDBConnectionRef( $dbMode );
                        // @todo: Title::getSelectFields(), or Title::getQueryInfo(), or something like that
                        $row = $dbr->selectRow(
                                [ 'revision', 'page' ],
index 9aad401..c4cf434 100644 (file)
@@ -1812,10 +1812,10 @@ class Title implements LinkTarget {
                if ( $this->isExternal() ) {
                        $target = SpecialPage::getTitleFor(
                                'GoToInterwiki',
-                               $this->getPrefixedDBKey()
+                               $this->getPrefixedDBkey()
                        );
                }
-               return $target->getFullUrl( $query, false, $proto );
+               return $target->getFullURL( $query, false, $proto );
        }
 
        /**
index 3d33406..1165a26 100644 (file)
@@ -441,7 +441,8 @@ class InfoAction extends FormlessAction {
                if ( $title->inNamespace( NS_FILE ) ) {
                        $fileObj = wfFindFile( $title );
                        if ( $fileObj !== false ) {
-                               $output = $fileObj->getSha1();
+                               // Convert the base-36 sha1 value obtained from database to base-16
+                               $output = Wikimedia\base_convert( $fileObj->getSha1(), 36, 16, 40 );
                                $pageInfo['header-basic'][] = [
                                        $this->msg( 'pageinfo-file-hash' ),
                                        $output
index 2d2f48d..62d73f4 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 5, 2006
- *
  * Copyright © 2006, 2010 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index df30a2d..f4aea98 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 4, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index e1be8ef..5d641d8 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Jan 29, 2015
- *
  * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 3b24630..12e0b6f 100644 (file)
@@ -1,8 +1,6 @@
 <?php
 
 /**
- * Created on August 26, 2014
- *
  * Copyright © 2014 Petr Bena (benapetr@gmail.com)
  *
  * This program is free software; you can redistribute it and/or modify
index 375fc18..93c35d3 100644 (file)
@@ -397,7 +397,7 @@ class ApiComparePages extends ApiBase {
                if ( $rev ) {
                        $title = $rev->getTitle();
                        if ( isset( $this->props['ids'] ) ) {
-                               $vals["{$prefix}id"] = $title->getArticleId();
+                               $vals["{$prefix}id"] = $title->getArticleID();
                                $vals["{$prefix}revid"] = $rev->getId();
                        }
                        if ( isset( $this->props['title'] ) ) {
index 96c291c..e19f1f2 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jun 30, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 684c425..3211189 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2008
- *
  * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 26d4fd1..e887ef5 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on August 16, 2007
- *
  * Copyright © 2007 Iker Labarga "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 84ea266..535a3e8 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on June 1, 2008
- *
  * Copyright © 2008 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
index 7c86e09..fe49b25 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 05, 2007
- *
  * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index cae1e15..61a9035 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on June 06, 2011
- *
  * Copyright © 2011 Sam Reed
  *
  * This program is free software; you can redistribute it and/or modify
index db15032..393e536 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 13, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 736898e..b68b948 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on March 5, 2011
- *
  * Copyright © 2011 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
index 5e14e30..471ce21 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 19, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 3ab5ab9..262eb1f 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 19, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index e5dafae..6d8e743 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 19, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 91c73a1..602e3c1 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 22, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 671f356..b05097a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 22, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index ebaeb2c..9ec4a2c 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Feb 2, 2009
- *
  * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index e4dfda0..cc1bd82 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 19, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 529b32c..8d24859 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Aug 29, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 162b7cd..7aebf90 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 22, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 0568403..21e2694 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- *
- * Created on January 3rd, 2013
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 9636789..e4c4429 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 19, 2006
- *
  * Copyright © 2006-2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  * Daniel Cannon (cannon dot danielc at gmail dot com)
  *
index d56c096..c663d1e 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jan 4, 2008
- *
  * Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  *
  * This program is free software; you can redistribute it and/or modify
index 82753a1..5056b6d 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Sep 4, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 79e9909..86b4427 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 29, 2015
- *
  * Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
index b5e47ac..2619a7c 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 27, 2012
- *
  * Copyright © 2012 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index e7b2808..2814564 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 31, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index bb5a261..4b76906 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Apr 15, 2012
- *
  * Copyright © 2012 Szymon Świerkosz beau@adres.pl
  *
  * This program is free software; you can redistribute it and/or modify
@@ -124,7 +120,7 @@ class ApiOptions extends ApiBase {
                                $user->setOption( $key, $value );
                                $changed = true;
                        } else {
-                               $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikitext( $key ), $validation ] );
+                               $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikiText( $key ), $validation ] );
                        }
                }
 
index 774ea1a..30611b6 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 24, 2006
- *
  * Copyright © 2006, 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 93fc51a..bfd3d61 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 01, 2007
- *
  * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index ec015da..cf1fd1e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Dec 01, 2007
- *
  * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 06e8ae2..a20aca4 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API for MediaWiki 1.14+
  *
- * Created on Sep 2, 2008
- *
  * Copyright © 2008 Soxred93 soxred93@gmail.com,
  *
  * This program is free software; you can redistribute it and/or modify
index 1be4b10..f67d3b3 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 1, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 31bcc7a..5bbd211 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 7, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index aa89158..4f833e0 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on December 12, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 765b5c7..32d081e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Oct 3, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * Heavily based on ApiQueryDeletedrevs,
index 6f497b1..dde22d8 100644 (file)
@@ -3,8 +3,6 @@
 /**
  * API for MediaWiki 1.12+
  *
- * Created on Mar 16, 2008
- *
  * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
  * based on ApiQueryAllPages.php
  *
index 9d6bf46..057dbb2 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 7, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 271d281..40abcaf 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 1, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a084279..40909a4 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index c8db6a1..6823646 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Sep 27, 2015
- *
  * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index d594ad4..65a4b32 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 7, 2007
- *
  * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 830cc48..35cb83a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 16, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index ef02d09..fb90e25 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API module to handle links table back-queries
  *
- * Created on Aug 19, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 179e6f7..e0ab53a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 7, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 698c13c..d02fefa 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 10, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index f728dc5..7b447cb 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 13, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 25e9b27..02361a2 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 13, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index e3265d1..37d0788 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on June 14, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index f802d9e..25b7c84 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * Query the list of contributors to a page
  *
- * Created on Nov 14, 2013
- *
  * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 3339fec..f579065 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Oct 3, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * Heavily based on ApiQueryDeletedrevs,
index 5dd007b..5c1f6ba 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jul 2, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a94af69..8610007 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2008
- *
  * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 0eaeaec..dfe3cf3 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 27, 2008
- *
  * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 43f4131..fc5d8a0 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 7, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 71fd6d1..fd196aa 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 13, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 838fc2b..d401511 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API for MediaWiki 1.12+
  *
- * Created on May 10, 2010
- *
  * Copyright © 2010 Sam Reed
  * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
  * based on ApiQueryAllPages.php
index 5acd75f..a7df33a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 7, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a10ba16..90aed6e 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API for MediaWiki 1.17+
  *
- * Created on May 14, 2010
- *
  * Copyright © 2010 Sam Reed
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
index 9313af3..08c8abf 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API for MediaWiki 1.17+
  *
- * Created on May 14, 2010
- *
  * Copyright © 2010 Sam Reed
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
index 0603923..fd456cb 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 6, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 01a54de..06a3ba0 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 13, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index bff1978..23a327b 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index fd67d7c..9b99312 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * API for MediaWiki 1.17+
  *
- * Created on May 14, 2011
- *
  * Copyright © 2011 Sam Reed
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
index df33d02..2d8e44c 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 13, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 119db3e..67bf619 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on May 12, 2007
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 3066720..9d24794 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 16, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 2d56983..f280ef0 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on January 21, 2013
- *
  * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index e49dfbc..2bee698 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Aug 7, 2010
- *
  * Copyright © 2010 soxred93, Bryan Tong Minh
  *
  * This program is free software; you can redistribute it and/or modify
index 97f79b6..06b412f 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on December 31, 2012
- *
  * Copyright © 2012 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index b69a299..843e209 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Feb 13, 2009
- *
  * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 46c2265..a828e11 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Dec 22, 2010
- *
  * Copyright © 2010 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index ce62226..636191d 100644 (file)
@@ -1,10 +1,6 @@
 <?php
 
 /**
- *
- *
- * Created on Monday, January 28, 2008
- *
  * Copyright © 2008 Brent Garber
  *
  * This program is free software; you can redistribute it and/or modify
index 63e0748..4549987 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 19, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a04b7c5..aa9a39c 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 7, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 2ffd024..f888434 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 3, 2014 as a split from ApiQueryRevisions
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 2c681f5..7d46a5f 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 30, 2007
- *
  * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 6bab826..acae889 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index b340b57..ed5fe8a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jul 9, 2009
- *
  * Copyright © 2009
  *
  * This program is free software; you can redistribute it and/or modify
index 0e46fd0..e86fdf3 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * Module to fetch tokens via action=query&meta=tokens
  *
- * Created on August 8, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index bb0f335..99a582e 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 16, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 036515d..fa151c9 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 30, 2007
- *
  * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 8fc99bb..9261003 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on July 30, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 710550a..f9ac44a 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 25, 2006
- *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index b0b1cde..0adbfdb 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Oct 4, 2008
- *
  * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index d7bc931..9a793e2 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Jun 25, 2013
- *
  * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 4ca2955..d2ff790 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jun 20, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a41f655..31d00cc 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Feb 25, 2015
- *
  * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index b6a0a78..5e7a633 100644 (file)
@@ -3,8 +3,6 @@
 /**
  * API for MediaWiki 1.14+
  *
- * Created on Jun 18, 2012
- *
  * Copyright © 2012 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 54394a5..40826ae 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on January 1, 2017
- *
  * Copyright © 2017 Justin Du "<justin.d128@gmail.com>"
  *
  * This program is free software; you can redistribute it and/or modify
index fc2951a..606967d 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jul 29, 2011
- *
  * Copyright © 2011 John Du Hart john@johnduhart.me
  *
  * This program is free software; you can redistribute it and/or modify
index 887edaa..b748cb3 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 7, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 3aa7b60..ee5c3a2 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jul 3, 2007
- *
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index cfe1968..e8a2061 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Aug 21, 2008
- *
  * Copyright © 2008 - 2010 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
index efe21f1..38be178 100644 (file)
@@ -1,9 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Jan 4, 2008
- *
  * Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  *
  * This program is free software; you can redistribute it and/or modify
index 109ea0e..2e68946 100644 (file)
        "api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
        "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
+       "api-help-param-maxbytes": "לא יכול להיות ארוך {{PLURAL:$1|מבית אחד|מ־$1 בתים}}.",
+       "api-help-param-maxchars": "לא יכול להיות ארוך {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
        "api-help-examples": "{{PLURAL:$1|דוגמה|דוגמאות}}:",
        "api-help-permissions": "{{PLURAL:$1|הרשאה|הרשאות}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|הוענק ל|הוענקו ל}}: $2",
index 7f89db5..b45300f 100644 (file)
        "apihelp-query+deletedrevs-param-excludeuser": "Не перечислять правки данного участника.",
        "apihelp-query+deletedrevs-param-namespace": "Перечислять только страницы этого пространства имён.",
        "apihelp-query+deletedrevs-param-limit": "Максимальное количество правок в списке.",
-       "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной Ð¿Ñ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 Ð½Ð¸Ðº Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, Ð±Ñ\8bла Ð»Ð¸ Ð¿Ñ\80авка Ð¼Ð°Ð»Ñ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 Ð´Ð»Ð¸Ð½Ñ\83 (в Ð±Ð°Ð¹Ñ\82аÑ\85) Ð¿Ñ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) Ð¿Ñ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое Ð¿Ñ\80авки.\n;token: <span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Ð\92озвÑ\80аÑ\89аеÑ\82 Ñ\82окен Ñ\80едакÑ\82иÑ\80ованиÑ\8f.\n;tags: Ð¢ÐµÐ³и правки.",
+       "apihelp-query+deletedrevs-param-prop": "Ð\9aакие Ñ\81войÑ\81Ñ\82ва Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аÑ\82Ñ\8c:\n;revid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83далÑ\91нной Ð¿Ñ\80авки.\n;parentid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ð¿Ñ\80едÑ\8bдÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.\n;user: Ð\94обавлÑ\8fеÑ\82 Ð½Ð¸Ðº Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;userid: Ð\94обавлÑ\8fеÑ\82 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника, Ñ\81делавÑ\88его Ð¿Ñ\80авкÑ\83.\n;comment: Ð\94обавлÑ\8fеÑ\82 Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;parsedcomment: Ð\94обавлÑ\8fеÑ\82 Ñ\80аÑ\81паÑ\80Ñ\81енное Ð¾Ð¿Ð¸Ñ\81ание Ð¿Ñ\80авки.\n;minor: Ð\9eÑ\82меÑ\87аеÑ\82, Ð±Ñ\8bла Ð»Ð¸ Ð¿Ñ\80авка Ð¼Ð°Ð»Ñ\8bм.\n;len: Ð\94обавлÑ\8fеÑ\82 Ð´Ð»Ð¸Ð½Ñ\83 (в Ð±Ð°Ð¹Ñ\82аÑ\85) Ð¿Ñ\80авки.\n;sha1: Ð\94обавлÑ\8fеÑ\82 Ñ\85Ñ\8dÑ\88 SHA-1 (base 16) Ð¿Ñ\80авки.\n;content: Ð\94обавлÑ\8fеÑ\82 Ñ\81одеÑ\80жимое Ð¿Ñ\80авки.\n;token: <span class=\"apihelp-deprecated\">УÑ\81Ñ\82аÑ\80ело.</span> Ð\92озвÑ\80аÑ\89аеÑ\82 Ñ\82окен Ñ\80едакÑ\82иÑ\80ованиÑ\8f.\n;tags: Ð\9cеÑ\82ки правки.",
        "apihelp-query+deletedrevs-example-mode1": "Список последних удалённых правок страниц <kbd>Main Page</kbd> и <kbd>Talk:Main Page</kbd> с содержимым (режим 1).",
        "apihelp-query+deletedrevs-example-mode2": "Список последних 50 удалённых правок участника <kbd>Bob</kbd> (режим 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Список последних 50 удалённых правок в основном пространстве имён (режим 3)",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Отмечает правку, если страница является перенаправлением.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Отмечает патрулируемые правки как отпатрулированные или неотпатрулированные.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Добавляет информацию о записи журнала (идентификатор записи, её тип, и так далее).",
-       "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет теги записи.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет метки записи.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Добавляет значение контрольных сумм для записей, связанных с версией.",
        "apihelp-query+recentchanges-param-token": "Вместо этого используйте <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+recentchanges-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Возвращает список языков, поддерживаемых MediaWiki (опционально локализованных с помощью <var>$1inlanguagecode</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список языковых кодов, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты, поддерживаемые для каждого языка.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Возвращает список доступных скинов (опционально локализованных с помощью <var>$1inlanguagecode</var>, в противном случае — на языке вики).",
-       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список тегов рашсирений парсера.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список меток рашсирений парсера.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Возвращает список перехватчиков функций парсера.",
        "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Возвращает список всех подписанных перехватчиков (содержимое <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Возвращает список идентификаторов переменных.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Добавляет метку времени, когда участник был уведомлён о правке.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Добавляет информацию о журнале, где уместно.",
+       "apihelp-query+watchlist-paramvalue-prop-tags": "Перечисляет метки записи.",
        "apihelp-query+watchlist-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Какие типы правок показать:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Обычные правки страниц.",
        "apihelp-setpagelanguage-param-pageid": "Идентификатор страницы, язык которой вы желаете поменять. Не может быть использовано одновременно с <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Код нового языка. Используйте <kbd>default</kbd> для смены на язык содержимого по умолчанию для этой вики.",
        "apihelp-setpagelanguage-param-reason": "Причина изменения.",
-       "apihelp-setpagelanguage-param-tags": "Изменить теги записей в журнале, возникающих в результате этого действия.",
+       "apihelp-setpagelanguage-param-tags": "Изменить метки записей в журнале, возникающих в результате этого действия.",
        "apihelp-setpagelanguage-example-language": "Изменить язык <kbd>Main Page</kbd> на баскский.",
        "apihelp-setpagelanguage-example-default": "Изменить язык страницы с идентификатором 123 на язык по умолчанию.",
        "apihelp-stashedit-summary": "Подготовка правки в общем кэше.",
diff --git a/includes/collation/AbkhazUppercaseCollation.php b/includes/collation/AbkhazUppercaseCollation.php
new file mode 100644 (file)
index 0000000..e0ea237
--- /dev/null
@@ -0,0 +1,93 @@
+<?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
+ *
+ * @since 1.31
+ *
+ * @file
+ */
+
+class AbkhazUppercaseCollation extends CustomUppercaseCollation {
+
+       public function __construct() {
+               parent::__construct( [
+                       'А',
+                       'Б',
+                       'В',
+                       'Г',
+                       'Гь',
+                       'Гә',
+                       'Ҕ',
+                       'Ҕь',
+                       'Ҕә',
+                       'Д',
+                       'Дә',
+                       'Е',
+                       'Ж',
+                       'Жь',
+                       'Жә',
+                       'З',
+                       'Ӡ',
+                       'Ӡә',
+                       'И',
+                       'К',
+                       'Кь',
+                       'Кә',
+                       'Қ',
+                       'Қь',
+                       'Қә',
+                       'Ҟ',
+                       'Ҟь',
+                       'Ҟә',
+                       'Л',
+                       'М',
+                       'Н',
+                       'О',
+                       'П',
+                       'Ҧ',
+                       'Р',
+                       'С',
+                       'Т',
+                       'Тә',
+                       'Ҭ',
+                       'Ҭә',
+                       'У',
+                       'Ф',
+                       'Х',
+                       'Хь',
+                       'Хә',
+                       'Ҳ',
+                       'Ҳә',
+                       'Ц',
+                       'Цә',
+                       'Ҵ',
+                       'Ҵә',
+                       'Ч',
+                       'Ҷ',
+                       'Ҽ',
+                       'Ҿ',
+                       'Ш',
+                       'Шь',
+                       'Шә',
+                       'Ы',
+                       'Ҩ',
+                       'Џ',
+                       'Џь',
+                       'ь',
+                       'ә',
+               ], Language::factory( 'ab' ) );
+       }
+}
index 7171a21..30cae5a 100644 (file)
@@ -65,6 +65,8 @@ abstract class Collation {
                                return new CollationEt;
                        case 'xx-uca-fa':
                                return new CollationFa;
+                       case 'uppercase-ab':
+                               return new AbkhazUppercaseCollation;
                        case 'uppercase-ba':
                                return new BashkirUppercaseCollation;
                        case 'uppercase-se':
index 301972d..170d5c2 100644 (file)
@@ -32,6 +32,7 @@
  * conflicts with other people using private use area)
  *
  * This does not support fancy things like secondary differences, etc.
+ * (It supports digraphs, trigraphs etc. though.)
  *
  * It is expected most people will subclass this and just override the
  * constructor to hard-code an alphabet.
@@ -45,25 +46,30 @@ class CustomUppercaseCollation extends NumericUppercaseCollation {
        private $puaSubset;
 
        /**
-        * @note This assumes $alphabet does not contain U+F3000-U+F303F
+        * @note This assumes $alphabet does not contain U+F3000-U+F3FFF
         *
         * @param array $alphabet Sorted array of uppercase characters.
         * @param Language $lang What language for number sorting.
         */
        public function __construct( array $alphabet, Language $lang ) {
-               // It'd be trivial to extend this past 64, you'd just
-               // need a bit of bit-fiddling. Doesn't seem necessary right
-               // now.
-               if ( count( $alphabet ) < 1 || count( $alphabet ) >= 64 ) {
-                       throw new UnexpectedValueException( "Alphabet must be < 64 items" );
+               if ( count( $alphabet ) < 1 || count( $alphabet ) >= 4096 ) {
+                       throw new UnexpectedValueException( "Alphabet must be < 4096 items" );
                }
-               $this->alphabet = $alphabet;
+               $this->firstLetters = $alphabet;
+               // For digraphs, only the first letter is capitalized in input
+               $this->alphabet = array_map( [ $lang, 'uc' ], $alphabet );
 
                $this->puaSubset = [];
                $len = count( $alphabet );
                for ( $i = 0; $i < $len; $i++ ) {
-                       $this->puaSubset[] = "\xF3\xB3\x80" . chr( $i + 128 );
+                       $this->puaSubset[] = "\xF3\xB3" . chr( floor( $i / 64 ) + 128 ) . chr( ( $i % 64 ) + 128 );
                }
+
+               // Sort these arrays so that any trigraphs, digraphs etc. are first
+               // (and they get replaced first in convertToPua()).
+               $lengths = array_map( 'mb_strlen', $this->alphabet );
+               array_multisort( $lengths, SORT_DESC, $this->firstLetters, $this->alphabet, $this->puaSubset );
+
                parent::__construct( $lang );
        }
 
@@ -76,12 +82,17 @@ class CustomUppercaseCollation extends NumericUppercaseCollation {
        }
 
        public function getFirstLetter( $string ) {
-               // In case a title has a PUA code in it, make it sort
-               // under the header for the character it would replace
-               // to avoid inconsistent behaviour. This class mostly
-               // assumes that people will not use PUA codes.
-               return parent::getFirstLetter(
-                       str_replace( $this->puaSubset, $this->alphabet, $string )
-               );
+               $sortkey = $this->getSortKey( $string );
+
+               // In case a title begins with a character from our alphabet, return the corresponding
+               // first-letter. (This also happens if the title has a corresponding PUA code in it, to avoid
+               // inconsistent behaviour. This class mostly assumes that people will not use PUA codes.)
+               $index = array_search( substr( $sortkey, 0, 4 ), $this->puaSubset );
+               if ( $index !== false ) {
+                       return $this->firstLetters[ $index ];
+               }
+
+               // String begins with a character outside of our alphabet, fall back
+               return parent::getFirstLetter( $string );
        }
 }
index 6530550..03fb9e2 100644 (file)
@@ -49,8 +49,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Set the IContextSource object
-        *
         * @since 1.18
         * @param IContextSource $context
         */
@@ -59,8 +57,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Config object
-        *
         * @since 1.23
         * @return Config
         */
@@ -69,8 +65,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the WebRequest object
-        *
         * @since 1.18
         * @return WebRequest
         */
@@ -79,8 +73,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Title object
-        *
         * @since 1.18
         * @return Title|null
         */
@@ -114,8 +106,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the OutputPage object
-        *
         * @since 1.18
         * @return OutputPage
         */
@@ -124,8 +114,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the User object
-        *
         * @since 1.18
         * @return User
         */
@@ -134,8 +122,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Language object
-        *
         * @since 1.19
         * @return Language
         */
@@ -144,8 +130,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Skin object
-        *
         * @since 1.18
         * @return Skin
         */
@@ -154,8 +138,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Timing object
-        *
         * @since 1.27
         * @return Timing
         */
@@ -164,8 +146,6 @@ abstract class ContextSource implements IContextSource {
        }
 
        /**
-        * Get the Stats object
-        *
         * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
         *
         * @since 1.25
index 82b97ec..f7a1815 100644 (file)
@@ -81,17 +81,13 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the SiteConfiguration object
-        *
-        * @param Config $s
+        * @param Config $config
         */
-       public function setConfig( Config $s ) {
-               $this->config = $s;
+       public function setConfig( Config $config ) {
+               $this->config = $config;
        }
 
        /**
-        * Get the Config object
-        *
         * @return Config
         */
        public function getConfig() {
@@ -103,8 +99,6 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Get the stats object
-        *
         * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
         *
         * @return IBufferingStatsdDataFactory
@@ -114,8 +108,6 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Get the timing object
-        *
         * @return Timing
         */
        public function getTiming() {
@@ -127,17 +119,13 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the WebRequest object
-        *
-        * @param WebRequest $r
+        * @param WebRequest $request
         */
-       public function setRequest( WebRequest $r ) {
-               $this->request = $r;
+       public function setRequest( WebRequest $request ) {
+               $this->request = $request;
        }
 
        /**
-        * Get the WebRequest object
-        *
         * @return WebRequest
         */
        public function getRequest() {
@@ -149,17 +137,13 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the Title object
-        *
-        * @param Title $t
+        * @param Title $title
         */
-       public function setTitle( Title $t ) {
-               $this->title = $t;
+       public function setTitle( Title $title ) {
+               $this->title = $title;
        }
 
        /**
-        * Get the Title object
-        *
         * @return Title|null
         */
        public function getTitle() {
@@ -189,13 +173,11 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the WikiPage object
-        *
         * @since 1.19
-        * @param WikiPage $p
+        * @param WikiPage $wikiPage
         */
-       public function setWikiPage( WikiPage $p ) {
-               $this->wikipage = $p;
+       public function setWikiPage( WikiPage $wikiPage ) {
+               $this->wikipage = $wikiPage;
        }
 
        /**
@@ -216,17 +198,13 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the OutputPage object
-        *
-        * @param OutputPage $o
+        * @param OutputPage $output
         */
-       public function setOutput( OutputPage $o ) {
-               $this->output = $o;
+       public function setOutput( OutputPage $output ) {
+               $this->output = $output;
        }
 
        /**
-        * Get the OutputPage object
-        *
         * @return OutputPage
         */
        public function getOutput() {
@@ -238,17 +216,13 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the User object
-        *
-        * @param User $u
+        * @param User $user
         */
-       public function setUser( User $u ) {
-               $this->user = $u;
+       public function setUser( User $user ) {
+               $this->user = $user;
        }
 
        /**
-        * Get the User object
-        *
         * @return User
         */
        public function getUser() {
@@ -260,18 +234,16 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the Language object
-        *
-        * @param Language|string $l Language instance or language code
+        * @param Language|string $language Language instance or language code
         * @throws MWException
         * @since 1.19
         */
-       public function setLanguage( $l ) {
-               if ( $l instanceof Language ) {
-                       $this->lang = $l;
-               } elseif ( is_string( $l ) ) {
-                       $l = RequestContext::sanitizeLangCode( $l );
-                       $obj = Language::factory( $l );
+       public function setLanguage( $language ) {
+               if ( $language instanceof Language ) {
+                       $this->lang = $language;
+               } elseif ( is_string( $language ) ) {
+                       $language = RequestContext::sanitizeLangCode( $language );
+                       $obj = Language::factory( $language );
                        $this->lang = $obj;
                } else {
                        throw new MWException( __METHOD__ . " was passed an invalid type of data." );
@@ -279,8 +251,6 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Get the Language object
-        *
         * @return Language
         * @since 1.19
         */
@@ -293,18 +263,14 @@ class DerivativeContext extends ContextSource implements MutableContext {
        }
 
        /**
-        * Set the Skin object
-        *
-        * @param Skin $s
+        * @param Skin $skin
         */
-       public function setSkin( Skin $s ) {
-               $this->skin = clone $s;
+       public function setSkin( Skin $skin ) {
+               $this->skin = clone $skin;
                $this->skin->setContext( $this );
        }
 
        /**
-        * Get the Skin object
-        *
         * @return Skin
         */
        public function getSkin() {
index 5a856cf..6e48e1e 100644 (file)
  * shutdown by separate persistence handler objects, for example.
  */
 interface IContextSource extends MessageLocalizer {
+
        /**
-        * Get the WebRequest object
-        *
         * @return WebRequest
         */
        public function getRequest();
 
        /**
-        * Get the Title object
-        *
         * @return Title|null
         */
        public function getTitle();
@@ -87,30 +84,22 @@ interface IContextSource extends MessageLocalizer {
        public function getWikiPage();
 
        /**
-        * Get the OutputPage object
-        *
         * @return OutputPage
         */
        public function getOutput();
 
        /**
-        * Get the User object
-        *
         * @return User
         */
        public function getUser();
 
        /**
-        * Get the Language object
-        *
         * @return Language
         * @since 1.19
         */
        public function getLanguage();
 
        /**
-        * Get the Skin object
-        *
         * @return Skin
         */
        public function getSkin();
@@ -124,8 +113,6 @@ interface IContextSource extends MessageLocalizer {
        public function getConfig();
 
        /**
-        * Get the stats object
-        *
         * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
         *
         * @since 1.25
@@ -134,8 +121,6 @@ interface IContextSource extends MessageLocalizer {
        public function getStats();
 
        /**
-        * Get the timing object
-        *
         * @since 1.27
         * @return Timing
         */
index 189b346..56ec960 100644 (file)
  */
 
 interface MutableContext {
+
        /**
-        * Set the Config object
-        *
         * @param Config $config
         */
        public function setConfig( Config $config );
 
        /**
-        * Set the WebRequest object
-        *
-        * @param WebRequest $r
+        * @param WebRequest $request
         */
-       public function setRequest( WebRequest $r );
+       public function setRequest( WebRequest $request );
 
        /**
-        * Set the Title object
-        *
-        * @param Title $t
+        * @param Title $title
         */
-       public function setTitle( Title $t );
+       public function setTitle( Title $title );
 
        /**
-        * Set the WikiPage object
-        *
-        * @param WikiPage $p
+        * @param WikiPage $wikiPage
         */
-       public function setWikiPage( WikiPage $p );
+       public function setWikiPage( WikiPage $wikiPage );
 
        /**
-        * Set the OutputPage object
-        *
-        * @param OutputPage $o
+        * @param OutputPage $output
         */
-       public function setOutput( OutputPage $o );
+       public function setOutput( OutputPage $output );
 
        /**
-        * Set the User object
-        *
-        * @param User $u
+        * @param User $user
         */
-       public function setUser( User $u );
+       public function setUser( User $user );
 
        /**
-        * Set the Language object
-        *
-        * @param Language|string $l Language instance or language code
+        * @param Language|string $language Language instance or language code
         */
-       public function setLanguage( $l );
+       public function setLanguage( $language );
 
        /**
-        * Set the Skin object
-        *
-        * @param Skin $s
+        * @param Skin $skin
         */
-       public function setSkin( Skin $s );
+       public function setSkin( Skin $skin );
 
 }
index 47d1684..6fedead 100644 (file)
@@ -101,17 +101,13 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the WebRequest object
-        *
-        * @param WebRequest $r
+        * @param WebRequest $request
         */
-       public function setRequest( WebRequest $r ) {
-               $this->request = $r;
+       public function setRequest( WebRequest $request ) {
+               $this->request = $request;
        }
 
        /**
-        * Get the WebRequest object
-        *
         * @return WebRequest
         */
        public function getRequest() {
@@ -129,8 +125,6 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Get the Stats object
-        *
         * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
         *
         * @return IBufferingStatsdDataFactory
@@ -140,8 +134,6 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Get the timing object
-        *
         * @return Timing
         */
        public function getTiming() {
@@ -154,8 +146,6 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the Title object
-        *
         * @param Title|null $title
         */
        public function setTitle( Title $title = null ) {
@@ -165,8 +155,6 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Get the Title object
-        *
         * @return Title|null
         */
        public function getTitle() {
@@ -212,18 +200,16 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the WikiPage object
-        *
         * @since 1.19
-        * @param WikiPage $p
+        * @param WikiPage $wikiPage
         */
-       public function setWikiPage( WikiPage $p ) {
-               $pageTitle = $p->getTitle();
+       public function setWikiPage( WikiPage $wikiPage ) {
+               $pageTitle = $wikiPage->getTitle();
                if ( !$this->hasTitle() || !$pageTitle->equals( $this->getTitle() ) ) {
                        $this->setTitle( $pageTitle );
                }
                // Defer this to the end since setTitle sets it to null.
-               $this->wikipage = $p;
+               $this->wikipage = $wikiPage;
        }
 
        /**
@@ -249,15 +235,13 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * @param OutputPage $o
+        * @param OutputPage $output
         */
-       public function setOutput( OutputPage $o ) {
-               $this->output = $o;
+       public function setOutput( OutputPage $output ) {
+               $this->output = $output;
        }
 
        /**
-        * Get the OutputPage object
-        *
         * @return OutputPage
         */
        public function getOutput() {
@@ -269,17 +253,13 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the User object
-        *
-        * @param User $u
+        * @param User $user
         */
-       public function setUser( User $u ) {
-               $this->user = $u;
+       public function setUser( User $user ) {
+               $this->user = $user;
        }
 
        /**
-        * Get the User object
-        *
         * @return User
         */
        public function getUser() {
@@ -311,18 +291,16 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the Language object
-        *
-        * @param Language|string $l Language instance or language code
+        * @param Language|string $language Language instance or language code
         * @throws MWException
         * @since 1.19
         */
-       public function setLanguage( $l ) {
-               if ( $l instanceof Language ) {
-                       $this->lang = $l;
-               } elseif ( is_string( $l ) ) {
-                       $l = self::sanitizeLangCode( $l );
-                       $obj = Language::factory( $l );
+       public function setLanguage( $language ) {
+               if ( $language instanceof Language ) {
+                       $this->lang = $language;
+               } elseif ( is_string( $language ) ) {
+                       $language = self::sanitizeLangCode( $language );
+                       $obj = Language::factory( $language );
                        $this->lang = $obj;
                } else {
                        throw new MWException( __METHOD__ . " was passed an invalid type of data." );
@@ -380,18 +358,14 @@ class RequestContext implements IContextSource, MutableContext {
        }
 
        /**
-        * Set the Skin object
-        *
-        * @param Skin $s
+        * @param Skin $skin
         */
-       public function setSkin( Skin $s ) {
-               $this->skin = clone $s;
+       public function setSkin( Skin $skin ) {
+               $this->skin = clone $skin;
                $this->skin->setContext( $this );
        }
 
        /**
-        * Get the Skin object
-        *
         * @return Skin
         */
        public function getSkin() {
index 62624f4..910d221 100644 (file)
@@ -87,27 +87,4 @@ class PreparedEdit {
         */
        public $oldContent;
 
-       /**
-        * $newContent in text form
-        *
-        * @var string
-        * @deprecated since 1.21
-        */
-       public $newText;
-
-       /**
-        * $oldContent in text from
-        *
-        * @var string
-        * @deprecated since 1.21
-        */
-       public $oldText;
-
-       /**
-        * $pstContent in text form
-        *
-        * @var string
-        * @deprecated since 1.21
-        */
-       public $pst;
 }
index 80fd22e..700c8ee 100644 (file)
@@ -207,22 +207,26 @@ abstract class ImageGalleryBase extends ContextSource {
        /**
         * Set how wide each image will be, in pixels.
         *
-        * @param int $num Integer > 0; invalid numbers will be ignored
+        * @param string $num Number. Unit other than 'px is invalid. Invalid numbers
+        *   and those below 0 are ignored.
         */
        public function setWidths( $num ) {
-               if ( $num > 0 ) {
-                       $this->mWidths = (int)$num;
+               $parsed = Parser::parseWidthParam( $num, false );
+               if ( isset( $parsed['width'] ) && $parsed['width'] > 0 ) {
+                       $this->mWidths = $parsed['width'];
                }
        }
 
        /**
         * Set how high each image will be, in pixels.
         *
-        * @param int $num Integer > 0; invalid numbers will be ignored
+        * @param string $num Number. Unit other than 'px is invalid. Invalid numbers
+        *   and those below 0 are ignored.
         */
        public function setHeights( $num ) {
-               if ( $num > 0 ) {
-                       $this->mHeights = (int)$num;
+               $parsed = Parser::parseWidthParam( $num, false );
+               if ( isset( $parsed['width'] ) && $parsed['width'] > 0 ) {
+                       $this->mHeights = $parsed['width'];
                }
        }
 
diff --git a/includes/http/HttpRequestFactory.php b/includes/http/HttpRequestFactory.php
new file mode 100644 (file)
index 0000000..80f9b68
--- /dev/null
@@ -0,0 +1,82 @@
+<?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
+ */
+namespace MediaWiki\Http;
+
+use CurlHttpRequest;
+use DomainException;
+use Http;
+use MediaWiki\Logger\LoggerFactory;
+use MWHttpRequest;
+use PhpHttpRequest;
+use Profiler;
+
+/**
+ * Factory creating MWHttpRequest objects.
+ */
+class HttpRequestFactory {
+
+       /**
+        * Generate a new MWHttpRequest object
+        * @param string $url Url to use
+        * @param array $options (optional) extra params to pass (see Http::request())
+        * @param string $caller The method making this request, for profiling
+        * @throws DomainException
+        * @return MWHttpRequest
+        * @see MWHttpRequest::__construct
+        */
+       public function create( $url, array $options = [], $caller = __METHOD__ ) {
+               if ( !Http::$httpEngine ) {
+                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
+                       throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
+                          ' Http::$httpEngine is set to "curl"' );
+               }
+
+               if ( !isset( $options['logger'] ) ) {
+                       $options['logger'] = LoggerFactory::getInstance( 'http' );
+               }
+
+               switch ( Http::$httpEngine ) {
+                       case 'curl':
+                               return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
+                       case 'php':
+                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
+                                       throw new DomainException( __METHOD__ . ': allow_url_fopen ' .
+                                          'needs to be enabled for pure PHP http requests to ' .
+                                          'work. If possible, curl should be used instead. See ' .
+                                          'http://php.net/curl.'
+                                       );
+                               }
+                               return new PhpHttpRequest( $url, $options, $caller, Profiler::instance() );
+                       default:
+                               throw new DomainException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
+               }
+       }
+
+       /**
+        * Simple function to test if we can make any sort of requests at all, using
+        * cURL or fopen()
+        * @return bool
+        */
+       public function canMakeRequests() {
+               return function_exists( 'curl_init' ) || wfIniGetBool( 'allow_url_fopen' );
+       }
+
+}
index 0f0118c..fff72ec 100644 (file)
@@ -18,7 +18,6 @@
  * @file
  */
 
-use MediaWiki\Logger\LoggerFactory;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\NullLogger;
@@ -30,7 +29,7 @@ use Psr\Log\NullLogger;
  * Renamed from HttpRequest to MWHttpRequest to avoid conflict with
  * PHP's HTTP extension.
  */
-class MWHttpRequest implements LoggerAwareInterface {
+abstract class MWHttpRequest implements LoggerAwareInterface {
        const SUPPORTS_FILE_POSTS = false;
 
        /**
@@ -90,8 +89,8 @@ class MWHttpRequest implements LoggerAwareInterface {
         * @param string $caller The method making this request, for profiling
         * @param Profiler $profiler An instance of the profiler for profiling, or null
         */
-       protected function __construct(
-               $url, $options = [], $caller = __METHOD__, $profiler = null
+       public function __construct(
+               $url, array $options = [], $caller = __METHOD__, $profiler = null
        ) {
                global $wgHTTPTimeout, $wgHTTPConnectTimeout;
 
@@ -174,44 +173,18 @@ class MWHttpRequest implements LoggerAwareInterface {
 
        /**
         * Generate a new request object
+        * Deprecated: @see HttpRequestFactory::create
         * @param string $url Url to use
         * @param array $options (optional) extra params to pass (see Http::request())
         * @param string $caller The method making this request, for profiling
         * @throws DomainException
-        * @return CurlHttpRequest|PhpHttpRequest
+        * @return MWHttpRequest
         * @see MWHttpRequest::__construct
         */
        public static function factory( $url, $options = null, $caller = __METHOD__ ) {
-               if ( !Http::$httpEngine ) {
-                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
-               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
-                       throw new DomainException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
-                               ' Http::$httpEngine is set to "curl"' );
-               }
-
-               if ( !is_array( $options ) ) {
-                       $options = [];
-               }
-
-               if ( !isset( $options['logger'] ) ) {
-                       $options['logger'] = LoggerFactory::getInstance( 'http' );
-               }
-
-               switch ( Http::$httpEngine ) {
-                       case 'curl':
-                               return new CurlHttpRequest( $url, $options, $caller, Profiler::instance() );
-                       case 'php':
-                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new DomainException( __METHOD__ . ': allow_url_fopen ' .
-                                               'needs to be enabled for pure PHP http requests to ' .
-                                               'work. If possible, curl should be used instead. See ' .
-                                               'http://php.net/curl.'
-                                       );
-                               }
-                               return new PhpHttpRequest( $url, $options, $caller, Profiler::instance() );
-                       default:
-                               throw new DomainException( __METHOD__ . ': The setting of Http::$httpEngine is not valid.' );
-               }
+               return \MediaWiki\MediaWikiServices::getInstance()
+                       ->getHttpRequestFactory()
+                       ->create( $url, $options, $caller );
        }
 
        /**
index 7583455..e2dfea8 100644 (file)
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-install-done-path": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקייה <code>$4</code>. ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
+       "config-install-success": "מדיה־ויקי הותקנה בהצלחה. עכשיו אפשר\nלבקר בכתובת <$1$2> כדי לצפות בוויקי שלך.\nאם יש לך שאלות, ר' את רשימת השאלות הנפוצות שלנו:\n<https://www.mediawiki.org/wiki/Manual:FAQ> ואפשר גם להשתמש\nבאתרי התמיכה שקישורים אליהם מופיעים באותו הדף.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
        "config-help-tooltip": "להרחיב",
index 02f6335..b492208 100644 (file)
@@ -6,12 +6,14 @@
                        "Milicevic01",
                        "Aktron",
                        "Сербијана",
-                       "Zoranzoki21"
+                       "Zoranzoki21",
+                       "Acamicamacaraca"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
        "config-title": "Инсталација Медијавикија $1",
-       "config-information": "Информације",
+       "config-information": "Информација",
+       "config-localsettings-key": "Кључ за уградњу:",
        "config-session-error": "Грешка при започињању сесије: $1",
        "config-session-expired": "Ваши подаци о сесији су истекли.\nСесије су подешене да трају $1.\nЊихов рок можете повећати постављањем <code>session.gc_maxlifetime</code> у php.ini.\nПоново покрените инсталацију.",
        "config-no-session": "Ваши подаци о сесији су изгубљени!\nПроверите Ваш php.ini и обезбедите да је <code>session.save_path</code> постављен на одговарајући директоријум.",
        "config-back": "← Назад",
        "config-continue": "Настави →",
        "config-page-language": "Језик",
-       "config-page-welcome": "Ð\94обÑ\80о Ð´Ð¾Ñ\88ли Ð½Ð° Ð\9cедиÑ\98аÐ\92ики!",
+       "config-page-welcome": "Ð\94обÑ\80о Ð´Ð¾Ñ\88ли Ð½Ð° Ð\9cедиÑ\98авики!",
        "config-page-dbconnect": "Повезивање са базом података",
        "config-page-upgrade": "Надоградња постојеће инсталације",
        "config-page-dbsettings": "Подешавања базе података",
        "config-page-name": "Назив",
-       "config-page-options": "Поставке",
+       "config-page-options": "Подешавања",
        "config-page-install": "Инсталирај",
        "config-page-complete": "Завршено!",
        "config-page-restart": "Поновно покретање инсталације",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] је инсталиран",
        "config-db-type": "Тип базе података:",
        "config-db-host": "Хост базе података",
+       "config-db-wiki-settings": "Идентификуј овај вики",
        "config-db-name": "Назив базе података:",
-       "config-db-password": "Лозинка за базу података:",
+       "config-db-name-oracle": "Шема базе података:",
+       "config-db-username": "Корисничко име базе података:",
+       "config-db-password": "Лозинка базе података:",
+       "config-db-port": "Порт базе података:",
+       "config-db-schema": "Шема за Медијавики:",
        "config-type-mysql": "MySQL (или компактибилан)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Тип провере идентитета:",
-       "config-mssql-sqlauth": "Провера идентитета за SQL Server",
-       "config-mssql-windowsauth": "Провера идентитета Windows-а",
+       "config-mssql-sqlauth": "Провера идентитета SQL Server-а",
+       "config-mssql-windowsauth": "Провера идентитета Виндоуса",
        "config-site-name": "Име викија:",
-       "config-admin-name": "Ð\9aорисничко име:",
+       "config-admin-name": "Ð\92аÑ\88е Ðºорисничко име:",
        "config-admin-password": "Лозинка:",
        "config-admin-email": "Имејл адреса:",
-       "config-optional-skip": "Ð\94оÑ\81адно Ð¼Ð¸ Ñ\98е, Ñ\85аÑ\98де Ð´Ð° Ð¸Ð½Ñ\81Ñ\82алиÑ\80амо вики.",
+       "config-optional-skip": "Ð\94оÑ\81адно Ð¼Ð¸ Ñ\98е, Ñ\81амо Ð¸Ð½Ñ\81Ñ\82алиÑ\80аÑ\98 вики.",
        "config-profile-no-anon": "Неопходно је отворити налог",
        "config-profile-fishbowl": "Само овлашћени корисници",
        "config-profile-private": "Приватна вики",
        "config-skins": "Теме",
        "config-install-step-done": "готово",
        "config-install-step-failed": "није успело",
+       "config-install-extensions": "Обухвата екстензије",
+       "config-install-schema": "Прављење шеме",
+       "config-install-tables": "Прављење табела",
+       "config-install-keys": "Генеришем тајне кључеве",
        "config-install-mainpage-exists": "Главна страна већ постоји, прескакање",
+       "config-install-mainpage-failed": "Не могу да убацим главну страну: „$1”",
+       "config-download-localsettings": "Преузми <code>LocalSettings.php</code>",
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
+       "config-nofile": "Не могу да пронађем датотеку „$1”. Није ли она била избрисана?",
+       "config-skins-screenshots": "„$1” (снимци екрана: $2)",
+       "config-screenshot": "снимак екрана",
        "mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
        "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
 }
index f8ca7e5..9c367af 100644 (file)
@@ -87,6 +87,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                      This will apply such updates post-send for web requests. Note that
         *                      any checks from "syncChecks" are still synchronous.
         *
+        * Bogus warning
+        * @suppress PhanAccessMethodProtected
+        *
         * @param array $config
         * @throws FileBackendError
         */
index 648fb67..9770515 100644 (file)
@@ -376,7 +376,7 @@ class XmlTypeCheck {
                if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) {
                        return;
                }
-               $dtd = $reader->readOuterXML();
+               $dtd = $reader->readOuterXml();
                $callbackReturn = false;
 
                if ( $generalCallback ) {
index 323c147..1efa9a1 100644 (file)
@@ -336,53 +336,51 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.18
         */
        final public static function factory( $dbType, $p = [] ) {
-               static $canonicalDBTypes = [
-                       'mysql' => [ 'mysqli' ],
-                       'postgres' => [],
-                       'sqlite' => [],
-                       'oracle' => [],
-                       'mssql' => [],
-               ];
-               static $classAliases = [
-                       'DatabaseMssql' => DatabaseMssql::class,
-                       'DatabaseMysqli' => DatabaseMysqli::class,
-                       'DatabaseSqlite' => DatabaseSqlite::class,
-                       'DatabasePostgres' => DatabasePostgres::class
+               // For database types with built-in support, the below maps type to IDatabase
+               // implementations. For types with multipe driver implementations (PHP extensions),
+               // an array can be used, keyed by extension name. In case of an array, the
+               // optional 'driver' parameter can be used to force a specific driver. Otherwise,
+               // we auto-detect the first available driver. For types without built-in support,
+               // an class named "Database<Type>" us used, eg. DatabaseFoo for type 'foo'.
+               static $builtinTypes = [
+                       'mssql' => DatabaseMssql::class,
+                       'mysql' => [ 'mysqli' => DatabaseMysqli::class ],
+                       'sqlite' => DatabaseSqlite::class,
+                       'postgres' => DatabasePostgres::class,
                ];
 
-               $driver = false;
                $dbType = strtolower( $dbType );
-               if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) {
-                       $possibleDrivers = $canonicalDBTypes[$dbType];
-                       if ( !empty( $p['driver'] ) ) {
-                               if ( in_array( $p['driver'], $possibleDrivers ) ) {
-                                       $driver = $p['driver'];
-                               } else {
-                                       throw new InvalidArgumentException( __METHOD__ .
-                                               " type '$dbType' does not support driver '{$p['driver']}'" );
-                               }
+               $class = false;
+               if ( isset( $builtinTypes[$dbType] ) ) {
+                       $possibleDrivers = $builtinTypes[$dbType];
+                       if ( is_string( $possibleDrivers ) ) {
+                               $class = $possibleDrivers;
                        } else {
-                               foreach ( $possibleDrivers as $posDriver ) {
-                                       if ( extension_loaded( $posDriver ) ) {
-                                               $driver = $posDriver;
-                                               break;
+                               if ( !empty( $p['driver'] ) ) {
+                                       if ( !isset( $possibleDrivers[$p['driver']] ) ) {
+                                               throw new InvalidArgumentException( __METHOD__ .
+                                                       " type '$dbType' does not support driver '{$p['driver']}'" );
+                                       } else {
+                                               $class = $possibleDrivers[$p['driver']];
+                                       }
+                               } else {
+                                       foreach ( $possibleDrivers as $posDriver => $possibleClass ) {
+                                               if ( extension_loaded( $posDriver ) ) {
+                                                       $class = $possibleClass;
+                                                       break;
+                                               }
                                        }
                                }
                        }
                } else {
-                       $driver = $dbType;
+                       $class = 'Database' . ucfirst( $dbType );
                }
 
-               if ( $driver === false || $driver === '' ) {
+               if ( $class === false ) {
                        throw new InvalidArgumentException( __METHOD__ .
                                " no viable database extension found for type '$dbType'" );
                }
 
-               $class = 'Database' . ucfirst( $driver );
-               if ( isset( $classAliases[$class] ) ) {
-                       $class = $classAliases[$class];
-               }
-
                if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
                        $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
index b01b23f..ee3c86f 100644 (file)
@@ -511,6 +511,8 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function waitForAll( $pos, $timeout = null ) {
+               $timeout = $timeout ?: $this->mWaitTimeout;
+
                $oldPos = $this->mWaitForPos;
                try {
                        $this->mWaitForPos = $pos;
@@ -519,7 +521,12 @@ class LoadBalancer implements ILoadBalancer {
                        $ok = true;
                        for ( $i = 1; $i < $serverCount; $i++ ) {
                                if ( $this->mLoads[$i] > 0 ) {
-                                       $ok = $this->doWait( $i, true, $timeout ) && $ok;
+                                       $start = microtime( true );
+                                       $ok = $this->doWait( $i, true, max( 1, (int)$timeout ) ) && $ok;
+                                       $timeout -= ( microtime( true ) - $start );
+                                       if ( $timeout <= 0 ) {
+                                               break; // timeout reached
+                                       }
                                }
                        }
                } finally {
index d403ab5..a7f53df 100644 (file)
@@ -2128,15 +2128,6 @@ class WikiPage implements Page, IDBAccessObject {
                $edit->newContent = $content;
                $edit->oldContent = $this->getContent( Revision::RAW );
 
-               // NOTE: B/C for hooks! don't use these fields!
-               $edit->newText = $edit->newContent
-                       ? ContentHandler::getContentText( $edit->newContent )
-                       : '';
-               $edit->oldText = $edit->oldContent
-                       ? ContentHandler::getContentText( $edit->oldContent )
-                       : '';
-               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialFormat ) : '';
-
                if ( $edit->output ) {
                        $edit->output->setCacheTime( wfTimestampNow() );
                }
index 07944d4..c6a10ae 100644 (file)
@@ -337,8 +337,8 @@ class CoreParserFunctions {
                // default
                $gender = User::getDefaultOption( 'gender' );
 
-               // allow prefix.
-               $title = Title::newFromText( $username );
+               // allow prefix and normalize (e.g. "&#42;foo" -> "*foo" ).
+               $title = Title::newFromText( $username, NS_USER );
 
                if ( $title && $title->inNamespace( NS_USER ) ) {
                        $username = $title->getText();
@@ -1005,10 +1005,10 @@ class CoreParserFunctions {
                if ( $argA == 'nowiki' ) {
                        // {{filepath: | option [| size] }}
                        $isNowiki = true;
-                       $parsedWidthParam = $parser->parseWidthParam( $argB );
+                       $parsedWidthParam = Parser::parseWidthParam( $argB );
                } else {
                        // {{filepath: [| size [|option]] }}
-                       $parsedWidthParam = $parser->parseWidthParam( $argA );
+                       $parsedWidthParam = Parser::parseWidthParam( $argA );
                        $isNowiki = ( $argB == 'nowiki' );
                }
 
index dcd16eb..831c1ff 100644 (file)
@@ -5210,7 +5210,7 @@ class Parser {
 
                                # Special case; width and height come in one variable together
                                if ( $type === 'handler' && $paramName === 'width' ) {
-                                       $parsedWidthParam = $this->parseWidthParam( $value );
+                                       $parsedWidthParam = self::parseWidthParam( $value );
                                        if ( isset( $parsedWidthParam['width'] ) ) {
                                                $width = $parsedWidthParam['width'];
                                                if ( $handler->validateParam( 'width', $width ) ) {
@@ -6053,11 +6053,12 @@ class Parser {
         * Parsed a width param of imagelink like 300px or 200x300px
         *
         * @param string $value
+        * @param bool $parseHeight
         *
         * @return array
         * @since 1.20
         */
-       public function parseWidthParam( $value ) {
+       public static function parseWidthParam( $value, $parseHeight = true ) {
                $parsedWidthParam = [];
                if ( $value === '' ) {
                        return $parsedWidthParam;
@@ -6065,7 +6066,7 @@ class Parser {
                $m = [];
                # (T15500) In both cases (width/height and width only),
                # permit trailing "px" for backward compatibility.
-               if ( preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
+               if ( $parseHeight && preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
                        $width = intval( $m[1] );
                        $height = intval( $m[2] );
                        $parsedWidthParam['width'] = $width;
index 17b62d7..7b888ab 100644 (file)
@@ -79,7 +79,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        /**
         * Get the ParserOutput from this object, or false in case of failure
         *
-        * @return ParserOutput
+        * @return ParserOutput|bool
         */
        public function getParserOutput() {
                return $this->parserOutput;
index 0391b30..a23d644 100644 (file)
@@ -1617,7 +1617,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         * @param PreferencesForm $form
         * @return bool|Status|string
         */
-       protected function legacySaveFormData( $formData, PreferencesForm $form ) {
+       public function legacySaveFormData( $formData, PreferencesForm $form ) {
                return $this->saveFormData( $formData, $form );
        }
 
index 6308461..ae1ab58 100644 (file)
@@ -291,7 +291,7 @@ class ExtensionRegistry {
 
                        // Optimistic: If the global is not set, or is an empty array, replace it entirely.
                        // Will be O(1) performance.
-                       if ( !isset( $GLOBALS[$key] ) || ( is_array( $GLOBALS[$key] ) && !$GLOBALS[$key] ) ) {
+                       if ( !array_key_exists( $key, $GLOBALS ) || ( is_array( $GLOBALS[$key] ) && !$GLOBALS[$key] ) ) {
                                $GLOBALS[$key] = $val;
                                continue;
                        }
index 4253193..7ac24c5 100644 (file)
@@ -543,7 +543,7 @@ abstract class SearchEngine {
                                $this->setLimitOffset( $fallbackLimit );
                                $fallbackSearchResult = $this->completionSearch( $fbs );
                                $results->appendAll( $fallbackSearchResult );
-                               $fallbackLimit -= count( $fallbackSearchResult );
+                               $fallbackLimit -= $fallbackSearchResult->getSize();
                                if ( $fallbackLimit <= 0 ) {
                                        break;
                                }
index 6679098..a14afe0 100644 (file)
@@ -4,8 +4,6 @@
  * the usual skin elements but still using CSS, JS, and such via OutputPage and
  * ResourceLoader.
  *
- * Created on Sep 08, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index d3e453a..222a762 100644 (file)
@@ -4,8 +4,6 @@
  * the usual skin elements but still using CSS, JS, and such via OutputPage and
  * ResourceLoader.
  *
- * Created on Sep 08, 2014
- *
  * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
index 4c3ca54..9f666c2 100644 (file)
@@ -809,7 +809,7 @@ class SpecialPage implements MessageLocalizer {
        public function getFinalGroupName() {
                $name = $this->getName();
 
-               // Allow overbidding the group from the wiki side
+               // Allow overriding the group from the wiki side
                $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
                if ( !$msg->isBlank() ) {
                        $group = $msg->text();
index 69844d9..5f5d1cd 100644 (file)
@@ -1,15 +1,13 @@
 <?php
-/**
- * MediaWiki Widgets – ComplexNamespaceInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
  * checkboxes to include associated namespace or to invert selection.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class ComplexNamespaceInputWidget extends \OOUI\Widget {
 
index e111a97..ca6c848 100644 (file)
@@ -1,14 +1,12 @@
 <?php
-/**
- * MediaWiki Widgets – ComplexTitleInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * Complex title input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class ComplexTitleInputWidget extends \OOUI\Widget {
 
index afa6570..975f8e9 100644 (file)
@@ -1,10 +1,4 @@
 <?php
-/**
- * MediaWiki Widgets – DateInputWidget class.
- *
- * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
 
 namespace MediaWiki\Widget;
 
@@ -14,6 +8,8 @@ use DateTime;
  * Date input widget.
  *
  * @since 1.29
+ * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class DateInputWidget extends \OOUI\TextInputWidget {
 
index b726f3c..21e3d79 100644 (file)
@@ -1,16 +1,14 @@
 <?php
-/**
- * MediaWiki Widgets – DateTimeInputWidget class.
- *
- * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 use OOUI\Tag;
 
 /**
  * Date-time input widget.
+ *
+ * @copyright 2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class DateTimeInputWidget extends \OOUI\InputWidget {
 
index 6a0c0da..0840886 100644 (file)
@@ -1,14 +1,12 @@
 <?php
-/**
- * MediaWiki Widgets – NamespaceInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * Namespace input widget. Displays a dropdown box with the choice of available namespaces.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
 
index e468396..6fed794 100644 (file)
@@ -1,14 +1,12 @@
 <?php
-/**
- * MediaWiki Widgets – SearchInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * Search input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class SearchInputWidget extends TitleInputWidget {
 
index 994906a..5ceed4c 100644 (file)
@@ -1,17 +1,15 @@
 <?php
-/**
- * MediaWiki Widgets – SelectWithInputWidget class.
- *
- * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
-use \OOUI\TextInputWidget;
-use \OOUI\DropdownInputWidget;
+use OOUI\DropdownInputWidget;
+use OOUI\TextInputWidget;
 
 /**
  * Select and input widget.
+ *
+ * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class SelectWithInputWidget extends \OOUI\Widget {
 
index aca9163..db1ea0b 100644 (file)
@@ -1,14 +1,12 @@
 <?php
-/**
- * MediaWiki Widgets – TitleInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * Title input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class TitleInputWidget extends \OOUI\TextInputWidget {
 
index 9385b48..36f63c1 100644 (file)
@@ -1,14 +1,12 @@
 <?php
-/**
- * MediaWiki Widgets – UserInputWidget class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
 /**
  * User input widget.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class UserInputWidget extends \OOUI\TextInputWidget {
 
index 69fa1f8..68cdad6 100644 (file)
@@ -1,16 +1,14 @@
 <?php
-/**
- * MediaWiki Widgets – UsersMultiselectWidget class.
- *
- * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
+
 namespace MediaWiki\Widget;
 
-use \OOUI\MultilineTextInputWidget;
+use OOUI\MultilineTextInputWidget;
 
 /**
  * Widget to select multiple users.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
  */
 class UsersMultiselectWidget extends \OOUI\Widget {
 
index f9631a1..f611358 100644 (file)
@@ -163,6 +163,8 @@ class LanguageConverter {
 
                $req = $this->getURLVariant();
 
+               Hooks::run( 'GetLangPreferredVariant', [ &$req ] );
+
                if ( $wgUser->isSafeToLoad() && $wgUser->isLoggedIn() && !$req ) {
                        $req = $this->getUserVariant();
                } elseif ( !$req ) {
index 7751439..85441b6 100644 (file)
        "specialpage-securitylevel-not-allowed-title": "Nie toegestaan",
        "cannotauth-not-allowed-title": "Geen toegang",
        "cannotauth-not-allowed": "U word nie toegelaat om die bladsy te gebruik nie",
-       "credentialsform-account": "Gebruikersnaam:"
+       "credentialsform-account": "Gebruikersnaam:",
+       "edit-error-short": "Fout: $1",
+       "edit-error-long": "Foute:\n\n$1"
 }
index 0f640cf..a714789 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "كائن فارغ",
        "content-json-empty-array": "مصفوفة فارغة",
-       "deprecated-self-close-category": "صفحات تستخدم وسوم أتش تي أم أل غير صالحة",
+       "deprecated-self-close-category": "صفحات تستخدم وسوم HTML غير صالحة",
        "deprecated-self-close-category-desc": "هذه الصفحة تحتوي على وسوم HTML مغلقة ذاتيا، مثل  <code>&lt;b/></code> أو <code>&lt;span/></code>. سلوك هذه سيتغير سريعا ليكون متوافقا مع معيار HTML5، لذا فاستخدامهم في نص الويكي ينبغي أن يتم الاستغناء عنه.",
        "duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
        "duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
        "rcfilters-activefilters": "المرشحات النشطة",
        "rcfilters-advancedfilters": "مرشحات متقدمة",
        "rcfilters-limit-title": "النتائج للعرض",
-       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|$1 تغييرات}}، $2",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|تغييرات}}، $2",
        "rcfilters-date-popup-title": "الفترة الزمنية للبحث",
        "rcfilters-days-title": "عدد الأيام الأخيرة",
        "rcfilters-hours-title": "عدد الساعات الأخيرة",
        "doubleredirects": "تحويلات مزدوجة",
        "doubleredirectstext": "هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.\nكل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف \"الحقيقية\"، التي من المفترض أن تحول إليها التحويلة الأولى.\nالمدخلات <del>المشطوبة</del> صححت.",
        "double-redirect-fixed-move": "نُقلت [[$1]].\nحُدّثت تلقائيا وهي الآن تحويلة إلى [[$2]].",
-       "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة.",
+       "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة",
        "double-redirect-fixer": "مصلح التحويل",
        "brokenredirects": "تحويلات مكسورة",
        "brokenredirectstext": "التحويلات التالية تصل لصفحات غير موجودة:",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
        "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "خطأ: $1",
+       "edit-error-long": "الأخطاء:\n\n$1",
        "revid": "المراجعة $1",
        "pageid": "معرف الصفحة $1",
        "rawhtml-notallowed": "لا يمكن استخدام وسوم &lt;html&gt; خارج الصفحات العادية.",
index 75fa204..de3b6af 100644 (file)
        "restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
        "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errores:\n\n$1",
        "revid": "revisión $1",
        "pageid": "ID de páxina $1",
        "rawhtml-notallowed": "Les etiquetes &lt;html&gt; nun pueden usase fuera de les páxines normales.",
index 5ed6939..988ecdf 100644 (file)
        "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
        "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
        "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
-       "credentialsform-account": "Иҫәп яҙмаһы исеме:"
+       "credentialsform-account": "Иҫәп яҙмаһы исеме:",
+       "edit-error-short": "Хата: $1"
 }
index 5436934..9b0dc5a 100644 (file)
        "grouppage-sysop": "{{ns:project}}:Адміністрацыя",
        "grouppage-bureaucrat": "{{ns:project}}:Бюракраты",
        "grouppage-suppress": "{{ns:project}}:Падаўляльнікі_вэрсіяў",
-       "right-read": "прагляд старонак",
-       "right-edit": "рэдагаваньне старонак",
-       "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
+       "right-read": "Ð\9fрагляд старонак",
+       "right-edit": "Рэдагаваньне старонак",
+       "right-createpage": "Стварэньне старонак (акрамя старонак абмеркаваньняў)",
        "right-createtalk": "стварэньне старонак абмеркаваньня",
        "right-createaccount": "стварэньне новых рахункаў удзельніка",
        "right-autocreateaccount": "Аўтаматычны ўваход з вонкавага рахунку ўдзельніка",
        "doubleredirects": "Двайныя перанакіраваньні",
        "doubleredirectstext": "На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.\n<del>Закрэсьленыя</del> элемэнты былі выпраўленыя.",
        "double-redirect-fixed-move": "[[$1]] была перанесеная.\nСтаронка аўтаматычна абноўленая і цяпер перанакіроўвае на [[$2]].",
-       "double-redirect-fixed-maintenance": "Аўтаматычнае выпраўленьне падвойнага перанакіраваньня з [[$1]] на [[$2]] падчас тэхнічнага абслугоўваньня.",
+       "double-redirect-fixed-maintenance": "Аўтаматычнае выпраўленьне падвойнага перанакіраваньня з [[$1]] на [[$2]] падчас тэхнічнага абслугоўваньня",
        "double-redirect-fixer": "Выпраўленьне перанакіраваньняў",
        "brokenredirects": "Некарэктныя перанакіраваньні",
        "brokenredirectstext": "Наступныя перанакіраваньні спасылаюцца на неіснуючыя старонкі:",
        "restrictionsfield-badip": "Няслушны IP-адрас ці дыяпазон: $1",
        "restrictionsfield-label": "Дазволеныя IP-дыяпазоны:",
        "restrictionsfield-help": "Адзін IP-адрас ці CIDR-дыяпазон на радок. Каб дазволіць усё, ужывайце:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Памылка: $1",
        "revid": "вэрсія $1",
        "pageid": "Ідэнтыфікатар старонкі $1",
        "rawhtml-notallowed": "&lt;html&gt;-тэгі ня могуць быць выкарыстаныя па-за звычайнымі старонкамі.",
index 791d60f..a569fc9 100644 (file)
        "tag-filter-submit": "Филтриране",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2)",
        "tag-mw-contentmodelchange": "промяна на модела на съдържание",
+       "tag-mw-rollback": "Отмяна",
        "tag-mw-undo": "Отмяна",
        "tags-title": "Етикети",
        "tags-intro": "Тук са изброени всички етикети, които могат да се ползват за отбелязване на редакциите, както и тяхното значение.",
        "linkaccounts-success-text": "Сметката беше свързана.",
        "linkaccounts-submit": "Свързване на сметки",
        "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+       "edit-error-short": "Грешка: $1",
+       "edit-error-long": "Грешки:\n\n$1",
        "revid": "версия $1"
 }
index 8e29c29..0898cd3 100644 (file)
@@ -36,7 +36,7 @@
        "tog-shownumberswatching": "धियान रखे वाला प्रयोगकर्ता लोग के संख्या देखावल जाव",
        "tog-oldsig": "राउर वर्तमान दसखत:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
-       "tog-uselivepreview": "लà¤\97ातार à¤\9dलà¤\95 (लाà¤\87व à¤ªà¥\8dरà¥\80वà¥\8dयà¥\82) à¤\87सà¥\8dतà¥\87माल à¤\95à¤\87ल à¤\9cाव",
+       "tog-uselivepreview": "पनà¥\8dना à¤\95à¥\87 à¤°à¥\80लà¥\8bड à¤\95à¤\87लà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤­à¥\80 à¤\9dलà¤\95 à¤¦à¥\87à¤\96ावल à¤\9cाय",
        "tog-forceeditsummary": "संपादन सारांश ना भरल गइल होखे त हमके सूचित कइल जाय",
        "tog-watchlisthideown": "धियानसूची से हमार खुद के संपादन छिपावल जाय",
        "tog-watchlisthidebots": "धियानसूची से बॉट संपादन छिपावल जाय",
        "speciallogtitlelabel": "टारगेट (टाइटिल या {{ns:user}}:प्रयोगकर्ता खाती प्रयोगकर्तानाँव):",
        "log": "सगरी लॉग",
        "all-logs-page": "सगरी पब्लिक लॉग",
+       "alllogstext": "{{SITENAME}} के सगरी मौजूद लॉग सब के कंबाइन डिस्प्ले।\nआप लॉग के प्रकार, प्रयोगकर्ता नाँव (केस सेंसेटिव), या प्रभावित पन्ना (इहो केस सेंसेटिव) बीछ के एकरा के कम आइटम पर फोकस के के देख सकी ला।",
        "logempty": "लॉग में कौनों मैचिंग आइटम ना बा।",
        "allpages": "सगरी पन्ना",
        "nextpage": "अगिला पन्ना ($1)",
        "usermessage-editor": "सिस्टम मसेंजर",
        "watchlist": "धियानसूची",
        "mywatchlist": "धियानसूची",
+       "watchlistfor2": "$1 खाती $2",
        "watch": "धियानसूची में डालीं",
        "watchthispage": "ई पन्ना ध्यानसूची में डालीं",
        "unwatch": "धियानसूची से हटाईं",
+       "watchlist-details": "{{PLURAL:$1|$1 पन्ना}} राउर धियानसूची में बा (आ वार्ता पन्ना)।",
+       "wlheader-showupdated": "राउर अंतिम विजिट के बाद जवना पन्ना सभ में बदलाव भइल बा ऊ <strong>मोट अच्छर</strong> में देखावल जात बाड़ें।",
+       "wlnote": "नीचे $3, $4 तक ले, आखिरी {{PLURAL:$2|घंटा|<strong>$2</strong> घंटा}} में भइल {{PLURAL:$1|अंतिम बदलाव बा|अंतिम <strong>$1</strong> बदलाव बाड़ें}}।",
        "wlshowlast": "पछिला $1 घंटा $2 दिन देखावल जाय",
+       "watchlist-options": "धियानसूची बिकल्प",
        "watching": "ध्यानसूची में जाते हुए",
        "unwatching": "ध्यानसूची से हटते हुए",
+       "enotif_reset": "सगरी पन्ना सभ देखल चिन्हित करीं",
        "created": "बनावल गईल",
        "actioncomplete": "काम पुरा भइल",
        "dellogpage": "हटवले के लिस्ट",
        "contribslink": "योगदान",
        "blocklogpage": "निष्क्रिय खाता",
        "blocklogentry": "[[$1]] के ब्लॉक कइल गइल, समाप्ती के अवधि $2 $3",
+       "reblock-logentry": "[[$1]] खातिर रोक सेटिंग बदलल गइल आ अब समाप्ती समय बा $2 $3",
        "block-log-flags-nocreate": "खाता निर्माण सक्षम नइखे",
        "proxyblocker": "प्रॉक्सी ब्लॉककर्ता",
        "movepagebtn": "पन्ना स्थांतरण करीं",
        "pageinfo-content-model": "पन्ना सामग्री के मॉडल",
        "pageinfo-robot-policy": "रोबोट द्वारा इंडेक्सिंग",
        "pageinfo-robot-index": "एलाऊ बा",
+       "pageinfo-robot-noindex": "डिसएलाऊ",
        "pageinfo-watchers": "पन्ना पर धियान रखे वाला लोग के संख्या",
        "pageinfo-few-watchers": "$1 से कम धियान रखे {{PLURAL:$1|वाला|वाला लोग}}",
        "pageinfo-redirects-name": "एह पन्ना पर आवे वाला अनुप्रेषणन के संख्या",
        "pageinfo-subpages-name": "एह पन्ना के उपपन्ना संख्या",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|अनुप्रेषण}}; $3 {{PLURAL:$3|गैर-अनुप्रेषण}})",
        "pageinfo-firstuser": "पन्ना बनावेवाला",
        "pageinfo-firsttime": "पन्ना बनावे के तारीख",
        "pageinfo-lastuser": "अंतिम संपादक",
        "pageinfo-recent-edits": "हाल के संपादन संख्या (पछिला $1 में)",
        "pageinfo-recent-authors": "हाल के बिभिन्न संपादक लोग के संख्या",
        "pageinfo-magic-words": "जादुई शब्द {{{{PLURAL:$1||शब्द|शब्द}}}} ($1)",
+       "pageinfo-hidden-categories": "छिपल {{PLURAL:$1|श्रेणी}} ($1)",
        "pageinfo-templates": "ट्रांसक्लूड {{PLURAL:$1|टेम्पलेट|टेम्पलेट सभ}} ($1)",
        "pageinfo-toolboxlink": "पन्ना से जुड़ल जानकारी",
        "pageinfo-contentpage": "सामग्री पन्ना के रूप में गिनती वाला",
        "nextdiff": "नया संपादन →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पन्ना}}",
        "file-info-size": "$1 × $2 पिक्सेल, फाइल साइज: $3, MIME टाइप: $4",
+       "file-info-size-pages": "$1 × $2 पिक्सेल, फाइल साइज: $3, MIME प्रकार: $4, $5 {{PLURAL:$5|पन्ना}}",
        "file-nohires": "ए से उच्च गुणवत्ता उपलब्ध नइखे।",
        "svg-long-desc": "एसवीजी फाइल, नॉमिनली $1 x $2 पिक्सल, फाइल के आकार: $3",
        "show-big-image": "ओरिजनल फाइल",
        "imgmultigo": "जाईं!",
        "imgmultigoto": "$1 पन्ना पर जाईं",
        "autoredircomment": "पन्ना [[$1]] पर अनुप्रेषित कइल गइल",
+       "watchlisttools-clear": "धियानसूची साफ करीं",
+       "watchlisttools-view": "प्रासंगिक बदलाव देखीं",
+       "watchlisttools-edit": "धियानसूची देखीं आ संपादित करीं",
+       "watchlisttools-raw": "मूल धियानसूची संपादित करीं",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|बात करीं]])",
        "version-no-ext-name": "[अज्ञात नाम]",
        "redirect": "फाइल, प्रयोगकर्ता, पन्ना रिवीजन या लॉग आइडी से अनुप्रेषण",
        "tags-active-no": "ना",
        "tags-hitcount": "$1 {{PLURAL:$1|बदलाव}}",
        "logentry-delete-delete": "$1 द्वारा पन्ना $3 {{GENDER:$2|हटा}} दिहल गइल",
+       "logentry-delete-restore": "$1 पन्ना $3 ($4) के वापस ले {{GENDER:$2|अइलें|अइली}}",
        "logentry-delete-revision": "$1 पन्ना $3 पर {{PLURAL:$5|रिवीजन|$5 रिवीजन सभ}} के विजिबिलिटी {{GENDER:$2|बदललें|बदलली}}: $4",
        "revdelete-content-hid": "छिपावल सामग्री",
        "revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
index 00ca8a7..0ecd719 100644 (file)
        "subject-preview": "বিষয়ের প্রাকদর্শন:",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
-       "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়:$8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"(ব্যবহারকারীকে) ইমেইল করুন\" সুবিধাটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং সুবিধাটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি সুবিধাটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
-       "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি à¦ à¦¿à¦\95ানাà¦\9fিà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦®à§\8dপাদনায় à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fমন à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\8fà¦\9fি à¦¬à§\8dযবহার à¦\95রà§\87à¦\9bà§\87ন, à¦¯à¦¾à¦\95à§\87 $1 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦¸à§\87à¦\9fি à¦¹à¦²:\n\n:<em>$2</em>\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর à¦¸à¦¾à¦¥à§\87 à¦\95িà¦\82বা à¦\85নà§\8dয à¦¯à§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦\8fà¦\87 à¦¬à¦¾à¦§à¦¾ à¦¸à¦\82à¦\95à§\8dরানà§\8dত à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, à¦¯à¦¦à¦¿ à¦\86পনি \"à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" à¦¸à§\81বিধাà¦\9fি à¦¬à§\8dযবহার à¦\95রতà§\87 à¦\9aান, à¦¤à¦¬à§\87 [[Special:Preferences|à¦\86পনার à¦ªà¦\9bনà§\8dদ à¦¤à¦¾à¦²à¦¿à¦\95াতà§\87]] à¦¯à¦¦à¦¿ à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f  à¦¥à¦¾à¦\95তà§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦\86পনার à¦¸à§\87à¦\9fি à¦¬à§\8dযবহারà§\87 à¦\95à§\8bন à¦¬à¦¾à¦§à¦¾ à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à¦¬à§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦¬à¦°à§\8dতমান à¦\86à¦\87পি à¦ à¦¿à¦\95ানা à¦¹à¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 à¦¬à¦¾à¦§à¦¾ à¦¨à¦\82 à¦¹à¦² #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা অন্য [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"ইমেইল করুন\" বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না যদি না আপনার [[Special:Preferences|অ্যাকাউন্টের পছন্দসমূহে]] একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট না করা হয়ে থাকে এবং আপনাকে এটি ব্যবহার করা থেকে অবরুদ্ধ না করা হয়ে থাকে।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি à¦ à¦¿à¦\95ানাà¦\9fিà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¸à¦®à§\8dপাদনায় à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fমন à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\8fà¦\9fি à¦¬à§\8dযবহার à¦\95রà§\87à¦\9bà§\87ন, à¦¯à¦¾à¦\95à§\87 $1 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦¸à§\87à¦\9fি à¦¹à¦²:\n\n:<em>$2</em>\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $7\n\nà¦\86পনি $1-à¦\8fর à¦¸à¦¾à¦¥à§\87 à¦\95িà¦\82বা à¦\85নà§\8dয à¦¯à§\87à¦\95à§\8bন [[{{MediaWiki:Grouppage-sysop}}|পà§\8dরশাসà¦\95à§\87র]] à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97 à¦\95রà§\87 à¦\8fà¦\87 à¦¬à¦¾à¦§à¦¾ à¦¸à¦\82à¦\95à§\8dরানà§\8dত à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nলà¦\95à§\8dষà§\8dয à¦\95রà§\81ন, à¦\86পনি \"à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87-মà§\87à¦\87ল à¦\95রà§\81ন\" à¦¬à§\88শিষà§\8dà¦\9fà§\8dযà¦\9fি à¦¬à§\8dযবহার à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾ à¦¯à¦¦à¦¿ à¦¨à¦¾ à¦\86পনার [[Special:Preferences|à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦ªà¦\9bনà§\8dদসমà§\82হà§\87]] à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦¨à¦¾ à¦¥à¦¾à¦\95à§\87 à¦\8fবà¦\82 à¦\86পনাà¦\95à§\87 à¦\8fà¦\9fি à¦¬à§\8dযবহার à¦\95রা à¦¥à§\87à¦\95à§\87 à¦\85বরà§\81দà§\8dধ à¦¨à¦¾ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87।\n\nà¦\86পনার à¦¬à¦°à§\8dতমান à¦\86à¦\87পি à¦ à¦¿à¦\95ানা à¦¹à¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 à¦¬à¦¾à¦§à¦¾ à¦¨à¦\82 à¦¹à¦² #$5।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "systemblockedtext": "আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে মিডিয়াউইকি দ্বারা বাধাদান করা হয়েছে। যে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
        "whitelistedittext": "পাতায় সম্পাদনা করতে অনুগ্রহ করে $1 করুন।",
        "blocklist-params": "বাধাদানের প্যারামিটার",
        "blocklist-reason": "কারণ",
        "ipblocklist-submit": "অনুসন্ধান",
-       "ipblocklist-localblock": "সà§\8dথানà§\80য় à¦¬à§\8dলà¦\95",
+       "ipblocklist-localblock": "সà§\8dথানà§\80য় à¦¬à¦¾à¦§à¦¾",
        "ipblocklist-otherblocks": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
        "infiniteblock": "অসীম",
        "expiringblock": "$1 তারিখের $2 এ মেয়াদোত্তীর্ণ হবে",
        "ipb_expiry_old": "মেয়াদোত্তীর্ণের সময় অতীত হয়েছে।",
        "ipb_expiry_temp": "লুকানো ব্যবহারকারীনাম বাধা চিরস্থায়ী হতে হবে।",
        "ipb_hide_invalid": "এই অ্যাকাউন্ট বাধা দেয়া সম্ভব নয়; এটি {{PLURAL:$1|একের অধিক|$1টি}} সম্পাদনা করেছে।",
-       "ipb_already_blocked": "\"$1\" à¦\87তিমধà§\8dযà§\87 à¦¬à§\8dলà¦\95",
+       "ipb_already_blocked": "\"$1\" à¦\87তিমধà§\8dযà§\87 à¦¬à¦¾à¦§à¦¾à¦ªà§\8dরাপà§\8dত।",
        "ipb-needreblock": "$1 ইতিমধ্যেই বাধাপ্রাপ্ত আছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
        "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধা|বাধাসমূহ}}",
        "unblock-hideuser": "আপনি এই ব্যবহারকারীকে বাধা মুক্ত করতে পারবেন না, কারণ এই ব্যবহারকারীদের ব্যবহারকারী নাম লুকানো রয়েছে।",
        "softblockrangesreason": "বেনামী অবদান আপনার আইপি ঠিকানা থেকে অনুমোদিত নয় ($1)। দয়া করে প্রবেশ করুন।",
        "xffblockreason": "X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
-       "ipbblocked": "à¦\86পনি à¦\85নà§\8dয à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95রà§\80à¦\95à§\87 à¦¬à§\8dলà¦\95 à¦¬à¦¾ à¦\86নবà§\8dলà¦\95 à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\86পনি à¦¨à¦¿à¦\9cà§\87à¦\87 à¦¬à§\8dলà¦\95 à¦°à¦¯à¦¼à§\87à¦\9bà§\87ন",
+       "ipbblocked": "à¦\86পনি à¦\85নà§\8dয à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95রà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦¬à¦¾ à¦¬à¦¾à¦§à¦¾ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\86পনি à¦¨à¦¿à¦\9cà§\87à¦\87 à¦\85বরà§\81দà§\8dধ à¦°à¦¯à¦¼à§\87à¦\9bà§\87ন।",
        "ipbnounblockself": "আপনি নিজেকে আনব্লক করতে পারবেন না",
        "lockdb": "ডাটাবেজ অবরুদ্ধ করা হোক",
        "unlockdb": "ডাটাবেজ খুলে দেওয়া হোক",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
        "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "ত্রুটি: $1",
+       "edit-error-long": "ত্রুটিসমূহ:\n\n$1",
        "revid": "সংশোধন $1",
        "pageid": "পাতার আইডি $1",
        "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
index 125c4a8..1780f90 100644 (file)
        "category-empty": "<em>Ova kategorija trenutno ne sadrži članke ni medije.</em>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Skrivene kategorije",
-       "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Sljedeća stranica je|Sljedeće $1 stranice su|Sljedećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Sljedeća stranica je|Sljedeće $1 stranice su|Sljedećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
        "category-file-count": "{{PLURAL:$2|Ova kategorija ima slijedeću $1 datoteku.|{{PLURAL:$1|Prikazana je $1 datoteka|Prikazane su $1 datoteke|Prikazano je $1 datoteka}} u ovoj kategoriji, od ukupno $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Slijedeća $1 datoteka je|Slijedeće $1 datoteke su|Slijedećih $1 datoteka je}} u ovoj kategoriji.",
index 6f94d64..b63d3fb 100644 (file)
        "userjsispublic": "Tingueu en compte que les subpàgines de JavaScript no haurien de contenir dades confidencials perquè poden ser visibles per altres usuaris.",
        "restrictionsfield-badip": "Adreça o interval d'IP no vàlid: $1",
        "restrictionsfield-label": "Intervals d'IP permesos:",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errors:\n\n$1",
        "revid": "revisió $1",
        "pageid": "ID de pàgina $1",
        "gotointerwiki": "A punt d’abandonar {{SITENAME}}",
index 86c34dc..0e9bed7 100644 (file)
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "recentchanges-submit": "Гайта",
+       "rcfilters-legend-heading": "<strong>Дацдарийн могӀам:</strong>",
        "rcfilters-other-review-tools": "Талларан кхин гӀирсаш",
        "rcfilters-group-results-by-page": "Карийнарш, агӀонгахь тобанаш ян",
        "rcfilters-activefilters": "Жигара литтарш",
        "autosumm-blank": "Агӏон чулацам дӏабяккхина",
        "autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
        "autoredircomment": "[[$1]] тӀе хьажийна",
+       "autosumm-removed-redirect": "ДӀаяьккхина дӀасхьажог [[$1]]",
        "autosumm-new": "Керла агӀо: «$1»",
        "autosumm-newblank": "Кхоьллина еса агӀо",
        "lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "tag-filter-submit": "Литта",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2)",
        "tag-mw-new-redirect": "Керла дӀасахьажорг",
+       "tag-mw-removed-redirect": "дӀаяьккхина дӀасхьажорг",
        "tag-mw-rollback": "Юхаяккха",
        "tag-mw-undo": "цаоьшу",
        "tags-title": "Билгалонаш",
index a7b5d7a..f6da1db 100644 (file)
        "actionthrottled": "چالاکی پێشی پێ گیرا",
        "actionthrottledtext": "بە مەبەستی پێشگریی لە خراپکاری، ڕێگە نادرێت تۆ لە ماوەیەکی کورت دا لە سەر یەک ئەمە زۆر جار ئەنجام بدەی، ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
        "protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
-       "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
+       "viewsourcetext": "دەتوانیت سەرچاوەی ئەم پەڕەیە ببینیت و لەبەری بگریتەوە.",
        "viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
        "protectedinterface": "ئەم پەڕەیە دەقی ڕواڵەتی نەرمامێری ئەم ویکییە نیشان دەدات و بۆ بەرگری لە خراپکاری پارێزراوە.\nبۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [https://translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
        "editinginterface": "<strong>ھۆشیار بە:</strong> خەریکی دەستکاریی پەڕەیەک دەکەیت کە بۆ دابین کردنی دەقی ڕووکاری نەرمامێر بەکاردێت.\nگۆڕانکارییەکان لەم پەڕەیەدا لە سەر ڕواڵەتی پەڕەکان بۆ بەکارھێنەرانی تر لەم ویکییەدا کاریگەر دەبێت.",
        "recentchanges-submit": "نیشانی بدە",
        "rcfilters-legend-heading": "<strong>پێرستی ناوبڕەکان:</strong>",
        "rcfilters-other-review-tools": "ئامرازەکانی تری بەسەرداچوونەوە",
+       "rcfilters-group-results-by-page": "ئەنجامەکان بە پێی پەڕە کۆبکەرەوە",
        "rcfilters-activefilters": "پاڵێوەرە چالاکەکان",
        "rcfilters-advancedfilters": "پاڵوێنە پێشکەوتووەکان",
+       "rcfilters-limit-title": "ئەنجام بۆ نیشاندان",
+       "rcfilters-limit-and-date-label": "$1 گۆڕانکاری، $2",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|ڕۆژ}}",
        "rcfilters-quickfilters": "پاڵوێنە پاشەکەوتکراوەکان",
        "rcfilters-savedqueries-defaultlabel": "پاڵوێنە پاشەکەوتکراوەکان",
+       "rcfilters-savedqueries-setdefault": "بە بنەڕەتی کارای بکە",
+       "rcfilters-savedqueries-new-name-label": "ناو",
+       "rcfilters-savedqueries-new-name-placeholder": "وەسفی کاری پاڵوێنەکە بکە",
+       "rcfilters-savedqueries-apply-label": "دروستکردنی پاڵوێنە",
+       "rcfilters-savedqueries-cancel-label": "ھەڵوەشاندنەوە",
+       "rcfilters-savedqueries-add-new-title": "پاشەکەوتکردنی ھەڵبژاردەکانی پاڵوێنەکەی ئێستا",
+       "rcfilters-restore-default-filters": "ھێنانەوەی پاڵوێنە بنچینەییەکان",
        "rcfilters-clear-all-filters": "ھەموو فیلتەرەکان بسڕەوە",
+       "rcfilters-show-new-changes": "نیشاندانی نوێترین دەستکارییەکان",
        "rcfilters-search-placeholder": "پاڵاوتنی گۆڕانکارییە نوێیەکان (بگەڕێ یان دەست بە نووسین بکە)",
-       "rcfilters-filterlist-title": "فیلتەرەکان",
+       "rcfilters-empty-filter": "ھیچ پاڵوێنەیەک چالاک نییە. ھەموو بەشدارییەکان نیشان دەدرێن.",
+       "rcfilters-filterlist-title": "پاڵێوکەکان",
        "rcfilters-filterlist-whatsthis": "ئەمە چۆن کاردەکات؟",
+       "rcfilters-filterlist-feedbacklink": "ڕای خۆتمان پێ بڵێ لەسەر ئەم ئامرازە نوێیانە",
+       "rcfilters-highlightbutton-title": "ئەنجامەکان ڕووناک بکە",
        "rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
+       "rcfilters-filtergroup-authorship": "بەشدارییەکان",
        "rcfilters-filter-editsbyself-label": "گۆڕانکارییەکانت",
        "rcfilters-filter-editsbyself-description": "بەشدارییەکانی خۆت.",
        "rcfilters-filter-editsbyother-label": "گۆڕانکارییەکانی کەسانی تر",
        "rcfilters-filter-editsbyother-description": "ھەموو گۆڕانکارییەکان بێجگە لەوەی خۆت",
+       "rcfilters-filtergroup-userExpLevel": "ئەزموونی بەکارھێنەران",
        "rcfilters-filter-user-experience-level-registered-label": "تۆمارکراو",
        "rcfilters-filter-user-experience-level-registered-description": "ئەو بەکارھێنەرانەی لە ژوورەوەن",
        "rcfilters-filter-user-experience-level-unregistered-label": "تۆمارنەکراوەکان",
        "rcfilters-filter-user-experience-level-unregistered-description": "ئەو بەکارھێنەرانەی لە ژوورەوە نین",
        "rcfilters-filter-user-experience-level-newcomer-label": "تازەکاران",
        "rcfilters-filter-user-experience-level-newcomer-description": "کەمتر لە ١٠ دەستکاری و ٤ ڕۆژ لە چالاک بوون",
+       "rcfilters-filter-user-experience-level-learner-label": "خوێندکاران",
+       "rcfilters-filter-user-experience-level-learner-description": "ئەو بەکارھێنەرە تۆمارکراوانەی ئاستی ئەزموونەکەیان دەکەوێتە نێوان «تازەکاران» و «بەکارھێنەرانی پێشکەوتوو.»",
        "rcfilters-filter-user-experience-level-experienced-label": "بەکارھێنەرانی پێشکەوتوو",
        "rcfilters-filter-user-experience-level-experienced-description": "زیاتر لە ٣٠ ڕۆژ لە چالاکی و ٥٠٠ دەستکاری",
+       "rcfilters-filtergroup-automated": "دەستکارییە خۆگەڕەکان",
        "rcfilters-filter-bots-label": "بۆت",
+       "rcfilters-filter-bots-description": "ئەو دەستکارییانەی بە ئامرازە خۆگەڕەکان کراون",
        "rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
        "rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
        "rcfilters-filter-patrolled-label": "پاسدراو",
        "rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
        "rcfilters-filter-unpatrolled-label": "پاسنەدراوەکان",
        "rcfilters-filter-unpatrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیارینەکراون",
+       "rcfilters-filtergroup-significance": "بەسوود",
        "rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
        "rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
        "rcfilters-filter-major-label": "دەستکارییە نا-بچووکەکان",
        "rcfilters-filtergroup-watchlist": "پەڕەکانی لە پێڕستی چاودێریتن",
        "rcfilters-filter-watchlist-watched-label": "لە پێرستی چاودێری",
        "rcfilters-filter-watchlist-watched-description": "گۆڕانکاری لە پەڕەکانی کە لە پێڕستی چاودێریتن.",
+       "rcfilters-filter-watchlist-watchednew-label": "گۆڕانکارییە نوێکانی پێڕستی چاودێری",
        "rcfilters-filter-watchlist-notwatched-label": "لە پێڕستی چاودێریت نییە",
+       "rcfilters-filter-watchlist-notwatched-description": "ھەمووشتێک جگە لە گۆڕانکاریی پەڕەکانی پێڕستی چاودێرییەکەت.",
+       "rcfilters-filter-watchlistactivity-unseen-label": "گۆڕانکارییە نەبینراوەکان",
+       "rcfilters-filter-watchlistactivity-unseen-description": "گۆڕانکاریی ئەو پەڕانەی سەردانت نەکردوون لەوەتەی گۆڕانکارییان تێدا کراوە.",
+       "rcfilters-filter-watchlistactivity-seen-label": "گۆڕانکارییە بینراوەکان",
        "rcfilters-filtergroup-changetype": "جۆری گۆڕانکاری",
        "rcfilters-filter-pageedits-label": "دەستکارییەکانی پەڕە",
+       "rcfilters-filter-pageedits-description": "دەستکارییەکانی ناوەڕۆکی ویکیپیدیا، لێدوانەکان، وەسفی پۆلەکان...",
        "rcfilters-filter-newpages-label": "دروستکردنی پەڕەکان",
+       "rcfilters-filter-newpages-description": "ئەو دەستکارییانەی پەڕەی نوێ دروست دەکەن.",
        "rcfilters-filter-categorization-label": "گۆڕانکاری پۆلەکان",
        "rcfilters-filter-logactions-label": "کردارە لۆگییەکان",
+       "rcfilters-filter-logactions-description": "کردارە بەڕێوەبەرییەکان، دروستکردنی ھەژمارەکان، سڕینەوەی پەڕەکان، بارکردنەکان...",
+       "rcfilters-filtergroup-lastRevision": "دوایین پێداچوونەوەکان",
+       "rcfilters-filter-lastrevision-label": "دوایین پێداچوونەوە",
+       "rcfilters-filter-lastrevision-description": "تەنیا دوایین گۆڕانکاری سەر پەڕەکان.",
+       "rcfilters-filter-previousrevision-label": "دوایین گۆڕانکاری نا",
+       "rcfilters-filter-previousrevision-description": "ھەموو ئەو گۆڕانکارییەی «نوێترین وەشان» نین.",
+       "rcfilters-view-tags": "دەستکارییە تاگکراوەکان",
+       "rcfilters-view-tags-help-icon-tooltip": "زیاتر بزانە لەسەر دەستکارییە تاگکراوەکان",
+       "rcfilters-liveupdates-button": "نوێکردنەوەی زیندوو",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە <strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
+       "changecontentmodel-legend": "گۆڕینی مۆدێلی ناوەڕۆک",
        "changecontentmodel-title-label": "سەرناوی پەڕە",
        "changecontentmodel-reason-label": "هۆکار:",
        "changecontentmodel-submit": "گۆڕین",
+       "log-name-contentmodel": "لۆگی گۆڕینی مۆدێلی ناوەڕۆک",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|مۆدێلی}} ناوەڕۆکی پەڕەی $3ی لە «$4» گۆڕی بە «$5»",
        "logentry-contentmodel-change-revertlink": "گەڕاندنەوە",
        "logentry-contentmodel-change-revert": "گەڕاندنەوە",
        "protectlogpage": "لۆگی پاراستن",
        "protect-cascadeon": "ھەنووکە ئەم پەڕە پارێزراوە بۆ ئەوەی کە لە نێو ئەم {{PLURAL:$1|پەڕە کە پاراستنی تاڤگەییی|پەڕانە کە پاراستنی تاڤگەیییان}} بۆ چالاککراوە، ھێنراوە.\nدەتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، بەڵام ھیچ کاریگەرییەکی نابێت لە سەر پاراستنی تاڤگەیی",
        "protect-default": "بە ھەموو بەکارھێنەران ڕێگە بدە",
        "protect-fallback": "تەنیا بە بەکارھێنەران بە مافی «$1» ڕێگە بدە",
-       "protect-level-autoconfirmed": "تەنیا بە بەکارھێنەرانی پەسندکراو ڕێگە بدە",
+       "protect-level-autoconfirmed": "تەنیا بە [[ویکیپیدیا:بەکارھێنەرانی پەسندکراوی خۆگەڕ|بەکارھێنەرانی پەسندکراوی خۆگەڕ ]] ڕێگە بدە",
        "protect-level-sysop": "تەنیا بە بەڕێوەبەران ڕێگە بدە",
        "protect-summary-cascade": "تاڤگەیی",
        "protect-expiring": "بەسەردەچێ لە ڕێکەوتی $1 (UTC)",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|پاراستنی}} لەسەر $3 لابرد",
        "logentry-protect-protect": "$1 $3ی {{GENDER:$2|پاراست}} $4",
        "logentry-protect-modify": "$1 ئاستی پاراستنی $3ی {{GENDER:$2|گۆڕی}} $4",
+       "logentry-protect-modify-cascade": "$1 $2 ئاستی پاراستنی $3ی $4 گۆڕی [تاڤگەیی]",
        "logentry-rights-rights": "$1 ئەندامێتیی {{GENDER:$6|$3}}ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
        "logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
        "logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
index b79aaec..fa1f3db 100644 (file)
        "restrictionsfield-badip": "Neplatná IP adresa nebo rozsah: $1",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
        "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Chyba: $1",
+       "edit-error-long": "Chyby:\n\n$1",
        "revid": "revize $1",
        "pageid": "Stránka s ID $1",
        "rawhtml-notallowed": "Značky &lt;html&gt; nelze používat mimo běžné stránky.",
index b40c032..400c353 100644 (file)
        "preview": "Pòdzérk",
        "showpreview": "Wëskrzëni pòdzérk",
        "showdiff": "Wëskrzëni zjinaczi",
-       "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto dobëjesz rozmajité ùdogòdnienia.",
+       "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto dobëjesz rozmajité ùdogòdnienia.",
        "anonpreviewwarning": "Të nie jes wlogòwóny. Jeżlë wprowadzysz jaczés zjinaczi, twòja adresa IP mdze ùmieszczónô w historie edicji starnë.",
        "summary-preview": "Pòdzérk òpisënka zjinaków:",
        "blockedtitle": "Brëkòwnik je zascëgóny",
index 1103592..9a5e276 100644 (file)
        "recentchangeslinked-feed": "Relaterede ændringer",
        "recentchangeslinked-toolbox": "Relaterede ændringer",
        "recentchangeslinked-title": "Ændringer der relaterer til \"$1\"",
-       "recentchangeslinked-summary": "Dette er en liste over de seneste ændringer af sider, der linkes til fra en bestemt side (eller medlemmer af en bestemt kategori).\nSider på [[Special:Watchlist|din overvågningsliste]] er vist med '''fed''' skrift.",
+       "recentchangeslinked-summary": "Indtast et sidenavn for at sændringer på sider henvist til eller fra den side. (For at se medlemmer af en kategori indtast Category:Kategorinavn). Ændringer til sider på [[Special:Watchlist|din overvågningsliste]] er vist med <strong>fed</strong> skrift.",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet",
        "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
        "removecredentials-invalidsubpage": "$1 er ikke en gyldig type for akkreditiver.",
        "removecredentials-success": "Dine akkreditiver er blevet fjernet.",
        "credentialsform-provider": "Akkreditivtype:",
-       "credentialsform-account": "Kontonavn:"
+       "credentialsform-account": "Kontonavn:",
+       "edit-error-short": "Fejl: $1"
 }
index e7dcd97..dfe7008 100644 (file)
@@ -38,6 +38,7 @@
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
        "tog-enotifrevealaddr": "Ihre E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen",
+       "cancel": "Abbrechen",
        "view-pool-error": "Entschuldigen Sie bitte, dass die Server im Moment überlastet sind.\nZu viele Benutzer versuchen, diese Seite zu besuchen.\nBitte warten Sie einige Minuten, bevor Sie es noch einmal versuchen.\n\n$1",
        "generic-pool-error": "Entschuldigen Sie bitte, dass die Server im Moment überlastet sind.\nZu viele Benutzer wollen diese Ressource ansehen.\nBitte warten Sie einen Moment, bevor Sie sie erneut aufrufen.",
        "badaccess-group0": "Sie haben nicht die erforderlichen Benutzerrechte für diese Aktion.",
        "changepassword-success": "Ihr Passwort wurde erfolgreich geändert.",
        "changepassword-throttled": "Sie haben zu viele Anmeldeversuche unternommen.\nBitte warten Sie $1, bevor Sie es erneut versuchen.",
        "resetpass-no-info": "Sie müssen sich anmelden, um auf diese Seite direkt zuzugreifen.",
+       "resetpass-submit-cancel": "Abbrechen",
        "resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.",
        "resetpass-recycled": "Bitte setzen Sie Ihr Passwort auf ein anderes Passwort als Ihr aktuelles fest.",
        "resetpass-temp-emailed": "Sie haben sich mit einem temporären E-Mail-Code angemeldet. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort festlegen:",
        "filename-bad-prefix": "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.\nBitte geben Sie der Datei einen Namen, der den Inhalt besser beschreibt.",
        "upload-file-error-text": "Bei der Erstellung einer temporären Datei auf dem Server ist ein interner Fehler aufgetreten.\nBitte informieren Sie einen [[Special:ListUsers/sysop|Administrator]].",
        "upload-misc-error-text": "Beim Hochladen ist ein unbekannter Fehler aufgetreten.\nPrüfen Sie die URL auf Fehler, den Online-Status der Seite und versuchen es erneut.\nWenn das Problem weiter besteht, informieren Sie einen [[Special:ListUsers/sysop|Administrator]].",
+       "upload-dialog-button-cancel": "Abbrechen",
        "uploadstash-badtoken": "Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil Ihre Sitzungsdaten abgelaufen sind. Bitte versuchen Sie es erneut.",
        "img-auth-nopathinfo": "PATH_INFO fehlt.\nIhr Server ist nicht dafür eingerichtet, diese Information weiterzugeben.\nSie könnte CGI-gestützt sein und kann daher img_auth nicht ermöglichen.\nSiehe auch http://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-nologinnWL": "Sie sind nicht angemeldet und „$1“ ist nicht in der weißen Liste.",
        "dberr-outofdate": "Beachten Sie, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.",
        "feedback-bugcheck": "Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.",
        "feedback-bugornote": "Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].\nAnderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
+       "feedback-cancel": "Abbrechen",
        "feedback-thanks": "Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.",
-       "changecredentials": "Anmeldeinformationen ändern"
+       "authmanager-provider-password": "Passwortbasierte Authentifizierung",
+       "changecredentials": "Anmeldeinformationen ändern",
+       "changecredentials-submit": "Anmeldeinformationen ändern",
+       "credentialsform-provider": "Typ der Anmeldeinformationen:",
+       "credentialsform-account": "Benutzername:"
 }
index 29fe73c..492d0cd 100644 (file)
        "doubleredirects": "Doppelte Weiterleitungen",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
        "double-redirect-fixed-move": "[[$1]] wurde verschoben.\nDie Seite wurde automatisch aktualisiert und leitet nun nach [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitungen",
        "brokenredirectstext": "Diese Spezialseite listet Weiterleitungen auf nicht existierende Seiten auf.",
        "restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
        "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+       "edit-error-short": "Fehler: $1",
+       "edit-error-long": "Fehler:\n\n$1",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
        "rawhtml-notallowed": "&lt;html&gt;-Tags können nicht außerhalb von normalen Seiten verwendet werden.",
index e0cdc7d..c63cda9 100644 (file)
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
-       "group-membership-link-with-expiry": "$1 (μέχρι τις $3 στις $4)",
+       "group-membership-link-with-expiry": "$1 (μέχρι τις $2)",
        "prefs-registration": "Χρόνος εγγραφής:",
        "yourrealname": "Πραγματικό όνομα:",
        "yourlanguage": "Γλώσσα:",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
-       "userrights-expiry-current": "Λήγει στις $2 στις $3",
+       "userrights-expiry-current": "Λήγει $1",
        "userrights-expiry-none": "Δεν λήγει",
        "userrights-expiry": "Λήγει:",
        "userrights-expiry-existing": "Υπάρχουσα ώρα λήξης: $3, $2",
        "rcfilters-activefilters": "Ενεργά φίλτρα",
        "rcfilters-advancedfilters": "Σύνθετα Φίλτρα",
        "rcfilters-limit-title": "Αλλαγές προς εμφάνιση",
-       "rcfilters-limit-and-date-label": "{{PLURAL:$1|αλλαγή|$1 αλλαγές}}, $2",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|αλλαγή|αλλαγές}}, $2",
        "rcfilters-date-popup-title": "Χρονική περίοδος αναζήτησης",
        "rcfilters-days-title": "Πρόσφατες ημέρες",
        "rcfilters-hours-title": "Πρόσφατες ώρες",
        "recentchangeslinked-feed": "Σχετικές αλλαγές",
        "recentchangeslinked-toolbox": "Σχετικές αλλαγές",
        "recentchangeslinked-title": "Αλλαγές σχετικές με το «$1»",
-       "recentchangeslinked-summary": "Î\91Ï\85Ï\84Ï\8cÏ\82 ÎµÎ¯Î½Î±Î¹ Î­Î½Î± ÎºÎ±Ï\84άλογοÏ\82 Î±Î»Î»Î±Î³Ï\8eν Ï\80οÏ\85 Î­Î³Î¹Î½Î±Î½ Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84α Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδέονÏ\84αι Î±Ï\80Ï\8c Î¼Î¹Î± ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένη Ï\83ελίδα (ή Ï\83ε Î¼Î­Î»Î· Î¼Î¹Î±Ï\82 ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένηÏ\82 ÎºÎ±Ï\84ηγοÏ\81ίαÏ\82).\nΣελίδεÏ\82 Ï\80οÏ\85 Ï\85Ï\80άÏ\81Ï\87οÏ\85ν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ '''ένÏ\84ονεÏ\82'''.",
+       "recentchangeslinked-summary": "Î\95ιÏ\83αγάγεÏ\84ε Î­Î½Î± Ï\8cνομα Ï\83ελίδαÏ\82 Î³Î¹Î± Î½Î± Î´ÎµÎ¯Ï\84ε Ï\84ιÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδέονÏ\84αι Î® Î±Ï\80Ï\8c Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα. (Î\93ια Î½Î± Î´ÎµÎ¯Ï\84ε Ï\84α Î¼Î­Î»Î· Î¼Î¹Î±Ï\82 ÎºÎ±Ï\84ηγοÏ\81ίαÏ\82, ÎµÎ¹Ï\83αγάγεÏ\84ε Î\9aαÏ\84ηγοÏ\81ία:Î\8cνομα ÎºÎ±Ï\84ηγοÏ\81ίαÏ\82.)\nÎ\91λλαγέÏ\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\83Ï\84ην [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ <strong>ένÏ\84ονεÏ\82</strong>.",
        "recentchangeslinked-page": "Όνομα σελίδας:",
        "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
        "recentchanges-page-added-to-category": "Η σελίδα [[:$1]] προστέθηκε στην κατηγορία",
        "fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη στο χώρο φύλαξης κοινών αρχείων.\nΕάν θέλετε παρ' όλ' αυτά να επιφορτώσετε το δικό σας αρχείο, παρακαλούμε πηγαίνετε πίσω και χρησιμοποιήστε ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο της τρέχουσας έκδοσης του <strong>[[:$1]]</strong>.",
-       "fileexists-duplicate-version": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο {{{{PLURAL:$2|παλιότερης έκδοσης|παλιότερων εκδόσεων}} του <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Το ανεβασμένο αρχείο είναι ένα ακριβές αντίγραφο {{PLURAL:$2|παλιότερης έκδοσης|παλιότερων εκδόσεων}} του <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Αυτό το αρχείο είναι διπλότυπο {{PLURAL:$1|αυτού του αρχείου|αυτών των αρχείων}}:",
        "file-deleted-duplicate": "Αρχείο παρόμοιο με αυτό εδώ ([[:$1]]) έχει προηγουμένως διαγραφεί. Θα πρέπει να ελέγξετε το ιστορικό διαγραφής του πριν να προχωρήσετε στην επαναφόρτωσή του.",
        "file-deleted-duplicate-notitle": "Ένα αρχείο πανομοιότυπο με αυτό έχει προηγουμένως διαγραφεί, και ο τίτλος έχει κατασταλεί.\nΘα πρέπει να ζητήσετε από κάποιον με την δυνατότητα προβολής κατεσταλμένου αρχείου δεδομένων για να εξετάσει την κατάσταση προτού προχωρήσετε σε επαναφόρτωση του.",
        "listfiles_size": "Μέγεθος",
        "listfiles_description": "Περιγραφή",
        "listfiles_count": "Εκδόσεις",
-       "listfiles-show-all": "Συμπερίληψη παλαιών εκδόσεων των εικόνων",
+       "listfiles-show-all": "Συμπερίληψη παλαιών εκδόσεων αρχείων",
        "listfiles-latestversion": "Τρέχουσα έκδοση",
        "listfiles-latestversion-yes": "Ναι",
        "listfiles-latestversion-no": "Όχι",
        "doubleredirects": "Διπλές ανακατευθύνσεις",
        "doubleredirectstext": "Αυτή η σελίδα καταγράφει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. \nΚάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη ανακατεύθυνση, όπως επίσης και προς τον προορισμό της δεύτερης ανακατεύθυνσης, η οποία και είναι συνήθως η «πραγματική» σελίδα προορισμού στην οποία πρέπει να δείχνει η πρώτη ανακατεύθυνση. \nΤα <del>διαγεγραμμένα</del> λήμματα έχουν επιλυθεί.",
        "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
-       "double-redirect-fixed-maintenance": "Αυτόματη διόρθωση διπλής ανακατεύθυνσης από [[$1]] σε [[$2]] σε εργασία συντήρησης.",
+       "double-redirect-fixed-maintenance": "Αυτόματη διόρθωση διπλής ανακατεύθυνσης από [[$1]] σε [[$2]] σε εργασία συντήρησης",
        "double-redirect-fixer": "Διορθωτής ανακατευθύνσεων",
        "brokenredirects": "Λανθασμένες ανακατευθύνσεις",
        "brokenredirectstext": "Οι παρακάτω ανακατευθύνσεις οδηγούν σε σελίδες που δεν υπάρχουν:",
index 42ea35c..3726ae9 100644 (file)
        "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
        "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
        "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
-       "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
+       "lockmanager-fail-openlock": "Could not open lock file for \"$1\". Make sure your upload directory is configured correctly and your web server has permission to write to that directory. See https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory for more information.",
        "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
        "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
        "lockmanager-fail-db-release": "Could not release locks on database $1.",
        "doubleredirects-summary": "",
        "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
        "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
+       "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job",
        "double-redirect-fixer": "Redirect fixer",
        "brokenredirects": "Broken redirects",
        "brokenredirects-summary": "",
        "restrictionsfield-badip": "Invalid IP address or range: $1",
        "restrictionsfield-label": "Allowed IP ranges:",
        "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errors:\n\n$1",
        "revid": "revision $1",
        "pageid": "page ID $1",
        "rawhtml-notallowed": "&lt;html&gt; tags cannot be used outside of normal pages.",
index 0b642fc..31585fa 100644 (file)
        "restrictionsfield-badip": "Malvalida IP-adreso de la intervalo: $1",
        "restrictionsfield-label": "Permesita IP-intervalo:",
        "restrictionsfield-help": "Unu IP-adreso aŭ CIDR-intervalo per linio. Por permesigi ĉion, uzu:<pre>0.0.0.0/0</code>\n<code>::/0</pre>",
+       "edit-error-short": "Eraro: $1",
+       "edit-error-long": "Eraroj\n\n$1",
        "revid": "revizio $1",
        "pageid": "Identigilo de paĝo $1"
 }
index 7e49b45..a43d383 100644 (file)
        "doubleredirects": "Redirecciones dobles",
        "doubleredirectstext": "Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.\nCada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.\nLas entradas <del>tachadas</del> han sido resueltas.",
        "double-redirect-fixed-move": "[[$1]] se ha trasladado.\nSe actualizó automáticamente y ahora redirecciona a [[$2]].",
-       "double-redirect-fixed-maintenance": "Corrigiendo automáticamente la doble redirección desde [[$1]] a [[$2]] en un trabajo de mantenimiento.",
+       "double-redirect-fixed-maintenance": "Corrección automática de redirección doble de [[$1]] a [[$2]] mediante una tarea de mantenimiento",
        "double-redirect-fixer": "Corrector de redirecciones",
        "brokenredirects": "Redirecciones incorrectas",
        "brokenredirectstext": "Las siguientes redirecciones enlazan a páginas que no existen:",
        "restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
        "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errores:\n\n$1",
        "revid": "revisión $1",
        "pageid": "ID de página $1",
        "rawhtml-notallowed": "No se pueden emplear las etiquetas &lt;html&gt; si no es en las páginas normales.",
index 3210396..706d8ba 100644 (file)
        "restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
        "restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
        "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Tõrge: $1",
+       "edit-error-long": "Tõrked:\n\n$1",
        "revid": "redaktsioon $1",
        "pageid": "lehekülje identifikaator $1",
        "rawhtml-notallowed": "&lt;html&gt;-silte ei saa kasutada mujal kui harilikel lehekülgedel.",
index f22cb84..a92336b 100644 (file)
        "doubleredirects": "Birbideratze bikoitzak",
        "doubleredirectstext": "Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <del>zuzendu</del> beharko luke.",
        "double-redirect-fixed-move": "«[[$1]]» orria mugitu da.\nAutomatikoki eguneratu da, eta orain «[[$2]]» orrira darama.",
-       "double-redirect-fixed-maintenance": "«[[$1]]» orritik «[[$2]]» orrira egindako birbideratze bikoitza automatikoki konpondua, mantentze lanak egitean.",
+       "double-redirect-fixed-maintenance": "[[$1]] orritik [[$2]] orrira egindako birbideratze bikoitza automatikoki konpondua, mantentze lanak egitean.",
        "double-redirect-fixer": "Birbideratze zuzentzailea",
        "brokenredirects": "Hautsitako birzuzenketak",
        "brokenredirectstext": "Ondorengo birbideratze hauek existitzen ez diren orrietara bideratuta daude:",
index 4288f61..e668234 100644 (file)
        "botpasswords-insert-failed": "شکست در افزودن نام ربات «$1». در حال حاضر اضافه شده است؟",
        "botpasswords-update-failed": "شکست در به‌روزرسانی نام رباتی «$1». حذف شده است؟",
        "botpasswords-created-title": "گذرواژه ربات ایجاد شد",
-       "botpasswords-created-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» ایجاد شد.",
+       "botpasswords-created-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» ایجاد شد.",
        "botpasswords-updated-title": "گذرواژه ربات به‌روز شد",
-       "botpasswords-updated-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» به‌روز شد.",
+       "botpasswords-updated-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» به‌روز شد.",
        "botpasswords-deleted-title": "گذرواژه ربات حذف شد",
-       "botpasswords-deleted-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» حذف شد.",
+       "botpasswords-deleted-body": "گذرواژهٔ رباتی برای ربات «$1» و {{GENDER:$2|کاربر}} «$2» حذف شد.",
        "botpasswords-newpassword": "<strong>$2</strong> گذرواژهٔ جدید برای ورود با حساب <strong>$1</strong> است. <em>لطفاً آن را برای ارجاع در آینده ذخیره کنید.</em> <br> (برای ربات‌های قدیمی که نیاز به نام کاربری مطابق با حساب کاربری‌شان دارد، شما می‌توانید از <strong>$3</strong> به عنوان نام کاربری و از <strong>$4</strong> به عنوان گذرواژه استفاده کنید.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider موجود نیست.",
        "botpasswords-restriction-failed": "محدودیت‌های گذرواژهٔ ربات از این ورود جلوگیری می‌کند.",
        "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}}ِ همین کاربر نمایش داده نشده است)",
        "diff-multi-otherusers": "({{PLURAL:$1|۱ نسخهٔ میانی|$1 نسخه‌ٔ میانی}} ویرایش شده توسط {{PLURAL:$2|۱ کاربر|$2 کاربر}} نشان داده نشده)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} نسخه‌ٔ میانی ویرایش شده توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده است)",
+       "diff-paragraph-moved-tonew": "پاراگراف جابه‌جا شده بود. کلیک کنید تا به جای جدیدش بروید.",
+       "diff-paragraph-moved-toold": "پاراگراف جابه‌جا شده بود. کلیک کنید تا به جای قدیمش بروید.",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nاین اتفاق معمولاً در اثر دنبال کردن پیوند تفاوتی به یک صفحهٔ حذف‌شده پیش می‌آید.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "searchresults": "نتایج جستجو",
        "searchresults-title": "نتایج جستجو برای «$1»",
        "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روز}}",
        "recentchangescount": "تعداد پیش‌فرض ویرایش‌های نمایش یافته:",
        "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
-       "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
+       "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. اگر لازم باشد [[Special:ResetTokens|می‌توانید کلیدی نو ایجاد کنید]].",
        "savedprefs": "ترجیحات شما ذخیره شد.",
        "savedrights": "گروه‌های کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
        "timezonelegend": "منطقهٔ زمانی:",
        "timezoneregion-indian": "اقیانوس هند",
        "timezoneregion-pacific": "اقیانوس آرام",
        "allowemail": "دریافت ایمیل از دیگر کاربران ممکن باشد",
+       "email-allow-new-users-label": "اجازهٔ دریافت ایمیل از کاربران تازه‌کار داده شود",
        "email-blacklist-label": "این کاربران را از فرستادن رایانامه به من منع کن:",
        "prefs-searchoptions": "جستجو",
        "prefs-namespaces": "فضاهای نام",
        "rcfilters-savedqueries-apply-and-setdefault-label": "ایجاد پالایه پیش‌فرض",
        "rcfilters-savedqueries-cancel-label": "لغو",
        "rcfilters-savedqueries-add-new-title": "ذخیره تنظیمات کنونی پالایه",
-       "rcfilters-savedqueries-already-saved": "این پالایه‌ها اکنون ذخیره شده‌اند",
+       "rcfilters-savedqueries-already-saved": "این پالایه‌ها اکنون ذخیره شده‌اند. تنظیمات‌تان را تغییر دهید تا یک پالایهٔ ذخیره شدهٔ جدید بسازید.",
        "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
        "rcfilters-clear-all-filters": "پاک‌کردن تمام پالایه‌ها",
        "rcfilters-show-new-changes": "دیدن جدیدترین تغییرات",
        "recentchangeslinked-feed": "تغییرات مرتبط",
        "recentchangeslinked-toolbox": "تغییرات مرتبط",
        "recentchangeslinked-title": "تغییرات مرتبط با $1",
-       "recentchangeslinked-summary": "در زیر فهرستی از تغییرات اخیر صفحه‌های پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را می‌بینید.\nصفحه‌هایی که در [[Special:Watchlist|فهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
+       "recentchangeslinked-summary": "نام یک صفحه را وارد کنید تا تغییرات صفحه‌هایی که به آن پیوند داده‌اند یا از آن پیوند گرفته‌اند را ببینید. (برای مشاهدهٔ اعضای یک رده، ورودی را به صورت رده:نام رده وارد کنید). تغییرات در صفحه‌هایی که در  [[Special:Watchlist|فهرست پی‌گیری‌های شما]] هستند <strong>ضخیم</strong> نمای می‌یابند.",
        "recentchangeslinked-page": "نام صفحه:",
        "recentchangeslinked-to": "نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند",
        "recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد",
        "autosumm-removed-redirect": "تغییرمسیر به [[$1]] حذف شد",
        "autosumm-new": "صفحه‌ای تازه حاوی «$1» ایجاد کرد",
        "autosumm-newblank": "ایجاد صفحه خالی",
-       "size-bytes": "$1 بایت",
+       "size-bytes": "$1 {{PLURAL:$1|بایت}}",
        "size-kilobytes": "$1 کیلوبایت",
        "size-megabytes": "$1 مگابایت",
        "size-gigabytes": "$1 گیگابایت",
        "version-poweredby-others": "دیگران",
        "version-poweredby-translators": "مترجمان translatewiki.net",
        "version-credits-summary": "افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.",
-       "version-license-info": "مدیاویکی یک نرم‌افزار آزاد است. می‌توانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده‌است، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شده‌است، ولی هیچ‌گونه ضمانتی، حتی ضمانت ضمنی تجاری یا مناسب بودن برای یک مصرف خاص را ارائه نمی‌کند. برای اطلاعات بیش‌تر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html مکاتبه کرده یا آن را به صورت برخط بخوانید].",
+       "version-license-info": "مدیاویکی یک نرم‌افزار آزاد است. می‌توانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده‌است، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شده‌است، ولی <em>هیچ‌گونه ضمانتی</em>، حتی ضمانت ضمنی <strong>تجاری</strong> یا <strong>مناسب بودن برای یک مصرف خاص</strong> را ارائه نمی‌کند. برای اطلاعات بیش‌تر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html مکاتبه کرده یا آن را به صورت برخط بخوانید].",
        "version-software": "نسخهٔ نصب‌شده",
        "version-software-product": "محصول",
        "version-software-version": "نسخه",
        "tag-mw-contentmodelchange": "تغییر مدل محتوا",
        "tag-mw-contentmodelchange-description": "ویرایش‌هایی که [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel مدل محتوای صفحه را تغییر می‌دهند]",
        "tag-mw-new-redirect": "تغییر مسیر جدید",
+       "tag-mw-new-redirect-description": "ویرایش‌هایی که یک تغییرمسیر جدید ساخته‌اند یا صفحه‌ای را به یک تغییرمسیر تبدیل کرده‌اند",
        "tag-mw-removed-redirect": "تغییرمسیر حذف شد",
+       "tag-mw-removed-redirect-description": "ویرایش‌هایی که یک صفحهٔ تغییرمسیر را به صفحه‌ای غیر تغییرمسیر تغییر داده‌اند",
+       "tag-mw-changed-redirect-target": "تغییر هدف تغییرمسیر",
+       "tag-mw-changed-redirect-target-description": "ویرایش‌هایی که هدف یک تغییرمسیر را تغییر داده‌اند",
        "tag-mw-blank": "خالی‌کردن",
        "tag-mw-blank-description": "ویرایش‌هایی که یک صفحه را خالی می‌کنند",
        "tag-mw-replace": "جایگزین شد",
        "tag-mw-replace-description": "ویرایش‌هایی که بیش از ۹۰ درصد صفحه را حذف می‌کنند",
        "tag-mw-rollback": "واگردانی",
+       "tag-mw-rollback-description": "ویرایش‌هایی که با استفاده از پیوند واگردانی، ویرایش‌های قبلی را واگردانی کرده‌اند",
+       "tag-mw-undo": "خنثی‌سازی",
+       "tag-mw-undo-description": "ویرایش‌هایی که با استفاده از پیوند خنثی‌سازی، ویرایش‌های قبلی را خنثی کرده‌اند",
        "tags-title": "برچسب‌ها",
        "tags-intro": "این صفحه فهرستی‌است از برچسب‌هایی که نرم‌افزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.",
        "tags-tag": "نام برچسب",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
        "expandtemplates": "بسط دادن الگوها",
-       "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
+       "expand_templates_intro": "این صفحهٔ ویژه، ویکی‌متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
        "expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
        "expand_templates_input": "ویکی‌متن ورودی:",
        "expand_templates_output": "نتیجه",
        "expand_templates_preview": "پیش‌نمایش",
        "expand_templates_preview_fail_html": "<em>به دلیل این که در {{SITENAME}} اچ‌تی‌ام‌ال خام فعال است و اطلاعات نشست کاربری از دست رفت، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوااسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیش‌نمایش مشروع است، لطفاً دوباره سعی کنید.</strong>\nاگر هنوز کار نکرد، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "expand_templates_preview_fail_html_anon": "<em>به دلیل این که در {{SITENAME}} اچ‌تی‌ام‌ال خام فعال است و اطلاعات نشست کاربری از دست رفت، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوااسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیش‌نمایش مشروع است، لطفا [[Special:UserLogin|به سامانه وارد شوید]] و دوباره تلاش کنید.</strong>",
-       "expand_templates_input_missing": "شما نیازمندید که حداقل متن‌هایی را برای وارد کردن تهیه کنید.",
+       "expand_templates_input_missing": "می‌بایست دست کم مقداری ویکی‌متن را وارد کنید.",
        "pagelanguage": "تغییر زبان صفحه",
        "pagelang-name": "صفحه",
        "pagelang-language": "زبان",
        "log-action-filter-upload": "نوع بارگذاری",
        "log-action-filter-all": "همه",
        "log-action-filter-block-block": "بستن",
-       "log-action-filter-block-reblock": "تصحÛ\8cØ­ Ø¨Ù\84اک",
+       "log-action-filter-block-reblock": "تغÛ\8cÛ\8cر Ù\82طع Ø¯Ø³ØªØ±Ø³Û\8c",
        "log-action-filter-block-unblock": "باز شدن",
        "log-action-filter-contentmodel-change": "تغییر مدل محتوا",
        "log-action-filter-contentmodel-new": "ایجاد صفحه با مدل محتوای غیر استاندارد",
index 9a23029..f4b5f6b 100644 (file)
        "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Tallennetun SVG-tiedoston tyylielementissä löytyi turvaton CSS.",
        "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
-       "uploaded-href-attribute-svg": "href-attribuutit SVG-tiedostoissa saavat linkittää vain http://- tai https://-kohteisiin, löytyi <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-attribute-svg": "<a>-elementit voivat linkittää (href) vain kohteisiin data: (upotettu tiedosto), http://, https:// tai fragment (#, sama tiedosto). Muissa elementeissä, kuten <image>, vain data: ja fragment ovat sallittuja. Kokeile kuvien upottamista, kun viet SVG-tiedostoasi. Löytyi <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Löytyi href epäturvalliseen dataan: URI-kohde <code>&lt;$1 $2=\"$3\"&gt;</code> tallennetussa SVG-tiedostossa.",
        "uploaded-animate-svg": "Found \"animate\" tag that might be changing href, using the \"from\" attribute <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploaded-setting-event-handler-svg": "Setting event-handler attributes is blocked, found <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "limitreport-expansiondepth": "Highest expansion depth",
        "limitreport-expensivefunctioncount": "Vaativien jäsenninfunktioiden lukumäärä",
        "expandtemplates": "Laajenna mallineet",
-       "expand_templates_intro": "Tämä toimintosivu ottaa syötteeksi tekstiä ja laajentaa kaikki siinä olevat mallineet rekursiivisesti.\nSe myös laajentaa tuetut parserifunktiot kuten\n<code><nowiki>{{</nowiki>#language:...}}</code> ja -muuttujat kuten\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nKäytännössä se laajentaa melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.",
+       "expand_templates_intro": "Tämä toimintosivu ottaa syötteeksi wikitekstiä ja laajentaa kaikki siinä olevat mallineet rekursiivisesti.\nSe myös laajentaa tuetut parserifunktiot kuten\n<code><nowiki>{{</nowiki>#language:...}}</code> ja -muuttujat kuten\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nKäytännössä se laajentaa melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.",
        "expand_templates_title": "Otsikko (esimerkiksi muuttujaa {{FULLPAGENAME}} varten)",
        "expand_templates_input": "Syötä wikiteksti:",
        "expand_templates_output": "Tulos",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
        "restrictionsfield-label": "Sallitut IP-alueet:",
        "restrictionsfield-help": "Yksi IP-osoite tai CIDR-alue per rivi. Ottaaksesi kaiken käyttöön, käytä:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "$1",
+       "edit-error-long": "Virheet:\n\n$1",
        "revid": "versio $1",
        "pageid": "sivun tunnistenumero $1",
        "rawhtml-notallowed": "&lt;html&gt; komentoa ei voida käyttää normaalien sivujen ulkopuolella.",
index 152b609..7ca5b4c 100644 (file)
        "prefs-help-recentchangescount": "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
        "prefs-help-watchlist-token2": "Voici la clé secrète du flux Web de votre liste de suivi.\nToute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.\nSi nécessaire, [[Special:ResetTokens|vous pouvez la réinitialiser ici]].",
        "savedprefs": "Les préférences ont été sauvegardées.",
-       "savedrights": "Les droits d’utilisat{{GENDER:$1|eur|rice}} de $1 ont été enregistrés.",
+       "savedrights": "Le groupes de l'utilisat{{GENDER:$1|eur|rice}} $1 ont été sauvegardés.",
        "timezonelegend": "Fuseau horaire :",
        "localtime": "Heure locale :",
        "timezoneuseserverdefault": "Utiliser la valeur par défaut du wiki ($1)",
        "doubleredirects": "Doubles redirections",
        "doubleredirectstext": "Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.\nChaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.\nLes entrées <del>barrées</del> ont été résolues.",
        "double-redirect-fixed-move": "[[$1]] a été déplacé.\nIl a été mis à jour automatiquement et redirige maintenant vers [[$2]].",
-       "double-redirect-fixed-maintenance": "Correction automatique de la double redirection de [[$1]] vers [[$2]] dans une tâche de maintenance.",
+       "double-redirect-fixed-maintenance": "Correction automatique de la double redirection de [[$1]] vers [[$2]] dans une tâche de maintenance",
        "double-redirect-fixer": "Correcteur de redirection",
        "brokenredirects": "Redirections cassées",
        "brokenredirectstext": "Ces redirections mènent vers des pages inexistantes :",
        "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "moveuserpage-warning": "<strong>Attention :</strong> Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur <em>ne</em> sera <em>pas</em> renommé.",
        "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la catégorie sera renommée et <em>qu’aucune</em> des pages de l’ancienne catégorie ne sera transférée dans la nouvelle.",
-       "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e}}]] avec un compte d’utilisateur enregistré.",
+       "movenologintext": "Pour pouvoir renommer une page, vous devez être un utilisateur enregistré et être [[Special:UserLogin|connecté{{GENDER:||e}}]].",
        "movenotallowed": "Vous n'avez pas la permission de renommer les pages.",
        "movenotallowedfile": "Vous n'avez pas la permission de renommer les fichiers.",
        "cant-move-user-page": "Vous n’avez pas la permission de renommer les pages principales des utilisateurs (sauf les sous-pages).",
-       "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page d’utilisateur (mais vous pouvez le faire vers une sous-page d’utilisateur).",
+       "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (mais vous pouvez le faire vers une sous-page utilisateur).",
        "cant-move-category-page": "Vous n'avez pas la permission de renommer les pages de catégorie.",
        "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
        "cant-move-subpages": "Vous n’avez pas le droit de renommer des sous-pages.",
        "restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
        "restrictionsfield-label": "Plages IP autorisées :",
        "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Erreur : $1",
+       "edit-error-long": "Erreurs :\n\n$1",
        "revid": "version $1",
        "pageid": "ID de page $1",
        "rawhtml-notallowed": "Les balises &lt;html&gt; ne peuvent pas être utilisées en dehors des pages normales.",
index 4d190c3..5193c0b 100644 (file)
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de ficheiros",
        "pageinfo-user-id": "ID do usuario",
+       "pageinfo-file-hash": "Valor de hash",
        "markaspatrolleddiff": "Marcar como revisada",
        "markaspatrolledtext": "Marcar esta páxina como revisada",
        "markaspatrolledtext-file": "Marcar esta versión de ficheiro como verificada",
        "restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
        "restrictionsfield-label": "Rangos de IP permitidos:",
        "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Erro: $1",
+       "edit-error-long": "Erros:\n\n$1",
        "revid": "revisión $1",
        "pageid": "identificador de páxina $1",
        "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
index 643a108..92f6950 100644 (file)
        "doubleredirects": "הפניות כפולות",
        "doubleredirectstext": "בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.\nכל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה\"אמיתי\" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.\nפריטים <del>מחוקים</del> כבר תוקנו.",
        "double-redirect-fixed-move": "הדף [[$1]] הועבר.\nהוא עודכן אוטומטית ועכשיו מפנה לדף [[$2]].",
-       "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מהדף [[$1]] אל הדף [[$2]] במשימת תחזוקה.",
+       "double-redirect-fixed-maintenance": "תיקון אוטומטי של הפניה כפולה מהדף [[$1]] אל הדף [[$2]] במשימת תחזוקה",
        "double-redirect-fixer": "מתקן הפניות",
        "brokenredirects": "הפניות לא תקינות",
        "brokenredirectstext": "ההפניות שלהלן מפנות לדפים שאינם קיימים:",
        "restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
        "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "שגיאה: $1",
+       "edit-error-long": "שגיאות:\n\n$1",
        "revid": "גרסה $1",
        "pageid": "מזהה דף $1",
        "rawhtml-notallowed": "לא ניתן להשתמש בתגיות &lt;html&gt; מחוץ לדפים רגילים.",
index 4463c05..c51d106 100644 (file)
@@ -89,7 +89,8 @@
                        "Rajatkatiyar10",
                        "Dcljr",
                        "Bhatakati aatma",
-                       "Shypoetess"
+                       "Shypoetess",
+                       "Innocentbunny"
                ]
        },
        "tog-underline": "लिंक रेखांकित करें:",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>से जुड़े पृष्ठ</strong> चयनित पृष्ठ",
        "rcfilters-filter-showlinkedto-label": "लिंक करने वाले पृष्ठों पर परिवर्तन दिखाएं",
        "rcfilters-filter-showlinkedto-option-label": "<strong>से जुड़ने वाले पृष्ठ</strong> चयनित पृष्ठ",
-       "rcfilters-target-page-placeholder": "पृष्ठ का नाम दर्ज करें",
+       "rcfilters-target-page-placeholder": "पृष्ठ(अथवा श्रेणी) का नाम भरें",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfromreset": "चुने दिनांक पहले जैसा करें",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "pageinfo-category-subcats": "उपश्रेणियों की संख्या",
        "pageinfo-category-files": "फ़ाइलों की संख्या",
        "pageinfo-user-id": "सदस्य पता",
+       "pageinfo-file-hash": "हैश मान",
        "markaspatrolleddiff": "जाँचा हुआ चिन्हित करें",
        "markaspatrolledtext": "इस पृष्ठ को जाँचा हुआ चिन्हित करें",
        "markaspatrolledtext-file": "इस फ़ाइल संस्करण को जांचा हुआ चिन्हित करें",
        "restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1",
        "restrictionsfield-label": "अनुमत आईपी सीमा:",
        "restrictionsfield-help": "एक आईपी पता या सीडीआरएल सीमा प्रति पंक्ति में लिखें। सभी को सक्रिय करने के लिए <pre>0.0.0.0/0::/0</pre> का उपयोग करें।",
+       "edit-error-short": "त्रुटि: $1",
+       "edit-error-long": "त्रुटि:\n\n$1",
        "revid": "अवतरण $1",
        "pageid": "पेज आईडी $1",
        "rawhtml-notallowed": "&lt;html&gt; टैग का उपयोग सामान्य पन्नों के बाहर नहीं किया जा सकता है।",
index 601bd4d..03dbd49 100644 (file)
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od ukupno $2.}}",
        "category-subcat-count-limited": "Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Prikazana stranica jedina je|Prikazane su $1 stranice su|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|stranica je|$1 stranice su|$1 stranica je}} u ovoj kategoriji.",
        "category-file-count": "Ova kategorija sadrži $2 {{PLURAL:$2|datoteku|datoteke|datoteka}}. {{PLURAL:$1|Slijedi $1 datoteka|Slijede $1 datoteke|Slijedi $1 datoteka}}.",
        "category-file-count-limited": "{{PLURAL:$1|datoteka je|$1 datoteke su|$1 datoteka su}} u ovoj kategoriji.",
index 5dd1e4e..1a1353d 100644 (file)
        "restrictionsfield-badip": "Érvénytelen IP-cím vagy -tartomány: $1",
        "restrictionsfield-label": "Engedélyezett IP-tartományok:",
        "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
+       "edit-error-short": "Hiba: $1",
+       "edit-error-long": "Hibák:\n\n$1",
        "revid": "$1 változat",
        "pageid": "$1 lapazonosító",
        "rawhtml-notallowed": "&lt;html&gt; címkék nem használhatók normál lapokon kívül.",
index 485fca4..3f6c0cb 100644 (file)
        "showhideselectedversions": "Ցուցադրել/թաքցնել ընտրված խմբագրումները",
        "editundo": "հետ շրջել",
        "diff-empty": "(Տարբերություն չկա)",
-       "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցրված է)",
+       "diff-multi-sameuser": "(Միևնույն մասնակցի {{PLURAL:$1|մեկ միջանկյալ տարբերակ|$1 միջանկյալ տարբերակներ}} թաքցված է)",
        "searchresults": "Որոնման արդյունքներ",
        "searchresults-title": "«$1»-ի որոնման արդյունքներ",
        "titlematches": "Համընկած հոդվածների անվանումներ",
index 311561a..110935f 100644 (file)
        "doubleredirects": "Redirectiones duple",
        "doubleredirectstext": "Iste pagina lista paginas de redirection verso altere paginas de redirection.\nCata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le \"ver\" pagina de destination, al qual le prime redirection tamben deberea punctar.\nLe entratas <del>cancellate</del> ha essite resolvite.",
        "double-redirect-fixed-move": "[[$1]] ha essite renominate.\nIllo ha essite automaticamente actualisate e ora redirige verso [[$2]].",
-       "double-redirect-fixed-maintenance": "Corrige automaticamente le redirection duple de [[$1]] a [[$2]] durante un carga de mantenentia.",
+       "double-redirect-fixed-maintenance": "Correction automatic del redirection duple de [[$1]] a [[$2]] in un processo de mantenentia",
        "double-redirect-fixer": "Corrector de redirectiones",
        "brokenredirects": "Redirectiones rupte",
        "brokenredirectstext": "Le sequente redirectiones mena a paginas non existente:",
        "restrictionsfield-badip": "Adresse o intervallo IP non valide: $1",
        "restrictionsfield-label": "Intervallos IP permittite:",
        "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Error: $1",
+       "edit-error-long": "Errores:\n\n$1",
        "revid": "version $1",
        "pageid": "ID de pagina $1",
        "rawhtml-notallowed": "Etiquettas &lt;html&gt; non pote esser usate foras de paginas normal.",
index b5d8910..9c7e5fd 100644 (file)
@@ -15,8 +15,8 @@
                        "Tusholi"
                ]
        },
-       "tog-underline": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га кIала така хьакхар:",
-       "tog-hideminor": "Къайладаккха з|амига дола хувцамаш керда хувцамашта юкъера",
+       "tog-underline": "ТIаÑ\82овжама кIала така хьакхар:",
+       "tog-hideminor": "Къайладаккха зӏамига дола хувцамаш керда хувцамашта юкъера",
        "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола (патрулированные) хувцамаш керда хувцамашта юкъера",
        "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола (патрулированные) оагIонаш керда оагIонашта юкъера",
        "tog-hidecategorization": "Къайлаяха оагӀонай категореш",
        "tog-watchlisthideminor": "Са зем бара хьаязъяьр чура зIамига хувцамаш къайладаха",
        "tog-watchlisthideliu": "Шоаш хьабайзийта доакъошхоша хувцамаш къайладаха зем бара хьаязъяьр чура",
        "tog-watchlisthideanons": "ЦIийоацача доакъошхоша хувцамаш къайладаха зем бара хьаязъяьр чура",
-       "tog-watchlisthidepatrolled": "Ха даь дола хувцамаш къайладаха зем бара хьаязъяьр чура",
-       "tog-watchlisthidecategorization": "Ð\9aÑ\8aайлаÑ\8fккÑ\85а Ð¾Ð°Ð³Ó\80онай ÐºÐ°Ñ\82егоÑ\80еÑ\88",
+       "tog-watchlisthidepatrolled": "Ха даь дола хувцамаш къайладаха зéма хьаязъяьра чу",
+       "tog-watchlisthidecategorization": "Ð\9eагÓ\80онаÑ\88Ñ\82а Ð¾Ð°Ð³IаÑ\82аÑ\88 Ñ\82оÑ\85аÑ\80 ÐºÑ\8aайладаккÑ\85а",
        "tog-ccmeonemails": "Сона хьатIаахийта аз доакъашхошта дIадахийта дола каьхатий кепаш",
        "tog-diffonly": "Ма гойта оагIон чулоацам ши верси вIашидистара кIал",
-       "tog-showhiddencats": "Ð\93ойÑ\82а ÐºÑ\8aайла ÐºÐ°Ñ\82егоÑ\80еш",
-       "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа ца яздеш аз болх дӀаберзабеча ханахь",
+       "tog-showhiddencats": "Ð\93ойÑ\82а ÐºÑ\8aайла Ð¾Ð°Ð³IаÑ\82аш",
+       "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа а ца яздеш аз болх дӀаберзабеча хана",
        "underline-always": "Даиман",
        "underline-never": "ЦIаккха",
        "underline-default": "Браузера гIирсаш тоаяраш лелае",
        "sunday": "кIиранди",
        "monday": "оршот",
        "tuesday": "шинара",
-       "wednesday": "Ð\9aхаьра",
+       "wednesday": "кхаьра",
        "thursday": "éра",
        "friday": "пӀаьраска",
        "saturday": "шоатта",
-       "sun": "Ð\9aIиранди",
-       "mon": "Ð\9eÑ\80Ñ\88",
-       "tue": "Шин",
-       "wed": "Ð\9aÑ\85",
-       "thu": "Ð\95Ñ\80",
-       "fri": "Ð\9fI",
-       "sat": "Шоа",
+       "sun": "кIиранди",
+       "mon": "оÑ\80Ñ\88оÑ\82",
+       "tue": "шинара",
+       "wed": "кÑ\85аÑ\8cÑ\80а",
+       "thu": "еÑ\80а",
+       "fri": "пIаÑ\8cÑ\80аÑ\81ка",
+       "sat": "шоатта",
        "january": "АгIой",
        "february": "Саь-кур",
        "march": "Мутт-хьал",
        "anontalk": "Дувца оттадар",
        "navigation": "Навигаци",
        "and": "&#32;а",
-       "faq": "Ð\9aТХ",
+       "faq": "Ð\9aÐ\9bХ",
        "actions": "Ардамаш",
        "namespaces": "ЦIерий аренаш",
        "variants": "Эршаш",
        "otherlanguages": "Кхыча меттаех",
        "redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
        "redirectpagesub": "ОагIув-дIа-сахьожадар",
-       "redirectto": "Ð\94Iа-Ñ\81аÑ\85Ñ\8cожадар укхаза:",
+       "redirectto": "Ð\94Iа-Ñ\85Ñ\8cа Ñ\85Ñ\8cожавар укхаза:",
        "lastmodifiedat": "Ер оагIув тIеххьара хийца хиннай $2 $1 яьннача ха́на.",
        "viewcount": "Укх оагIонга хьежа хиннаб $1{{PLURAL:$1|-зза}}.",
        "protectedpage": "ГIо оттадаь лораяь оагIув",
        "badaccess-groups": "ДIадийха ардам кхоачашде могаш ба алхха доакъашхой {{PLURAL:$2|1=тоабан «$1»|укх тоабаш чура: $1}}",
        "versionrequired": "Эшаш я $1 версех йола MediaWiki",
        "versionrequiredtext": "Укх оагIонца болх бергболаш $1 версех йола MediaWiki эша. Хьажа [[Special:Version|програмни Iалашдарах бола хоамага]].",
-       "ok": "Мега",
+       "ok": "Мег",
        "retrievedfrom": "Хьаст — «$1»",
        "youhavenewmessages": "{{PLURAL:$3|Хьога денад}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Хьога кхаьчад}} $1 {{PLURAL:$3|1=$3 доакъашхочунгара|$3 доакъашхоштагара|1=кхыволча доакъашхочунгара}} ($2).",
        "showtoc": "хьахьокха",
        "hidetoc": "хьулде",
        "collapsible-collapse": "дIахьулде",
-       "collapsible-expand": "доаржаде",
-       "confirmable-yes": "XӀа",
+       "collapsible-expand": "хьадоаржаде",
+       "confirmable-yes": "XӀау",
        "confirmable-no": "A",
        "thisisdeleted": "БIаргтоха е юхаметтаоттае $1?",
        "viewdeleted": "Хьажа $1?",
        "yourpasswordagain": "Юхаязде къайладIоагIа:",
        "createacct-yourpasswordagain": "Бакъйе пароль",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Ӏочуязъе пароль",
-       "userlogin-remembermypassword": "Ража чу виса",
+       "userlogin-remembermypassword": "Ражача чувиса",
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
-       "notloggedin": "Ð\9eаÑ\88 Ñ\88оаÑ\88 Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82адаÑ\86 Ñ\81иÑ\81Ñ\82еман",
-       "userlogin-noaccount": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\83Ñ\87еÑ\82а Ñ\8fздаÑ\80 Ð´Ð¸Ñ\86е Ñ\85Ñ\8cа?",
-       "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
+       "notloggedin": "РажаÑ\87а Ñ\87Ñ\83даÑ\8cннадаÑ\86 Ñ\88о",
+       "userlogin-noaccount": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ð´ÐµÑ\86е Ñ\85Ñ\8cога?",
+       "userlogin-joinproject": "ДIахоттале {{SITENAME}} яхача проекта",
        "createaccount": "Дагара йоазув хьакхолла",
        "userlogin-resetpassword-link": "Тӏеракхосса езий хьа пароль?",
-       "userlogin-helplink2": "Раже чувалара новкъостал",
+       "userlogin-helplink2": "Ражеча чувалара новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-emailoptional": "Электронни поштан цӀай (ца яздича мегаш да)",
        "createacct-email-ph": "Ӏочуязде хьай электронни поштан цӀай",
        "bold_tip": "Сома йоазон текст",
        "italic_sample": "Сиха йоазон текст",
        "italic_tip": "Сиха йоазон текст",
-       "link_sample": "ТIахьожаярга дáкъа цIи",
-       "link_tip": "Чура тIахьожаярг",
+       "link_sample": "Тӏатовжама кепакерта цIи",
+       "link_tip": "Чура тӏатовжам",
        "extlink_sample": "http://www.example.com тIахьожаярга дáкъа цIи",
        "extlink_tip": "Арахьара тIахьожаярг (йиц ма ялийтта префикс http://)",
        "headline_sample": "Дáкъа цIера текст",
        "nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
        "nowiki_tip": "Теркал ма е вики-форматировани",
        "image_tip": "Чуоттаяь файл",
-       "media_tip": "Файла тIахьожавар",
+       "media_tip": "Файлá тIатовжам",
        "sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
        "hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
        "summary": "Хувцамий сурт оттадар",
        "rcshowhidebots": "$1 боташ",
        "rcshowhidebots-show": "Хьахьокха",
        "rcshowhidebots-hide": "Къайладаккха",
-       "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
+       "rcshowhideliu": "$1 ражача дӏаэтта доакъашхой",
        "rcshowhideliu-show": "Хьахьокха",
        "rcshowhideliu-hide": "Къайлабаха",
        "rcshowhideanons": "$1 цIияккханза доакъашхой",
        "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
        "linkstoimage-more": "$1-ннел дуккхагIа {{PLURAL:$1|оагIув}} я укх файла тIахьожавеш.\nУкх хьаязъяьра чу белгалъяй цу файла {{PLURAL:$1|алхха $1 тIахьожаярг}}.\nТIакхача йиш я иштта [[Special:WhatLinksHere/$2|бIарчча хьаязъяьра]].",
        "nolinkstoimage": "Укх файла тӏатовжаш оагӏонаш яц.",
-       "linkstoimage-redirect": "$1 (Ñ\84айлови Ð´Ó\80а-Ñ\81аÑ\85Ñ\8cожадар) $2",
+       "linkstoimage-redirect": "$1 (Ñ\84айлови Ð´Ó\80а-Ñ\85Ñ\8cа Ñ\85Ñ\8cожавар) $2",
        "sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
        "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
        "filepage-nofile": "Ишта цӀи йола файл йоацаш я.",
        "sp-contributions-newonly": "ОагIонаш кхоллара мара хувцамаш ма гойта.",
        "sp-contributions-submit": "Хьалáха",
        "whatlinkshere": "Тӏатовжамаш укхаза",
-       "whatlinkshere-title": "«$1» ← укхунна тӏатовжаш йола оагӏонаш",
+       "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
        "whatlinkshere-page": "ОагIув:",
-       "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
-       "nolinkshere": "Ð\9eагIона '''[[:$1]]''' ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88каÑ\80а Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\88 Ð¹Ð¾Ð°Ñ\86аÑ\88 Ñ\8f.",
+       "linkshere": "«'''[[:$1]]'''» яхача оагIонна тIахьожавеш я тIехьайоагIа:",
+       "nolinkshere": "Ð\9aÑ\85Ñ\8bйолÑ\87а Ð¾Ð°Ð³Ó\8fонаÑ\88каÑ\80а '''[[:$1]]''' Ñ\8fÑ\85аÑ\87а Ð¾Ð°Ð³Ó\8fон Ñ\82IаÑ\82овжамаÑ\88 Ð´Ð¾Ð°Ñ\86аÑ\88 Ð´Ð°.",
        "isredirect": "оагIув-дIа-сахьожадар",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тӏатовжам",
        "whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайоагIа|хьалхайоагIараш}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "whatlinkshere-links": "← тӏатовжамаш",
-       "whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
-       "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aейоалаÑ\8fраш",
-       "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
+       "whatlinkshere-hideredirs": "$1 дӀа-хьа хьожавараш",
+       "whatlinkshere-hidetrans": "$1 Ñ\8eкÑ\8aедоаладаÑ\8cраш",
+       "whatlinkshere-hidelinks": "$1 тӏатовжамаш",
        "whatlinkshere-hideimages": "$1 файлай тIахьожаяргаш",
        "whatlinkshere-filters": "Фильтраш",
        "blockip": "ЧIега тоха {{GENDER:$1|доакъашхочун}}",
        "movelogpage": "ЦӀераш хувцара тептар",
        "movereason": "Бахьан:",
        "revertmove": "юха",
-       "export": "ОагIонай экспорт",
+       "export": "Оагӏоний экспорт",
        "allmessagesname": "Хоам",
        "allmessagesdefault": "Массаза йола текст",
        "allmessages-filter-all": "Еррига",
        "exif-software": "Программни Iалашдар",
        "exif-artist": "Автор",
        "exif-exifversion": "Верси Exif",
-       "exif-colorspace": "Ð\91еÑ\81ай Ð¼Ð¾Ñ\82Ñ\82",
+       "exif-colorspace": "Ð\91еÑ\81ий Ð¼Ð¾Ñ\82Ñ\82иг",
        "exif-pixelxdimension": "Сурта шорал",
        "exif-pixelydimension": "Сурта лакхал",
        "exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдар",
-       "logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
+       "logentry-delete-delete": "$1 яхача доакъашхочо {{GENDER:$2|дIаяккхай}} $3 яха оагӏув",
        "logentry-delete-restore": "$1 доакъашхочо {{GENDER:$2|юхаметтаоттаяьй}} $3 яха оагIув ($4)",
        "logentry-delete-revision": "$1 цIи йолча доакъашхочо {{GENDER:$2|хийцай}} $3 яхача оагIон {{PLURAL:$5|$5 версин|1=версин}} гуш хилар: $4",
        "revdelete-content-hid": "чулоацам къайлабаьккхаб",
-       "logentry-move-move": "$1 доакъашхочо $3 яхача оагӏон {{GENDER:$2|цӀи хийцай}} $4 яхача цӏерах",
+       "logentry-move-move": "$1 доакъашхочо $3 яхача оагӏон {{GENDER:$2|цӀи хийцай}} укх цӏерах → $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4 дӀа-сахьожадар ца дуташ.",
        "logentry-move-move_redir": "$1 доакъашхочо $3 яхача оагIон {{GENDER:$2|цIи хийцай}} укхунах → $4 дӀа-сахьожадара тIагIолла.",
        "logentry-patrol-patrol-auto": "$1 ше-ше {{GENDER:$2|ха даь техкай}} $3 оагIон верси $4",
index b1ea627..595ae1f 100644 (file)
        "title-invalid-interwiki": "La demandita pagino-titulo kontenas inter-wiki-ala ligilo, olqua ne povas uzesar en tituli.",
        "title-invalid-talk-namespace": "La demandita pagino-titulo referas a diskuto-pagino, qua ne existas.",
        "title-invalid-characters": "La demandita pagino-titulo kontenas ne-valida literi: \"$1\".",
-       "perfcached": "La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "title-invalid-magic-tilde": "La pagino demandata kontenas nevalida 'magiala' intersequo di tildi =>(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "La pagino demandata esas tre longa. Ol mustas esar min longa kam $1 {{PLURAL:$1|byte|bytes}} segun la kodexado UTF-8.",
+       "title-invalid-leading-colon": "La pagino demandata kontenas nevalida bi-punto en lua komenco.",
+       "perfcached": "La sequanta datumi esas en la memorio dil komputero, e povas esar aktualigita. Admaxime {{PLURAL:$1|un rezulto|$1 rezulti}} esas disponebla che la 'cache' dil komputero.",
+       "perfcachedts": "La sequanta datumi esas en la memorio dil komputero, ed aktualigesis lastafoye ye $1. Admaxime {{PLURAL:$4|un rezulto|$4 rezulti}} esas disponebla che la memorio 'cache'.",
+       "querypage-no-updates": "Ica pagino ne povas aktualigesar.\nLa datumi en ol ne rinovigesos.",
        "viewsource": "Vidar font-kodo",
        "viewsource-title": "Videz la fonto/fonti por $1",
        "actionthrottled": "Agado limitizita",
+       "actionthrottledtext": "Por preventar trouzo kun vandala skopo, tu ne povas facar ica agado plurafoye dum kurta periodo di tempo, e tu superiris ica limito.\nVoluntez probar ol itere, pos kelka minuti.",
        "protectedpagetext": "Ta pagino protektesis por preventar redaktadi od altra agi.",
        "viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino.",
        "viewyourtext": "Vu darfas vidar e kopiar la fonto di <strong>vua redakti</strong> ad ita pagino.",
        "protectedinterface": "Ita pagino provizas 'interface' texto por la programaro en ita wiki, ed esas protektita por preventar mis-uzo.\nPor introduktar o chanjar tradukaji di la wiki-i, voluntez vizitar [https://translatewiki.net/ translatewiki.net], la projeto qua provizas tradukaji a MediaWiki.",
        "editinginterface": "<strong>Averto:</strong> Vu redaktas pagino qua uzesas por provizar 'interface' texto di la programaro.\nChanji a ta pagino chanjos la aspekto di pagini por altra uzeri di ta wiki.",
        "translateinterface": "Por introduktar o chanjar tradukaji en omna wiki-i, voluntez uzar [https://translatewiki.net/ translatewiki.net], la komuna projeto MediaWiki.",
+       "cascadeprotected": "Ica pagino protektesis kontre l'editado pro ke lua kontenajo transskribesas en la sequanta {{PLURAL:$1|pagino, qua esas|pagini, qui esas}} protektita kande selektesis por ol la formo di \"protekto en kaskado\":\n$2",
        "namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
        "customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
        "customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
        "titleprotected": "Ita titulo es protektita de kreado da [[User:$1|$1]].\nLa motivo es <em>$2</em>.",
        "filereadonlyerror": "La dosiero \"$1\" ne es modifikebla nam la depozeyo di dosieri \"$2\" esas nur lektebla.\n\nLa sistem-administrero qua klozis ol ofris ita klarigo: \"$3\".",
        "invalidtitle-knownnamespace": "Ne-valida titulo kun nomaro \"$2\" e texto \"$3\"",
+       "invalidtitle-unknownnamespace": "Nevalida titulo kun nekonocata nombro di limitilo 'namespace' $1 e texto \"$2\"",
        "exception-nologin": "Vu ne eniris",
        "exception-nologin-text": "Voluntez enirar konto por acesar la pagino od ago.",
        "exception-nologin-text-manual": "Voluntez $1 por acesar ta pagino od ago.",
        "nosuchusershort": "Esas nula uzero \"$1\".\nKontrolez la espelado.",
        "nouserspecified": "Vu mustas specigar uzantonomo.",
        "login-userblocked": "Ta uzero es interdiktita. Enirado ne permisesas.",
-       "wrongpassword": "La skribita pasovorto esis nekorekta. Voluntez probar itere.",
+       "wrongpassword": "La skribita pasovorto ne esas korekta.\nVoluntez probar itere.",
        "wrongpasswordempty": "Vu ne skribis pasovorto. Probez nove.",
        "passwordtooshort": "Pasovorti mustas kontenar adminime {{PLURAL:$1|1 signo|$1 signi}}.",
        "passwordtoolong": "Pasovorti ne mustas esar plu longa kam {{PLURAL:$1|1 litero|$1 literi}}.",
        "password-login-forbidden": "La uzo di ita uzeronomo e pasovorto es interdiktita.",
        "mailmypassword": "Sendez nova pasovorto per e-posto",
        "passwordremindertitle": "Nova provizora pasovorto por {{SITENAME}}",
+       "passwordremindertext": "Ulu (probable tu, del IP-adreso $1) solicitis nova pasovorto de {{SITENAME}} ($4). Provizora pasovorto por l'uzero \"$2\" kreesis e sendesis a \"$3\". Se to esis tua volunto, tu mustas facar 'log in' e selektar nova pasovorto nun.\nTua tempala pasovorto expiros en {{PLURAL:$5|un dio|$5 dii}}.\n\nSe altra persono facis la demando, o se tu rimemoris tua anciena pasovorto e ne bezonas modifikar ol, tu povas ignorar ica mesajo e durar l'uzo di tua anciena pasovorto.",
        "noemail": "Ne esas e-adreso konservita por la uzero \"$1\".",
        "noemailcreate": "Tu mustas informar valida e-posto",
        "passwordsent": "Nova pasovorto sendesis a la e-adreso registragita por \"$1\".\nVoluntez enirar altrafoye pos recevar ol.",
        "eauthentsent": "E-posto por konfirmar l'informi sendesis a la e-posto indikita da vu.\nAnte ke altra e-posto sendesos a vua konto, vu mustos sequar l'instrukti mencionata en la e-posto, por konfirmar ke la konto fakte esas vua.",
        "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
        "mailerror": "Eroro sendante posto: $1",
-       "acct_creation_throttle_hit": "Vizitanti ad ica wiki uzante vua IP adreso kreis {{PLURAL:$1|1 konto|$1 konti}} ye la antea dio (24 hori), qua esas la maximo permisata. Konseque, vizitanti uzante ca IP adreso ne pluse povas krear konti prezente.",
+       "acct_creation_throttle_hit": "Viziteri di ica wiki uzante vua IP-adreso kreis {{PLURAL:$1|1 konto|$1 konti}} dum la sequanta $2, quo esas la maxima quanto permisata dum ta periodo. Konseque, viziteri uzante ica IP-adreso ne pluse povas krear nova konti prezente.",
        "emailauthenticated": "Vua e-postal adreso autentikigesis ye $2, ye $3.",
        "emailnotauthenticated": "Vua e-postal adreso ne ja autentikigesas.\nNula mesaji sendesos por irga di la sequanta funcioni.",
        "noemailprefs": "Prizentez e-postal adreso en vua preferaji por disponar ita funcioni.",
        "emailconfirmlink": "Konfirmez vua adreso di e-posto",
+       "invalidemailaddress": "La e-posto informata ne povas aceptesar, pro ke ol semblas havar nevalida formato.\nVoluntez skribar korekte la e-posto, od efacar l'informo.",
        "cannotchangeemail": "E-posto-adreso dil konto ne povas chanjesar ye ta wikio.",
        "emaildisabled": "Ita ret-sito ne povas sendar e-mesaji.",
        "accountcreated": "Konto kreesis",
        "login-abort-generic": "Vua eniro-probo faliis - Cesigita",
        "login-migrated-generic": "Vua konto esas migrata, e vua uzeronomo ne plus existas che ita wikio.",
        "loginlanguagelabel": "Linguo: $1",
+       "suspicious-userlogout": "Vua demando pri ekiro ('log out') refuzesis, pro ke ol semblas sendesir de retnavigilo krevita, o de 'proxy' antee konservita.",
        "pt-login": "Enirar",
        "pt-login-button": "Enirar",
        "pt-login-continue-button": "Durez enirar",
        "botpasswords-label-delete": "Efacar",
        "botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
        "botpasswords-label-grants": "Uzebla grantaji:",
+       "botpasswords-label-grants-column": "Permisita",
+       "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.",
+       "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis",
        "resetpass-submit-loggedin": "Chanjar pasovorto",
        "resetpass-submit-cancel": "Anular",
        "resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.",
        "resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:",
        "resetpass-temp-password": "Provizora pasovorto:",
        "passwordreset": "Sendez nova pasovorto per e-posto",
+       "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.",
        "passwordreset-username": "Uzantonomo:",
+       "passwordreset-domain": "Interreto-domeno:",
+       "passwordreset-email": "E-postal adreso:",
+       "passwordreset-emailtitle": "Detali pri la konto en {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
+       "passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2",
+       "passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
        "passwordreset-invalidemail": "Ne-valida e-posto-adreso",
        "passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita",
        "changeemail": "Chanjar od efacar e-postal adreso",
        "anoneditwarning": "<strong>Averto:</strong> Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu <strong>[$1 enirus]</strong> od <strong>[$2 kreus konto]</strong>, vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.",
        "anonpreviewwarning": "<em>Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.</em>",
        "missingcommenttext": "Voluntez, skribez komento sube.",
-       "summary-preview": "Prevido di la rezumo:",
+       "summary-preview": "Previdado di la rezumo:",
+       "subject-preview": "Previdado di la temo:",
+       "previewerrortext": "Eventis eroro kande on probis krear previdado pri vua modifikuri.",
        "blockedtitle": "La uzero esas blokusita",
        "blockedtext": "<strong>Vua uzantonomo od IP-adreso blokusesis.</strong>\n\n$1 blokusis vu.\nLa motivo esis <em>$2</em>.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.",
+       "autoblockedtext": "<strong>Vua uzantonomo od IP-adreso blokusesis.</strong>\n\n$1 blokusis vu.\nLa motivo esis <em>$2</em>.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.",
        "blockednoreason": "nula motivo donesis",
        "whitelistedittext": "Vu mustas $1 por redaktar pagini.",
        "nosuchsectiontitle": "On ne povis trovar la seciono",
index 04fc12d..340ab40 100644 (file)
        "recentchangeslinked-feed": "Skyldar breytingar",
        "recentchangeslinked-toolbox": "Skyldar breytingar",
        "recentchangeslinked-title": "Breytingar tengdar \"$1\"",
-       "recentchangeslinked-summary": "Þetta er listi yfir nýlega gerðar breytingar á síðum sem tengt er í frá tilgreindri síðu (eða á meðlimum úr tilgreindum flokki).\nSíður á [[Special:Watchlist|vaktlistanum þínum]] eru '''feitletraðar'''.",
+       "recentchangeslinked-summary": "Settu inn heiti á síðu til að sjá breytingar á síðum sem tengt er í frá þeirri síðu. (Til að sjá meðlimi í ákveðnum flokki, settu inn Flokkur:Nafn á flokki). \nBreytingar á síðum á [[Special:Watchlist|vaktlistanum þínum]] eru <strong>feitletraðar</strong>.",
        "recentchangeslinked-page": "Síðutitill:",
        "recentchangeslinked-to": "Sýna breytingar á síðum sem tengjast uppgefinni síðu í staðinn",
        "recentchanges-page-added-to-category": "[[:$1]] bætt við flokk",
        "pageinfo-article-id": "Einkennisnúmer síðunnar",
        "pageinfo-language": "Tungumál síðunnar",
        "pageinfo-language-change": "breyta",
+       "pageinfo-content-model": "Efnislíkan síðu",
        "pageinfo-content-model-change": "breyta",
        "pageinfo-robot-policy": "Attriðaskráning af vélmennum",
        "pageinfo-robot-index": "Heimilað",
        "version-libraries-license": "Notkunarleyfi",
        "version-libraries-description": "Lýsing",
        "version-libraries-authors": "Höfundar",
+       "redirect": "Endurbeining miðað við skrá, notanda, síðu, útgáfu eða innskráningarauðkenni",
        "redirect-submit": "Áfram",
        "redirect-lookup": "Fletta upp:",
        "redirect-value": "Gildi:",
index 74ee3ce..b843b77 100644 (file)
                        "Greis",
                        "Pierpao",
                        "Sakretsu",
-                       "Yiyi"
+                       "Yiyi",
+                       "Manvydasz"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "doubleredirects": "Redirect doppi",
        "doubleredirectstext": "In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.\nCiascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione \"corretta\" alla quale dovrebbe puntare anche il primo redirect.\nI redirect <del>cancellati</del> sono stati corretti.",
        "double-redirect-fixed-move": "[[$1]] è stata spostato.\nÈ stato automaticamente aggiornato e ora è un redirect a [[$2]].",
-       "double-redirect-fixed-maintenance": "Corretto automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione.",
+       "double-redirect-fixed-maintenance": "Corretto automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione",
        "double-redirect-fixer": "Correttore di redirect",
        "brokenredirects": "Redirect errati",
        "brokenredirectstext": "I seguenti redirect puntano a pagine inesistenti:",
        "tag-mw-blank-description": "Modifiche che svuotano una pagina",
        "tag-mw-replace": "Sostituito",
        "tag-mw-replace-description": "Modifiche che rimuovono oltre il 90% del contenuto di una pagina",
-       "tag-mw-rollback": "Rollback",
+       "tag-mw-rollback": "Atmesti",
        "tag-mw-rollback-description": "Modifiche che ripristinano le versioni precedenti utilizzando il collegamento di rollback",
        "tag-mw-undo": "Annulla",
        "tag-mw-undo-description": "Modifiche che annullano le modifiche precedenti utilizzando il collegamento \"Annulla\"",
        "restrictionsfield-badip": "Indirizzo IP o intervallo non valido: $1",
        "restrictionsfield-label": "Intervalli IP consentiti:",
        "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Errore: $1",
+       "edit-error-long": "Errori:\n\n$1",
        "revid": "versione $1",
        "pageid": "ID della pagina $1",
        "rawhtml-notallowed": "I tag &lt;html&gt; non possono essere utilizzati al di fuori delle normali pagine.",
index 39dc919..a50f7bc 100644 (file)
        "rcfilters-activefilters": "絞り込み",
        "rcfilters-advancedfilters": "詳細フィルター",
        "rcfilters-limit-title": "表示する件数",
-       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|件の変更}}、$2",
+       "rcfilters-limit-and-date-label": "過去$2の$1{{PLURAL:$1|件の変更}}",
        "rcfilters-date-popup-title": "検索期間",
        "rcfilters-days-title": "日数",
        "rcfilters-hours-title": "時間",
        "doubleredirects": "二重転送",
        "doubleredirectstext": "このページでは、転送ページへの転送ページを列挙します。\n最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。\n<del>取り消し線</del>が入った項目は解決済みです。",
        "double-redirect-fixed-move": "[[$1]]を移動しました。\n自動的に更新され、今後は[[$2]]に転送されます。",
-       "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します",
+       "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します",
        "double-redirect-fixer": "転送修正係",
        "brokenredirects": "迷子のリダイレクト",
        "brokenredirectstext": "以下は、存在しないページへのリダイレクトの一覧です:",
        "restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
        "restrictionsfield-label": "許可する IP の範囲:",
        "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合: <pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "エラー: $1",
+       "edit-error-long": "エラー:\n\n\n\n$1",
        "revid": "版 $1",
        "pageid": "ページID $1",
        "rawhtml-notallowed": "&lt;html&gt;タグは通常ページ以外では使用できません。",
index dd7d032..f77067d 100644 (file)
        "rcfilters-restore-default-filters": "ნაგულისხმევი ფილტრების აღდგენა",
        "rcfilters-clear-all-filters": "ყველა ფილტრის გაწმენდა",
        "rcfilters-show-new-changes": "ახალი ცვლილებების ნახვა",
-       "rcfilters-search-placeholder": "á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 (á\83\93á\83\90á\83\90á\83\97á\83\95á\83\90á\83\9aá\83\98á\83\94á\83 á\83\94á\83\97 á\83\90á\83\9c á\83\93á\83\90á\83\98á\83¬á\83§á\83\94á\83\97 á\83\90á\83\99á\83 á\83\94á\83¤á\83\95á\83\90)",
+       "rcfilters-search-placeholder": "á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 (á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\97 á\83\9bá\83\94á\83\9cá\83\98á\83£ á\83\90á\83\9c á\83\9bá\83\9dá\83«á\83\94á\83\91á\83\9cá\83\94á\83\97 á\83¤á\83\98á\83\9aá\83¢á\83 á\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98)",
        "rcfilters-invalid-filter": "არასწორი ფილტრი",
        "rcfilters-empty-filter": "აქტიური ფილტრები არ არის. აისახება ყველა წვლილი.",
        "rcfilters-filterlist-title": "ფილტრები",
index 84055dc..340f427 100644 (file)
        "doubleredirects": "이중 넘겨주기 목록",
        "doubleredirectstext": "이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.\n매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 \"실제\" 문서인 두 번째 넘겨주기의 대상이 있습니다.\n<del>취소선이 그어진</del> 부분은 이미 해결되었습니다.",
        "double-redirect-fixed-move": "[[$1]] 문서를 이동하였습니다.\n이 문서는 자동으로 수정되었으며 이제 [[$2]] 문서로 자동으로 넘겨줍니다.",
-       "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다.",
+       "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다",
        "double-redirect-fixer": "넘겨주기 수리꾼",
        "brokenredirects": "끊긴 넘겨주기 목록",
        "brokenredirectstext": "존재하지 않는 문서로 넘겨주기가 되어 있는 문서의 목록입니다:",
        "restriction-level-all": "모두",
        "undelete": "삭제된 문서 보기",
        "undeletepage": "삭제된 문서를 보거나 되살리기",
-       "undeletepagetitle": "'''아래는 [[:$1|$1]] 판의 삭제된 판입니다'''.",
+       "undeletepagetitle": "<strong>아래 내용은 [[:$1|$1]] 문서의 삭제된 판입니다</strong>.",
        "viewdeletedpage": "삭제된 문서 보기",
        "undeletepagetext": "다음 {{PLURAL:$1|문서는 삭제되었지만|문서 $1개는 삭제되었지만}} 아직 보관되어 있고 되살릴 수 있습니다.\n보관된 문서는 주기적으로 삭제될 것입니다.",
        "undelete-fieldset-title": "문서 되살리기",
        "watchlistedit-raw-done": "주시문서 목록을 새로 고쳤습니다.",
        "watchlistedit-raw-added": "{{PLURAL:$1|문서 1개|문서 $1개}}를 추가했습니다:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
-       "watchlistedit-clear-title": "주시문서 목록 우기",
-       "watchlistedit-clear-legend": "주시문서 목록 우기",
+       "watchlistedit-clear-title": "주시문서 목록 우기",
+       "watchlistedit-clear-legend": "주시문서 목록 우기",
        "watchlistedit-clear-explain": "모든 문서가 주시문서 목록에서 제거됩니다",
        "watchlistedit-clear-titles": "제목:",
        "watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
        "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "오류: $1",
+       "edit-error-long": "오류:\n\n$1",
        "revid": "$1 판",
        "pageid": "페이지 ID $1",
        "rawhtml-notallowed": "&lt;html&gt; 태그는 일반 페이지 밖에서는 사용할 수 없습니다.",
index 340eb1b..93677c0 100644 (file)
        "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
        "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
        "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
+       "edit-error-short": "Feeler: $1",
+       "edit-error-long": "Feeler:\n\n$1",
        "revid": "Versioun $1",
        "gotointerwiki": "{{SITENAME}} verloossen",
        "gotointerwiki-invalid": "De spezifizéierten Titel ass net valabel.",
index bc756df..4c3fc7e 100644 (file)
        "autosumm-replace": "Teks vervange mit '$1'",
        "autoredircomment": "Verwies door nao [[$1]]",
        "autosumm-new": "Nuuj pazjena mit $1",
+       "autosumm-newblank": "haet 'n laeg pagina aangemaak",
        "lag-warn-normal": "Verangeringe die nujer zeen es $1 {{PLURAL:$1|sekónd|sekónd}} waere mesjiens neet getuind in dees lies.",
        "lag-warn-high": "Door 'ne hoege database-servertoeveur zeen verangeringe nujer es $1 {{PLURAL:$1|seconde|seconde}} mäögelik neet besjikbaar in de lies.",
        "watchlistedit-normal-title": "Volglies bewirke",
index ab2348a..5736d87 100644 (file)
                        "Macofe",
                        "Nemo bis",
                        "S4b1nuz E.656",
-                       "Luensu1959"
+                       "Luensu1959",
+                       "Feipìn"
                ]
        },
        "tog-underline": "Sotolìnnia i colegaménti",
-       "tog-hideminor": "Ascondi e modìffiche minoî inte ùrtime modìffiche",
-       "tog-hidepatrolled": "Ascondi e modìffiche verificæ inte ùrtime modìffiche",
-       "tog-newpageshidepatrolled": "Ascondi e pàgine verificæ da l'elénco de pàgine ciù recénti",
+       "tog-hideminor": "Ascondi e modìfiche minôri inte ùrtime modìfiche",
+       "tog-hidepatrolled": "Ascondi e modìfiche verificæ inte ùrtime modìfiche",
+       "tog-newpageshidepatrolled": "Ascondi e pàgine verifichæ da l'elénco de pàgine ciù recénti",
        "tog-hidecategorization": "Ascondi a categorizasión de pàgine",
-       "tog-extendwatchlist": "mostra tùtte e modìffiche a-i öservatoî speciâli, no sôlo l'ùrtima",
-       "tog-usenewrc": "Amùggia pe pàgina e modìffiche inte ùrtime modìffiche e sotta öservaçión",
+       "tog-extendwatchlist": "mostra tùtte e modìfiche di òservæ speciâli, no solo l'ùrtima",
+       "tog-usenewrc": "Amùggia pe pàgina e modìfiche inte ùrtime modìfiche e sotta òservaçión",
        "tog-numberheadings": "Numeraçión aotomàtica di tìtoli de seçión",
-       "tog-showtoolbar": "Fanni vedde a bâra di strumenti de modìffica",
-       "tog-editondblclick": "Modìffica de pàgine tràmite dóggio clic",
+       "tog-showtoolbar": "Mostra a bâra di strumenti de modìfica",
+       "tog-editondblclick": "Modìfica de pàgine tràmite dóggio clic",
        "tog-editsectiononrightclick": "Permetti de modificâ e seçioìn co-o clic drîto in sciô tìtolo",
-       "tog-watchcreations": "Azonzi e pàgine che mi crêo e i files che càrego a-i öservatoî speciâli",
-       "tog-watchdefault": "Azonzi e pàgine e i files che modìffico a-a mæ lista sotta öservaçión",
-       "tog-watchmoves": "Azonzi e pàgine e i files che mescio a-a mæ lista sotta Ãservaçión",
-       "tog-watchdeletion": "Azonzi e pàgine e i files che scancello a-a mæ lista sotta öservaçión",
-       "tog-watchuploads": "Azonzi i nêuvi files che mi métto sotta Ãservaçión",
-       "tog-watchrollback": "Azonzi a-a mæ lista sotta Ãservaçión e pàgine dôve ò fæto in rollback",
-       "tog-minordefault": "Indica de longo cómme menô tùtte e modìffiche",
-       "tog-previewontop": "Mostra l'anteprìmma de d'âto a-a cazélla de modìffica",
-       "tog-previewonfirst": "Mostra l'anteprìmma in sciâ prìmma modìffica",
-       "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na pàgina ò in file inta mæ lista de öservaçión a vegne cangiâ.",
-       "tog-enotifusertalkpages": "Màndime 'n'e-mail se gh'é de modìffiche inta mæ pàgina de discusción.",
-       "tog-enotifminoredits": "Màndime 'n'email ascì pe-e modìffiche menoî de pàgine e di files",
-       "tog-enotifrevealaddr": "Mostra o mæ indirìsso inte emails de notìffica",
+       "tog-watchcreations": "Azonzi e pàgine che mi crêo e i files che càrego a-i öservæ speciâli",
+       "tog-watchdefault": "Azonzi e pàgine e i file che mi modìffico a-a mæ lista sotta òservaçión",
+       "tog-watchmoves": "Azonzi e pàgine e i files che mescio a-a mæ lista sotta Ã²servaçión",
+       "tog-watchdeletion": "Azonzi e pàgine e i file che scancèllo a-a mæ lista sotta òservaçión",
+       "tog-watchuploads": "Azonzi i nêuvi files che mi métto sotta Ã²servaçión",
+       "tog-watchrollback": "Azonzi a-a mæ lista sotta Ã²servaçión e pàgine dôve ò fæto in rollback",
+       "tog-minordefault": "Indica de longo cómme menô tùtte e modìfiche",
+       "tog-previewontop": "Mostra l'anteprìmma de d'âto a-a cazélla de modìfica",
+       "tog-previewonfirst": "Mostra l'anteprìmma in sciâ prìmma modìfica",
+       "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na pàgina ò 'n file inta mæ lista de òservaçión a vegne cangiâ.",
+       "tog-enotifusertalkpages": "Màndime 'n'e-mail se gh'é de modìfiche inta mæ pàgina de discusción.",
+       "tog-enotifminoredits": "Màndime 'n'email ascì pe-e modìfiche menoî de pàgine e di files",
+       "tog-enotifrevealaddr": "Mostra o mæ indirìsso inte emails de notìfica",
        "tog-shownumberswatching": "Mostra o nùmero di uténti che tegnan d'éuggio sta pàgina",
        "tog-oldsig": "Firma atoâle:",
        "tog-fancysig": "Tratta a firma cómme wikitesto (sénsa n'ingancio aotomàtico)",
        "tog-uselivepreview": "Abìlita a fonçión de l'anteprìmma in diretta",
        "tog-forceeditsummary": "Domàndame a confèrma se o cànpo de l'ògetto o l'é vêuo",
-       "tog-watchlisthideown": "Ascondi e mæ modìffiche da-a lista sotta öservaçión",
-       "tog-watchlisthidebots": "Ascondi e modìffiche di bot da-a lista sotta öservaçión",
-       "tog-watchlisthideminor": "Ascondi e modìffiche minoî da-a lista sotta öservaçión",
-       "tog-watchlisthideliu": "Ascondi e modìffiche di uténti intræ da-a lista sotta öservaçión",
+       "tog-watchlisthideown": "Ascondi e mæ modìfiche da-a lista sotta òservaçión",
+       "tog-watchlisthidebots": "Ascondi e modìfiche di bot da-a lista sotta òservaçión",
+       "tog-watchlisthideminor": "Ascondi e modìfiche minôri da-a lista sotta òservaçión",
+       "tog-watchlisthideliu": "Ascondi e modìfiche di uténti intræ da-a lista sotta òservaçión",
        "tog-watchlistreloadautomatically": "Recàrega aotomaticaménte a lista di öservæ quande vegne cangiòu in filtro (ghe veu o JavaScript)",
-       "tog-watchlisthideanons": "Ascondi e modìffiche di uténti sénsa nómme da-a lista sotta öservaçión",
-       "tog-watchlisthidepatrolled": "Ascondi e modìffiche za controlæ da-a lista sotta öservaçión",
+       "tog-watchlisthideanons": "Ascondi e modìfiche di uténti sénsa nómme da-a lista sotta òservaçión",
+       "tog-watchlisthidepatrolled": "Ascondi e modìfiche za controlæ da-a lista sotta òservaçión",
        "tog-watchlisthidecategorization": "Ascondi a categorizasión de pàgine",
        "tog-ccmeonemails": "Màndime 'na còpia de e-mails che mi mando a-i âtri uténti",
        "tog-diffonly": "No mostrâ o contegnûo da pàgina sotta o confronto fra verscioìn",
-       "tog-showhiddencats": "Fanni vedde e categorîe ascôze",
-       "tog-norollbackdiff": "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
-       "tog-useeditwarning": "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
-       "tog-prefershttps": "Adœuvia delongo una connescion segua quande se intra",
-       "underline-always": "Sempre",
+       "tog-showhiddencats": "Fanni védde e categorîe ascôze",
+       "tog-norollbackdiff": "Ometti o confronto fra verscioin dòppo ch'ho fæto o riprìstino",
+       "tog-useeditwarning": "Avèrtime se lascio 'na pàgina de modìfica sens'avei sarvòu i cangiamenti",
+       "tog-prefershttps": "Adêuvia de longo 'na conesción segûa quande se intra",
+       "underline-always": "Sénpre",
        "underline-never": "Mâi",
-       "underline-default": "Impostassioin predefinie do navegatô o da skin",
-       "editfont-style": "Stile do carattere de l'area de modiffica",
-       "editfont-monospace": "Carattere a larghessa fissa",
-       "editfont-sansserif": "Carattere sans-serif",
-       "editfont-serif": "Carattere serif",
+       "underline-default": "Inpostasioìn predefinîe do navegatô ò da skin",
+       "editfont-style": "Stîle do caràtere de l'àrea de modìfica",
+       "editfont-monospace": "Caràtere a larghéssa fissa",
+       "editfont-sansserif": "Caràtere sans-serif",
+       "editfont-serif": "Caràtere serif",
        "sunday": "doménega",
        "monday": "lunesdì",
        "tuesday": "mâtesdì",
        "tagline": "Da {{SITENAME}}",
        "help": "Agiùtto",
        "search": "Riçèrca",
-       "search-ignored-headings": " #<!-- lascia questa riga esattamente comm'a l'è --> <pre>\n# Elenco de intestaçioin che saian ignoræ da-a riçerca.\n# E modifiche a questa paggina saian effettive non apen-a a paggina a saiâ indiçizâ.\n# Ti poeu forçâ a re-indiçizzaçion de 'na paggina effettoando una modifica nulla.\n# A scintasci a l'è a seguente:\n#   * Tutto da-o carattere \"#\" a-a fin da riga o l'è un commento\n#   * Tutte e righe non voeue son e intestaçioin esatte da ignorâ, maiuscolo/minuscolo e tutto\nNotte\nVoxe correlæ\nCollegamenti esterni\n #</pre> <!-- lascia questa riga esattamente comm'a l'è -->",
+       "search-ignored-headings": " #<!-- lascia questa riga ezatamente com'a l'é --> <pre>\n# Elenco de intestaçioin che saian ignoræ da-a riçerca.\n# E modifiche a questa pagina saian effetive non apenn-a a pagina a saiâ indicizâ.\n# Ti peu forsâ a re-indicizaçion de 'na pagina efetoando 'na modifica nulla.\n# A scintasci a l'è a segoente:\n#   * Tutto da-o carattere \"#\" a-a fin da riga o l'è un commento\n#   * Tutte e righe non veue són e intestaçioin ezatte da ignorâ, maioscolo/minuscolo e tutto\nNòtte\nVôxe corelæ\nColegamenti estèrni\n #</pre> <!-- lascia quésta riga ezattamente com'a l'è -->",
        "searchbutton": "Riçèrca",
        "go": "Vanni",
        "searcharticle": "Vanni",
        "tool-link-userrights": "Modiffica groppi {{GENDER:$1|utente}}",
        "tool-link-userrights-readonly": "Vixualizza groppi {{GENDER:$1|utente}}",
        "tool-link-emailuser": "Manda un'e-mail a questo {{GENDER:$1|utente}}",
-       "imagepage": "Vizualizza a paggina do file",
+       "imagepage": "Mostra a pagina do file",
        "mediawikipage": "Vizualizza o messaggio",
        "templatepage": "Vizualizza o modello",
-       "viewhelppage": "Vizualizza a paggina d'agiutto",
-       "categorypage": "Veddi a paggina da categoria",
-       "viewtalkpage": "Amia a paggina de discuscion",
+       "viewhelppage": "Móstra a pagina d'agiutto",
+       "categorypage": "Veddi a pagina da categorîa",
+       "viewtalkpage": "Amîa a pagina de discusción",
        "otherlanguages": "In âtre léngoe",
        "redirectedfrom": "(Rendirissou da $1)",
-       "redirectpagesub": "Paggina de rindirissamento",
+       "redirectpagesub": "Pagina de rindirissamento",
        "redirectto": "Rendirissa a:",
        "lastmodifiedat": "Sta pagina a l'è stæta cangiâ l'urtima votta o $1 a $2.",
-       "viewcount": "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
+       "viewcount": "Questa pagina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
        "protectedpage": "Pàgina protètta",
        "jumpto": "Vanni a:",
        "jumptonavigation": "navegaçión",
-       "jumptosearch": "çerca",
-       "view-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta paggina.\nAspeta quarche menuto primma de çercâ torna d'accede a sta pagina.\n\n$1",
+       "jumptosearch": "çèrca",
+       "view-pool-error": "Ne rincresce, a-o momento i server sono soviacareghi.\nTròppi utenti çercan d'amiâ sta pagina.\nAspeta quarche menûto primma de çercâ d'acedde torna a sta pagina.\n\n$1",
        "generic-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta risorsa.\nAspeta quarche menuto primma de çercâ torna d'accede a sta risorsa.",
        "pool-timeout": "Tempo descheito aspêtando o sblocco",
        "pool-queuefull": "A coa do pool a l'è pin-a",
        "badaccess-group0": "No ti g'hæ o permisso pe fâ quest'assion.",
        "badaccess-groups": "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti {{PLURAL:$2|do gruppo|de un de sti gruppi}}: $1.",
        "versionrequired": "Ghe voeu a verscion $1 de MediaWiki",
-       "versionrequiredtext": "Pe doeuviâ sta paggina ghe voeu a verscion $1 do software MediaWiki. Amia [[Special:Version|l'appoxita paggina]].",
+       "versionrequiredtext": "Pe deuviâ sta pagina ghe veu a versción $1 do software MediaWiki. Amîa [[Special:Version|l'appoxita paggina]].",
        "ok": "D'accòrdio",
        "retrievedfrom": "Estræto da \"$1\"",
        "youhavenewmessages": "Ti gh'æ $1 ($2).",
        "mainpage-nstab": "Pàgina prinçipâ",
        "nosuchaction": "No se poeu",
        "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nÒ che t'hæ scrito mâ, ò che donque l'ea sbaliou l'ingancio.\nÒ magara gh'è 'na cammoa into software dœuviou da {{SITENAME}}.",
-       "nosuchspecialpage": "Sta paggina speciale a no gh'è",
-       "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciua.</strong>\n\nA lista de paggine speciale vallide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
+       "nosuchspecialpage": "Sta pagina speciale a no gh'é",
+       "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciûa.</strong>\n\nA lista de pagine speciale valide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
        "error": "Errô",
        "databaseerror": "Errô do database",
        "databaseerror-text": "L'è ocorso un errô inte 'na çerchia in sciô database. \nO porriæ indicâ un bug into software.",
        "databaseerror-function": "Fonsion: $1",
        "databaseerror-error": "Errô: $1",
        "transaction-duration-limit-exceeded": "Pe evitâ un ato ritardo de replica, questa opiaçion a l'è stæta interotta perché a duata do tempo de scrittua ($1) a l'ha superou o limmite de $2 {{PLURAL:$2|segondo|segondi}}.\nSe t'ê aproeuvo a cangiâ tante cose inte'na votta sola, proeuva invece a cangiâ poche cose in tante votte.",
-       "laggedslavemode": "'''Attension:''' a paggina a porriæ no riportâ i aggiornamenti ciù reçenti.",
+       "laggedslavemode": "'''Atension:''' a pagina a poriéva no riportâ i agiornamenti ciù recenti.",
        "readonly": "Database bloccòu",
        "enterlockreason": "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
        "readonlytext": "Po-u momento o database o l'è bloccou a-e neuve azonte e modiffiche, foscia pe 'na manutension ordenaia do database, doppo a quæ o saiâ torna accescibile.\n\nL'amministratô ch'o l'ha misso o blocco o l'ha dæto sta spiegassion: $1",
        "unexpected": "Valô imprevisto: \"$1\"=\"$2\".",
        "formerror": "Errô: imposcibbile inviâ o formulaio",
        "badarticleerror": "L'açion che ti te veu fâ a non l'è permissa in sta pagina.",
-       "cannotdelete": "Non se peu scassâ a paggina ò o file  \"$1\" . O porriæ ese za stæto scassòu da quarchedun atro.",
-       "cannotdelete-title": "Imposcibbile scassâ a paggina \"$1\"",
+       "cannotdelete": "Non se peu scasâ a pagina ò o file  \"$1\" . O poriéva êse za stæto scasòu da quarchedun atro.",
+       "cannotdelete-title": "Imposcibile scasâ a pagina \"$1\"",
        "delete-hook-aborted": "A scassaxon a l'è stæta annullâ dall'hook.\nO no l'ha dæto arcun-a spiegassion.",
-       "no-null-revision": "No l'è stæto poscibbile creâ una verscion nulla pe-a paggina \"$1\"",
+       "no-null-revision": "No l'è stæto poscibile creâ una verscion nulla pe-a pagina \"$1\"",
        "badtitle": "O tìtolo o no l'è corretto.",
-       "badtitletext": "O tittolo da paggina çercâ o l'è vêuo, sballiòu o con caratteri no accettæ, oppû o deriva da 'n errô inti collegamenti inter-lengoa o inter-wiki.",
-       "title-invalid-empty": "O tittolo da paggina domandâ o l'è veuo ò o contene solo che-o nomme de un namespace.",
-       "title-invalid-utf8": "O tittolo da paggina domandâ o conten una sequensa UTF-8 non vallida.",
-       "title-invalid-interwiki": "O tittolo da paggina domandâ o conten un ingancio interwiki ch'o no poeu ese doeuviòu inti tittoli.",
-       "title-invalid-talk-namespace": "O tittolo da paggina domandâ o fa rifeimento a 'na paggina de discusscion ch'a no peu existe.",
-       "title-invalid-characters": "O tittolo da paggina domandâ o conten di caratteri invallidi: \"$1\".",
+       "badtitletext": "O titolo da pagina çercâ o l'è vêuo, sbaliòu o con caratteri no acetæ, opûre o deriva da 'n erô inti colegamenti inter-lengoa o inter-wiki.",
+       "title-invalid-empty": "O titolo da pagina domandâ o l'è veuo ò o contegne solo che-o nomme de'n namespace.",
+       "title-invalid-utf8": "O titolo da pagina domandâ o contegne 'na sequensa UTF-8 non valida.",
+       "title-invalid-interwiki": "O titolo da pagina domandâ o contegne un ingancio interwiki ch'o no peu ese adeuviòu inti titoli.",
+       "title-invalid-talk-namespace": "O titolo da pagina domandâ o fa rifeimento a 'na pagina de discusción ch'a no peu existe.",
+       "title-invalid-characters": "O titolo da pagina domandâ o contegne di caratteri no validi: \"$1\".",
        "title-invalid-relative": "O tittolo o conten un percorso relativo (./, ../). Tæ tittoli no son vallidi, perché risultian soventi irazonzibbili quande gestii da-o navegatô de l'utente.",
-       "title-invalid-magic-tilde": "O tittolo da paggina domandâ o no l'è vallido in quante o conten a succescion speciale de tirde (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "O tittolo da paggina domandâ o l'è troppo longo. O no peu ese ciù longo de {{PLURAL:$1|byte}} in codifica UTF-8.",
-       "title-invalid-leading-colon": "O tittolo da paggina domandâ o no l'è vallido perchè o comensa con doî ponti.",
+       "title-invalid-magic-tilde": "O titolo da pagina domandâ o no l'è valido in quante o contegne a sucesión speciale de tirde (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "O titolo da pagina domandâ o l'è troppo longo. O no peu ese ciù longo de {{PLURAL:$1|byte}} inta codifica UTF-8.",
+       "title-invalid-leading-colon": "O titolo da pagina domandâ o no l'è valido perché o l'incomensa con doî ponti.",
        "perfcached": "I dæti chì apreuvo son estræti da 'na coppia ''cache'' do database, e porrieivan no ese agiornæ. Un mascimo de {{PLURAL:$1|un risultou o l'è disponibbile|$1 risultæ son disponibbili}} into cache.",
        "perfcachedts": "I dæti chì apreuvo son estræti da una coppia ''cache'' do database, o quæ urtimo agiornamento o remonta a-o $1. Un mascimo de {{PLURAL:$4|un risultou o l'è disponibbile|$4 risultæ son disponibili}} into cache.",
-       "querypage-no-updates": "I aggiornamenti da paggina son temporaniamente sospeixi. I dæti in essa contegnui no saian aggiornæ.",
+       "querypage-no-updates": "I agiornamenti da pagina son temporaniamente sospeixi. I dæti in lé contegnui no saian aggiornæ.",
        "viewsource": "Veddi a fonte",
        "viewsource-title": "Visualizza sorgente de $1",
        "actionthrottled": "Assion ritardâ",
        "actionthrottledtext": "Comme mesua de segueça contra o spam, l'esecuçion de çerte açioin a l'è limitâ a un nummero mascimo de votte inte 'n determinòu periodo de tempo, limmite che ti t'hæ superòu. Se prega de riprovâ tra quarche menuto.",
-       "protectedpagetext": "Sta paggina a l'è stæta protezûa pe impedîne a modiffica ò di atre açioin.",
-       "viewsourcetext": "L'è poscibbile amiâ e copiâ a sorgente de sta paggina.",
-       "viewyourtext": "L'è poscibbile amiâ e copiâ a sorgente de <strong>teu modiffiche</strong> a sta paggina.",
-       "protectedinterface": "Sta paggina a conten un elemento ch'o fa parte de l'interfaccia utente do software de sto scito e a l'è protetta pe evitâ poscibbili abuxi.\nPe azonze o modificâ e tradussioin vallide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto de localizzassion de MediaWiki.",
-       "editinginterface": "<strong>Attension:</strong> o scrito de sta paggina o fa parte de l'interfaccia utente do software de questo scito. Tutte e modiffiche apportæ a questa paggina se riflettan in scî messaggi visualizzæ pe tutti i utenti in sce questo wiki.",
+       "protectedpagetext": "Sta pagina a l'è stæta protezûa pe impedîne a modifica ò atre açioin.",
+       "viewsourcetext": "L'è poscibile amiâ e copiâ a sorgente de sta pagina.",
+       "viewyourtext": "L'è poscibile amiâ e copiâ a sorgente de <strong>teu modifiche</strong> a sta pagina.",
+       "protectedinterface": "Sta pagina a contegne un elemento ch'o fa parte de l'interfaccia utente do software de sto scito e a l'è protetta pe evitâ poscibili abuxi.\nPe azonze o modificâ e tradusioìn valide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto de localizasión de MediaWiki.",
+       "editinginterface": "<strong>Atensión:</strong> o scrîto de sta pagina o fa parte de l'interfaccia utente do software de questo scito. Tutte e modifiche aportæ a questa pagina se riflèttan in scî mesaggi visualizæ pe tutti i utenti in sce questa wiki.",
        "translateinterface": "Pe azonze ò modificâ e tradussioin vallide insce tutti i wiki, deuvia [https://translatewiki.net/ translatewiki.net], o progetto MediaWiki pe-a localizzassion.",
-       "cascadeprotected": "Insce sta paggina no l'è poscibbile effettuâ modiffiche perché a l'è inclusa {{PLURAL:$1|inta paggina indicâ de seguito, ch'a l'è stæta protetta|inte paggine indicæ de seguito, ch'en stæte protette}} selessionando a protession \"ricorsciva\":\n$2",
+       "cascadeprotected": "Insce sta pagina no l'è poscibile efetoâ modifiche perché a l'è incluza {{PLURAL:$1|inta pagina indicâ dòppo, ch'a l'è stæta protètta|inte pagine indichæ de seguito, che son stæte protètte}} selesionando a protesion \"ricorsciva\":\n$2",
        "namespaceprotected": "No ti g'hæ i permissi necessai pe modificâ e paggine do namespace '''$1'''.",
        "customcssprotected": "No ti g'hæ i permissi pe cangiâ sta pagina CSS percose a conten e impostaçioin personale de 'n atro utente.",
        "customjsprotected": "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
-       "mycustomcssprotected": "No ti g'hæ i permissi pe cangiâ sta paggina CSS.",
-       "mycustomjsprotected": "No ti g'hæ o permisso pe modificâ sta paggina JavaScript .",
+       "mycustomcssprotected": "No ti g'hæ i permissi pe cangiâ sta pagina CSS.",
+       "mycustomjsprotected": "No ti g'hæ o permisso pe modificâ sta pagina JavaScript.",
        "myprivateinfoprotected": "No ti g'hæ o permisso pe modificâ i teu dæti personali.",
        "mypreferencesprotected": "No ti g'hæ o permisso pe modificâ e teu preferense.",
        "ns-specialprotected": "No se pœu modificâ e paggine speciali",
        "recentchanges-submit": "Fanni vedde",
        "rcfilters-activefilters": "Filtri attivi",
        "rcfilters-advancedfilters": "Filtri avançæ",
-       "rcfilters-quickfilters": "Sarva e impostaçioin do filtro",
-       "rcfilters-quickfilters-placeholder-title": "Nesciun ingancio sarvou ancon",
+       "rcfilters-quickfilters": "Sarva e impostaçioìn do filtro",
+       "rcfilters-quickfilters-placeholder-title": "Nisciun ingancio ancón sarvòu",
        "rcfilters-quickfilters-placeholder-description": "Pe sarvâ e impostaçioin do to filtro e doeuviâle torna ciu tardi, clicca l'icona segnalibbro inte l'area \"Filtri attivi\" chì de sotta",
        "rcfilters-savedqueries-defaultlabel": "Filtri sarvæ",
        "rcfilters-savedqueries-rename": "Rinommina",
        "rcfilters-savedqueries-unsetdefault": "Rimoeuvi comme predefinio",
        "rcfilters-savedqueries-remove": "Leva",
        "rcfilters-savedqueries-new-name-label": "Nomme",
-       "rcfilters-savedqueries-apply-label": "Sarva impostaçioin",
+       "rcfilters-savedqueries-apply-label": "Sarva impostaçioìn",
        "rcfilters-savedqueries-cancel-label": "Anulla",
        "rcfilters-savedqueries-add-new-title": "Sarva e impostaçioin attoale do filtro",
        "rcfilters-restore-default-filters": "Ripristina i filtri predefinii",
        "rcfilters-clear-all-filters": "Netezza tutti i filtri",
-       "rcfilters-search-placeholder": "Filtra i urtime modiffiche (navega ò comença a digitâ)",
+       "rcfilters-search-placeholder": "Filtra e urtime modifiche (navega ò comença a digitâ)",
        "rcfilters-invalid-filter": "Filtro non vallido",
        "rcfilters-empty-filter": "Nisciun filtro attivo. Se ghe vedde tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
-       "rcfilters-filterlist-whatsthis": "Cos'o l'è sto chì?",
-       "rcfilters-filterlist-feedbacklink": "Lascia un commento in sciâ noeuva fonçionalitæ sperimentale",
+       "rcfilters-filterlist-whatsthis": "C\81ómme fonsion-an?",
+       "rcfilters-filterlist-feedbacklink": "Dinne cöse ti ne pensi de quésti (neuvi) strumenti del filtro",
        "rcfilters-highlightbutton-title": "Evidençia risultæ",
        "rcfilters-highlightmenu-title": "Seleçion-a un cô",
        "rcfilters-highlightmenu-help": "Seleçion-a un cô pe evidençiâ sta propietæ",
        "rcfilters-filterlist-noresults": "Nisciun filtro atrovou",
        "rcfilters-noresults-conflict": "Nisciun risultou trovou percose i critei de çerchia son in conflito",
        "rcfilters-state-message-subset": "Sto filtro chì o no g'ha effetto percose i so risultæ son incluxi con quelli  {{PLURAL:$2|do seguente filtro ciu ampio|di  seguenti filtri ciu ampi}} (proeuva a evidençiâli pe distinguili): $1",
-       "rcfilters-state-message-fullcoverage": "A seleçion de tutti i filtri inte 'n groppo l'è comme no seleçionâne manc'un, coscì che sto filtro o no fa effetto. O groppo o l'includde: $1",
+       "rcfilters-state-message-fullcoverage": "Seleçionâ tutti i filtri inte quésto gruppo l'è comme no seleçionâne nisciun, coscì che sto filtro o no l'à de effetto. O gruppo o l'includde: $1",
        "rcfilters-filtergroup-authorship": "Aotô do contributo",
        "rcfilters-filter-editsbyself-label": "E to modiffiche",
        "rcfilters-filter-editsbyself-description": "I to contributi.",
        "rcfilters-filter-editsbyother-label": "E modiffiche di atri",
        "rcfilters-filter-editsbyother-description": "Tutte e modiffiche sarvo e to.",
-       "rcfilters-filtergroup-userExpLevel": "Livello d'esperiença (solo pe i utenti registræ)",
-       "rcfilters-filter-user-experience-level-registered-label": "Registrou",
-       "rcfilters-filter-user-experience-level-registered-description": "Contributoî conessi.",
-       "rcfilters-filter-user-experience-level-unregistered-label": "Non registrou",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Contributoî non conessi.",
+       "rcfilters-filtergroup-userExpLevel": "Livèllo d'esperiença (solo pe i utenti registræ)",
+       "rcfilters-filter-user-experience-level-registered-label": "Registròu",
+       "rcfilters-filter-user-experience-level-registered-description": "Contributoî conesci.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Non registròu",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Contributoî non conesci.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Noeuvi utenti",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modiffiche e 4 giorni d'attivitæ.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modifiche e 4 giórni d'attivitæ.",
        "rcfilters-filter-user-experience-level-learner-label": "Prinçipianti",
-       "rcfilters-filter-user-experience-level-learner-description": "Con ciu esperiença di \"Noeuvi arrivæ\" ma meno che i \"Utenti esperti\".",
+       "rcfilters-filter-user-experience-level-learner-description": "Con ciu esperiença di \"Neuvi arrivæ\" ma meno che i \"Utenti asperti\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Utenti con esperiença",
        "rcfilters-filter-user-experience-level-experienced-description": "Ciù de 30 giorni d'attivitæ e 500 modiffiche.",
        "rcfilters-filtergroup-automated": "Contributi aotomattichi",
        "rcfilters-typeofchange-conflicts-hideminor": "Questo filtro \"Tipo di modifica\" o l'è in conflito co-o  filtro \"Modiffiche minoî\". Çerti tipi de modiffiche no poeuan ese indicæ comme \"minoî\".",
        "rcfilters-filtergroup-lastRevision": "Urtima revixon",
        "rcfilters-filter-lastrevision-label": "Urtima revixon",
-       "rcfilters-filter-lastrevision-description": "I urtime modiffiche a 'na paggina.",
-       "rcfilters-filter-previousrevision-label": "Verscioin precedente",
-       "rcfilters-filter-previousrevision-description": "Tutte e modiffiche che no son l'urtima modiffica a-a paggina.",
+       "rcfilters-filter-lastrevision-description": "Solo e modiffiche ciu recenti a 'na pagina.",
+       "rcfilters-filter-previousrevision-label": "No l'urtima versción",
+       "rcfilters-filter-previousrevision-description": "Tutte e modifiche che no son \"l'urtima revixón\".",
        "rcfilters-filter-excluded": "Escluzo",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:non</strong> $1",
        "rcfilters-view-tags": "Modiffiche etichettæ",
        "recentchangeslinked-feed": "Cangiamenti correlæ",
        "recentchangeslinked-toolbox": "Cangiaménti corelæ",
        "recentchangeslinked-title": "Modiffiche correlæ a \"$1\"",
-       "recentchangeslinked-summary": "Sta pàgina a fâ védde i cangiaménti ciù recénti a-e pàgine colegæ a questa.\nE pàgine che t'æ in öservaçión inti [[Special:Watchlist|öservæ speciâli]] son in '''grascetto'''.",
+       "recentchangeslinked-summary": "Scrivi o nomme de 'na pagina pe vèdde i cangiamenti a-e pagine coleghæ a ò da quésta pagina. (Pe védde i menbri de 'na catgorîa, scrive Category:Nomme da catgorîa). Cangiamenti e-e pagine insce [[Special:Watchlist|your Watchlist]] són in <strong>bold</strong>.",
        "recentchangeslinked-page": "Nómme da pàgina:",
        "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a pàggina specificâ",
        "recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
index 1b07166..7d22c96 100644 (file)
        "category-article-count-limited": "{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|puslapis|puslapiai|puslapių}}.",
        "category-file-count": "{{PLURAL:$2|Šioje kategorijoje yra viena rinkmena.|{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|rinkmena|rinkmenos|rinkmenų}} (iš viso kategorijoje yra $2 {{PLURAL:$2|rinkmena|rinkmenos|rinkmenų}}).}}",
        "category-file-count-limited": "{{PLURAL:$1|Rodomas|Rodomi|Rodoma}} $1 šios kategorijos {{PLURAL:$1|failas|failai|failų}}.",
-       "listingcontinuesabbrev": "tęs.",
+       "listingcontinuesabbrev": "tęsti",
        "index-category": "Indeksuoti puslapiai",
        "noindex-category": "Neindeksuoti puslapiai",
        "broken-file-category": "Puslapiai su neteisingomis nuorodomis į failus",
        "actionthrottled": "Veiksmas apribotas",
        "actionthrottledtext": "Kad būtų apsisaugota nuo pažeidimų, jums neleidžiama pernelyg daug kartų atlikti šį veiksmą per trumpą laiko tarpą. Jūs viršijote šį limitą. Prašome vėl pamėginti po kelių minučių.",
        "protectedpagetext": "Šis puslapis yra užrakintas, saugant jį nuo redagavimo.",
-       "viewsourcetext": "Jūs galite peržiūrėti ir kopijuoti puslapio kodą:",
+       "viewsourcetext": "Jūs galite peržiūrėti ir kopijuoti puslapio kodą.",
        "viewyourtext": "Jūs galite peržiūrėti ir kopijuoti <strong>savo pakeitimų</strong> kodą į šį puslapį:",
        "protectedinterface": "Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas. Norėdami pridėti ar pakeisti vertimus visose wiki, naudokite [https://translatewiki.net/ translatewiki.net] MediaWiki vertimų projektą.",
        "editinginterface": "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.",
        "media_sample": "Pavyzdys.ogg",
        "media_tip": "Nuoroda į rinkmeną",
        "sig_tip": "Jūsų parašas bei laikas",
-       "hr_tip": "Horizontali linija (naudokite taupiai)",
+       "hr_tip": "Horizontali linija (naudokite saikingai)",
        "summary": "Paaiškinimas:",
        "subject": "Tema:",
        "minoredit": "Tai smulkus pataisymas",
        "search-file-match": "(atitinka rinkmenos turinį)",
        "search-suggest": "Galbūt norėjote ieškoti: $1",
        "search-rewritten": "Rodomi $1 rezultatai. Vietoje to ieškoti $2.",
-       "search-interwiki-caption": "Dukterinių projektų rezultatai",
+       "search-interwiki-caption": "Kitų projektų rezultatai",
        "search-interwiki-default": "Rezultatai iš $1:",
        "search-interwiki-more": "(daugiau)",
        "search-interwiki-more-results": "daugiau rezultatų",
        "prefs-editwatchlist-clear": "Išvalyti stebimųjų sąrašą",
        "prefs-watchlist-days": "Dienos rodomos stebimųjų sąraše:",
        "prefs-watchlist-days-max": "Daugiausiai 7 {{PLURAL:$1|diena|dienos|dienų}}",
-       "prefs-watchlist-edits": "Kiek daugiausia keitimų rodyti išplėstiniame stebimųjų sąraše:",
+       "prefs-watchlist-edits": "Kiek daugiausia keitimų rodyti stebimųjų sąraše:",
        "prefs-watchlist-edits-max": "Didžiausias skaičius: 1000",
        "prefs-watchlist-token": "Stebimųjų sąrašo raktas:",
        "prefs-misc": "Įvairūs nustatymai",
        "recentchangesdays-max": "(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})",
        "recentchangescount": "Numatytasis rodomas keitimų skaičius:",
        "prefs-help-recentchangescount": "Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.",
-       "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kurį jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei reikia jį anuliuoti, [[Special:ResetTokens|spauskite čia]].",
+       "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kuris jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei norite, [[Special:ResetTokens|galite jį anuliuoti]].",
        "savedprefs": "Nustatymai sėkmingai išsaugoti.",
        "savedrights": "Naudotojo {{GENDER:$1|$1}} grupės buvo išsaugotos.",
        "timezonelegend": "Laiko juosta:",
        "email-blacklist-label": "Neleisti šiems vartotojams siųsti man el. laiškų:",
        "prefs-searchoptions": "Paieška",
        "prefs-namespaces": "Vardų sritys",
-       "default": "pagal nutylėjimą",
+       "default": "numatytasis",
        "prefs-files": "Failai",
        "prefs-custom-css": "Asmeninis CSS",
        "prefs-custom-js": "Asmeninis JavaSript",
        "group-all": "(visi)",
        "group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
-       "group-bot-member": "Robotas",
-       "group-sysop-member": "Administratorius",
-       "group-bureaucrat-member": "Biurokratas",
+       "group-bot-member": "{{GENDER:$1|robotas}}",
+       "group-sysop-member": "{{GENDER:$1|administratorius|administratorė}}",
+       "group-bureaucrat-member": "{{GENDER:$1|biurokratas|biurokratė}}",
        "group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
        "grouppage-user": "{{ns:project}}:Naudotojai",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatiškai patvirtinti naudotojai",
        "recentchanges-legend": "Naujausių keitimų parinktys",
        "recentchanges-summary": "Žemiau pateikiamas naujausių šio projekto pakeitimų sąrašas.",
        "recentchanges-noresult": "Per nurodytą laiką atliktų keitimų, atitinkančių nurodytas sąlygas, nėra.",
-       "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame šaltinyje.",
+       "recentchanges-timeout": "Šios paieškos laikas baigėsi. Pabandykite ieškoti su kitais paieškos nustatymais.",
+       "recentchanges-network": "Dėl techninės klaidos, nepavyko įkelti rezultatų. Prašome pabandyti perkrauti puslapį.",
+       "recentchanges-feed-description": "Sekite pačius naujausius projekto keitimus šiame puslapyje.",
        "recentchanges-label-newpage": "Šiuo keitimu sukurtas naujas puslapis",
        "recentchanges-label-minor": "Tai smulkus pakeitimas",
        "recentchanges-label-bot": "Šį keitimą atliko automatinė programa",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
        "recentchanges-submit": "Rodyti",
        "rcfilters-tag-remove": "Pašalinti '$1'",
+       "rcfilters-legend-heading": "<strong>Santrumpų sąrašas:</strong>",
        "rcfilters-other-review-tools": "Kiti peržiūros įrankiai",
+       "rcfilters-group-results-by-page": "Grupuoti rezultatus pagal puslapį",
        "rcfilters-activefilters": "Aktyvūs filtrai",
        "rcfilters-advancedfilters": "Detalūs filtrai",
+       "rcfilters-limit-title": "Rodyti rezultatų",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}, $2",
+       "rcfilters-date-popup-title": "Paieškos laikotarpis",
+       "rcfilters-days-title": "Pastarosios dienos",
+       "rcfilters-hours-title": "Pastarosios valandos",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|dienos|dienų}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|valandos|valandų}}",
+       "rcfilters-highlighted-filters-list": "Paryškinta: $1",
        "rcfilters-quickfilters": "Išsaugoti filtrai",
        "rcfilters-quickfilters-placeholder-title": "Nėra išsaugotų filtrų",
+       "rcfilters-quickfilters-placeholder-description": "Norėdami išsaugoti filtravimo nustatymus ir vėliau juos naudoti, spustelėkite žymės piktogramą, esančią aktyvių filtrų srityje.",
        "rcfilters-savedqueries-defaultlabel": "Išsaugoti filtrai",
        "rcfilters-savedqueries-rename": "Pervadinti",
        "rcfilters-savedqueries-setdefault": "Nustatyti kaip numatytą",
        "rcfilters-savedqueries-unsetdefault": "Pašalinti kaip numatytą",
        "rcfilters-savedqueries-remove": "Pašalinti",
        "rcfilters-savedqueries-new-name-label": "Pavadinimas",
-       "rcfilters-savedqueries-new-name-placeholder": "Apibūdinkite šio filtro tikslą.",
+       "rcfilters-savedqueries-new-name-placeholder": "Apibūdinkite šio filtro tikslą",
        "rcfilters-savedqueries-apply-label": "Sukurti filtrą",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Sukurti numatytąjį filtrą",
        "rcfilters-savedqueries-cancel-label": "Atšaukti",
-       "rcfilters-savedqueries-add-new-title": "Išsaugoti dabartinius filtro nustatymus",
+       "rcfilters-savedqueries-add-new-title": "Išsaugoti dabartinius filtravimo nustatymus",
        "rcfilters-restore-default-filters": "Atstatyti numatytuosius filtrus",
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
-       "rcfilters-search-placeholder": "Filtruoti naujausius pakeitimus (naršykite arba pradėkite rašyti)",
+       "rcfilters-show-new-changes": "Rodyti naujausius keitimus",
+       "rcfilters-search-placeholder": "Filtruoti pakeitimus (naudokitės meniu arba ieškokite filtro pavadinimo)",
        "rcfilters-invalid-filter": "Negalimas filtras",
-       "rcfilters-empty-filter": "Nėra aktyvių filtrų. Rodomi visi indeliai.",
+       "rcfilters-empty-filter": "Nėra aktyvių filtrų. Rodomi visi indėliai.",
        "rcfilters-filterlist-title": "Filtrai",
        "rcfilters-filterlist-whatsthis": "Kaip tai veikia?",
        "rcfilters-filterlist-feedbacklink": "Pateikite atsiliepimą apie šiuos (naujus) filtravimo įrankius",
        "rcfilters-highlightmenu-help": "Pasirinkite spalvą šio elemento paryškinimui",
        "rcfilters-filterlist-noresults": "Nerastas toks filtras",
        "rcfilters-noresults-conflict": "Nerasta jokių rezultatų, nes paieškos kriterijai konfliktuoja",
+       "rcfilters-filtergroup-authorship": "Indėlio autorius",
        "rcfilters-filter-editsbyself-label": "Jūsų keitimai",
        "rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
        "rcfilters-filter-editsbyother-label": "Kitų keitimai",
        "rcfilters-filter-editsbyother-description": "Visi keitimai, išskyrus jūsų.",
-       "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
+       "rcfilters-filtergroup-userExpLevel": "Vartotojo registracija ir patirtis",
        "rcfilters-filter-user-experience-level-registered-label": "Registruoti",
        "rcfilters-filter-user-experience-level-registered-description": "Prisijungę naudotojai.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Neregistruoti",
        "rcfilters-filter-user-experience-level-unregistered-description": "Naudotojai, kurie nėra prisijungę.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Naujokai",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Mažiau nei 10 keitimų ir 4 dienų aktyvumo.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Registruoti naudotojai, turintys mažiau nei 10 keitimų ir 4 aktyvias dienas.",
        "rcfilters-filter-user-experience-level-learner-label": "Mokiniai",
+       "rcfilters-filter-user-experience-level-learner-description": "Registruoti naudotojai, kurių patirties lygis yra tarp „Naujokų“ ir „Patyrusių vartotojų“",
        "rcfilters-filter-user-experience-level-experienced-label": "Patyrę vartotojai",
-       "rcfilters-filter-user-experience-level-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Registruoti naudotojai, turintys daugiau nei 500 keitimų ir 30 dienų veiklos.",
        "rcfilters-filtergroup-automated": "Automatiniai indeliai",
-       "rcfilters-filter-bots-label": "Robotas",
+       "rcfilters-filter-bots-label": "Roboto",
        "rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
        "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
        "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
        "rcfilters-filter-unpatrolled-description": "Pakeitimai pažymėti kaip nestebimi.",
        "rcfilters-filtergroup-significance": "Reikšmė",
        "rcfilters-filter-minor-label": "Smulkūs pakeitimai",
-       "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip mažus.",
+       "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip smulkius.",
        "rcfilters-filter-major-label": "Nesmulkūs pakeitimai",
        "rcfilters-filter-major-description": "Keitimai, nepažymėti kaip smulkūs.",
-       "rcfilters-filtergroup-watchlist": "Puslapiai, įtraukti į stebimų sąrašą",
-       "rcfilters-filter-watchlist-watched-label": "Stebimų sąraše",
-       "rcfilters-filter-watchlist-watched-description": "Pakeitimai puslapiuose, jūsų Stebimųjų sąraše.",
-       "rcfilters-filter-watchlist-watchednew-label": "Nauji Stebimųjų sąrašo pakeitimai",
-       "rcfilters-filter-watchlist-notwatched-label": "Nėra Stebimųjų sąraše",
+       "rcfilters-filtergroup-watchlist": "Stebimi puslapiai",
+       "rcfilters-filter-watchlist-watched-label": "Stebimųjų sąraše",
+       "rcfilters-filter-watchlist-watched-description": "Pakeitimai puslapiuose, iš jūsų stebimųjų sąrašo.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nauji stebimųjų sąrašo pakeitimai",
+       "rcfilters-filter-watchlist-watchednew-description": "Pakeitimai stebimuose puslapiuose, kuriuose neapsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nėra stebimųjų sąraše",
+       "rcfilters-filter-watchlist-notwatched-description": "Visi keitimai, išskyrus keitimus puslapiuose iš stebimųjų sąrašo.",
+       "rcfilters-filtergroup-watchlistactivity": "Stebimųjų sąrašo veikla",
        "rcfilters-filter-watchlistactivity-unseen-label": "Neperžiūrėti pakeitimai",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Pakeitimai puslapiuose, kuriuose neapsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
        "rcfilters-filter-watchlistactivity-seen-label": "Peržiūrėti pakeitimai",
+       "rcfilters-filter-watchlistactivity-seen-description": "Pakeitimai puslapiuose, kuriuose apsilankėte nuo tada, kai pakeitimai buvo paskelbti.",
        "rcfilters-filtergroup-changetype": "Pakeitimo tipas",
        "rcfilters-filter-pageedits-label": "Puslapių keitimai",
+       "rcfilters-filter-pageedits-description": "Keitimai viki turinyje, aptarimuose, kategorijų aprašymuose…",
        "rcfilters-filter-newpages-label": "Puslapių sukūrimai",
        "rcfilters-filter-newpages-description": "Keitimai, kurie sukuria naujus puslapius.",
        "rcfilters-filter-categorization-label": "Kategorijų pakeitimai",
-       "rcfilters-filter-categorization-description": "Įrašai puslapių, kurie yra pridedami ar pašalinami iš kategorijų.",
-       "rcfilters-filter-logactions-label": "Įrašyti veiksmai",
+       "rcfilters-filter-categorization-description": "Keitimai, kuriais puslapiai yra pridedami ar pašalinami iš kategorijų.",
+       "rcfilters-filter-logactions-label": "Įrašyti į sąrašą veiksmai",
+       "rcfilters-filter-logactions-description": "Administravimo veiksmai, paskyrų sukūrimai, puslapių trynimai, įkėlimai…",
+       "rcfilters-filtergroup-lastRevision": "Naujausios versijos",
+       "rcfilters-filter-lastrevision-label": "Naujausia versija",
        "rcfilters-filter-lastrevision-description": "Tik naujausias puslapio keitimas.",
-       "rcfilters-filter-previousrevision-description": "Visi keitimai, kurie nėra naujausi puslapio keitimai.",
+       "rcfilters-filter-previousrevision-label": "Ne naujausia versija",
+       "rcfilters-filter-previousrevision-description": "Visi keitimai, kurie nėra „paskutinė versija“.",
+       "rcfilters-filter-excluded": "Įkelta",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ne</strong> $1",
+       "rcfilters-exclude-button-off": "Įkelti pasirinktus",
+       "rcfilters-exclude-button-on": "Įkeliami pasirinktieji",
        "rcfilters-view-tags": "Pažymėti keitimai",
-       "rcfilters-view-tags-help-icon-tooltip": "Sužinoti daugiau apie Pažymėtus pakeitimus",
+       "rcfilters-view-namespaces-tooltip": "Rodyti rezultatus pagal vardų sritį",
+       "rcfilters-view-tags-tooltip": "Rodyti rezultatus naudojančius keitimo žymes",
+       "rcfilters-view-return-to-default-tooltip": "Grįžti į pagrindinį filtravimo meniu",
+       "rcfilters-view-tags-help-icon-tooltip": "Sužinoti daugiau apie pažymėtus pakeitimus",
        "rcfilters-liveupdates-button": "Gyvi atnaujinimai",
        "rcfilters-liveupdates-button-title-on": "Išjungti gyvus atnaujinimus",
+       "rcfilters-liveupdates-button-title-off": "Įkelti naujus keitimus, kai jie įvyksta",
        "rcfilters-watchlist-markseen-button": "Pažymėti visus pakeitimus kaip peržiūrėtus",
        "rcfilters-watchlist-edit-watchlist-button": "Redaguoti stebimųjų sąrašą",
        "rcfilters-watchlist-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra <strong>paryškinti</strong>.",
        "rcfilters-preference-label": "Slėpti patobulintą naujausių pakeitimų versiją",
        "rcfilters-filter-showlinkedfrom-label": "Rodyti pakeitimus puslapiuose, iš kurių esate nukreipti",
-       "rcfilters-target-page-placeholder": "Įveskite puslapio pavadinimą",
+       "rcfilters-target-page-placeholder": "Įveskite puslapio pavadinimą (arba kategoriją)",
        "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rclistfromreset": "Nustatyti duomenų pasirinkimą iš naujo",
        "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "show": "Rodyti",
        "minoreditletter": "S",
        "newpageletter": "N",
-       "boteditletter": "r",
+       "boteditletter": "a",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinčių naudotojų}}]",
        "rc_categories": "Riboti kategorijoms (atskirkite su „|“)",
        "rc_categories_any": "Bet kuris iš pasirinktųjų",
        "recentchangeslinked-feed": "Susiję keitimai",
        "recentchangeslinked-toolbox": "Susiję keitimai",
        "recentchangeslinked-title": "Su „$1“ susiję keitimai",
-       "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.\nPuslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
+       "recentchangeslinked-summary": "Įveskite puslapio pavadinimą, jei norite žiūrėti keitimus, atliktus puslapiuose, į kuriuos yra nuoroda į arba iš nurodyto puslapio. (Jei norite žiūrėti nurodytos kategorijos narius, įveskite Kategorija:Kategorijos pavadinimas). Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra <strong>paryškinti</strong>.",
        "recentchangeslinked-page": "Puslapio pavadinimas:",
        "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
        "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] ir [[Special:WhatLinksHere/$1|{{PLURAL:$2|vienas puslapis|$2 puslapiai}}]] pridėti prie kategorijos",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] pridėti prie kategorijos, [[Special:WhatLinksHere/$1|šis puslapis yra įtrauktas su kitais puslapiais]]",
        "recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pašalinti iš kategorijos",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] pašalinti iš kategorijos, [[Special:WhatLinksHere/$1|šis puslapis yra įtrauktas kartu su kitais puslapiais]]",
        "autochange-username": "MediaWiki automatinis pakeitimas",
        "upload": "Įkelti rinkmeną",
        "uploadbtn": "Įkelti rinkmeną",
        "emaillink": "siųsti el. laišką",
        "autoblocker": "Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.",
        "blocklogpage": "Blokavimų sąrašas",
-       "blocklog-showlog": "Šis naudotojas buvo užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
+       "blocklog-showlog": "Šis naudotojas jau yra buvęs užblokuotas.\nPateikiamas paskutinis blokavimo istorijos įrašas.",
        "blocklog-showsuppresslog": "Šis naudotojas buvo užblokuotas ir paslėptas anksčiau.\nŽemiau yra pateiktas slėpimų žurnalas:",
        "blocklogentry": "užblokavo [[$1]], blokavimo laikas - $2 $3",
        "reblock-logentry": "pakeisti [[$1]] blokavimo nustatymai, naujas blokavimo laikas – $2 $3",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žyma|Žymos}}]]: $2)",
        "tag-mw-contentmodelchange": "turinio modulio keitimas",
        "tag-mw-contentmodelchange-description": "Pakeitimai, kurie [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel keičia puslapio turinio modelį]",
+       "tag-mw-blank-description": "Keitimai, ištrinantys visą puslapio turinį",
+       "tag-mw-replace": "Pakeista",
+       "tag-mw-rollback": "Atmesti",
        "tag-mw-undo": "Anuliuoti",
        "tags-title": "Žymos",
        "tags-intro": "Šiame puslapyje yra žymų, kuriomis programinė įranga gali pažymėti keitimus, sąrašas bei jų reikšmės.",
        "log-action-filter-patrol-autopatrol": "Automatinis patikrinimas",
        "log-action-filter-protect-protect": "Apsauga",
        "log-action-filter-protect-modify": "Apsaugos keitimas",
+       "log-action-filter-protect-unprotect": "Atrakinimas",
        "log-action-filter-protect-move_prot": "Apsauga perkelta",
        "log-action-filter-rights-rights": "Rankinis keitimas",
        "log-action-filter-rights-autopromote": "Automatinis keitimas",
        "linkaccounts-submit": "Susieti paskyras",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
+       "edit-error-short": "Klaida: $1",
+       "edit-error-long": "Klaidos:\n\n$1",
        "revid": "apžvalga $1",
        "pageid": "puslapio ID $1",
        "rawhtml-notallowed": "&lt;html&gt; negali būti naudojamos ne normaliuose puslapiuose.",
        "gotointerwiki": "Išeinama iš {{SITENAME}}",
        "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas.",
+       "pagedata-title": "Puslapio duomenys",
        "pagedata-bad-title": "Negalimas pavadinimas: $1."
 }
index 5d2557e..bd14009 100644 (file)
        "backend-fail-hashes": "Neizdevās iegūt failu kontrolsummas salīdzināšanai.",
        "backend-fail-notsame": "Neidentisks fails jau pastāv $1.",
        "backend-fail-delete": "Nevar izdzēst failu $1.",
+       "backend-fail-describe": "Nevarēja izmainīt faila \"$1\" metadatus.",
        "backend-fail-alreadyexists": "Fails $1 jau pastāv.",
        "backend-fail-store": "Neizdevās saglabāt failu \"$1\" \"$2\".",
        "backend-fail-copy": "Nevar kopēt failu $1 uz $2.",
        "protectcomment": "Iemesls:",
        "protectexpiry": "Beidzas:",
        "protect_expiry_invalid": "Beigu termiņš ir nederīgs.",
-       "protect_expiry_old": "Beigu termiņs ir pagātnē.",
+       "protect_expiry_old": "Beigu termiņš ir pagātnē.",
        "protect-unchain-permissions": "Pieslēgt papildu aizsargāšanas iespējas",
        "protect-text": "Šeit var apskatīt un izmainīt lapas <strong>$1</strong> aizsardzības līmeni.",
        "protect-locked-access": "Jūsu kontam nav atļaujas mainīt lapas aizsardzības pakāpi.\nPašreizējie lapas '''$1''' iestatījumi ir:",
        "blocklist-userblocks": "Paslēpt kontu bloķējumus",
        "blocklist-tempblocks": "Paslēpt pagaidu bloķējumus",
        "blocklist-addressblocks": "Paslēpt vienas IP adreses bloķējumus",
+       "blocklist-rangeblocks": "Paslēpt IP adrešu diapazona blokus",
        "blocklist-timestamp": "Laiks",
        "blocklist-target": "Mērķis",
+       "blocklist-expiry": "Beidzas",
+       "blocklist-by": "Bloķējušais administrators",
        "blocklist-params": "Bloķēšanas parametri",
        "blocklist-reason": "Iemesls",
        "ipblocklist-submit": "Meklēt",
        "block-log-flags-nousertalk": "nevar izmainīt savu diskusiju lapu",
        "block-log-flags-hiddenname": "lietotājvārds slēpts",
        "ipb_expiry_invalid": "Nederīgs beigu termiņš",
+       "ipb_expiry_old": "Beigu termiņš ir pagātnē.",
        "ipb_expiry_temp": "Slēpto lietotājvārdu bloķēšanai jābūt beztermiņa.",
        "ipb_already_blocked": "\"$1\" jau ir bloķēts",
        "ipb-needreblock": "$1 jau ir bloķēts.\nVai tu gribi izmainīt bloka uzstādījumus?",
        "unlockconfirm": "Jā, es tiešām vēlos atbloķēt datubāzi.",
        "lockbtn": "Bloķēt datubāzi",
        "unlockbtn": "Atbloķēt datubāzi",
+       "locknoconfirm": "Tu neatzīmēji apstiprinājuma rūtiņu.",
        "lockdbsuccesssub": "Datubāzes bloķēšana pabeigta",
        "unlockdbsuccesssub": "Datubāze atbloķēta",
        "unlockdbsuccesstext": "Datubāze ir atbloķēta.",
-       "databasenotlocked": "Datubāzē nav bloķēta.",
+       "databaselocked": "Datubāze jau ir bloķēta.",
+       "databasenotlocked": "Datubāze nav bloķēta.",
        "move-page": "Pārvietot $1",
        "move-page-legend": "Pārvietot lapu",
        "movepagetext": "Šajā lapā tu vari pārdēvēt vai pārvietot lapu, kopā tās izmaiņu hronoloģiju pārvietojot to uz citu nosaukumu.\nIepriekšējā lapa kļūs par lapu, kas pāradresēs uz jauno lapu.\nŠeit var automātiski izmainīt visas pāradresācijas (redirektus) uz šo lapu (2. ķeksis apakšā).\nSaites pārējās lapās uz iepriekšējo lapu netiks mainītas. Ja izvēlies neizmainīt pāradresācijas automātiski, noteikti pārbaudi un izlabo, izskaužot [[Special:DoubleRedirects|dubultu pāradresāciju]] vai [[Special:BrokenRedirects|pāradresāciju uz neesošu lapu]].\nTev ir jāpārliecinās, vai saites vēl aizvien ved tur, kur tās ir paredzētas.\n\nŅem vērā, ka lapa '''netiks''' pārvietota, ja jau eksistē kāda cita lapa ar vēlamo nosaukumu (izņemot gadījumus, kad tā ir tukša vai kad tā ir pāradresācijas lapa, kā arī tad, ja tai nav izmaiņu hronoloģijas).\nTas nozīmē, ka tu vari pārvietot lapu atpakaļ, no kurienes tu jau reiz to esi pārvietojis, ja būsi kļūdījies, bet tu nevari pārrakstīt jau esošu lapu.\n\n'''BRĪDINĀJUMS!'''\nPopulārām lapām tā var būt krasa un negaidīta pārmaiņa;\npirms turpināšanas vēlreiz pārdomā, vai tu izproti visas iespējamās sekas.",
        "movenotallowedfile": "Tev nav atļaujas pārvietot failus.",
        "cant-move-user-page": "Tev nav atļaujas pārvietot lietotāju lapas (neskaitot apakšlapas).",
        "cant-move-to-user-page": "Tev nav atļaujas pārvietot lapu uz lietotāja lapu (neskaitot lietotāja lapas apakšlapu).",
+       "cant-move-category-page": "Tev nav atļaujas pārvietot kategoriju lapas.",
+       "cant-move-to-category-page": "Tev nav atļaujas pārvietot lapu uz kategorijas lapu.",
+       "cant-move-subpages": "Tev nav atļaujas pārvietot apakšlapas.",
+       "namespace-nosubpages": "Vārdtelpā \"$1\" apakšlapas nav atļautas.",
        "newtitle": "Jaunais nosaukums:",
        "move-watch": "Uzraudzīt šo lapu",
        "movepagebtn": "Pārvietot lapu",
        "specialpage-securitylevel-not-allowed-title": "Nav atļauts",
        "cannotauth-not-allowed-title": "Atļauja liegta",
        "credentialsform-account": "Konta nosaukums:",
+       "edit-error-short": "Kļūda: $1",
+       "edit-error-long": "Kļūdas:\n\n$1",
        "revid": "versija $1",
        "pageid": "lapas ID $1",
        "gotointerwiki-invalid": "Norādītais nosaukums ir nederīgs.",
index ae5ccb9..57ba371 100644 (file)
        "doubleredirects": "Двојни пренасочувања",
        "doubleredirectstext": "Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.\nСекој ред содржи врски кон првото и второто пренасочување, како и целта на второто пренасочување, кое обично ја посочува <i>вистинската</i> целна страница кон која првото пренасочување би требало да насочува.\n<del>Пречкртаните</del> ставки треба да се разрешат.",
        "double-redirect-fixed-move": "Страницата „[[$1]]“ е преместена.\nСега е самоподновена и пренасочува кон [[$2]].",
-       "double-redirect-fixed-maintenance": "Самоисправка на двојно пренасочување од [[$1]] на [[$2]] во задача за одржување.",
+       "double-redirect-fixed-maintenance": "Самоисправка на двојно пренасочување од [[$1]] на [[$2]] во задача за одржување",
        "double-redirect-fixer": "Исправувач на пренасочувања",
        "brokenredirects": "Прекинати пренасочувања",
        "brokenredirectstext": "Следните пренасочувања водат до непостоечки страници.",
        "restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
        "restrictionsfield-label": "Допуштени IP-опсези:",
        "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "edit-error-short": "Грешка: $1",
+       "edit-error-long": "Грешки:\n\n$1",
        "revid": "преработка $1",
        "pageid": "назнака на страницата $1",
        "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници.",
index bd81c17..16db22e 100644 (file)
        "log-action-filter-rights-rights": "मानवी बदल",
        "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
        "changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) बदला",
-       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा"
+       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
+       "edit-error-short": "त्रुटी: $1",
+       "edit-error-long": "त्रुटी:$1"
 }
index 72a7a53..d330d90 100644 (file)
        "restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
        "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Feil: $1",
+       "edit-error-long": "Feil:\n\n$1",
        "revid": "revisjon $1",
        "pageid": "side-ID $1",
        "rawhtml-notallowed": "&lt;html&gt;-tagger kan ikke brukes utenfor normale sider.",
index 5ea6fde..5e983bd 100644 (file)
        "doubleredirects": "Dubbele doorverwijzingen",
        "doubleredirectstext": "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.\nElke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.\nMeestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou moeten doorverwijzen.\n<del>Doorgehaalde regels</del> geven aan dat het probleem al is opgelost.",
        "double-redirect-fixed-move": "[[$1]] is verplaatst.\nHet is automatisch bijgewerkt en verwijst nu naar [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatische dubbele doorverwijzing van [[$1]] naar [[$2]] herstellen in een onderhoudstaak.",
+       "double-redirect-fixed-maintenance": "Automatische dubbele doorverwijzing van [[$1]] naar [[$2]] herstellen in een onderhoudstaak",
        "double-redirect-fixer": "Doorverwijzingen opschonen",
        "brokenredirects": "Defecte doorverwijzingen",
        "brokenredirectstext": "De onderstaande doorverwijzingen verwijzen naar niet-bestaande pagina's.",
index 24e1679..58bd82f 100644 (file)
        "restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
        "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
        "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Błąd: $1",
+       "edit-error-long": "Błędy:\n\n$1",
        "revid": "wersja $1",
        "pageid": "ID strony: $1",
        "rawhtml-notallowed": "Znaczniki &lt;html&gt; nie mogą być stosowane poza zwykłymi stronami.",
index 86cbb75..afc7d6b 100644 (file)
@@ -15,7 +15,8 @@
                        "Saanvel",
                        "Satdeep gill",
                        "Abbas dhothar",
-                       "Saraiki"
+                       "Saraiki",
+                       "BukhariSaeed"
                ]
        },
        "tog-underline": "جوڑ تھلے لین:",
        "currentrev": "ہن آلی تبدیلی",
        "currentrev-asof": "$1 ویلے دا صفحہ",
        "revisionasof": "دی تبدیلیاں $1",
-       "revision-info": " $1 دی دہرائی  توں {{جنس:$6|$2}}$7",
+       "revision-info": "$1 دی دہرائی  توں {{GENDER:$6|$2}}$7",
        "previousrevision": "← اوس توں پچھلا کم",
        "nextrevision": "نویں تبدیلی →",
        "currentrevisionlink": "موجودہ حالت",
        "revdelete-uname-unhid": "ورتن والے دا ناں ںئیں لکیا",
        "revdelete-restricted": "مکھیاں تے روکاں لگیاں",
        "revdelete-unrestricted": "مکھیاں تے روکاں لتھیاں",
-       "logentry-move-move": "$1 {{جنس:$2|پلٹی}} صفہ $3 توں $4",
+       "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 ریڈائرکٹ",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|پلٹی}} صفہ $3 توں $4 اک ریڈائرکٹ دے بنا کسے ریڈائرکٹ دتیاں",
index 7c19d48..ab90f28 100644 (file)
        "timezoneregion-indian": "هندی سمندر",
        "timezoneregion-pacific": "غلی سمندر",
        "allowemail": "د نورو کارنانو لخوا د برېښليک رالېږل چارن کړه",
+       "email-allow-new-users-label": "د نویو کارنانو لخوا د برېښناليک راليږلو ته اجازه ورکړئ",
+       "email-blacklist-label": "دا کارنان ماته د بریښنالیک رالیږلو څخه منع کړي:",
        "prefs-searchoptions": "پلټنه",
        "prefs-namespaces": "نوم-تشيالونه",
        "default": "تلواليز",
        "allpagesbadtitle": "ورکړ شوی سرليک سم نه دی او يا هم د ژبو او يا د بېلابېلو ويکي گانو مختاړی لري. ستاسو په سرليک کې يو يا څو داسې ابېڅې دي کوم چې په سرليک کې نه شي کارېدلی.",
        "allpages-bad-ns": "{{SITENAME}} د \"$1\" په نامه هېڅ کوم نوم-تشيال نه لري.",
        "allpages-hide-redirects": "مخ گرځونې پټول",
+       "cachedspecial-viewing-cached-ttl": "تاسو د دې پاڼې هغه نسخه ګورئ، کومه چې به ممکنن $1 زړه وي.",
        "cachedspecial-refresh-now": "تر ټولو تازه کتل.",
        "categories": "وېشنيزې",
        "categories-submit": "ښکاره کول",
        "activeusers-intro": "دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.",
        "activeusers-count": "په {{PLURAL:$3|تېرې ورځ|تېرو $3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}",
        "activeusers-from": "هغه کارنان کتل چې نومونه يې پېلېږي په:",
+       "activeusers-groups": "د ډلو کارنان ښودل:",
+       "activeusers-excludegroups": "د ګروپونو اړوند کاروونکي غوره کړئ:",
        "activeusers-noresult": "کارن و نه موندل شو.",
        "activeusers-submit": "فعاله کارنان ښکاره کول",
        "listgrouprights": "د کارن ډلو رښتې",
        "protect-otherreason-op": "بل سبب",
        "protect-dropdown": "*د ژغورلو عام سببونه\n** ډېره زياته ورانکاري\n** ډېره زياته سپام خپرونه\n** بې گټې سمونې او خپرونې\n** ډېر لوستونکی مخ",
        "protect-edit-reasonlist": "د ژغورنې سببونه سمول",
-       "protect-expiry-options": "1 ساعت:1 hour,1 ورځ:1 day,1 اوونۍ:1 week,2 اوونۍ:2 weeks,1 مياشت:1 month,3 مياشتې:3 months,6 مياشتې:6 months,1 کال:1 year,نامحدوده:infinite",
+       "protect-expiry-options": "۲ ساعتونه:2 hours,۱ ورځ:1 day,۳ ورځې:3 days,۱ اوونۍ:1 week,۲ اوونۍ:2 weeks,۱ مياشت:1 month,۳ مياشت:3 months,۶ مياشت:6 months,۱ کال:1 year,نامحدوده:infinite",
        "restriction-type": "اجازه:",
        "restriction-level": "د بنديز کچه:",
        "minimum-size": "وړه کچه",
        "ipbenableautoblock": "په اتوماتيکه توگه د کارن په وروستنۍ IP پتې چې کارن کارولې، او هر هغو IP پتو باندې چې کارن د سمون هڅه ورباندې کړې بنديز لگول",
        "ipbsubmit": "په دې کارن بنديز لگول",
        "ipbother": "بل وخت:",
-       "ipboptions": "2 ساعتونه:2 hours,1 ورځ:1 day,3 ورځې:3 days,1 اوونۍ:1 week,2 اوونۍ:2 weeks,1 مياشت:1 month,3 مياشتې:3 months,6 مياشتې:6 months,1 کال:1 year,نامحدوده:infinite",
+       "ipboptions": "۲ ساعتونه:2 hours,۱ ورځ:1 day,۳ ورځې:3 days,۱ اوونۍ:1 week,۲ اوونۍ:2 weeks,۱ مياشت:1 month,۳ مياشت:3 months,۶ مياشت:6 months,۱ کال:1 year,نامحدوده:infinite",
        "ipbhidename": "کارن-نوم له سمون او لړليکونو پټول",
        "ipbwatchuser": "د دې کارن د خبرو اترو مخ او کارن مخ کتل",
        "ipb-disableusertalk": "د بنديز لگېدو سره دې د کارن د خبرو اترو مخ د سمولو مخنيوی هم پلي شي",
        "sp-newimages-showfrom": "هغه نوې دوتنې چې په $1 په $2 بجو پيلېږي ښکاره کول",
        "minutes-abbrev": "$1 دقیقي",
        "hours-abbrev": "$1 گ",
+       "days-abbrev": "$1 ورځې",
        "seconds": "{{PLURAL:$1|$1 ثانيه|$1 ثانيې}}",
        "minutes": "{{PLURAL:$1|$1 دقيقه|$1 دقيقې}}",
        "hours": "{{PLURAL:$1|يو ساعت|$1 ساعتونه}}",
index 2620fd0..1bf0c8e 100644 (file)
        "doubleredirects": "Redirecionamentos duplos",
        "doubleredirectstext": "Esta página lista as páginas que redirecionam para outros redirecionamentos.\nCada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.\nEntradas <del>riscadas</del> foram resolvidas.",
        "double-redirect-fixed-move": "[[$1]] foi movido\nEle foi atualizado automaticamente e agora é um redirecionamento para [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrigindo automaticamente o redirecionamento duplo de [[$1]] para [[$2]] em uma tarefa de manutenção.",
+       "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
        "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
        "restrictionsfield-badip": "Endereço IP ou intervalo inválido: $1",
        "restrictionsfield-label": "Intervalos IP permitidos:",
        "restrictionsfield-help": "Um endereço IP ou intervalo CIDR por linha. Para ativar tudo, use\n<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Erro: $1",
+       "edit-error-long": "Erros:\n$1",
        "revid": "revisão $1",
        "pageid": "ID da página $1",
        "rawhtml-notallowed": "As tags &lt;html&gt; não podem ser usadas fora das páginas normais.",
index 1e4fd61..a4e13c6 100644 (file)
        "doubleredirects": "Redirecionamentos duplos",
        "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém hiperligações para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
        "double-redirect-fixed-move": "[[$1]] foi movida.\nEla foi atualizada automaticamente e agora redireciona para [[$2]].",
-       "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção.",
+       "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]] num processo de manutenção",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
        "brokenredirectstext": "Os seguintes redirecionamentos contêm hiperligações para páginas inexistentes:",
        "restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
        "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse: <pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Erro: $1",
+       "edit-error-long": "Erros:\n\n$1",
        "revid": "revisão $1",
        "pageid": "identificador de página $1",
        "rawhtml-notallowed": "As etiquetas &lt;html&gt; não podem ser utilizadas fora de páginas normais.",
index 6621e72..e29bcad 100644 (file)
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
        "selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
-       "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
+       "missingcommenttext": "This message is shown when the user tries to save a textbox created by the new section links, and the textbox is empty. \"Comment\" refers to the content that is supposed to be posted in the new section, usually a talk page comment.",
        "missingcommentheader": "Edit summary that is shown if you enable \"Prompt me when entering a blank summary\" and add a new section without headline to a talk page.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.\n\n\"Subject\" is {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Missingsummary}}\n* {{msg-mw|Savearticle}}",
        "summary-preview": "Preview of the edit summary, shown under the edit summary itself.\nShould match: {{msg-mw|summary}}.",
        "subject-preview": "Used as label for preview of the section title when adding a new section on a talk page.\n\nShould match {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Summary-preview}}\n\n{{Identical|Subject}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
        "pageinfo-user-id": "The numeric ID for a user\n{{Identical|User ID}}",
-       "pageinfo-file-hash": "Base-36 SHA-1 value of the file",
+       "pageinfo-file-hash": "Base-16 SHA-1 value of the file",
        "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\n{{Identical|Mark as patrolled}}",
        "markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
        "markaspatrolledtext": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolleddiff}}",
        "semicolon-separator": "{{optional}}",
        "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
        "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
-       "autocomment-prefix": "{{optional}}",
+       "autocomment-prefix": "{{notranslate}}",
        "pipe-separator": "{{optional}}",
        "word-separator": "{{optional}}\nThis is a string which is (usually) put between words of the language. It is used, e.g. when messages are concatenated (appended to each other). Note that you must express a space as html entity &amp;#32; because the editing and updating process strips leading and trailing spaces from messages.\n\nMost languages use a space, but some Asian languages, such as Thai and Chinese, do not.",
        "ellipsis": "{{optional}}",
        "restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
        "restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
        "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
+       "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
+       "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}",
        "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
        "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
        "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an &lt;html&gt; tag in a system message or somewhere other than a normal page.",
index 13516e4..1c77450 100644 (file)
        "recentchangeslinked-feed": "Cangiaminde culleghete",
        "recentchangeslinked-toolbox": "Cangiaminde culleghete",
        "recentchangeslinked-title": "Cangiaminde culleghete a \"$1\"",
-       "recentchangeslinked-summary": "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).\nPàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
+       "recentchangeslinked-summary": "Mitte 'u nome de 'na pàgene pe 'ndrucà le cangiaminde a le pàggene ca sò collegate o ca appondane a sta pàgene. (Pe 'ndrucà le membre de 'na categorije, mitte Categoria:Nome d'a categorije). Le cangiaminde a le pàggene ca stonne jndr'à l'elenghe de [[Special:Watchlist|le Pàggene condrollate]] stonne in <strong>grascette</strong>.",
        "recentchangeslinked-page": "Nome d'a vôsce:",
        "recentchangeslinked-to": "Fa vedè le cangiaminde de le pàggene colleghete a 'na certa pàgene",
        "recentchanges-page-added-to-category": "[[:$1]] aggiunde a categorije",
index b4d0c00..4f48b67 100644 (file)
        "doubleredirects": "Двойные перенаправления",
        "doubleredirectstext": "На этой странице представлен список перенаправлений на другие перенаправления.\nКаждая строка содержит ссылки на первое и второе перенаправления, а также целевую страницу второго перенаправления, в которой обычно указывается название страницы, куда должно ссылаться первое перенаправление.\n<del>Зачёркнутые</del> записи были исправлены.",
        "double-redirect-fixed-move": "Страница [[$1]] была перемещена.\nОна автоматически обновлена и теперь она перенаправляет на страницу [[$2]].",
-       "double-redirect-fixed-maintenance": "Автоматическое исправление двойного перенаправления с [[$1]] на [[$2]] в работе по техническому обслуживанию.",
+       "double-redirect-fixed-maintenance": "Автоматическое исправление двойного перенаправления с [[$1]] на [[$2]] в работе по техническому обслуживанию",
        "double-redirect-fixer": "Исправитель перенаправлений",
        "brokenredirects": "Разорванные перенаправления",
        "brokenredirectstext": "Следующие перенаправления указывают на несуществующие страницы:",
        "rollback": "Откатить изменения",
        "rollbacklink": "откатить",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
-       "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
+       "rollbacklinkcount-morethan": "откатить более $1 {{PLURAL:$1|правки|правок}}",
        "rollbackfailed": "Ошибка при совершении отката",
        "rollback-missingparam": "Отсутствуют обязательные параметры по запросу.",
        "rollback-missingrevision": "Не удалось загрузить данные версии.",
        "restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
        "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Ошибка: $1",
+       "edit-error-long": "Ошибки: $1",
        "revid": "версия $1",
        "pageid": "ID страницы $1",
        "rawhtml-notallowed": "&lt;html&gt; теги могут быть использованы только в пределах обычных страниц.",
index 385d479..cc5fb1c 100644 (file)
        "parser-template-loop-warning": "Халыыптар бэйэ бэйлэригэр сигэниилэрэ (петля) булулунна: [[$1]]",
        "template-loop-category": "Халыыптара бэйэ бэйэлэригэр сигэнэр сирэйдэр",
        "template-loop-category-desc": "Бу сирэй халыыба бэйэтин ыҥырар, ол аата бэйэтин холбуу сатыыр эбит.",
+       "template-loop-warning": "<strong>Сэрэтии:</strong> Бу сирэй халыыпка хат эргийэн кэлиини оҥорор сирэйи ([[:$1]]) ыҥырар эбит (бүппэт рекурсия).",
        "parser-template-recursion-depth-warning": "($1) халыып рекурсиятын муҥура бүппүт (Превышен предел глубины рекурсии)",
        "language-converter-depth-warning": "Тыл конвертерын дириҥин хааччаҕа куоһарыллыбыт ($1)",
        "node-count-exceeded-category": "Түмүктэрин ахсаана аһара барбыт сирэйдэр",
        "recentchangesdays-max": "(улааппыта $1 күн)",
        "recentchangescount": "Саҥа уларытыылар көрдөрүллэр ахсааннара:",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
-       "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
+       "prefs-help-watchlist-token2": "Бу кэтиир испииһэгиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн испииһэккин көрүөн сөп, онон кимиэхэ да биэримэ. Хаһан баҕарар [[Special:ResetTokens|маны баттаан уларытыаххын]] сөп.",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
        "savedrights": "{{GENDER:$1|$1}} кыттааччы бөлөҕө бигэргэннэ.",
        "timezonelegend": "Олохтоох кэм:",
        "timezoneregion-indian": "Индия байҕала",
        "timezoneregion-pacific": "Чуумпу байҕал",
        "allowemail": "Атын кыттааччылартан сурук тутары көҥүллүүбүн",
+       "email-allow-new-users-label": "Сабыс-саҥа киирбит дьонтон сурук тутары көҥүллээ",
+       "email-blacklist-label": "Бу дьон миэхэ суруйалларын боп:",
        "prefs-searchoptions": "Көрдөөһүн",
        "prefs-namespaces": "Аат дала",
        "default": "чопчу ыйыллыбатаҕына маннык",
        "prefs-editor": "Эрэдээктэр",
        "prefs-preview": "Инники көрүү",
        "prefs-advancedrc": "Дириҥэтиллибит туруоруулар",
+       "prefs-opt-out": "Тупсарыыттан батыныы",
        "prefs-advancedrendering": "Дириҥэтиллибит туруоруулар",
        "prefs-advancedsearchoptions": "Дириҥэтиллибит туруоруулар",
        "prefs-advancedwatchlist": "Дириҥэтиллибит туруоруулар",
        "recentchanges-legend": "Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу",
        "recentchanges-summary": "Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.",
        "recentchanges-noresult": "Этиллибит уларытыылар эппит кэмҥэр оҥоһуллубатахтар.",
+       "recentchanges-timeout": "Көрдөөһүн болдьоҕо бүттэ. Атыннык көрдүөххүн сөп.",
+       "recentchanges-network": "Саахал тахсан хаалан түмүгэ көстүбэтэ. Хат ыытан көр.",
+       "recentchanges-notargetpage": "Сирэй аатын үөһээ суруй, оччоҕо ону кытта ситимнээх көннөрүүлэр көстүөхтэрэ.",
        "recentchanges-feed-description": "Бу ботуокка биики бүтэһик уларыйыыларын кэтииргэ.",
        "recentchanges-label-newpage": "Бу уларытыы түмүгэр саҥа сирэй айыллыбыт.",
        "recentchanges-label-minor": "Бу улахан суолтата суох уларытыы",
        "rcfilters-hours-title": "Тиһэх чаастар",
        "rcfilters-days-show-days": "$1 хонук",
        "rcfilters-days-show-hours": "$1 чаас",
+       "rcfilters-highlighted-filters-list": "Тыктарыллыбыт: $1",
        "rcfilters-quickfilters": "Бигэргэммит сиидэлэр",
-       "rcfilters-quickfilters-placeholder-title": "Ð\91игÑ\8dÑ\80гÑ\8dммиÑ\82 Ñ\81игэ билигин суох",
+       "rcfilters-quickfilters-placeholder-title": "Ð\91игÑ\8dÑ\80гÑ\8dммиÑ\82 Ñ\81иидэ билигин суох",
        "rcfilters-quickfilters-placeholder-description": "Сиидэ туруорууларын кэлин туһанарга, \"Холбоммут сиидэ\" хонуутугар кыбытык ойуутун баттаа.",
        "rcfilters-savedqueries-defaultlabel": "Бигэргэммит сиидэлэр",
        "rcfilters-savedqueries-rename": "Аатын уларыт",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Анаан этиллибэтэҕинэ туттуллар сиидэни оҥоруу",
        "rcfilters-savedqueries-cancel-label": "Салҕаама",
        "rcfilters-savedqueries-add-new-title": "Сиидэлэ билиҥҥи туруорууларын хааллар",
+       "rcfilters-savedqueries-already-saved": "Маннык сиидэлэр хайыы-үйэ бааллар. Туруорууларын уларытан саҥа Бигэргэммит сиидэтэ оҥор.",
        "rcfilters-restore-default-filters": "Анаан этиллибэтэҕинэ турар сиидэлэри холбоо",
        "rcfilters-clear-all-filters": "Сиидэлэри барытын суох гын",
        "rcfilters-show-new-changes": "Тиһэх уларытыылар",
-       "rcfilters-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
+       "rcfilters-search-placeholder": "Сиидэлэр уларыйыылара (талбаны туһан биитэр сиидэ аатынан көрдөө)",
        "rcfilters-invalid-filter": "Сатаммат сиидэ",
        "rcfilters-empty-filter": "Холбоммут сиидэ суох. Улартыы барыта көстөр.",
        "rcfilters-filterlist-title": "Сиидэ",
        "rcfilters-filterlist-whatsthis": "Бу тугуй?",
-       "rcfilters-filterlist-feedbacklink": "Саҥа (беÑ\82а) Ñ\81иидÑ\8dлÑ\8dÑ\80 Ñ\82Ñ\83Ñ\81Ñ\82аÑ\80Ñ\8bнан суруй",
+       "rcfilters-filterlist-feedbacklink": "Ð\91Ñ\83 (Ñ\81аҥа) Ñ\81иидÑ\8dлÑ\8dÑ\80 Ñ\82Ñ\83Ñ\81Ñ\82аÑ\80Ñ\8bнан Ð±Ð¸Ò»Ð¸Ñ\8dÑ\85Ñ\8d суруй",
        "rcfilters-highlightbutton-title": "Түмүгүн бэлиэтээ",
        "rcfilters-highlightmenu-title": "Өҥүн тал",
        "rcfilters-highlightmenu-help": "Өҥүн талан, көстөр гын",
        "rcfilters-filter-editsbyself-description": "Бэйэҥ уларытыыларыҥ.",
        "rcfilters-filter-editsbyother-label": "Атыттар уларытыылара",
        "rcfilters-filter-editsbyother-description": "Атыттар уларытыылара (Эйиэниттэн ураты).",
-       "rcfilters-filtergroup-userExpLevel": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ñ\83опÑ\83Ñ\82Ñ\83н Ñ\82аһÑ\8bмÑ\8bнан (бÑ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82Ñ\82Ñ\8dÑ\80гÑ\8d Ñ\8dÑ\80Ñ\8d)",
+       "rcfilters-filtergroup-userExpLevel": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82инÑ\8dн Ñ\83онна Ñ\83опÑ\83Ñ\82Ñ\83н Ñ\82аһÑ\8bмÑ\8bнан",
        "rcfilters-filter-user-experience-level-registered-label": "Бэлиэтэммиттэр",
        "rcfilters-filter-user-experience-level-registered-description": "Киирбит эрэдээктэрдэр.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Бэлиэтэммэтэхтэр",
        "rcfilters-filter-user-experience-level-unregistered-description": "Киирбэтэх эрэдээктэрдэр.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Саҥа киирбиттэр",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Ð\9eÑ\82ой Ñ\81аҥалаÑ\80: 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82Ñ\82Ñ\8dÑ\80 Ð³Ñ\8bнан Ð±Ð°Ñ\80ан 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
        "rcfilters-filter-user-experience-level-learner-label": "Үөрэнээччилэр",
        "rcfilters-filter-user-experience-level-learner-description": "\"Саҕалааччыттан\" элбэх, \"уопуттаахтан\" аҕыйах уопуттаах.",
        "rcfilters-filter-user-experience-level-experienced-label": "Уопуттаах кыттааччылар",
-       "rcfilters-filter-user-experience-level-experienced-description": "30 хонуктан ордук үлэлээбит уонна 500 көннөрүүнү оҥорбуттар.",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 хонуктан ордук үлэлээбит уонна 500 көннөрүүттэн элбэҕи оҥорбуттар.",
        "rcfilters-filtergroup-automated": "Аптамаат көннөрүүлэр",
        "rcfilters-filter-bots-label": "Оруобат",
        "rcfilters-filter-bots-description": "Аптамаатынан оҥоһуллубут көннөрүүлэр.",
        "rcfilters-filter-watchlist-notwatched-description": "Кэтэбил тиһилигэр киирбит ыстатыйалары уларытыыттан уратыны барытын.",
        "rcfilters-filtergroup-watchlistactivity": "Кэтэбил тиһилигин көҕө",
        "rcfilters-filter-watchlistactivity-unseen-label": "Көрүллэ илик уларытыылар",
+       "rcfilters-filter-watchlistactivity-seen-label": "Көрүллүбүт уларытыылар",
        "rcfilters-filtergroup-changetype": "Уларытыы көрүҥэ",
        "rcfilters-filter-pageedits-label": "Сирэй уларытыылара",
        "rcfilters-filter-pageedits-description": "Ис хоһоонун, ырытыылары, категорияны ойуулааһыны эҥин уларытыы...",
        "rcfilters-watchlist-markseen-button": "Уларытыылары барытын көрөүллүбүт гын",
        "rcfilters-watchlist-edit-watchlist-button": "Кэтэбилиҥ тиһилигин уларытыы",
        "rcfilters-watchlist-showupdated": "Эн көрбүтүҥ кэннэ уларыйбыт <strong>модьу бичигинэн</strong> уонна толору бэлиэннэн бэлиэтэммит.",
+       "rcfilters-preference-label": "Тиһэх барылын көстүбэт гын",
+       "rcfilters-preference-help": "2017 сыл алтыһаанын уларытыыларын уонн ол кэннэ киирбит тэриллэри суох гынар.",
+       "rcfilters-filter-showlinkedfrom-label": "Сигэнэр сирэйдэрбэр уларытыылары көрдөр",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Талбыт сирэйиҥ</strong> сигэнэр сирэйдэрэ",
+       "rcfilters-filter-showlinkedto-label": "Сигэнэр сирэйдэри уларытыыны көрдөр",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Талбыт сирэйгэр</strong> сигэнэр сирэйдэр",
+       "rcfilters-target-page-placeholder": "Сирэй (категория) аатын суруй",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
        "rclistfromreset": "Дьылын-күнүн сот",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "recentchangeslinked-feed": "Сигэнэр уларытыылар",
        "recentchangeslinked-toolbox": "Сигэнэр уларытыылар",
        "recentchangeslinked-title": "\"$1\" кытта сибээстээх уларытыылар",
-       "recentchangeslinked-summary": "Ð\91Ñ\83 Ð°Ð½Ð°Ð» Ñ\81иÑ\80Ñ\8dйгÑ\8d Ñ\81игÑ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80 Ð±Ò¯Ñ\82Ñ\8dһик Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bлаÑ\80а ÐºÓ©Ò»Ò¯Ð½Ð½Ò¯Ð»Ñ\8dÑ\80. [[Special:Watchlist|Ð\9aÑ\8dÑ\82Ñ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80]] '''модÑ\8cÑ\83 Ð±Ð¸Ñ\87игинÑ\8dн''' Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dннилÑ\8dÑ\80.",
+       "recentchangeslinked-summary": "СиÑ\80Ñ\8dй Ð°Ð°Ñ\82Ñ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йдаÑ\85Ñ\85Ñ\8bна ÐºÐ¸Ð½Ð¸Ñ\8dÑ\85Ñ\8d Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 ÐºÐ¸Ð½Ð¸ Ñ\81игÑ\8dнÑ\8dÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80ин Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b ÐºÓ©Ñ\81Ñ\82Ò¯Ó©Ò\95Ñ\8d. (Ð\9aаÑ\82егоÑ\80иÑ\8fÒ\95а ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80Ñ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и ÐºÓ©Ñ\80Ó©Ñ\80гө Ð¼Ð°Ð½Ð½Ñ\8bк Ñ\81Ñ\83Ñ\80Ñ\83й: Category:Ð\9aаÑ\82егоÑ\80иÑ\8f Ð°Ð°Ñ\82а). [[Special:Watchlist|Ð\9aÑ\8dÑ\82ииÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80иҥ]] Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bÑ\82а <strong>модÑ\8cÑ\83 Ð±Ð¸Ñ\87игинÑ\8dн</strong> Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dммиÑ\82.",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
        "recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ",
        "uploadbtn": "Билэни киллэрии",
        "reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
        "upload-tryagain": "Билэ туһунан сурук уларытыытын ыыт",
+       "upload-tryagain-nostash": "Билэни уонна ойуулааһынын хос ыыт",
        "uploadnologin": "Биикигэ ааккын билиһиннэрбэтиҥ",
        "uploadnologintext": "Билэлэри киллэрэргэ $1 наада",
        "upload_directory_missing": "Суруйуу паапката ($1) суох, ону ааһан сиэрбэр ону бэйэтэ оҥорор кыаҕа суох.",
        "file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
        "uploadwarning": "Сэрэтии",
        "uploadwarning-text": "Бука диэн аллара баар билэ туһунан суругу уларыт уонна өссө хатылаа.",
+       "uploadwarning-text-nostash": "Бука диэн, хат ыытан көр, ойуулаһынан уларыт уонна хатылаа.",
        "savefile": "Билэни суруттарыы",
        "uploaddisabled": "Суруттарыы бобуллубут",
        "copyuploaddisabled": "URL көмөтүнэн хачайдыыр кыах араарыллыбыт.",
        "uploaded-script-svg": "Хачайдаммыт SVG-билэҕэ сценарийы өйүүр куттааллаах «$1» элэмиэн көһүннэ.",
        "uploaded-hostile-svg": "Хачайдаммыт SVG-билэ истиилин элэмиэнигэр кутталлаах CSS-куод көһүннэ.",
        "uploaded-event-handler-on-svg": "SVG-билэлэргэ <code>$1=\"$2\"</code> сабыытыйаны таҥастааччы атрибууттарын туруоруу көҥүллэммэт.",
-       "uploaded-href-attribute-svg": "Манна көстүбүт <code><$1 $2=\"$3\"></code> SVG-билэ сигэҕэ аналлаах href-атрибуттарыгар, маннык эрэ көүллэнэр: http:// биитэр https://.",
+       "uploaded-href-attribute-svg": "<a> элэмиэн манна эрэ data сигэнэр (href) кыахтаах: (угуллубут билэ), http:// биитэр https:// сигэлэр биитэр фрагмент (#, ол докумуоҥҥа). Атын элэмиэннэргэ, холобур <image> элэмиэҥҥэ, data: уонна фрагмент эрэ көҥүллэнэр. Ойууну SVG экспортыыр кэмҥэр уган көр. Булулунна <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
        "uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code>&lt;$1 $2=\"$3\"&gt;</code> куод көстүбүт.",
        "uploadstash-exception": "Суруттараргын быстах уурар сиргэ харайар сатаммата ($1): \"$2\".",
        "uploadstash-bad-path": "Маннык суол суох.",
        "uploadstash-bad-path-invalid": "Суол алҕастаах.",
+       "uploadstash-bad-path-unknown-type": "Биллибэт көрүҥнээх «$1».",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Ойуучаан аата сатаан ааҕыллыбата.",
+       "uploadstash-bad-path-no-handler": "$2 билэ $1 mime-көрүҥүн таҥастыыр бырагыраама көстүбэтэ.",
+       "uploadstash-bad-path-bad-format": "\"$1\" күлүүс сөп түбэспэт формааттаах.",
+       "uploadstash-file-not-found": "«$1» күлүүс көстүбэтэ.",
+       "uploadstash-file-not-found-no-thumb": "Ойуучааны ылар табыллыбата.",
+       "uploadstash-file-not-found-no-local-path": "Масштаабтаммыт ойуу сытар сирэ көстүбэтэ.",
+       "uploadstash-file-not-found-no-object": "Ойуучаан билэтин эбийиэгин оҥорор сатаммата.",
+       "uploadstash-file-not-found-no-remote-thumb": "Эскиис сатаан хостоммото: $1\nURL = $2",
+       "uploadstash-file-not-found-missing-content-type": "Content-type аат көстүбэтэ.",
+       "uploadstash-file-not-found-not-exists": "Билэ сытар сирэ көстүбэтэ эбэтэр өйдөммөтө.",
+       "uploadstash-file-too-large": "$1 баайтан бөдөҥ билэни таҥастыыр сатаммат.",
+       "uploadstash-not-logged-in": "Бэлиэтэммит кыттааччы суох, билэ кыттааччы киэнэ буолуохтаах.",
+       "uploadstash-wrong-owner": "Бу билэ ($1) кыттааччы киэнэ буолбатах.",
+       "uploadstash-no-such-key": "Күлүүс ($1) суох, сотор сатаммат.",
+       "uploadstash-no-extension": "Кэтирээһинэ кураанах.",
+       "uploadstash-zero-length": "Билэ уһуна нуулга тэҥ.",
        "invalid-chunk-offset": "Бобуллубут сыҕарыйыы",
        "img-auth-accessdenied": "Киирии бобуллубут",
        "img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин img_auth өйөөбөтө буолуо.\nМаны https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization көр.",
        "listfiles_size": "Кээмэйэ",
        "listfiles_description": "Быһаарыыта",
        "listfiles_count": "Барыллар",
-       "listfiles-show-all": "Ð\9eйÑ\83Ñ\83 Ñ\8dÑ\80гÑ\8d Ð±Ð°Ñ\80Ñ\8bлларын эмиэ киллэр",
+       "listfiles-show-all": "Ð\91илÑ\8d Ñ\8dÑ\80гÑ\8d Ñ\82оÑ\80Ñ\83мнарын эмиэ киллэр",
        "listfiles-latestversion": "Билиҥҥи барыла",
        "listfiles-latestversion-yes": "Сөп",
        "listfiles-latestversion-no": "Суох",
        "pageswithprop-legend": "Уларытыллыбыт туруоруулаах сирэйдэр",
        "pageswithprop-text": "Манна сорох туруоруулара уларытыллыбыт сирэйдэр көстүбүттэр.",
        "pageswithprop-prop": "Туруоруу аата:",
+       "pageswithprop-reverse": "Таҥнары наардаа",
+       "pageswithprop-sortbyvalue": "Көрдөрүүтүнэн наардаа",
        "pageswithprop-submit": "Толор",
        "pageswithprop-prophidden-long": "уһун тиэкис кистэммит ($1)",
        "pageswithprop-prophidden-binary": "бинаар суолта кистэммит ($1)",
        "doubleredirects": "Хос көһөрөөһүн",
        "doubleredirectstext": "Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.\nХас устуруока аайы бастакы уонна иккис утаарыга сигэ баар, ону таһынан иккис утаарыыга баар сирэй аадырыһа (аата) баар, ол аата бастакы утаарыы дьиҥинэн ханна утаарыахтааҕа көстөр.\n<del>Сотуллубут</del> суруктар көннөрүллүбүттэр.",
        "double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт.\nАптамаатынан саҥардыллыбыт уонна бу сирэйгэ утаарар [[$2]].",
-       "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү оҥоһулла сылдьар.",
+       "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү оҥоһулла сылдьар",
        "double-redirect-fixer": "Утаарыылары көннөрөөччү",
        "brokenredirects": "Быстыбыт көһөрүүлэр",
        "brokenredirectstext": "Бу утаарыы сирэйдэрэ суох ыстатыйаларга сигэнэллэр (ыыталлар):",
        "apisandbox-sending-request": "API-көрдөбүлү ыытыы…",
        "apisandbox-loading-results": "API-түмүгүн ылыы…",
        "apisandbox-results-error": "Көрдөбүлгэ API-хоруйу киллэрии  кэмигэр алҕас таҕыста: $1.",
+       "apisandbox-results-login-suppressed": "Бу ыйытык браузер домены хааччахтыырын туораары бэлиэтэммэтэх кыттааччы ыйытыгын курдук таҥастаммыт. API кумаҕын токена оннук ыйытыктары аптамаатынан сороҕор сөпкө таҥастаабат, онон, бука диэн, бэйэҥ толор.",
        "apisandbox-request-selectformat-label": "Көрдөбүлү маннык көрдөр:",
        "apisandbox-request-format-url-label": "Көрдөбүл URL-ун устуруоката",
        "apisandbox-request-url-label": "Көрдөбүл URL-аадырыһа:",
        "enotif_lastdiff": "Уларытыыны манна көр: $1",
        "enotif_anon_editor": "ааттамматах кыттааччы $1",
        "enotif_body": "Аламай күн сырдыгынан, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nУларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT\n\nУларыппыт киһиэхэ суруйуоххун сөп:\nэл. почта: $PAGEEDITOR_EMAIL\nбиики: $PAGEEDITOR_WIKI\n\nБу сирэйи бэлиэтэммит ааккынан киирэн көрбөтөххүнэ уларыйбытын туһунан биллэриилэр кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ отой арааран кэбиһиэххин эмиэ сөп.\n\n             Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ\n\n--\nБиллэрии кэлэрин салайыы\n{{canonicalurl:{{#special:Preferences}}}}\n\nКэтиир тиһиги уларытыы\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nКэтиир тиһиктэн сирэйдэри сотуу\n$UNWATCHURL\n\nКөмө\n$HELPPAGE",
+       "enotif_minoredit": "Бу улахан суолтата суох уларытыы",
        "created": "айыллыбыт",
        "changed": "уларыппыт (уларытыллыбыт)",
        "deletepage": "Сирэйи сот",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
        "deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
        "deleting-backlinks-warning": "<strong>Сэрэтии.</strong>\nСотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
+       "deleting-subpages-warning": "<strong>Сэрэтии:</strong> Сотоору гынар сирэйиҥ анныгар [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 сирэй|51=50-тан тахса сирэй}} баар эбит]].",
        "rollback": "Уруккутугар төннөр",
        "rollbacklink": "төннөр",
        "rollbacklinkcount": "$1 көннөрүүнү суох гын",
        "editcomment": "Уларытыыны маннык быһаарбыттар: <em>$1</em>.",
        "revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
        "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "$1 көннөрүүлэр бу торумҥа төннөрүлүннүлэр: $2.",
+       "rollback-success": "{{GENDER:$3|$1}} көннөрүүтэ сотулунна; {{GENDER:$4|$2}} барылыгар төннөрүлүннэ.",
        "rollback-success-notify": "$1 уларытыылара сотулуннулар; \n$2 тиһэх торумугар төннөрүлүннэ. [$3 Уларытыыны көрдөр]",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "undelete-search-title": "Сотуллубут сирэйдэри көрдөөһүн",
        "undelete-search-box": "Сотуллубут сирэйдэри көрдөөһүн",
        "undelete-search-prefix": "Мантан саҕаланар сирэйдэри көрдөө:",
+       "undelete-search-full": "Аатыгар манныктааҕы көрдөр:",
        "undelete-search-submit": "Көрдөө",
        "undelete-no-results": "Сотуллубут сирэйдэргэ эн көрдүүр сирэйиҥ көстүбэтэ.",
        "undelete-filename-mismatch": "Сирэй $1 кэмнээҕи торумун төннөрөр кыах суох: аата сөп түбэспэт",
        "sp-contributions-newonly": "Саҥаттан оҥоһуллубут сирэйдэри эрэ көрдөр",
        "sp-contributions-hideminor": "Суолтата суох уларытыылары көрдөрүмэ",
        "sp-contributions-submit": "Көрдөө",
+       "sp-contributions-outofrange": "Түмүгү көрдөрөр сатаммата. Көрдөммүт IP-диапазон CIDR /$1 лимиититтэн улахан эбит.",
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "whatlinkshere-page": "Сирэй:",
        "ipb_blocked_as_range": "Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа суох. Ол гынан баран IP бу $2 диапазон сорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун устуохха) сөп.",
        "ip_range_invalid": "IP-лар диапазоннара сатаммат.",
        "ip_range_toolarge": "Мантан  /$1 үөһэ диапазоннары хааччахтыыр сатаммат.",
+       "ip_range_exceeded": "IP-диапазон муҥутууру куоһарар. Көҥүллэнэр диапазон маннык: /$1.",
        "proxyblocker": "Прокси бобуллуута",
        "proxyblockreason": "Эн IP-ҥ аһаҕас прокси эбит, онон бобулунна. Интернет-провайдергын эбэтэр техническэй сулууспаны кытта сибээстэһэн кутталлаах суол баарын биллэр.",
        "sorbsreason": "Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.",
        "import-mapping-namespace": "Бу аат далыгар:",
        "import-mapping-subpage": "Бу сирэй хос сирэйин курдук импортаа:",
        "import-upload-filename": "Билэ аата:",
+       "import-upload-username-prefix": "Интервики префиксэ:",
+       "import-assign-known-users": "Олохтоох биикигэ маннык кыттааччылар баар буоллахтарына көннөрүүлэрин холботолоо",
        "import-comment": "Хос быһаарыы:",
        "importtext": "Сирэйи [[Special:Export|экспорт үнүстүрүмүөнүн]] көмөтүнэн бастакы биикиттэн экспортаа. \nБилэни бастаан бэйэҥ көмпүүтэргэр суруй, онтон манна көһөр.",
        "importstart": "Сирэйдэри импортааһын...",
        "imported-log-entries": "Сурунаал $1 {{PLURAL:$1|суруга|суруктара}} импортаннылар.",
        "importfailed": "Импортыыр табыллыбата: $1",
        "importunknownsource": "Импортанар сирэй биллибэт көрүҥнээх",
+       "importnoprefix": "Интервики префиксэ ыйыллыбатах",
        "importcantopen": "Импортанар билэ кыайан арыллыбат",
        "importbadinterwiki": "Интервики ыйынньык сыыһа",
        "importsuccess": "Импортааһын түмүктэннэ!",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
        "pageinfo-user-id": "Кыттааччы нүөмэрэ",
+       "pageinfo-file-hash": "Хэш суолта",
        "markaspatrolleddiff": "Бэрэбиэркэлэммит курдук бэлиэтээ",
        "markaspatrolledtext": "Бу ыстатыйаны бэрэбиэркэлэммит курдук бэлиэтээ",
        "markaspatrolledtext-file": "Билэ бу торумун ботуруулламмыт курдук бэлиэтээ",
        "newimages-legend": "Фильтр",
        "newimages-label": "Билэ аата (эбэтэр сорҕото):",
        "newimages-user": "Кыттааччы аата эбэтэр IP-та",
+       "newimages-newbies": "Саҥа бэлиэ ааттартан эрэ оҥоһуллубуту көрдөр",
        "newimages-showbots": "Руобаттар хачайдааһыннарын көрдөр",
        "newimages-hidepatrolled": "Кэтэммит хачайданыылары сабыы.",
+       "newimages-mediatype": "Миэдьийэ көрүҥэ:",
        "noimages": "Ойуу суох.",
        "gallery-slideshow-toggle": "Ойуучааннары уларыт",
        "ilsubmit": "Көрдөт",
        "autosumm-blank": "Бу сирэй ыраастаныллыбыт",
        "autosumm-replace": "Сирэй иһэ уларытыллыбыт: '$1'",
        "autoredircomment": "Утаарыы: [[$1]]",
+       "autosumm-removed-redirect": "Сотуллубут утаарыы: $1",
+       "autosumm-changed-redirect-target": "Утаарыы мантан $1 манна $2 уларыйда",
        "autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
        "autosumm-newblank": "Кураанах сирэй оҥоһулунна",
        "size-bytes": "$1 байт",
        "fileduplicatesearch-noresults": "«$1» диэн билэ суох эбит.",
        "specialpages": "Анал сирэйдэр",
        "specialpages-note-top": "Легендата",
+       "specialpages-note-restricted": "* Көннөрү анал сирэйдэр.\n* <span class=\"mw-specialpagerestricted\">Хааччахтаах анал сирэйдэр.</span>",
        "specialpages-group-maintenance": "Техническэй отчуоттар",
        "specialpages-group-other": "Атын аналлаах сирэйдэр",
        "specialpages-group-login": "Киирии / бэлиэтэнии",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тиэк|Тиэктэр}}]]: $2)",
        "tag-mw-contentmodelchange": "Иһинээҕи киэбин уларытыы сурунаала",
        "tag-mw-contentmodelchange-description": "Сирэй [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ис тутулун уларытар] көннөрүүлэр",
+       "tag-mw-new-redirect": "Саҥа утаарыы",
+       "tag-mw-new-redirect-description": "Саҥа утаарыыны оҥорор эбэтэр сирэйи утаарыы оҥорор уларытыылар",
+       "tag-mw-removed-redirect": "Сотуллубут утаарыы",
+       "tag-mw-removed-redirect-description": "Баар утаарыыны суох гынар уларытыылар",
+       "tag-mw-changed-redirect-target": "Атын сиргэ утаарыы",
+       "tag-mw-changed-redirect-target-description": "Атын сиргэ утаарар гынар уларытыылар",
+       "tag-mw-blank": "ыраастааһын",
+       "tag-mw-blank-description": "Сирэйи ыраастыыр уларытыылар",
+       "tag-mw-replace": "Солбуллубут",
+       "tag-mw-replace-description": "Сирэй 90% сотор уларытыылар",
+       "tag-mw-rollback": "Төннөрүү",
+       "tag-mw-undo": "Төннөрүү",
        "tags-title": "Бэлиэлэр (тиэктэр)",
        "tags-intro": "Бу сирэйгэ бырагыраамма уларытыылары бэлиэтиир анал бэлиэлэрин (тиэктэрин) тиһиктэрэ уонна ол бэлиэлэр суолталара көстөр.",
        "tags-tag": "Бэлиэ (тиэк) аата",
        "tags-create-reason": "Төрүөтэ:",
        "tags-create-submit": "Оҥоруу",
        "tags-create-no-name": "Бэлиэ аатын суруйуохтааххын.",
-       "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>) эбэтэр слэш  (<code>/</code>) буолуохтаах.",
+       "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>), паайп (<code>|</code>), эбэтэр слэш  (<code>/</code>) суох буолуохтаах.",
        "tags-create-invalid-title-chars": "Тиэк аатыгар сирэй баһыгар туттуллуо суохтаах бэлиэ киириэ суохтаах",
        "tags-create-already-exists": "«$1» тиэк хайыы-үйэ баар эбит.",
        "tags-create-warnings-above": "«$1» тиэги оҥорорго маннык {{PLURAL:$2|сэрэтии көһүннэ|сэрэтиилэр көһүннүлэр}}:",
        "compare-invalid-title": "Суруллубут аат туттуллара сатаммат.",
        "compare-title-not-exists": "Ыйбыт аатыҥ суох эбит.",
        "compare-revision-not-exists": "Ыйбыт барылыҥ суох эбит.",
-       "diff-form": "'''тас көстүүтэ, быһыыта'''",
+       "diff-form": "Уратылар",
+       "diff-form-oldid": "Торум урукку нүөмэрэ (булгуччута суох)",
+       "diff-form-revid": "Уратылаах торум нүөмэрэ",
+       "diff-form-submit": "Уратылары көрдөр",
+       "permanentlink": "Куруук баар сигэ",
+       "permanentlink-revid": "Уларытыы нүөмэрэ",
+       "permanentlink-submit": "Торумҥа көс",
        "dberr-problems": "Баалаама! Бу саайт техническэй ыарахаттары көрсүбүт.",
        "dberr-again": "Аҕыйах мүнүүтэннэн саҥардан көрөөр.",
        "dberr-info": "(Билэ тиһигин кытта ситим быстыбыт: $1)",
        "limitreport-expansiondepth": "Кэҥэтии дириҥин муҥутуур кээмэйэ",
        "limitreport-expensivefunctioncount": "Анализатор \"сыаналаах\" функцияларын ахсаана",
        "expandtemplates": "Халыыптары тэнитии",
-       "expand_templates_intro": "Бу аналлаах сирэй тиэкис туох баар халыыптарын тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. \n<code><nowiki>{{</nowiki>#language:...}}</code> уонна переменнайдар <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nУопсайынан, бу барыта хос фигурнай ускуопка иһигэр баар.",
+       "expand_templates_intro": "Бу аналлаах сирэй тиэкис туох баар халыыптарын тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. \n<code><nowiki>{{#language:...}}</code> уонна переменнайдар <code><nowiki>{{CURRENTDAY}}</code>. \nУопсайынан, бу барыта хос фигурнай ускуопка иһигэр баар.",
        "expand_templates_title": "{{FULLPAGENAME}} сирэй аата уонна да атын сибидиэнньэлэр:",
        "expand_templates_input": "Киирэр сурук:",
        "expand_templates_output": "Түмүк",
        "expand_templates_preview": "Холоон көрүү",
        "expand_templates_preview_fail_html": "<em>raw HTML холбоно сылдьар {{SITENAME}} ситим-сир сиэссийэтин сүтэрэн кэбиспит буолан, эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнэр ньыма.</em>\n\n<strong>Эрдэ көрөрүҥ буортуну аҕалбат буоллаҕына хатылаан көр.</strong>\nСин биир сатамматаҕына [[Special:UserLogout|үлэҕин түмүктээ]] уонна хат киирэн көр.",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ситим-сиргэ «сиикэй» HTML холбоммут буолан уонна эн ааккын эппэтэх буолаҥҥын эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнии.</em>\n\n<strong>Өскөтүн туох да куһаҕаны оҥоруоххун баҕарбат буоллаххына, [[Special:UserLogin|киир]] уонна хатылаа.",
-       "expand_templates_input_missing": "Эһиги Ñ\85аннÑ\8bк Ñ\8dмиÑ\82 Ñ\82иÑ\8dкиһи Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80.",
+       "expand_templates_input_missing": "ТÑ\83гÑ\83 Ñ\8dмиÑ\82 Ñ\81Ñ\83Ñ\80Ñ\83йÑ\83оÑ\85Ñ\82ааÑ\85Ñ\85Ñ\8bн.",
        "pagelanguage": "Сирэй тылын уларытыы",
        "pagelang-name": "Сирэй",
        "pagelang-language": "Омугун тыла",
        "authprovider-confirmlink-request-label": "Ситимнэнэр бэлиэ-ааттар",
        "authprovider-confirmlink-success-line": "$1: ситимнэннэ.",
        "authprovider-confirmlink-failed": "Сороҕун эрэ ситимниир сатанна: $1",
+       "authprovider-confirmlink-ok-help": "Алҕас туһунан биллэрии кэнниттэн салгыырга.",
        "authprovider-resetpass-skip-label": "Аһар",
        "authprovider-resetpass-skip-help": "Аһарыгы хос ыытыыны көтүт.",
        "authform-nosession-login": "Этэҥҥэ киирдиҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
        "authform-nosession-signup": "Этэҥҥэ бэлиэтэнниҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+       "authform-newtoken": "Токен суох. $1",
+       "authform-notoken": "Токен суох",
+       "authform-wrongtoken": "Алҕастаах токен",
        "specialpage-securitylevel-not-allowed-title": "Көҥүллэммэт",
        "specialpage-securitylevel-not-allowed": "Бу сирэйи туһанар кыаҕыҥ суох эбит, тоҕо диэтэххэ бу чахчы Эн буоларгын тургутар кыахпыт суох.",
        "authpage-cannot-login": "Киириини салгыыр кыах суох.",
        "authpage-cannot-link-continue": "Ситимниир кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
        "cannotauth-not-allowed-title": "Киирэр көҥүллэммэт",
        "cannotauth-not-allowed": "Бу сирэйи туһанарыҥ сатаммат эбит",
+       "changecredentials": "Бэлиэтэммити уларыты",
+       "changecredentials-submit": "Бэлиэтэммити уларыт",
+       "changecredentials-invalidsubpage": "$1 бэлиэтэнии сатаммат көрүҥэ эбит.",
+       "changecredentials-success": "Бэлиэтэнииҥ уларытылынна.",
        "removecredentials": "Бэлиэ-ааты сот",
        "removecredentials-submit": "Бэлиэ-ааты сот",
        "removecredentials-invalidsubpage": "$1 бэлиэтэнии сатаммат көрүҥэ эбит.",
        "usercssispublic": "Болҕой: CSS  сирэйигэр кистэлэҥ сибидиэнньэ суох буолуохтаах, тоҕо диэтэххэ ону атын кыттааччылар хааччаҕа суох көрөр кыахтаахтар.",
        "restrictionsfield-badip": "IP эбэтэр IP-лар диапазоннара сатаммат: $1",
        "restrictionsfield-label": "Көҥүллэммит IP диапазона:",
+       "restrictionsfield-help": "Устуруокаҕа биирдии IP-аадырыс эбэтэр CIDR-диапазон. Барытын көҥүллүүргэ маны туһан:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Алҕас: $1",
+       "edit-error-long": "Алҕас:\n\n$1",
        "revid": "$1 торум",
        "pageid": "$1 сирэй нүөмэрэ",
+       "rawhtml-notallowed": "&lt;html&gt; тиэктэр көннөрү сирэйдэр эрэ истэригэр туттулаллар.",
        "gotointerwiki": "{{SITENAME}} сиртэн тахсарга",
        "gotointerwiki-invalid": "Аат алҕастаах.",
-       "gotointerwiki-external": "[[$2]] диэн сиргэ бараары {{SITENAME}} сиртэн тахсан эрэҕин.\n\n'''[$1 Манна $1 көс]'''"
+       "gotointerwiki-external": "[[$2]] диэн сиргэ бараары {{SITENAME}} сиртэн тахсан эрэҕин.\n\n'''[$1 Манна $1 көс]'''",
+       "undelete-cantedit": "Сөргүтэриҥ табыллыбата, тоҕо диэтэххэ бу сирэйи уларытар быраабыҥ суох эбит.",
+       "undelete-cantcreate": "Бу сирэйи сөргүтэриҥ табыллыбата, тоҕо диэтэххэ сотуллубут, саҥаны буоллаҕына оҥорор кыаҕыҥ суох эбит.",
+       "pagedata-title": "Сирэй туһунан",
+       "pagedata-text": "Бу сирэй сирэйдэр тустарынан кэпсиир алтыһааны көрдөрөр. URL-га сирэй аатын суруй. \n* Иһинээҕитэ эн көмпүүтэриҥ Accept диэнин туһанан көрдөрүллүө. Ол аата сирэй туһунан информация хайдах көстөрө көмпүүтэриҥ хайдах нарыламмытыттан тутулуктаах.",
+       "pagedata-not-acceptable": "Сөп түбэһэр формаат көстүбэтэ. MIME маннык көрүҥнэрэ сөп түбэһэллэр: $1",
+       "pagedata-bad-title": "Алҕастаах аат: $1."
 }
index b485715..3f0065f 100644 (file)
@@ -14,7 +14,8 @@
                        "Srdjan m",
                        "Conquistador",
                        "Xð",
-                       "Сербијана"
+                       "Сербијана",
+                       "Acamicamacaraca"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "uploadlogpage": "Registar postavljanja",
        "uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
        "filename": "Ime fajla / Име датотеке",
-       "filedesc": "Sažetak - Ð¡Ð°Ð¶ÐµÑ\82ак",
-       "fileuploadsummary": "Sažetak / Ð¡Ð°Ð¶ÐµÑ\82ак:",
+       "filedesc": "Sažetak - Ð\9eпиÑ\81",
+       "fileuploadsummary": "Sažetak / Ð\9eпиÑ\81:",
        "filereuploadsummary": "Izmjene datoteke:",
        "filestatus": "Status autorskih prava:",
        "filesource": "Izvor / Извор",
        "delete-legend": "Obriši",
        "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu sa svom njenom historijom.\nMolimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
-       "actioncomplete": "Akcija završena\n\nАкција завршена",
+       "actioncomplete": "Radnja završena\n\nРадња завршена",
        "actionfailed": "Akcija nije uspjela",
        "deletedtext": "\"$1\" je obrisan/a.\nV. $2 za registar nedavnih brisanja.",
        "dellogpage": "Evidencija brisanja",
        "ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju vlastitu stranicu za razgovor dok je blokiran",
        "ipb-change-block": "Ponovno blokiraj korisnika sa ovim postavkama",
        "ipb-confirm": "Potvrdite blokiranje",
-       "badipaddress": "Neodgovarajuća IP adresa / Неодговарајућа ИП адреса",
+       "badipaddress": "Neodgovarajuća IP adresa / Неодговарајућа IP адреса",
        "blockipsuccesssub": "Blokiranje je uspjelo",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
index ab05e18..f76e8dc 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Saraiki"
+                       "Saraiki",
+                       "BukhariSaeed"
                ]
        },
        "tog-underline": "لنک  ہیٹھ لکیر",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "createacct-benefit-body2": "\n$1 {{PLURAL:$1|ورقہ|ورقے}}",
        "createacct-benefit-body3": "ہݨ دے {{PLURAL:$1|کم|کماں}}",
+       "badretype": "جہڑے پاس ورڈ تساں لکھن ٹھیک کائنی۔",
        "loginerror": "لاگ ان وچ غلطی",
        "createacct-error": "کھاتہ بݨاوݨ وچ غلطی",
        "createaccounterror": "کھاتہ نی کھُل سڳیا:$1",
        "botpasswords-label-resetpassword": "پاس ورڈ تبدیل کرو",
        "botpasswords-label-grants-column": "ݙے ݙتا ڳئے",
        "botpasswords-bad-appid": "\"$1\" بوٹ ناں ٹھیک کائنی۔",
+       "botpasswords-created-title": "بوٹ پاسورڈ بݨ ڳیا",
+       "botpasswords-updated-title": "بوٹ پاسورڈ تازہ تھی ڳیا",
        "botpasswords-deleted-title": "بوٹ پاسورڈ مٹ ڳیا",
        "resetpass_forbidden": "پاسورڈ تبدیل نی تھی سڳدا",
        "resetpass_forbidden-reason": "پاسورڈ تبدیل نی تھی سڳدے:$1",
        "currentrev": "موجودہ حالت",
        "currentrev-asof": "حالیہ نسخہ بمطابق $1",
        "revisionasof": "دی تبدیلیاں $1",
-       "revision-info": " $1 دی دہرائی  توں {{جنس:$6|$2}}$7",
+       "revision-info": "$1 دی دہرائی  توں {{GENDER:$6|$2}}$7",
        "previousrevision": "→ پراݨا نسخہ",
        "nextrevision": "نویں تبدیلی →",
        "currentrevisionlink": "موجودہ حالت",
        "searchrelated": "متعلقہ",
        "searchall": "یکے",
        "search-nonefound": "سوال دے نال رلدے ملدے نتارے کائنی۔",
+       "powersearch-legend": "اضافی ڳول",
+       "powersearch-ns": "ناں جائیں وچ ڳولو:",
        "powersearch-togglelabel": "ݙیکھو",
        "powersearch-toggleall": "یکے",
        "powersearch-togglenone": "کوئی وی کائنی",
+       "search-external": "ٻاہردی ڳول",
        "preferences": "ترجیحات",
        "mypreferences": "ترجیحات",
        "prefs-edits": "تبدیلیاں دی گنتی:",
        "prefs-watchlist-edits-max": "ودھ کنوں ودھ تعداد: 1000",
        "prefs-misc": "رلیا ملیا",
        "prefs-resetpass": "پاس ورڈ تبدیل کرو",
+       "prefs-email": "ای میل دے آپشن",
        "prefs-rendering": "شکل و صورت",
        "saveprefs": "بچاؤ",
+       "prefs-editing": "لکھائی",
        "searchresultshead": "ڳولو",
        "stub-threshold-sample-link": "نمونہ",
        "stub-threshold-disabled": "غیر فعال",
        "prefs-emailconfirm-label": "ای میل دی تصدیق",
        "youremail": "ای میل",
        "username": "{{GENDER:$1|ورتݨ آلا ناں}}:",
+       "group-membership-link-with-expiry": "$1 ($2 تائیں)",
        "prefs-registration": "رجسٹریشن ویلہ:",
        "yourrealname": "اصلی ناں:",
        "yourlanguage": "زبان",
        "prefs-displaywatchlist": "ݙکھاوݨ دے اختیارات",
        "prefs-tokenwatchlist": "ٹوکن",
        "prefs-diffs": "فرق",
+       "userrights": "حقوق صارف",
+       "userrights-lookup-user": "ورتُو چُݨو",
        "userrights-user-editname": "ورتݨ آلا ناں درج کرو:",
+       "userrights-groupsmember": "دا رکن ہے:",
        "userrights-reason": "سبب:",
+       "userrights-expiry-current": "مکسی $1",
+       "userrights-expiry-none": "لامحدود",
        "userrights-expiry": "مُکسی:",
        "userrights-expiry-othertime": "ٻیا ویلا:",
        "group": "گروپ:",
        "group-user": "ورتݨ آلے",
        "group-bot": "بوٹ",
        "group-sysop": "منتظمین",
+       "group-bureaucrat": "بیوروکریٹ",
        "group-all": "(سارے)",
        "group-user-member": "{{GENDER:$1|ورتݨ آلا}}",
+       "group-bot-member": "{{GENDER:$1|بوٹ}}",
        "grouppage-bot": "{{ns:project}}:بوٹ",
        "grouppage-sysop": "{{ns:project}}:ایڈمنسٹریٹر",
+       "right-read": "ورقے پڑھو",
+       "right-edit": "ورقے وچ لکھو",
        "right-move": "ورقے ٹورو",
        "right-movefile": "فائلاں ٹورو",
        "right-upload": "فائلاں چڑھاؤ",
        "right-editmyoptions": "آپݨیاں ذاتی ترجیحاں لکھو",
        "grant-group-email": "ای میل بھیجو",
        "grant-createaccount": "کھاتے کھولو",
+       "grant-uploadfile": "نویاں فائلاں اپ لوڈ کرو",
        "grant-basic": "بنیادی حقوق",
        "newuserlogpage": "کھاتہ بݨاوݨ آلی لاگ",
        "rightslog": "ورتݨ والے دے حقاں دی لاگ",
index db5e3d7..05a1229 100644 (file)
        "doubleredirects": "Dvojne preusmeritve",
        "doubleredirectstext": "Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.\nVsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.\n<del>Prečrtani</del> vnosi so bili razrešeni.",
        "double-redirect-fixed-move": "Stran [[$1]] smo premaknili.\nSamodejno smo jo posodobili in sedaj se preusmerja na [[$2]].",
-       "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu.",
+       "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu",
        "double-redirect-fixer": "Popravljalec preusmeritev",
        "brokenredirects": "Pretrgane preusmeritve",
        "brokenredirectstext": "Naslednje preusmeritve kažejo na neobstoječe strani:",
        "restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
        "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Napaka: $1",
+       "edit-error-long": "Napake:\n\n$1",
        "revid": "redakcija $1",
        "pageid": "ID strani $1",
        "rawhtml-notallowed": "Oznak &lt;html&gt; ni možno uporabljati izven normalnih strani.",
index d91c401..d312b8a 100644 (file)
@@ -35,7 +35,8 @@
                        "Zoranzoki21",
                        "Obsuser",
                        "Prevodim",
-                       "Acamicamacaraca"
+                       "Acamicamacaraca",
+                       "BokicaK"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "june-date": "$1 јун",
        "july-date": "$1 јул",
        "august-date": "$1 август",
-       "september-date": "$1 Ñ\81емпÑ\82ембаÑ\80",
+       "september-date": "$1 септембар",
        "october-date": "$1 окотобар",
        "november-date": "$1 новембар",
        "december-date": "$1 децембар",
        "userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Отвори још један налог",
        "createacct-emailrequired": "Имејл адреса",
-       "createacct-emailoptional": "Ð\98меÑ\98л Ð°Ð´Ñ\80еÑ\81а (опÑ\86ионо)",
+       "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е (необавезно)",
        "createacct-email-ph": "Унесите Вашу имејл адресу",
        "createacct-another-email-ph": "Унесите имејл адресу",
        "createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
-       "createacct-realname": "Ð\9fÑ\80аво Ð¸Ð¼Ðµ (опÑ\86ионо)",
+       "createacct-realname": "Ð\9fÑ\80аво Ð¸Ð¼Ðµ (необавезно)",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
        "createacct-submit": "Отвори налог",
        "eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
-       "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.",
+       "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
        "emailauthenticated": "Ваша имејл адреса је потврђена $2 у $3.",
        "emailnotauthenticated": "Ваша имејл адреса још није потврђена.\nИмејл неће бити послат ни у једном од следећих случајева.",
        "noemailprefs": "Унесите имејл адресу како би ове могућности радиле.",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
-       "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана IP адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ваша IP адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана IP адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
        "continue-editing": "Иди на уређивачки оквир",
        "previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
        "session_fail_preview": "Извињавамо се! Нисмо могли да обрадимо Вашу измену због губитка података сесије.\n\nМожда сте одјављени. <strong>Проверите да ли сте пријављени и покушајте поново</strong>.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите, те проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
-       "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш претраживач дозвољава колачиће са овог сајта.",
+       "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш прегледач дозвољава колачиће са овог сајта.",
        "token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
        "edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
        "editing": "Уређујете $1",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccount-text": "Отварање налога с ове ИП адресе (<strong>$1</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
-       "cantcreateaccount-range-text": "Отварање налога са ИП адреса у распону <strong>$1</strong>, који укључује и вашу ИП адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
+       "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону <strong>$1</strong>, који укључује и вашу IP адресу (<strong>$4</strong>) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је <em>$2</em>",
        "viewpagelogs": "Погледај дневнике ове странице",
        "nohistory": "Не постоји историја измена ове странице.",
        "currentrev": "Текућа измена",
        "last": "разл",
        "page_first": "прва",
        "page_last": "последња",
-       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
+       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мања измена",
        "history-fieldset-title": "Преглед измена",
        "history-show-deleted": "Само обрисане измене",
        "histfirst": "најстарије",
        "rcfilters-filter-categorization-label": "Измјене категорија",
        "rcfilters-filter-categorization-description": "Записи о страницама додатим или уклоњеним из категорија.",
        "rcfilters-filter-logactions-label": "Радње забележене у дневницима",
-       "rcfilters-filter-logactions-description": "Административне акције, стварање налога, брисање страница, отпремања…",
+       "rcfilters-filter-logactions-description": "Административне радње, стварање налога, брисање страница, отпремања…",
        "rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
        "rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
        "img-auth-nologinnWL": "Нисте пријављени и „$1” није на списку дозвољених.",
        "img-auth-nofile": "Датотека „$1“ не постоји.",
        "img-auth-isdir": "Покушавате да приступите фасцикли „$1“.\nДозвољен је само приступ датотекама.",
-       "img-auth-streaming": "Учитавање „$1“.",
+       "img-auth-streaming": "Учитавам „$1“...",
        "img-auth-public": "Сврха img_auth.php је да прослеђује датотеке из приватних викија.\nОвај вики је постављен као јавни.\nРади сигурности, img_auth.php је онемогућен.",
        "img-auth-noread": "Корисник нема приступ за читање „$1“.",
        "http-invalid-url": "Неисправна адреса: $1",
        "nopagetext": "Тражена страница не постоји.",
        "pager-newer-n": "{{PLURAL:$1|новији 1|новија $1|новијих $1}}",
        "pager-older-n": "{{PLURAL:$1|старији 1|старија $1|старијих $1}}",
-       "suppress": "РевизиÑ\98а",
+       "suppress": "Ð\98змена",
        "querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
        "apihelp": "API помоћ",
        "apihelp-no-such-module": "Модул „$1“ није пронађен.",
        "apisandbox-submit": "Пошаљи захтев",
        "apisandbox-reset": "Очисти",
        "apisandbox-retry": "Покушај поново",
-       "apisandbox-loading": "Учитавање информација за API модул \"$1\"",
+       "apisandbox-loading": "Учитавам информације за API модул „$1”...",
        "apisandbox-load-error": "Дошло је до грешке приликом учитавања информација за API модул \"$1\": $2",
        "apisandbox-no-parameters": "Овај API модул нема параметре.",
        "apisandbox-helpurls": "Линкови за помоћ",
        "block": "Блокирај корисника",
        "unblock": "Деблокирање корисника",
        "blockip": "Блокирај {{GENDER:$1|корисника|корисницу}}",
-       "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене ИП адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге ИП адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.",
+       "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене IP адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге IP адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.",
        "ipaddressorusername": "ИП адреса или корисничко име:",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор",
        "ipb-change-block": "Поново блокирај корисника с овим поставкама",
        "ipb-confirm": "Потврди блокирање",
-       "badipaddress": "Неисправна ИП адреса",
+       "badipaddress": "Неисправна IP адреса",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
        "ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
index 0d3990f..0143b9f 100644 (file)
        "upload-disallowed-here": "Du kan inte skriva över denna fil.",
        "filerevert": "Återställ $1",
        "filerevert-legend": "Återställ fil",
-       "filerevert-intro": "Du återställer '''[[Media:$1|$1]]''' till [$4 versionen från $2 kl. $3].",
+       "filerevert-intro": "Du håller på att återställa filen <strong>[[Media:$1|$1]]</strong> till [$4 versionen från $2 kl. $3].",
        "filerevert-comment": "Anledning:",
        "filerevert-defaultcomment": "Återställd till versionen från $1, kl. $2 ($3)",
        "filerevert-submit": "Återställ",
        "restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
        "restrictionsfield-label": "Tillåtna IP-intervall:",
        "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "edit-error-short": "Fel: $1",
+       "edit-error-long": "Fel:\n\n$1",
        "revid": "sidversion $1",
        "pageid": "sid-ID $1",
        "rawhtml-notallowed": "&lt;html&gt;-taggar kan inte användas utanför normala sidor.",
index 3f8243f..9ba7104 100644 (file)
        "grant-group-watchlist-interaction": "โต้ตอบกับรายการเฝ้าดูของคุณ",
        "grant-group-email": "ส่งอีเมล",
        "grant-group-customization": "การปรับแต่งและการตั้งค่า",
+       "grant-group-administration": "ดำเนินปฏิบัติการบริหาร",
        "grant-group-private-information": "เข้าถึงข้อมูลส่วนตัวเกี่ยวกับตัวคุณ",
        "grant-group-other": "กิจกรรมเบ็ดเตล็ด",
        "grant-blockusers": "บล็อกและปลดบล็อกผู้ใช้ต่าง ๆ",
        "rcfilters-activefilters": "ตัวกรองที่ทำงาน",
        "rcfilters-advancedfilters": "ตัวกรองขั้นสูง",
        "rcfilters-limit-title": "ผลลัพธ์ที่แสดง",
-       "rcfilters-limit-and-date-label": "$1 การเปลี่ยนแปลง $2",
+       "rcfilters-limit-and-date-label": "$1 การเปลี่ยนแปลง, $2",
        "rcfilters-date-popup-title": "ระยะเวลาที่ค้นหา",
        "rcfilters-days-title": "วันล่าสุด",
        "rcfilters-hours-title": "ชั่วโมงล่าสุด",
        "rcfilters-preference-help": "ย้อนกลับการออกแบบอินเตอร์เฟซใหม่ปี 2560 และอุปกรณ์ทั้งหมดที่เพิ่มเข้ามาหลังจากนั้น",
        "rcfilters-filter-showlinkedfrom-label": "แสดงการเปลี่ยนแปลงในหน้าที่ลิงก์มาจาก",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>หน้าที่ลิงก์มา</strong>จากหน้าที่เลือก",
-       "rcfilters-filter-showlinkedto-label": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cมา",
+       "rcfilters-filter-showlinkedto-label": "à¹\81สà¸\94à¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\97ีà¹\88ลิà¸\87à¸\81à¹\8cà¹\84à¸\9b",
        "rcfilters-filter-showlinkedto-option-label": "<strong>หน้าที่ลิงก์ไป</strong>หน้าที่เลือก",
        "rcfilters-target-page-placeholder": "กรอกชื่อหน้า (หรือหมวดหมู่)",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
        "backend-fail-notexists": "ไม่มีไฟล์ $1",
        "backend-fail-hashes": "ไม่สามารถดึง hash ของไฟล์ เพื่อใช้เปรียบเทียบ",
        "backend-fail-delete": "ไม่สามารถลบไฟล์ \"$1\"",
-       "backend-fail-describe": "ไม่สามารถเปลี่ยน metadata ของไฟล์ \"$1\"",
+       "backend-fail-describe": "ไม่สามารถเปลี่ยนข้อมูลอภิพันธุ์ของไฟล์ \"$1\"",
        "backend-fail-alreadyexists": "มีไฟล์ \"$1\" อยู่แล้ว",
        "backend-fail-store": "ไม่สามารถเก็บไฟล์ \"$1\" ที่ \"$2\" ได้",
        "backend-fail-copy": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปยัง \"$2\" ได้",
        "sunday-at": "วันอาทิตย์เมื่อ $1 น.",
        "yesterday-at": "เมื่อวานเมื่อ $1 น.",
        "bad_image_list": "รูปแบบแสดงต่อไปนี้:\n\nเฉพาะรายการที่แสดง (ในแถวขึ้นต้นด้วย *) โดยลิงก์แรกของแต่ละแถวเป็นลิงก์ไปยังภาพที่เสีย\nโดยลิงก์ถัดไปเป็นข้อยกเว้น เช่น บทความที่ภาพถูกจัดในบรรทัดเดียวกับส่วนข้อความ",
-       "metadata": "à¸\82à¹\89อมูลà¹\81à¸\99à¸\9a",
+       "metadata": "à¸\82à¹\89อมูลอภิà¸\9eัà¸\99à¸\98ุà¹\8c",
        "metadata-help": "ไฟล์นี้มีสารสนเทศเพิ่มเติม อาจเพิ่มจากกล้องถ่ายรูปดิจิทัลหรือสแกนเนอร์ที่ใช้เพื่อสร้างหรือแปลงภาพเป็นดิจิทัล\nหากไฟล์นี้ถูกดัดแปรจากสถานะต้นฉบับ รายละเอียดบางอย่างอาจไม่สะท้อนไฟล์ที่ถูกดัดแปลอย่างสมบูรณ์",
        "metadata-expand": "แสดงรายละเอียดขยาย",
        "metadata-collapse": "ซ่อนรายละเอียดขยาย",
-       "metadata-fields": "à¹\80à¸\82à¸\95à¸\82à¹\89อมูลà¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\82อà¸\87ภาà¸\9eà¸\94ัà¸\87à¸\97ีà¹\88à¹\81สà¸\94à¸\87รายà¸\81ารà¹\84วà¹\89à¹\83à¸\99à¸\82à¹\89อà¸\84วามà¸\99ีà¹\89 à¸\88ะà¸\96ูà¸\81รวมà¸\9aà¸\99หà¸\99à¹\89าภาà¸\9eà¹\80มืà¹\88อà¸\95าราà¸\87à¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\96ูà¸\81ยุà¸\9a เขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "à¹\80à¸\82à¸\95à¸\82à¹\89อมูลà¸\82à¹\89อมูลอภิà¸\9eัà¸\99à¸\98ุà¹\8cà¸\82อà¸\87ภาà¸\9eà¸\94ัà¸\87à¸\97ีà¹\88à¹\81สà¸\94à¸\87รายà¸\81ารà¹\84วà¹\89à¹\83à¸\99à¸\82à¹\89อà¸\84วามà¸\99ีà¹\89 à¸\88ะà¸\96ูà¸\81รวมà¸\9aà¸\99หà¸\99à¹\89าภาà¸\9eà¹\80มืà¹\88อà¸\95าราà¸\87à¸\82à¹\89อมูลอภิà¸\9eัà¸\99à¸\98ุà¹\8cà¸\96ูà¸\81ยุà¸\9a \nเขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "ความกว้าง",
        "exif-imagelength": "ความสูง",
        "exif-bitspersample": "บิตต่อคอมโพเนนต์",
        "version-version": "($1)",
        "version-no-ext-name": "[ไม่มีชื่อ]",
        "version-license": "สัญญาอนุญาตมีเดียวิกิ",
+       "version-ext-license": "ใบอนุญาต",
+       "version-ext-colheader-name": "ส่วนขยาย",
+       "version-skin-colheader-name": "สกิน",
+       "version-ext-colheader-version": "รุ่น",
+       "version-ext-colheader-license": "ใบอนุญาต",
+       "version-ext-colheader-description": "คำอธิบาย",
+       "version-ext-colheader-credits": "ผู้ประพันธ์",
+       "version-license-title": "ใบอนุญาตสำหรับ $1",
+       "version-license-not-found": "ไม่พบสารสนเทศใบอนุญาตลงรายละเอียดสำหรับส่วนขยายนี้",
+       "version-credits-title": "ข้อความให้เกียรติเจ้าของงานสำหรับ $1",
+       "version-credits-not-found": "ไม่พบสารสนเทศข้อความให้เกียรติเจ้าของงานลงรายละเอียดสำหรับส่วนขยายนี้",
        "version-poweredby-credits": "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
        "version-poweredby-others": "ผู้อื่น",
        "version-poweredby-translators": "ผู้แปล translatewiki.net",
-       "version-license-info": "มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่เผยแพร่โดยมูลนิธิซอฟต์แวร์เสรี ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาต หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)\n\nมีเดียวิกิมีถูกแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่ไม่มีการรับประกันใด ๆ ทั้งสิ้น ไม่มีแม้การรับประกันโดยนัยเพื่อการค้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู\n\nคุณควรได้รับ[{{SERVER}}{{SCRIPTPATH}}/COPYING สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของกนู]พร้อมกับโปรแกรมนี้ หากไม่พบ กรุณาเขียนจดหมายถึงบริษัทมูลนิธิซอฟต์แวร์เสรี ที่อยู่ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA หรือ[//www.gnu.org/licenses/old-licenses/gpl-2.0.html อ่านออนไลน์]",
+       "version-credits-summary": "เราใคร่ขอตระหนักถึงบุคคลเหล่านี้สำหรับการเข้ามีส่วนร่วมต่อ[[Special:Version|มีเดียวิกิ]]",
+       "version-license-info": "มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่มูลนิธิซอฟต์แวร์เสรีเผยแพร่ ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาตฯ หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)\n\nมีเดียวิกิแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่<em>ไม่มีการรับประกันใด ๆ ทั้งสิ้น</em> ไม่มีแม้คำรับรองแสดงเจตนาเป็นนัยเพื่อ<strong>การค้า</strong>หรือ<strong>ความเหมาะสมสำหรับความมุ่งหมายเฉพาะ</strong> ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู\n\nคุณควรได้รับ[{{SERVER}}{{SCRIPTPATH}}/COPYING สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของกนู]พร้อมกับโปรแกรมนี้ หากไม่พบ กรุณาเขียนถึงบริษัทมูลนิธิซอฟต์แวร์เสรี จำกัด ที่อยู่ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA หรือ[//www.gnu.org/licenses/old-licenses/gpl-2.0.html อ่านออนไลน์]",
        "version-software": "ซอฟต์แวร์ที่ติดตั้ง",
        "version-software-product": "ผลิตภัณฑ์",
        "version-software-version": "รุ่น",
+       "version-entrypoints": "ยูอาร์แอลจุดเข้า",
+       "version-entrypoints-header-entrypoint": "จุดเข้า",
+       "version-entrypoints-header-url": "ยูอาร์แอล",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath เส้นทางบทความ]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath เส้นทางสคริปต์]",
+       "version-libraries": "คลังที่ติดตั้ง",
+       "version-libraries-library": "คลัง",
+       "version-libraries-version": "รุ่น",
+       "version-libraries-license": "ใบอนุญาต",
+       "version-libraries-description": "คำอธิบาย",
+       "version-libraries-authors": "ผู้ประพันธ์",
        "redirect": "การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้ หน้า รุ่นหรือปูม",
        "redirect-summary": "หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่นหรือรหัสหน้า) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้ตัวเลข) การใช้งาน: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] หรือ [[{{#Special:Redirect}}/logid/186]]",
        "redirect-submit": "ไป",
index bebeb34..8269f94 100644 (file)
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
        "date-range-from": "Mula sa petsang:",
        "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina",
+       "edit-error-long": "Mga kamalian:",
        "gotointerwiki-invalid": "Di-wasto ang tinukoy na pamagat."
 }
index 6c5f5bb..aaf61f6 100644 (file)
        "tag-filter": "[[Special:Tags|Etiket]] süzgeci:",
        "tag-filter-submit": "Süzgeç",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiket|Etiketler}}]]: $2)",
+       "tag-mw-new-redirect": "Yeni yönlendirme",
+       "tag-mw-removed-redirect": "Yönlendirme kaldırıldı",
+       "tag-mw-changed-redirect-target": "Yönlendirme hedefi değiştirildi",
        "tags-title": "Etiketler",
        "tags-intro": "Bu sayfa, yazılımın bir değişikliği işaretleyebileceği etiketleri ve bunların anlamlarını listeler.",
        "tags-tag": "Etiket adı",
index 19e6ab2..d40a8d8 100644 (file)
        "nolicense": "Відсутнє",
        "licenses-edit": "Редагувати параметри ліцензії",
        "license-nopreview": "(Попередній перегляд недоступний)",
-       "upload_source_url": "(введіть правильну, публічно доступну інтернет-адресу)",
-       "upload_source_file": " (файл на вашому комп'ютері)",
+       "upload_source_url": "(файл, розміщений за правильною, публічно доступною інтернет-адресою)",
+       "upload_source_file": "(файл на вашому комп'ютері)",
        "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
        "listfiles_search_for": "Пошук по назві зображення:",
        "pageswithprop-legend": "Сторінки з перевизначеними властивостями",
        "pageswithprop-text": "Тут перераховані сторінки, у яких були вручну перевизначені окремі властивості.",
        "pageswithprop-prop": "Назва властивості:",
-       "pageswithprop-reverse": "Сортувати у зворотньому порядку",
+       "pageswithprop-reverse": "Сортувати у зворотному порядку",
        "pageswithprop-sortbyvalue": "Сортувати за значенням властивості",
        "pageswithprop-submit": "Перейти",
        "pageswithprop-prophidden-long": "довге значення текстової властивості приховано ($1)",
        "restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
        "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Помилка: $1",
+       "edit-error-long": "Помилки:\n\n$1",
        "revid": "версія $1",
        "pageid": "ID сторінки $1",
        "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок.",
index 3e23dbb..676233c 100644 (file)
@@ -34,7 +34,8 @@
                        "Abuaneeqa",
                        "Saraiki",
                        "BukhariSaeed",
-                       "Zainab Meher"
+                       "Zainab Meher",
+                       "Sayam Asjad"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "mergehistory-fail-no-change": "ضم تاریخچہ نے کسی بھی نسخے کو ضم نہیں کیا۔ براہ کرم صفحہ اور وقت کے پیرامیٹر کو دوبارہ جانچ لیں۔",
        "mergehistory-fail-permission": "ناکافی اختیارات برائے ضم تاریخچہ۔",
        "mergehistory-fail-self-merge": "ماخذ و مقصود صفحات یکساں ہیں۔",
+       "mergehistory-fail-timestamps-overlap": "ماخذ کی نظر ثانیوں کی منزل پر نظر ثانی کرنے کے بعد اوورپپ.",
        "mergehistory-fail-toobig": "تاریخچے کو ضم نہیں کیا جا سکتا، کیونکہ {{PLURAL:$1|نسخے|نسخوں}} کی مقررہ حد  $1 سے تجاوز کرنا ہوگا۔",
        "mergehistory-no-source": "مآخذ صفحہ $1 موجود نہیں.",
        "mergehistory-no-destination": "مقصود صفحہ $1 موجود نہیں.",
        "userrights-editusergroup": "حلقہ ہائے {{GENDER:$1|صارف}} میں ترمیم کریں",
        "userrights-viewusergroup": "جائزہ {{GENDER:$1|صارف}} گروہان",
        "saveusergroups": "حلقہ ہائے {{GENDER:$1|صارف}} کو محفوظ کریں",
-       "userrights-groupsmember": "رکنِ:",
-       "userrights-groupsmember-auto": "اعتبارÛ\8c ØµØ§Ø±Ù\81 Ø¯Ø±",
+       "userrights-groupsmember": "رکن:",
+       "userrights-groupsmember-auto": "ضÙ\85Ù\86Û\8c Ø±Ú©Ù\86:",
        "userrights-groups-help": "آپ ان حلقوں میں تبدیلی کرسکتے ہیں جن سے صارف متعلق ہے: \n* نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے ہے۔ \n* غیر نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے نہیں ہے۔ \n* یہ # علامت اس بات کا اشارہ ہے کہ آپ اس گروہ کو نہیں ہٹا سکتے جسے ایک مرتبہ آپ نے شامل کردیا ہو۔",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
        "userrights-expiry-options": "1 دن:1 day,1 ہفتہ:1 week,1 مہینہ:1 month,3 مہینے:3 months,6 مہینے:6 months,1 سال:1 year",
        "userrights-invalid-expiry": "گروہ «$1» کا وقت اختتام درست نہیں ہے۔",
        "userrights-expiry-in-past": "گروہ «$1» کا وقت اختتام بیت چکا ہے۔",
+       "userrights-cannot-shorten-expiry": "آپ \"$1\" گروپ میں رکنیت ختم کرنے کے لۓ آگے بڑھا سکتے ہیں. صرف اس صارف کو اس گروہ کو شامل کرنے اور ہٹانے کی اجازت کے لۓ اختتامی وقت آگے بڑھا سکتا ہے.",
        "userrights-conflict": "اختیارات کی تبدیلی میں تنازع! براہ کرم نظر ثانی کریں اور اپنی تبدیلیوں کی تصدیق کریں۔",
        "group": "حلقہ:",
        "group-user": "صارفین",
        "rcfilters-preference-help": "سنہ 2017ء کے انٹرفیس کو واپس لایا گیا ہے اور تمام آلات کو شامل کیا گیا ہے۔",
        "rcfilters-filter-showlinkedfrom-label": "سے منسلک صفحات پر تبدیلیاں دکھائیں",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>صفحات سے منسلک</strong> چنندہ صفحہ",
+       "rcfilters-filter-showlinkedto-label": "صفحات",
+       "rcfilters-filter-showlinkedto-option-label": "منتخب کردہ صفحہ <strong> صفحات سے منسلک صفحات </ strong>",
        "rcfilters-target-page-placeholder": "ایک صفحہ کا نام (یا زمرہ) درج کریں",
        "rcnotefrom": "ذیل میں <strong>$2</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
        "rclistfromreset": "انتخاب تاریخ کی ترتیب نو",
        "upload-scripted-dtd": "SVG فائل کو اپلوڈ نہیں کیا جاسکتا جس ميں ایک غیر معیاری DTD کا اظہار ہو۔",
        "uploaded-script-svg": "اپلوڈ کردہ SVG فائل میں scriptable عنصر \"$1\" ملا۔",
        "uploaded-hostile-svg": "اپلوڈ کردہ ایس وی جی فائل کے اسٹائل عنصر میں غیر محفوظ سی ایس ایس دریافت ہوئی ہے۔",
+       "uploaded-event-handler-on-svg": "ایونٹ ہینڈلر صفات <code> $1 = \"$2\" </code> کو ترتیب دینے کی اجازت نہیں ہے کہ SVG فائلوں میں.",
+       "uploaded-setting-href-svg": "والدین \"عنصر\" ٹیگ کا استعمال کرتے ہوئے \"href\" شامل کرنے کے لئے والدین عنصر کو منسوب کیا جاتا ہے.",
        "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"<nowiki>$1</nowiki>\" موجود ہے۔",
        "uploadinvalidxml": "اپلوڈ کردہ فائل میں موجود ایکس ایم ایل کا تجزیہ نہیں کیا جا سکا۔",
        "uploadvirus": "اس فائل میں وائرس موجود ہے!\nتفصیلات: $1",
        "backend-fail-maxsize": "فائل $1 کی معلومات نہیں لکھی جا سکی کیونکہ اس کا حجم {{PLURAL:$2|ایک بائٹ|$2 بائٹ}} سے زیادہ ہے۔",
        "backend-fail-readonly": "فی الحال ذخیرہ کا پس منظر $1 فقط خواندگی حالت میں ہے۔ اس کی وجہ حسب ذیل ہے:\n\n\n<em>«$2»</em>",
        "backend-fail-synced": "اس وقت فائل $1 داخلی ذخیرہ کے پس منظر کے اندر ناپائیدار حالت میں ہے۔",
+       "filejournal-fail-dbconnect": "\"$1\" اسٹوریج بیک اپ کے لئے جرنل ڈیٹا بیس سے منسلک نہیں ہوسکتا.",
+       "filejournal-fail-dbquery": "\"$1\" اسٹوریج بیک اپ کے لئے جرنل ڈیٹا بیس کو اپ ڈیٹ نہیں کیا جا سکا.",
        "lockmanager-notlocked": "«$1» کو کھولا نہیں جا سکا؛ کیونکہ یہ مقفل نہیں ہے۔",
        "lockmanager-fail-closelock": "«$1» کا فائل لاک بند نہیں کیا جا سکا۔",
        "lockmanager-fail-deletelock": "«$1» کا فائل لاک حذف نہیں کیا جا سکا۔",
        "lockmanager-fail-acquirelock": "«$1» کا قفل حاصل نہیں کیا جا سکا۔",
        "lockmanager-fail-openlock": "«$1» کا فائل لاک کھولا نہیں جا سکا۔",
        "lockmanager-fail-releaselock": "«$1» کا قفل کھولا نہ جا سکا۔",
+       "lockmanager-fail-db-bucket": "$1 بالٹی میں کافی تالا ڈیٹا بیس سے رابطہ نہیں کیا جا سکا.",
        "lockmanager-fail-db-release": "$1 ڈیٹابیس سے قفل نہیں ہٹائے جا سکے۔",
        "lockmanager-fail-svr-acquire": "$1 سرور کے قفل حاصل نہیں کیے جا سکے۔",
        "lockmanager-fail-svr-release": "$1 سرور کے قفل ہٹائے نہیں جا سکے۔",
        "zip-file-open-error": "مواد کی جانچ کے لیے زپ فائل کھولنے کے دوران میں کوئی نقص واقع ہوا۔",
        "zip-wrong-format": "یہ زپ فائل نہیں تھی۔",
+       "zip-bad": "فائل ایک بدعنوانی یا دوسری صورت میں غیر قابل رسائی زپ فائل ہے.\nیہ سیکورٹی کیلئے مناسب طریقے سے جانچ نہیں کیا جا سکتا.",
        "uploadstash": "پوشیدہ اپلوڈ کریں",
        "uploadstash-summary": "اس صفحہ کے ذریعہ ان فائلوں تک رسائی حاصل ہوگی جو اپلوڈ ہو چکی ہیں یا ہو رہی ہیں لیکن اب تک ویکی پر شائع نہیں ہوئیں۔ یہ فائلیں محض اپلوڈ کنندہ صارفین ہی کو نظر آتی ہیں۔",
        "uploadstash-clear": "پوشیدہ فائلوں کو صاف کریں",
        "uploadstash-bad-path-invalid": "راہ درست نہیں ہے۔",
        "uploadstash-bad-path-unknown-type": "نامعلوم قسم \"$1\"",
        "uploadstash-bad-path-unrecognized-thumb-name": "غیر معروف نام تصغیر",
+       "uploadstash-file-not-found": "اسکرین میں کلیدی \"$1\" نہیں مل سکا.",
+       "uploadstash-file-not-found-missing-content-type": "لاپتہ مواد کی قسم ہیڈر.",
        "uploadstash-no-extension": "توسیع نہیں ہے۔",
        "uploadstash-zero-length": "فائل کا طول صفر ہے۔",
        "invalid-chunk-offset": "آفسیٹ کا قطعہ نادرست ہے",
        "pageswithprop-legend": "صفحات مع خاصیت صفحہ",
        "pageswithprop-text": "اس صفحہ میں ان تمام صفحات کی فہرست موجود ہے جس کسی مخصوص خاصیت صفحہ کو استعمال کر رہے ہیں۔",
        "pageswithprop-prop": "نام خاصیت:",
+       "pageswithprop-reverse": "ریورس آرڈر میں ترتیب دیں",
+       "pageswithprop-sortbyvalue": "پراپرٹی کی قیمت کی طرف سے ترتیب دیں",
        "pageswithprop-submit": "ٹھیک",
        "pageswithprop-prophidden-long": "طویل متن کی خاصیت کی پوشیدہ قدر ($1)",
        "pageswithprop-prophidden-binary": "ثنائی خاصیت کی پوشیدہ قدر ($1)",
        "apisandbox-sending-request": "اے پی آئی درخواست بھیجی جا رہی ہے۔۔۔",
        "apisandbox-loading-results": "اے پی آئی کے نتائج موصول ہو رہے ہیں۔۔۔",
        "apisandbox-results-error": "اے پی آئی کوئری کا جواب لوڈ ہونے کے دوران میں نقص واقع ہوا: $1",
+       "apisandbox-request-selectformat-label": "درخواست کے اعداد و شمار کے طور پر دکھائیں:",
        "apisandbox-request-url-label": "درخواست کا ربط:",
        "apisandbox-request-json-label": "JSON درخواست:",
        "apisandbox-request-time": "درخواست کا وقت: {{PLURAL:$1|$1 ملی سیکنڈ}}",
index 9d344ff..ab931ff 100644 (file)
        "restrictionsfield-badip": "Địa chỉ hoặc dải IP không hợp lệ: $1.",
        "restrictionsfield-label": "Các dải IP được cho phép:",
        "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "Lỗi: $1",
+       "edit-error-long": "Lỗi:\n\n$1",
        "revid": "phiên bản $1",
        "pageid": "số trang $1",
        "rawhtml-notallowed": "Không thể sử dụng thẻ &lt;html&gt; bên ngoài trang bình thường.",
index 6651194..ed42790 100644 (file)
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "randomrootpage": "Ojúewé ìtẹ́dìí àrìnàkò"
+       "randomrootpage": "Ojúewé ìtẹ́dìí àrìnàkò",
+       "edit-error-short": "Àṣìṣe: $1",
+       "edit-error-long": "Àwọn àsìṣe:\n\n\n$1"
 }
index b45b3bb..dfcb1a3 100644 (file)
        "resetpass-validity-soft": "您的密码无效:$1\n\n请选择一个新密码,或单击“{{int:authprovider-resetpass-skip-label}}”以稍后重置。",
        "passwordreset": "重置密码",
        "passwordreset-text-one": "请完成此表单来通过电子邮件接收临时密码。",
-       "passwordreset-text-many": "{{PLURAL:$1|å\9c¨æ­¤é\94®å\85¥æ\82¨å¸\8cæ\9c\9bæ\8e¥æ\94¶ä¸´æ\97¶å¯\86ç \81ç\9a\84é\82®ä»¶å\9c°å\9d\80。}}",
+       "passwordreset-text-many": "{{PLURAL:$1|å¡«å\86\99å\85¶ä¸­ä¸\80个å­\97段以é\80\9aè¿\87ç\94µå­\90é\82®ä»¶æ\8e¥æ\94¶ä¸´æ\97¶å¯\86ç \81。}}",
        "passwordreset-disabled": "此Wiki已经禁用密码重置。",
        "passwordreset-emaildisabled": "此Wiki上无法使用邮件功能。",
        "passwordreset-username": "用户名:",
        "doubleredirects": "双重重定向",
        "doubleredirectstext": "本页面列出重定向至其他重定向页面的页面。每行含有第一及第二重定向的链接和第二重定向的目标(这通常是第一重定向应该指向的“实际”目标页面)。<del>带删除线的</del>条目已经被解决。",
        "double-redirect-fixed-move": "[[$1]]已被移动。它已自动更新,并且现在重定向至[[$2]]。",
-       "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]",
+       "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]",
        "double-redirect-fixer": "重定向修复器",
        "brokenredirects": "受损重定向",
        "brokenredirectstext": "以下重定向链接至不存在的页面:",
        "restrictionsfield-badip": "无效的IP地址或段:$1",
        "restrictionsfield-label": "允许的IP段:",
        "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "错误:$1",
+       "edit-error-long": "错误:\n\n$1",
        "revid": "修订版本$1",
        "pageid": "页面ID$1",
        "rawhtml-notallowed": "&lt;html&gt;标签不能在一般页面以外使用。",
index 6f36d5c..d5c8ce1 100644 (file)
        "resetpass-validity-soft": "您的密碼無效:$1 \n\n請現在設定您的新密碼,或點選 \"{{int:authprovider-resetpass-skip-label}}\" 稍後再重設。",
        "passwordreset": "重新設定密碼",
        "passwordreset-text-one": "完成此表單,透過電子郵件傳送臨時密碼以重新設定您的密碼。",
-       "passwordreset-text-many": "{{PLURAL:$1|請完成此表單以透過電子郵件接收臨時密碼。}}",
+       "passwordreset-text-many": "{{PLURAL:$1|填寫其中一個欄位以透過電子郵件接收臨時密碼。}}",
        "passwordreset-disabled": "此 Wiki 已停用重設密碼。",
        "passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
        "passwordreset-username": "使用者名稱:",
        "doubleredirects": "雙重的重新導向",
        "doubleredirectstext": "此頁列出重新導向至另一個重新導向頁面的頁面。每一列都包含第一次和第二次重新導向頁面的連結,以及第二次重新導向之後的目標,第二次重新導向之後的目標通常是「實際」的目標頁面,也是第一個重新導向頁面應該指向的頁面。\n<del>刪節線</del> 代表該項目的問題已經解決。",
        "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
-       "double-redirect-fixed-maintenance": "在維護作業時自動修正雙重的重新導向自 [[$1]] 至 [[$2]]",
+       "double-redirect-fixed-maintenance": "在維護作業時自動修正雙重的重新導向自 [[$1]] 至 [[$2]]",
        "double-redirect-fixer": "重新導向修正者",
        "brokenredirects": "損壞的重新導向",
        "brokenredirectstext": "以下的重新導向頁面連結的頁面不存在:",
        "checkbox-none": "無",
        "checkbox-invert": "反向選擇",
        "allpages": "所有頁面",
-       "nextpage": "下一頁 ($1)",
-       "prevpage": "上一頁 ($1)",
+       "nextpage": "下一頁($1)",
+       "prevpage": "上一頁($1)",
        "allpagesfrom": "顯示頁面開始於:",
        "allpagesto": "顯示頁面結束於:",
        "allarticles": "所有頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
-       "whatlinkshere-filters": "搜尋",
+       "whatlinkshere-filters": "篩選器",
        "whatlinkshere-submit": "前往",
        "autoblockid": "自動封鎖 #$1",
        "block": "封鎖使用者",
        "allmessagescurrent": "目前的訊息文字",
        "allmessagestext": "此處列出所有在 MediaWiki 命名空間中系統訊息。\n若您想參與官方的 MediaWiki 在地化,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki 在地化] 與 [https://translatewiki.net translatewiki.net]。",
        "allmessagesnotsupportedDB": "已停用 <strong>$wgUseDatabaseMessages</strong> 設定,無法使用此頁面。",
-       "allmessages-filter-legend": "搜尋",
+       "allmessages-filter-legend": "篩選",
        "allmessages-filter": "依修改狀況搜尋:",
        "allmessages-filter-unmodified": "未修改",
        "allmessages-filter-all": "全部",
        "newimages": "新檔圖庫",
        "imagelisttext": "以下為 <strong>$1</strong> 清單,$2 排序。",
        "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
-       "newimages-legend": "搜尋",
+       "newimages-legend": "篩選",
        "newimages-label": "檔案名稱 (或部份檔名):",
        "newimages-user": "IP 位址或使用者名稱",
        "newimages-newbies": "僅顯示新帳號的貢獻",
        "external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
-       "tag-filter-submit": "搜尋",
+       "tag-filter-submit": "篩選器",
        "tag-list-wrapper": "([[Special:Tags|$1 個標籤]]:$2)",
        "tag-mw-contentmodelchange": "內容模型變更",
        "tag-mw-contentmodelchange-description": "編輯 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel 更改頁面的內容模型]。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
        "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
+       "edit-error-short": "錯誤:$1",
+       "edit-error-long": "錯誤:\n\n$1",
        "revid": "修訂 $1",
        "pageid": "頁面 ID $1",
        "rawhtml-notallowed": "&lt;html&gt; 標籤無法在一般頁面之外使用。",
index 751a131..9c1093b 100644 (file)
@@ -93,4 +93,4 @@ class SevenZipStream {
        }
 }
 
-stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' );
+stream_wrapper_register( 'mediawiki.compress.7z', SevenZipStream::class );
index 861a613..527e6cb 100644 (file)
@@ -182,7 +182,7 @@ abstract class Maintenance {
                if ( $count < 2 ) {
                        return false; // sanity
                }
-               if ( $bt[0]['class'] !== 'Maintenance' || $bt[0]['function'] !== 'shouldExecute' ) {
+               if ( $bt[0]['class'] !== self::class || $bt[0]['function'] !== 'shouldExecute' ) {
                        return false; // last call should be to this function
                }
                $includeFuncs = [ 'require_once', 'require', 'include', 'include_once' ];
@@ -414,7 +414,10 @@ abstract class Maintenance {
                        $this->fatalError( $err, intval( $die ) );
                }
                $this->outputChanneled( false );
-               if ( PHP_SAPI == 'cli' || PHP_SAPI == 'phpdbg' ) {
+               if (
+                       ( PHP_SAPI == 'cli' || PHP_SAPI == 'phpdbg' ) &&
+                       !defined( 'MW_PHPUNIT_TEST' )
+               ) {
                        fwrite( STDERR, $err . "\n" );
                } else {
                        print $err;
@@ -1207,6 +1210,9 @@ abstract class Maintenance {
                                "must exist and be readable in the source directory.\n" .
                                "Use --conf to specify it." );
                }
+               if ( isset( $this->mOptions['server'] ) ) {
+                       $_SERVER['SERVER_NAME'] = $this->mOptions['server'];
+               }
                $wgCommandLineMode = true;
 
                return $settingsFile;
index b21bfbb..409afb5 100644 (file)
@@ -91,5 +91,5 @@ class AddRFCAndPMIDInterwiki extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = 'AddRFCAndPMIDInterwiki';
+$maintClass = AddRFCAndPMIDInterwiki::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 04158ae..4953343 100644 (file)
@@ -88,5 +88,5 @@ class AddSite extends Maintenance {
        }
 }
 
-$maintClass = 'AddSite';
+$maintClass = AddSite::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 36060d8..897972c 100644 (file)
@@ -88,5 +88,5 @@ class AttachLatest extends Maintenance {
        }
 }
 
-$maintClass = "AttachLatest";
+$maintClass = AttachLatest::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 00dbd00..ffc75c6 100644 (file)
@@ -82,15 +82,15 @@ class BackupDumper extends Maintenance {
                $this->stderr = fopen( "php://stderr", "wt" );
 
                // Built-in output and filter plugins
-               $this->registerOutput( 'file', 'DumpFileOutput' );
-               $this->registerOutput( 'gzip', 'DumpGZipOutput' );
-               $this->registerOutput( 'bzip2', 'DumpBZip2Output' );
-               $this->registerOutput( 'dbzip2', 'DumpDBZip2Output' );
-               $this->registerOutput( '7zip', 'Dump7ZipOutput' );
-
-               $this->registerFilter( 'latest', 'DumpLatestFilter' );
-               $this->registerFilter( 'notalk', 'DumpNotalkFilter' );
-               $this->registerFilter( 'namespace', 'DumpNamespaceFilter' );
+               $this->registerOutput( 'file', DumpFileOutput::class );
+               $this->registerOutput( 'gzip', DumpGZipOutput::class );
+               $this->registerOutput( 'bzip2', DumpBZip2Output::class );
+               $this->registerOutput( 'dbzip2', DumpDBZip2Output::class );
+               $this->registerOutput( '7zip', Dump7ZipOutput::class );
+
+               $this->registerFilter( 'latest', DumpLatestFilter::class );
+               $this->registerFilter( 'notalk', DumpNotalkFilter::class );
+               $this->registerFilter( 'namespace', DumpNamespaceFilter::class );
 
                // These three can be specified multiple times
                $this->addOption( 'plugin', 'Load a dump plugin class. Specify as <class>[:<file>].',
diff --git a/maintenance/benchmarks/README b/maintenance/benchmarks/README
deleted file mode 100644 (file)
index 27da9de..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-This directory hold several benchmarking scripts used as a proof of speed
-or to track PHP performances over time.
-
-To get somehow accurate result, you might want to bound the PHP process
-to a specific CPU with `taskset` and raise its priority with `nice`. Example:
-
- $ taskset 1 nice -n-10 php bench_wfIsWindows.php
-
-australia-untidy.html.gz contains representative input text for
-benchmarkTidy.php. It needs to be decompressed before use.
diff --git a/maintenance/benchmarks/README.md b/maintenance/benchmarks/README.md
new file mode 100644 (file)
index 0000000..b411c52
--- /dev/null
@@ -0,0 +1,15 @@
+This directory hold several benchmarking scripts used track performances of
+MediaWiki and/or PHP.
+
+## Consistency
+
+On Linux, use of `taskset` and `nice` can help get more consistent results.
+
+For example:
+
+ $ taskset 1 nice -n-10 php bench_wfIsWindows.php
+
+## Fixtures
+
+* australia-untidy.html.gz: Representative input text for benchmarkTidy.php.
+  It needs to be decompressed before use.
index 0e3cd73..5e1feb7 100644 (file)
@@ -59,5 +59,5 @@ class BenchHttpHttps extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchHttpHttps';
+$maintClass = BenchHttpHttps::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 86bcc8a..f9b3a74 100644 (file)
@@ -73,5 +73,5 @@ class BenchWikimediaBaseConvert extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchWikimediaBaseConvert';
+$maintClass = BenchWikimediaBaseConvert::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0a999ec..794b743 100644 (file)
@@ -101,5 +101,5 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchmarkDeleteTruncate';
+$maintClass = BenchmarkDeleteTruncate::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 843ef7c..5f661f2 100644 (file)
@@ -106,5 +106,5 @@ class BenchIfSwitch extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchIfSwitch';
+$maintClass = BenchIfSwitch::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 55c7159..2c065f6 100644 (file)
@@ -70,5 +70,5 @@ class BenchStrtrStrReplace extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchStrtrStrReplace';
+$maintClass = BenchStrtrStrReplace::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 52b00f1..b13b863 100644 (file)
@@ -110,5 +110,5 @@ class BenchUtf8TitleCheck extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchUtf8TitleCheck';
+$maintClass = BenchUtf8TitleCheck::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 960ef0e..6943182 100644 (file)
@@ -64,5 +64,5 @@ class BenchWfIsWindows extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchWfIsWindows';
+$maintClass = BenchWfIsWindows::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3eaa88d..a7d998d 100644 (file)
@@ -52,11 +52,11 @@ class BenchmarkCSSMin extends Benchmarker {
 
                $this->bench( [
                        "minify ($filename)" => [
-                               'function' => [ 'CSSMin', 'minify' ],
+                               'function' => [ CSSMin::class, 'minify' ],
                                'args' => [ $css ]
                        ],
                        "remap ($filename)" => [
-                               'function' => [ 'CSSMin', 'remap' ],
+                               'function' => [ CSSMin::class, 'remap' ],
                                'args' => [ $css, dirname( $file ), 'https://example.org/test/', true ]
                        ],
                ] );
@@ -72,5 +72,5 @@ class BenchmarkCSSMin extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchmarkCSSMin';
+$maintClass = BenchmarkCSSMin::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index d49fa1d..0bfe039 100644 (file)
@@ -69,5 +69,5 @@ class BenchmarkHooks extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchmarkHooks';
+$maintClass = BenchmarkHooks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index fa93f23..fd66b3f 100644 (file)
@@ -58,5 +58,5 @@ class BenchmarkJSMinPlus extends Benchmarker {
        }
 }
 
-$maintClass = 'BenchmarkJSMinPlus';
+$maintClass = BenchmarkJSMinPlus::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 1541f82..6b1fcd3 100644 (file)
@@ -32,8 +32,7 @@ class BenchmarkLruHash extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Benchmarks HashBagOStuff and MapCacheLRU.' );
-               $this->addOption( 'construct', 'Run construct only', false, false );
-               $this->addOption( 'fill', 'Run fill only', false, false );
+               $this->addOption( 'method', 'One of "construct" or "set". Default: [All]', false, true );
        }
 
        public function execute() {
@@ -46,27 +45,26 @@ class BenchmarkLruHash extends Benchmarker {
                // 1000 keys (1...500, 500...1)
                $keys = array_merge( $exampleKeys, array_reverse( $exampleKeys ) );
 
-               $fill = $this->hasOption( 'fill' ) || !$this->hasOption( 'construct' );
-               $construct = $this->hasOption( 'construct' ) || !$this->hasOption( 'fill' );
+               $method = $this->getOption( 'method' );
                $benches = [];
 
-               if ( $construct ) {
-                       $benches['HashBagOStuff-construct'] = [
+               if ( !$method || $method === 'construct' ) {
+                       $benches['HashBagOStuff::__construct'] = [
                                'function' => function () use ( $max ) {
                                        $obj = new HashBagOStuff( [ 'maxKeys' => $max ] );
                                },
                        ];
-                       $benches['MapCacheLRU-construct'] = [
+                       $benches['MapCacheLRU::__construct'] = [
                                'function' => function () use ( $max ) {
                                        $obj = new MapCacheLRU( $max );
                                },
                        ];
                }
 
-               if ( $fill ) {
-                       // For the fill bechmark, ensure object creation is not measured.
+               if ( !$method || $method === 'set' ) {
+                       // For the set bechmark, do object creation in setup (not measured)
                        $hObj = null;
-                       $benches['HashBagOStuff-fill'] = [
+                       $benches['HashBagOStuff::set'] = [
                                'setup' => function () use ( &$hObj, $max ) {
                                        $hObj = new HashBagOStuff( [ 'maxKeys' => $max ] );
                                },
@@ -77,7 +75,7 @@ class BenchmarkLruHash extends Benchmarker {
                                }
                        ];
                        $mObj = null;
-                       $benches['MapCacheLRU-fill'] = [
+                       $benches['MapCacheLRU::set'] = [
                                'setup' => function () use ( &$mObj, $max ) {
                                        $mObj = new MapCacheLRU( $max );
                                },
index a613f96..3a79ad3 100644 (file)
@@ -188,5 +188,5 @@ class BenchmarkParse extends Maintenance {
        }
 }
 
-$maintClass = 'BenchmarkParse';
+$maintClass = BenchmarkParse::class;
 require RUN_MAINTENANCE_IF_MAIN;
index 8566c0b..cbab677 100644 (file)
@@ -114,5 +114,5 @@ class BenchmarkPurge extends Benchmarker {
        }
 }
 
-$maintClass = "BenchmarkPurge";
+$maintClass = BenchmarkPurge::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6698db3..f2939b3 100644 (file)
@@ -74,5 +74,5 @@ class BenchmarkTidy extends Maintenance {
        }
 }
 
-$maintClass = 'BenchmarkTidy';
+$maintClass = BenchmarkTidy::class;
 require RUN_MAINTENANCE_IF_MAIN;
index d7db321..316004b 100644 (file)
@@ -69,5 +69,5 @@ class ChangePassword extends Maintenance {
        }
 }
 
-$maintClass = "ChangePassword";
+$maintClass = ChangePassword::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6eafc96..b22432a 100644 (file)
@@ -60,5 +60,5 @@ class CheckBadRedirects extends Maintenance {
        }
 }
 
-$maintClass = "CheckBadRedirects";
+$maintClass = CheckBadRedirects::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 22f5969..69f16f5 100644 (file)
@@ -61,5 +61,5 @@ class CheckComposerLockUpToDate extends Maintenance {
        }
 }
 
-$maintClass = 'CheckComposerLockUpToDate';
+$maintClass = CheckComposerLockUpToDate::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6fe15fb..f858f03 100644 (file)
@@ -82,5 +82,5 @@ class CheckImages extends Maintenance {
        }
 }
 
-$maintClass = "CheckImages";
+$maintClass = CheckImages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8416c8a..f001236 100644 (file)
@@ -62,5 +62,5 @@ class CheckLess extends Maintenance {
        }
 }
 
-$maintClass = 'CheckLess';
+$maintClass = CheckLess::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index f29f836..6c1343a 100644 (file)
@@ -65,5 +65,5 @@ class CheckUsernames extends Maintenance {
        }
 }
 
-$maintClass = "CheckUsernames";
+$maintClass = CheckUsernames::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index add967a..bcf4af2 100644 (file)
@@ -110,5 +110,5 @@ class CleanupAncientTables extends Maintenance {
        }
 }
 
-$maintClass = "CleanupAncientTables";
+$maintClass = CleanupAncientTables::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 41d492d..cbf0084 100644 (file)
@@ -148,5 +148,5 @@ class CleanupBlocks extends Maintenance {
        }
 }
 
-$maintClass = "CleanupBlocks";
+$maintClass = CleanupBlocks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2da45ca..546825b 100644 (file)
@@ -169,5 +169,5 @@ class CapsCleanup extends TableCleanup {
        }
 }
 
-$maintClass = "CapsCleanup";
+$maintClass = CapsCleanup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2d22704..786c20a 100644 (file)
@@ -199,5 +199,5 @@ TEXT
        }
 }
 
-$maintClass = 'CleanupEmptyCategories';
+$maintClass = CleanupEmptyCategories::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e0da027..fbdc7c2 100644 (file)
@@ -220,5 +220,5 @@ class ImageCleanup extends TableCleanup {
        }
 }
 
-$maintClass = "ImageCleanup";
+$maintClass = ImageCleanup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 569fd2b..54ed3aa 100644 (file)
@@ -307,5 +307,5 @@ TEXT
        }
 }
 
-$maintClass = 'CleanupInvalidDbKeys';
+$maintClass = CleanupInvalidDbKeys::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6e58ae9..a55b539 100644 (file)
@@ -48,5 +48,5 @@ class CleanupPreferences extends Maintenance {
        }
 }
 
-$maintClass = 'CleanupPreferences'; // Tells it to run the class
+$maintClass = CleanupPreferences::class; // Tells it to run the class
 require_once RUN_MAINTENANCE_IF_MAIN;
index a6f10c6..63838d2 100644 (file)
@@ -77,5 +77,5 @@ class CleanupRemovedModules extends Maintenance {
        }
 }
 
-$maintClass = 'CleanupRemovedModules';
+$maintClass = CleanupRemovedModules::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3d039fa..038b28c 100644 (file)
@@ -156,5 +156,5 @@ class CleanupSpam extends Maintenance {
        }
 }
 
-$maintClass = "CleanupSpam";
+$maintClass = CleanupSpam::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 24d6d86..8c782d9 100644 (file)
@@ -189,5 +189,5 @@ class TitleCleanup extends TableCleanup {
        }
 }
 
-$maintClass = "TitleCleanup";
+$maintClass = TitleCleanup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index aeaf150..61cd9c2 100644 (file)
@@ -152,5 +152,5 @@ class UploadStashCleanup extends Maintenance {
        }
 }
 
-$maintClass = "UploadStashCleanup";
+$maintClass = UploadStashCleanup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 74167d1..3763d3b 100644 (file)
@@ -208,5 +208,5 @@ class CleanupUsersWithNoId extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "CleanupUsersWithNoId";
+$maintClass = CleanupUsersWithNoId::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9728ac5..64d39dd 100644 (file)
@@ -95,5 +95,5 @@ class WatchlistCleanup extends TableCleanup {
        }
 }
 
-$maintClass = "WatchlistCleanup";
+$maintClass = WatchlistCleanup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ce19974..2e1f7c9 100644 (file)
@@ -54,5 +54,5 @@ class ClearInterwikiCache extends Maintenance {
        }
 }
 
-$maintClass = "ClearInterwikiCache";
+$maintClass = ClearInterwikiCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3329958..8232d52 100644 (file)
@@ -67,5 +67,5 @@ class CommandLineInc extends Maintenance {
        }
 }
 
-$maintClass = 'CommandLineInc';
+$maintClass = CommandLineInc::class;
 require RUN_MAINTENANCE_IF_MAIN;
index afbb268..b12974b 100644 (file)
@@ -108,5 +108,5 @@ class CompareParserCache extends Maintenance {
        }
 }
 
-$maintClass = "CompareParserCache";
+$maintClass = CompareParserCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3b09385..fe6e604 100644 (file)
@@ -185,5 +185,5 @@ class CompareParsers extends DumpIterator {
        }
 }
 
-$maintClass = "CompareParsers";
+$maintClass = CompareParsers::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 24391c1..0205311 100644 (file)
@@ -63,7 +63,7 @@ class ConvertExtensionToRegistration extends Maintenance {
        }
 
        protected function getAllGlobals() {
-               $processor = new ReflectionClass( 'ExtensionProcessor' );
+               $processor = new ReflectionClass( ExtensionProcessor::class );
                $settings = $processor->getProperty( 'globalSettings' );
                $settings->setAccessible( true );
                return array_merge( $settings->getValue(), $this->formerGlobals );
@@ -303,5 +303,5 @@ class ConvertExtensionToRegistration extends Maintenance {
        }
 }
 
-$maintClass = 'ConvertExtensionToRegistration';
+$maintClass = ConvertExtensionToRegistration::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 54c0eda..8cd0297 100644 (file)
@@ -302,5 +302,5 @@ class ConvertLinks extends Maintenance {
        }
 }
 
-$maintClass = "ConvertLinks";
+$maintClass = ConvertLinks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 501f045..c1a096f 100644 (file)
@@ -120,5 +120,5 @@ class ConvertUserOptions extends Maintenance {
        }
 }
 
-$maintClass = "ConvertUserOptions";
+$maintClass = ConvertUserOptions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index b46cac7..3c7ffba 100644 (file)
@@ -374,5 +374,5 @@ class CopyFileBackend extends Maintenance {
        }
 }
 
-$maintClass = 'CopyFileBackend';
+$maintClass = CopyFileBackend::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7dd40b8..dc70e9c 100644 (file)
@@ -94,5 +94,5 @@ class CopyJobQueue extends Maintenance {
        }
 }
 
-$maintClass = 'CopyJobQueue';
+$maintClass = CopyJobQueue::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8035c3e..d3efca6 100644 (file)
@@ -150,5 +150,5 @@ class CreateAndPromote extends Maintenance {
        }
 }
 
-$maintClass = "CreateAndPromote";
+$maintClass = CreateAndPromote::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e77113a..ef5a30d 100644 (file)
@@ -114,5 +114,5 @@ class GenerateCommonPassword extends Maintenance {
        }
 }
 
-$maintClass = "GenerateCommonPassword";
+$maintClass = GenerateCommonPassword::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0f33a14..d010073 100644 (file)
@@ -130,5 +130,5 @@ class DeleteArchivedFiles extends Maintenance {
        }
 }
 
-$maintClass = "DeleteArchivedFiles";
+$maintClass = DeleteArchivedFiles::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 905b5d9..e441951 100644 (file)
@@ -61,5 +61,5 @@ class DeleteArchivedRevisions extends Maintenance {
        }
 }
 
-$maintClass = "DeleteArchivedRevisions";
+$maintClass = DeleteArchivedRevisions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index c3cbdeb..0f3c506 100644 (file)
@@ -123,5 +123,5 @@ class DeleteBatch extends Maintenance {
        }
 }
 
-$maintClass = "DeleteBatch";
+$maintClass = DeleteBatch::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 417aa03..c52013b 100644 (file)
@@ -95,5 +95,5 @@ class DeleteDefaultMessages extends Maintenance {
        }
 }
 
-$maintClass = "DeleteDefaultMessages";
+$maintClass = DeleteDefaultMessages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2a1fe22..cd9ef11 100644 (file)
@@ -202,5 +202,5 @@ class DeleteEqualMessages extends Maintenance {
        }
 }
 
-$maintClass = "DeleteEqualMessages";
+$maintClass = DeleteEqualMessages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index aa11cd9..fc43e22 100644 (file)
@@ -99,5 +99,5 @@ class DeleteOldRevisions extends Maintenance {
        }
 }
 
-$maintClass = "DeleteOldRevisions";
+$maintClass = DeleteOldRevisions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4d60070..8d3f6b3 100644 (file)
@@ -98,5 +98,5 @@ class DeleteOrphanedRevisions extends Maintenance {
        }
 }
 
-$maintClass = "DeleteOrphanedRevisions";
+$maintClass = DeleteOrphanedRevisions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ab25784..20d5c2f 100644 (file)
@@ -54,5 +54,5 @@ class DeleteSelfExternals extends Maintenance {
        }
 }
 
-$maintClass = "DeleteSelfExternals";
+$maintClass = DeleteSelfExternals::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ad75c6b..f3fb32c 100644 (file)
@@ -34,7 +34,7 @@ if ( !defined( 'RUN_MAINTENANCE_IF_MAIN' ) ) {
 // Wasn't included from the file scope, halt execution (probably wanted the class)
 // If a class is using commandLine.inc (old school maintenance), they definitely
 // cannot be included and will proceed with execution
-if ( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
+if ( !Maintenance::shouldExecute() && $maintClass != CommandLineInc::class ) {
        return;
 }
 
@@ -69,7 +69,7 @@ if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
                                && ( $wgLocalisationCacheConf['store'] == 'db'
                                        || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
                        ) {
-                               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+                               $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
                        }
                }
 
index 4890199..6bbd86d 100644 (file)
@@ -133,5 +133,5 @@ TEXT
        }
 }
 
-$maintClass = 'DumpBackup';
+$maintClass = DumpBackup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3467932..e4bd756 100644 (file)
@@ -180,5 +180,5 @@ class DumpCategoriesAsRdf extends Maintenance {
        }
 }
 
-$maintClass = "DumpCategoriesAsRdf";
+$maintClass = DumpCategoriesAsRdf::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 707f4b3..e9a6bc5 100644 (file)
@@ -105,7 +105,7 @@ abstract class DumpIterator extends Maintenance {
                if ( $this->getDbType() == Maintenance::DB_NONE ) {
                        global $wgUseDatabaseMessages, $wgLocalisationCacheConf, $wgHooks;
                        $wgUseDatabaseMessages = false;
-                       $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+                       $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
                        $wgHooks['InterwikiLoadPrefix'][] = 'DumpIterator::disableInterwikis';
                }
        }
@@ -185,5 +185,5 @@ class SearchDump extends DumpIterator {
        }
 }
 
-$maintClass = "SearchDump";
+$maintClass = SearchDump::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ff4e894..6904953 100644 (file)
@@ -75,5 +75,5 @@ class DumpLinks extends Maintenance {
        }
 }
 
-$maintClass = "DumpLinks";
+$maintClass = DumpLinks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e18d0b8..fdc36c7 100644 (file)
@@ -986,5 +986,5 @@ TEXT
        }
 }
 
-$maintClass = 'TextPassDumper';
+$maintClass = TextPassDumper::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8d63fe5..4bfc574 100644 (file)
@@ -124,5 +124,5 @@ By default, outputs relative paths against the parent directory of $wgUploadDire
        }
 }
 
-$maintClass = "UploadDumper";
+$maintClass = UploadDumper::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7e50e9e..60ed252 100644 (file)
@@ -103,5 +103,5 @@ class EditCLI extends Maintenance {
        }
 }
 
-$maintClass = "EditCLI";
+$maintClass = EditCLI::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 24ef1ed..ef6d3d8 100644 (file)
@@ -115,5 +115,5 @@ class EraseArchivedFile extends Maintenance {
        }
 }
 
-$maintClass = "EraseArchivedFile";
+$maintClass = EraseArchivedFile::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 542bdda..2462eaf 100644 (file)
@@ -52,5 +52,5 @@ class ExportSites extends Maintenance {
 
 }
 
-$maintClass = 'ExportSites';
+$maintClass = ExportSites::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9c5a375..bc4fa31 100644 (file)
@@ -92,5 +92,5 @@ class FetchText extends Maintenance {
        }
 }
 
-$maintClass = "FetchText";
+$maintClass = FetchText::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4b6c619..a60942f 100644 (file)
@@ -141,5 +141,5 @@ class TestFileOpPerformance extends Maintenance {
        }
 }
 
-$maintClass = "TestFileOpPerformance";
+$maintClass = TestFileOpPerformance::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ec998da..ae2ee42 100644 (file)
@@ -202,5 +202,5 @@ class FindDeprecated extends Maintenance {
        }
 }
 
-$maintClass = 'FindDeprecated';
+$maintClass = FindDeprecated::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6a21a61..04c00e2 100644 (file)
@@ -349,5 +349,5 @@ class FindHooks extends Maintenance {
        }
 }
 
-$maintClass = 'FindHooks';
+$maintClass = FindHooks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8bf2bdb..4997cab 100644 (file)
@@ -115,5 +115,5 @@ class FindMissingFiles extends Maintenance {
        }
 }
 
-$maintClass = 'FindMissingFiles';
+$maintClass = FindMissingFiles::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 522bbc2..57e04e0 100644 (file)
@@ -151,5 +151,5 @@ class FindOrphanedFiles extends Maintenance {
        }
 }
 
-$maintClass = 'FindOrphanedFiles';
+$maintClass = FindOrphanedFiles::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7262770..cb4eddf 100644 (file)
@@ -124,5 +124,5 @@ class FixDefaultJsonContentPages extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = 'FixDefaultJsonContentPages';
+$maintClass = FixDefaultJsonContentPages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7e29f09..a76617a 100644 (file)
@@ -136,5 +136,5 @@ class FixDoubleRedirects extends Maintenance {
        }
 }
 
-$maintClass = "FixDoubleRedirects";
+$maintClass = FixDoubleRedirects::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 97cd37e..c70b8be 100644 (file)
@@ -95,5 +95,5 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "FixExtLinksProtocolRelative";
+$maintClass = FixExtLinksProtocolRelative::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 1efbc5f..32ff985 100644 (file)
@@ -125,5 +125,5 @@ class FixTimestamps extends Maintenance {
        }
 }
 
-$maintClass = "FixTimestamps";
+$maintClass = FixTimestamps::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 30364c6..57fd91b 100644 (file)
@@ -87,5 +87,5 @@ class FixUserRegistration extends Maintenance {
        }
 }
 
-$maintClass = "FixUserRegistration";
+$maintClass = FixUserRegistration::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 95d90c1..dbaeb86 100644 (file)
@@ -72,5 +72,5 @@ class MaintenanceFormatInstallDoc extends Maintenance {
        }
 }
 
-$maintClass = 'MaintenanceFormatInstallDoc';
+$maintClass = MaintenanceFormatInstallDoc::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ec32aee..efddfb3 100644 (file)
@@ -192,5 +192,5 @@ class GenerateJsonI18n extends Maintenance {
        }
 }
 
-$maintClass = "GenerateJsonI18n";
+$maintClass = GenerateJsonI18n::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4a70aaa..5a2c6c7 100644 (file)
@@ -555,5 +555,5 @@ class GenerateSitemap extends Maintenance {
        }
 }
 
-$maintClass = "GenerateSitemap";
+$maintClass = GenerateSitemap::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 18dcc22..de6e87a 100644 (file)
@@ -192,5 +192,5 @@ class GetConfiguration extends Maintenance {
        }
 }
 
-$maintClass = "GetConfiguration";
+$maintClass = GetConfiguration::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ad2fdf8..c2c7983 100644 (file)
@@ -75,5 +75,5 @@ class GetLagTimes extends Maintenance {
        }
 }
 
-$maintClass = "GetLagTimes";
+$maintClass = GetLagTimes::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6e0a1fe..43e876e 100644 (file)
@@ -51,5 +51,5 @@ class GetSlaveServer extends Maintenance {
        }
 }
 
-$maintClass = "GetSlaveServer";
+$maintClass = GetSlaveServer::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 21a183b..2e8cf77 100644 (file)
@@ -62,5 +62,5 @@ class GetTextMaint extends Maintenance {
        }
 }
 
-$maintClass = "GetTextMaint";
+$maintClass = GetTextMaint::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index f77f5b9..cef0dad 100644 (file)
@@ -157,5 +157,5 @@ class HHVMMakeRepo extends Maintenance {
        }
 }
 
-$maintClass = 'HHVMMakeRepo';
+$maintClass = HHVMMakeRepo::class;
 require RUN_MAINTENANCE_IF_MAIN;
index 2d71b87..d84e02f 100755 (executable)
@@ -24,5 +24,5 @@ class RunHipHopServer extends Maintenance {
                exit( $ret );
        }
 }
-$maintClass = 'RunHipHopServer';
+$maintClass = RunHipHopServer::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 918c1ab..965906f 100644 (file)
@@ -346,5 +346,5 @@ TEXT
        }
 }
 
-$maintClass = 'BackupReader';
+$maintClass = BackupReader::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index a72ec67..eb13dd1 100644 (file)
@@ -519,5 +519,5 @@ class ImportImages extends Maintenance {
 
 }
 
-$maintClass = 'ImportImages';
+$maintClass = ImportImages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7fdb355..e60e776 100644 (file)
@@ -114,5 +114,5 @@ class ImportSiteScripts extends Maintenance {
        }
 }
 
-$maintClass = 'ImportSiteScripts';
+$maintClass = ImportSiteScripts::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 5722344..be6cc05 100644 (file)
@@ -50,5 +50,5 @@ class ImportSites extends Maintenance {
        }
 }
 
-$maintClass = 'ImportSites';
+$maintClass = ImportSites::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4681003..c99aa15 100644 (file)
@@ -204,5 +204,5 @@ class ImportTextFiles extends Maintenance {
        }
 }
 
-$maintClass = "ImportTextFiles";
+$maintClass = ImportTextFiles::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 96aea03..3c4336f 100644 (file)
@@ -101,5 +101,5 @@ in the load balancer, usually indicating a replication environment.' );
        }
 }
 
-$maintClass = "InitEditCount";
+$maintClass = InitEditCount::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index b2530ce..297544d 100644 (file)
@@ -78,5 +78,5 @@ class InitSiteStats extends Maintenance {
        }
 }
 
-$maintClass = "InitSiteStats";
+$maintClass = InitSiteStats::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7b7cf15..1ab880c 100644 (file)
@@ -80,5 +80,5 @@ class InitUserPreference extends Maintenance {
        }
 }
 
-$maintClass = 'InitUserPreference'; // Tells it to run the class
+$maintClass = InitUserPreference::class; // Tells it to run the class
 require_once RUN_MAINTENANCE_IF_MAIN;
index c996530..d170c15 100644 (file)
@@ -168,6 +168,6 @@ class CommandLineInstaller extends Maintenance {
        }
 }
 
-$maintClass = 'CommandLineInstaller';
+$maintClass = CommandLineInstaller::class;
 
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6e62cd1..8d877a5 100644 (file)
@@ -90,5 +90,5 @@ class InvalidateUserSesssions extends Maintenance {
        }
 }
 
-$maintClass = "InvalidateUserSesssions";
+$maintClass = InvalidateUserSesssions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 49b945c..deac4af 100644 (file)
@@ -73,5 +73,5 @@ class JSParseHelper extends Maintenance {
        }
 }
 
-$maintClass = "JSParseHelper";
+$maintClass = JSParseHelper::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index fa2bd54..f041e15 100644 (file)
@@ -68,5 +68,5 @@ class DatabaseLag extends Maintenance {
        }
 }
 
-$maintClass = "DatabaseLag";
+$maintClass = DatabaseLag::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 931718f..684f4d2 100644 (file)
@@ -43,5 +43,5 @@ class AllTrans extends Maintenance {
        }
 }
 
-$maintClass = "AllTrans";
+$maintClass = AllTrans::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2142c24..f93c506 100644 (file)
@@ -78,5 +78,5 @@ class DateFormats extends Maintenance {
        }
 }
 
-$maintClass = "DateFormats";
+$maintClass = DateFormats::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index bb1f3d2..9aacf51 100644 (file)
@@ -65,5 +65,5 @@ class Digit2Html extends Maintenance {
        }
 }
 
-$maintClass = "Digit2Html";
+$maintClass = Digit2Html::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 37c87a8..543ee06 100644 (file)
@@ -48,5 +48,5 @@ class DumpMessages extends Maintenance {
        }
 }
 
-$maintClass = "DumpMessages";
+$maintClass = DumpMessages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 141f1ea..85949d8 100644 (file)
@@ -464,5 +464,5 @@ class UcdXmlReader {
        }
 }
 
-$maintClass = 'GenerateCollationData';
+$maintClass = GenerateCollationData::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4338a17..90ca41e 100644 (file)
@@ -127,5 +127,5 @@ class GenerateNormalizerDataAr extends Maintenance {
        }
 }
 
-$maintClass = 'GenerateNormalizerDataAr';
+$maintClass = GenerateNormalizerDataAr::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index a84ffb0..664f06c 100644 (file)
@@ -66,5 +66,5 @@ class GenerateNormalizerDataMl extends Maintenance {
        }
 }
 
-$maintClass = 'GenerateNormalizerDataMl';
+$maintClass = GenerateNormalizerDataMl::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cb989bc..6f2c6ad 100644 (file)
@@ -61,5 +61,5 @@ class LangMemUsage extends Maintenance {
        }
 }
 
-$maintClass = "LangMemUsage";
+$maintClass = LangMemUsage::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e8d0e76..4098e0c 100644 (file)
@@ -69,5 +69,5 @@ class ListVariants extends Maintenance {
        }
 }
 
-$maintClass = 'ListVariants';
+$maintClass = ListVariants::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cfd5fc2..d4ce931 100644 (file)
@@ -64,5 +64,5 @@ class MakeTestEdits extends Maintenance {
        }
 }
 
-$maintClass = "MakeTestEdits";
+$maintClass = MakeTestEdits::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index c1b038c..488c915 100644 (file)
@@ -93,5 +93,5 @@ class ManageJobs extends Maintenance {
        }
 }
 
-$maintClass = "ManageJobs";
+$maintClass = ManageJobs::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 14df53c..c976bd7 100644 (file)
@@ -102,5 +102,5 @@ class McTest extends Maintenance {
        }
 }
 
-$maintClass = "McTest";
+$maintClass = McTest::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7d85259..51c41db 100644 (file)
@@ -26,7 +26,7 @@
 define( 'MW_NO_EXTENSION_MESSAGES', 1 );
 
 require_once __DIR__ . '/Maintenance.php';
-$maintClass = 'MergeMessageFileList';
+$maintClass = MergeMessageFileList::class;
 $mmfl = false;
 
 /**
index dd78a7d..e9beaa3 100644 (file)
@@ -155,5 +155,5 @@ class MigrateArchiveText extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "MigrateArchiveText";
+$maintClass = MigrateArchiveText::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index c000871..c35315d 100644 (file)
@@ -291,5 +291,5 @@ class MigrateComments extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "MigrateComments";
+$maintClass = MigrateComments::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 536eddd..6188ea1 100644 (file)
@@ -235,5 +235,5 @@ class MigrateFileRepoLayout extends Maintenance {
        }
 }
 
-$maintClass = 'MigrateFileRepoLayout';
+$maintClass = MigrateFileRepoLayout::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 703d97f..eeaddba 100644 (file)
@@ -106,5 +106,5 @@ class MigrateUserGroup extends Maintenance {
        }
 }
 
-$maintClass = "MigrateUserGroup";
+$maintClass = MigrateUserGroup::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 540a4d9..ddae17d 100644 (file)
@@ -129,5 +129,5 @@ class MinifyScript extends Maintenance {
        }
 }
 
-$maintClass = 'MinifyScript';
+$maintClass = MinifyScript::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9c53daa..090c3d4 100644 (file)
@@ -122,5 +122,5 @@ class MoveBatch extends Maintenance {
        }
 }
 
-$maintClass = "MoveBatch";
+$maintClass = MoveBatch::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9447268..2d6a0be 100644 (file)
@@ -165,5 +165,5 @@ TEXT
        }
 }
 
-$maintClass = 'MWDocGen';
+$maintClass = MWDocGen::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 84d4533..3c83921 100644 (file)
@@ -616,5 +616,5 @@ class NamespaceConflictChecker extends Maintenance {
        }
 }
 
-$maintClass = "NamespaceConflictChecker";
+$maintClass = NamespaceConflictChecker::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e735aed..ee1f59c 100644 (file)
@@ -88,7 +88,7 @@ class NukeNS extends Maintenance {
                                        $dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
                                        $this->commitTransaction( $dbw, __METHOD__ );
                                        // Delete revisions as appropriate
-                                       $child = $this->runChild( 'NukePage', 'nukePage.php' );
+                                       $child = $this->runChild( NukePage::class, 'nukePage.php' );
                                        $child->deleteRevisions( $revs );
                                        $this->purgeRedundantText( true );
                                        $n_deleted++;
@@ -118,5 +118,5 @@ class NukeNS extends Maintenance {
        }
 }
 
-$maintClass = "NukeNS";
+$maintClass = NukeNS::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e27324a..baead94 100644 (file)
@@ -115,5 +115,5 @@ class NukePage extends Maintenance {
        }
 }
 
-$maintClass = "NukePage";
+$maintClass = NukePage::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ed412da..7f997cb 100644 (file)
@@ -93,5 +93,5 @@ class AlterSharedConstraints extends Maintenance {
        }
 }
 
-$maintClass = "AlterSharedConstraints";
+$maintClass = AlterSharedConstraints::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 54a68ae..a1cf166 100644 (file)
@@ -252,5 +252,5 @@ class Orphans extends Maintenance {
        }
 }
 
-$maintClass = "Orphans";
+$maintClass = Orphans::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 24ec8cb..dc9bbda 100644 (file)
@@ -49,5 +49,5 @@ class PageExists extends Maintenance {
        }
 }
 
-$maintClass = "PageExists";
+$maintClass = PageExists::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6279a34..b87a716 100644 (file)
@@ -140,5 +140,5 @@ class CLIParser extends Maintenance {
        }
 }
 
-$maintClass = "CLIParser";
+$maintClass = CLIParser::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index bc21140..3ba962f 100644 (file)
@@ -66,5 +66,5 @@ class PatchSql extends Maintenance {
        }
 }
 
-$maintClass = "PatchSql";
+$maintClass = PatchSql::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index f5f1de6..23144e9 100644 (file)
@@ -94,5 +94,5 @@ class PopulateBacklinkNamespace extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateBacklinkNamespace";
+$maintClass = PopulateBacklinkNamespace::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 5dccdd6..f2a0007 100644 (file)
@@ -150,5 +150,5 @@ TEXT
        }
 }
 
-$maintClass = "PopulateCategory";
+$maintClass = PopulateCategory::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index a4fac05..8d64dae 100644 (file)
@@ -250,5 +250,5 @@ class PopulateContentModel extends Maintenance {
        }
 }
 
-$maintClass = 'PopulateContentModel';
+$maintClass = PopulateContentModel::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cbd969d..7c094be 100644 (file)
@@ -104,5 +104,5 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateFilearchiveSha1";
+$maintClass = PopulateFilearchiveSha1::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 84b65ee..212a20d 100644 (file)
@@ -178,5 +178,5 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateImageSha1";
+$maintClass = PopulateImageSha1::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2165820..fbe16de 100644 (file)
@@ -137,5 +137,5 @@ TEXT
        }
 }
 
-$maintClass = "PopulateIpChanges";
+$maintClass = PopulateIpChanges::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 979a28a..f960753 100644 (file)
@@ -169,5 +169,5 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateLogSearch";
+$maintClass = PopulateLogSearch::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6e8261a..2fe7ea6 100644 (file)
@@ -85,5 +85,5 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateLogUsertext";
+$maintClass = PopulateLogUsertext::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 98d535a..1ba7054 100644 (file)
@@ -100,5 +100,5 @@ class PopulatePPSortKey extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = 'PopulatePPSortKey';
+$maintClass = PopulatePPSortKey::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 99c2b23..39bc733 100644 (file)
@@ -127,5 +127,5 @@ class PopulateParentId extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateParentId";
+$maintClass = PopulateParentId::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0a53dd6..4ac3486 100644 (file)
@@ -104,5 +104,5 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateRecentChangesSource";
+$maintClass = PopulateRecentChangesSource::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cc1a9f1..f83be9c 100644 (file)
@@ -157,5 +157,5 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateRevisionLength";
+$maintClass = PopulateRevisionLength::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 7ced779..54937ab 100644 (file)
@@ -217,5 +217,5 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
        }
 }
 
-$maintClass = "PopulateRevisionSha1";
+$maintClass = PopulateRevisionSha1::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 17d97b0..d540e8f 100644 (file)
@@ -67,7 +67,7 @@ class PreprocessDump extends DumpIterator {
                } elseif ( isset( $wgParserConf['preprocessorClass'] ) ) {
                        $name = $wgParserConf['preprocessorClass'];
                } else {
-                       $name = 'Preprocessor_DOM';
+                       $name = Preprocessor_DOM::class;
                }
 
                $wgParser->firstCallInit();
@@ -94,5 +94,5 @@ class PreprocessDump extends DumpIterator {
        }
 }
 
-$maintClass = "PreprocessDump";
+$maintClass = PreprocessDump::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index eae6154..b47476a 100644 (file)
@@ -89,5 +89,5 @@ class Protect extends Maintenance {
        }
 }
 
-$maintClass = "Protect";
+$maintClass = Protect::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 1035ff5..74298cb 100644 (file)
@@ -107,5 +107,5 @@ class PruneFileCache extends Maintenance {
        }
 }
 
-$maintClass = "PruneFileCache";
+$maintClass = PruneFileCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9805452..7d5d40b 100644 (file)
@@ -258,5 +258,5 @@ class PurgeChangedFiles extends Maintenance {
        }
 }
 
-$maintClass = "PurgeChangedFiles";
+$maintClass = PurgeChangedFiles::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cce9b03..22020e7 100644 (file)
@@ -190,5 +190,5 @@ class PurgeChangedPages extends Maintenance {
        }
 }
 
-$maintClass = "PurgeChangedPages";
+$maintClass = PurgeChangedPages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index f5a085d..d0bbddf 100644 (file)
@@ -41,5 +41,5 @@ class PurgeExpiredUserrights extends Maintenance {
        }
 }
 
-$maintClass = "PurgeExpiredUserrights";
+$maintClass = PurgeExpiredUserrights::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8cf217f..16a62f4 100644 (file)
@@ -143,5 +143,5 @@ class PurgeList extends Maintenance {
        }
 }
 
-$maintClass = "PurgeList";
+$maintClass = PurgeList::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 591f7ee..3b25629 100644 (file)
@@ -68,5 +68,5 @@ class PurgeModuleDeps extends Maintenance {
        }
 }
 
-$maintClass = 'PurgeModuleDeps';
+$maintClass = PurgeModuleDeps::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 1b78c7d..65d25c9 100644 (file)
@@ -41,5 +41,5 @@ class PurgeOldText extends Maintenance {
        }
 }
 
-$maintClass = "PurgeOldText";
+$maintClass = PurgeOldText::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 44d390e..df1403c 100644 (file)
@@ -74,5 +74,5 @@ class PurgePage extends Maintenance {
        }
 }
 
-$maintClass = "PurgePage";
+$maintClass = PurgePage::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 716be3a..dcd6d13 100644 (file)
@@ -93,5 +93,5 @@ class PurgeParserCache extends Maintenance {
        }
 }
 
-$maintClass = 'PurgeParserCache';
+$maintClass = PurgeParserCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index de09998..6f88f3d 100644 (file)
@@ -195,5 +195,5 @@ class ReassignEdits extends Maintenance {
        }
 }
 
-$maintClass = "ReassignEdits";
+$maintClass = ReassignEdits::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 1fc1daf..55ed4fa 100644 (file)
@@ -179,5 +179,5 @@ class RebuildFileCache extends Maintenance {
        }
 }
 
-$maintClass = "RebuildFileCache";
+$maintClass = RebuildFileCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8fceedb..713492a 100644 (file)
@@ -233,5 +233,5 @@ class ImageBuilder extends Maintenance {
        }
 }
 
-$maintClass = 'ImageBuilder';
+$maintClass = ImageBuilder::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8f92420..4213d5f 100644 (file)
@@ -177,5 +177,5 @@ class RebuildLocalisationCache extends Maintenance {
        }
 }
 
-$maintClass = "RebuildLocalisationCache";
+$maintClass = RebuildLocalisationCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 93e6d47..41fd863 100644 (file)
@@ -64,5 +64,5 @@ class RebuildSitesCache extends Maintenance {
 
 }
 
-$maintClass = "RebuildSitesCache";
+$maintClass = RebuildSitesCache::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 95822ca..30a5dd4 100644 (file)
@@ -44,24 +44,24 @@ class RebuildAll extends Maintenance {
                if ( $this->getDB( DB_REPLICA )->getType() != 'postgres' ) {
                        $this->output( "** Rebuilding fulltext search index (if you abort "
                                . "this will break searching; run this script again to fix):\n" );
-                       $rebuildText = $this->runChild( 'RebuildTextIndex', 'rebuildtextindex.php' );
+                       $rebuildText = $this->runChild( RebuildTextIndex::class, 'rebuildtextindex.php' );
                        $rebuildText->execute();
                }
 
                // Rebuild RC
                $this->output( "\n\n** Rebuilding recentchanges table:\n" );
-               $rebuildRC = $this->runChild( 'RebuildRecentchanges', 'rebuildrecentchanges.php' );
+               $rebuildRC = $this->runChild( RebuildRecentchanges::class, 'rebuildrecentchanges.php' );
                $rebuildRC->execute();
 
                // Rebuild link tables
                $this->output( "\n\n** Rebuilding links tables -- this can take a long time. "
                        . "It should be safe to abort via ctrl+C if you get bored.\n" );
-               $rebuildLinks = $this->runChild( 'RefreshLinks', 'refreshLinks.php' );
+               $rebuildLinks = $this->runChild( RefreshLinks::class, 'refreshLinks.php' );
                $rebuildLinks->execute();
 
                $this->output( "Done.\n" );
        }
 }
 
-$maintClass = "RebuildAll";
+$maintClass = RebuildAll::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index a47e50d..88eaf67 100644 (file)
@@ -53,5 +53,5 @@ class RebuildMessages extends Maintenance {
        }
 }
 
-$maintClass = "RebuildMessages";
+$maintClass = RebuildMessages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index bbf91f5..f26d8b3 100644 (file)
@@ -495,5 +495,5 @@ class RebuildRecentchanges extends Maintenance {
        }
 }
 
-$maintClass = "RebuildRecentchanges";
+$maintClass = RebuildRecentchanges::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0e41ff3..f06e62b 100644 (file)
@@ -157,5 +157,5 @@ class RebuildTextIndex extends Maintenance {
        }
 }
 
-$maintClass = "RebuildTextIndex";
+$maintClass = RebuildTextIndex::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6a00d57..7e8f063 100644 (file)
@@ -168,5 +168,5 @@ TEXT
        }
 }
 
-$maintClass = 'RecountCategories';
+$maintClass = RecountCategories::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 3bae4b8..db8a19a 100644 (file)
@@ -152,5 +152,5 @@ class RefreshFileHeaders extends Maintenance {
        }
 }
 
-$maintClass = 'RefreshFileHeaders';
+$maintClass = RefreshFileHeaders::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index dcfed11..65db94d 100644 (file)
@@ -260,5 +260,5 @@ class RefreshImageMetadata extends Maintenance {
        }
 }
 
-$maintClass = 'RefreshImageMetadata';
+$maintClass = RefreshImageMetadata::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4fab146..9d5d39f 100644 (file)
@@ -489,5 +489,5 @@ class RefreshLinks extends Maintenance {
        }
 }
 
-$maintClass = 'RefreshLinks';
+$maintClass = RefreshLinks::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 91025bf..ec68ef2 100644 (file)
@@ -74,5 +74,5 @@ class RemoveInvalidEmails extends Maintenance {
        }
 }
 
-$maintClass = 'RemoveInvalidEmails';
+$maintClass = RemoveInvalidEmails::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 767924f..0910c9c 100644 (file)
@@ -131,5 +131,5 @@ class RemoveUnusedAccounts extends Maintenance {
        }
 }
 
-$maintClass = "RemoveUnusedAccounts";
+$maintClass = RemoveUnusedAccounts::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 6aefc39..af8a280 100644 (file)
@@ -90,5 +90,5 @@ class RenameDbPrefix extends Maintenance {
        }
 }
 
-$maintClass = "RenameDbPrefix";
+$maintClass = RenameDbPrefix::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 458556f..cc5ae59 100644 (file)
@@ -123,5 +123,5 @@ class DumpRenderer extends Maintenance {
        }
 }
 
-$maintClass = "DumpRenderer";
+$maintClass = DumpRenderer::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index f59ce6c..d6b4b79 100644 (file)
@@ -68,5 +68,5 @@ class ResetUserEmail extends Maintenance {
        }
 }
 
-$maintClass = 'ResetUserEmail';
+$maintClass = ResetUserEmail::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 710198b..235b37f 100644 (file)
@@ -116,5 +116,5 @@ class ResetUserTokens extends Maintenance {
        }
 }
 
-$maintClass = "ResetUserTokens";
+$maintClass = ResetUserTokens::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index ca9abb1..34bc62b 100644 (file)
@@ -111,5 +111,5 @@ class RollbackEdits extends Maintenance {
        }
 }
 
-$maintClass = 'RollbackEdits';
+$maintClass = RollbackEdits::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index b0a2b92..64eca95 100644 (file)
@@ -111,5 +111,5 @@ class BatchedQueryRunner extends Maintenance {
        }
 }
 
-$maintClass = "BatchedQueryRunner";
+$maintClass = BatchedQueryRunner::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0874538..51c52be 100644 (file)
@@ -118,5 +118,5 @@ class RunJobs extends Maintenance {
        }
 }
 
-$maintClass = "RunJobs";
+$maintClass = RunJobs::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 75b2e22..c8a8a45 100644 (file)
@@ -96,5 +96,5 @@ class MediaWikiShell extends Maintenance {
 
 }
 
-$maintClass = 'MediaWikiShell';
+$maintClass = MediaWikiShell::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0c68032..b2fde8e 100644 (file)
@@ -105,5 +105,5 @@ class ShowJobs extends Maintenance {
        }
 }
 
-$maintClass = "ShowJobs";
+$maintClass = ShowJobs::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 5a15165..08f009b 100644 (file)
@@ -74,5 +74,5 @@ class ShowSiteStats extends Maintenance {
        }
 }
 
-$maintClass = "ShowSiteStats";
+$maintClass = ShowSiteStats::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index a67b28e..dd05bbe 100644 (file)
@@ -192,5 +192,5 @@ class MwSql extends Maintenance {
        }
 }
 
-$maintClass = "MwSql";
+$maintClass = MwSql::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index fbde417..5070745 100644 (file)
@@ -142,5 +142,5 @@ class SqliteMaintenance extends Maintenance {
        }
 }
 
-$maintClass = "SqliteMaintenance";
+$maintClass = SqliteMaintenance::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 4d56ef0..4414c5b 100644 (file)
@@ -471,5 +471,5 @@ class CompressOld extends Maintenance {
        }
 }
 
-$maintClass = 'CompressOld';
+$maintClass = CompressOld::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index d39acd4..5a537aa 100644 (file)
@@ -84,5 +84,5 @@ class DumpRev extends Maintenance {
        }
 }
 
-$maintClass = "DumpRev";
+$maintClass = DumpRev::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e8bd23d..f6aa19b 100644 (file)
@@ -345,5 +345,5 @@ class FixT22757 extends Maintenance {
        }
 }
 
-$maintClass = 'FixT22757';
+$maintClass = FixT22757::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index eb72915..4feb95e 100644 (file)
@@ -80,5 +80,5 @@ class OrphanStats extends Maintenance {
        }
 }
 
-$maintClass = "OrphanStats";
+$maintClass = OrphanStats::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index c5dd53b..2a92140 100644 (file)
@@ -114,8 +114,8 @@ class RecompressTracked {
                        $GLOBALS['wgDebugLogPrefix'] = "RCT {$this->replicaId}: ";
                }
                $this->pageBlobClass = function_exists( 'xdiff_string_bdiff' ) ?
-                       'DiffHistoryBlob' : 'ConcatenatedGzipHistoryBlob';
-               $this->orphanBlobClass = 'ConcatenatedGzipHistoryBlob';
+                       DiffHistoryBlob::class : ConcatenatedGzipHistoryBlob::class;
+               $this->orphanBlobClass = ConcatenatedGzipHistoryBlob::class;
        }
 
        function debug( $msg ) {
index c23f508..6dee1a5 100644 (file)
@@ -111,5 +111,5 @@ SQL;
        }
 }
 
-$maintClass = 'StorageTypeStats';
+$maintClass = StorageTypeStats::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 028f11c..c3ed4fc 100644 (file)
@@ -45,7 +45,7 @@ if ( isset( $options['limit'] ) ) {
        $limit = 1000;
        $untilHappy = true;
 }
-$type = isset( $options['type'] ) ? $options['type'] : 'ConcatenatedGzipHistoryBlob';
+$type = isset( $options['type'] ) ? $options['type'] : ConcatenatedGzipHistoryBlob::class;
 
 $dbr = $this->getDB( DB_REPLICA );
 $revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );
index 68afde7..49627c3 100644 (file)
@@ -303,5 +303,5 @@ class SyncFileBackend extends Maintenance {
        }
 }
 
-$maintClass = "SyncFileBackend";
+$maintClass = SyncFileBackend::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9d7cc0e..0dd0341 100644 (file)
@@ -44,5 +44,5 @@ class TidyUpBug37714 extends Maintenance {
        }
 }
 
-$maintClass = 'TidyUpBug37714';
+$maintClass = TidyUpBug37714::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 278b68d..e9b2abd 100644 (file)
@@ -58,5 +58,5 @@ class Undelete extends Maintenance {
        }
 }
 
-$maintClass = "Undelete";
+$maintClass = Undelete::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index e60efdb..c780b6a 100755 (executable)
@@ -131,7 +131,7 @@ class UpdateMediaWiki extends Maintenance {
 
                // Check external dependencies are up to date
                if ( !$this->hasOption( 'skip-external-dependencies' ) ) {
-                       $composerLockUpToDate = $this->runChild( 'CheckComposerLockUpToDate' );
+                       $composerLockUpToDate = $this->runChild( CheckComposerLockUpToDate::class );
                        $composerLockUpToDate->execute();
                } else {
                        $this->output(
@@ -233,13 +233,13 @@ class UpdateMediaWiki extends Maintenance {
                # This needs to be disabled early since extensions will try to use the l10n
                # cache from $wgExtensionFunctions (T22471)
                $wgLocalisationCacheConf = [
-                       'class' => 'LocalisationCache',
-                       'storeClass' => 'LCStoreNull',
+                       'class' => LocalisationCache::class,
+                       'storeClass' => LCStoreNull::class,
                        'storeDirectory' => false,
                        'manualRecache' => false,
                ];
        }
 }
 
-$maintClass = 'UpdateMediaWiki';
+$maintClass = UpdateMediaWiki::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 213195d..c72e74f 100644 (file)
@@ -69,5 +69,5 @@ class UpdateArticleCount extends Maintenance {
        }
 }
 
-$maintClass = "UpdateArticleCount";
+$maintClass = UpdateArticleCount::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 84fc2d2..63176cb 100644 (file)
@@ -344,5 +344,5 @@ TEXT
        }
 }
 
-$maintClass = "UpdateCollation";
+$maintClass = UpdateCollation::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 12056c8..810af57 100644 (file)
@@ -77,5 +77,5 @@ class UpdateDoubleWidthSearch extends Maintenance {
        }
 }
 
-$maintClass = "UpdateDoubleWidthSearch";
+$maintClass = UpdateDoubleWidthSearch::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 264f4be..6233d5b 100644 (file)
@@ -65,5 +65,5 @@ class UpdateExtensionJsonSchema extends Maintenance {
        }
 }
 
-$maintClass = 'UpdateExtensionJsonSchema';
+$maintClass = UpdateExtensionJsonSchema::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index c4dccbc..cb40af3 100644 (file)
@@ -126,5 +126,5 @@ class UpdateRestrictions extends Maintenance {
        }
 }
 
-$maintClass = "UpdateRestrictions";
+$maintClass = UpdateRestrictions::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index cdb7d9f..af2d828 100644 (file)
@@ -121,5 +121,5 @@ class UpdateSearchIndex extends Maintenance {
        }
 }
 
-$maintClass = "UpdateSearchIndex";
+$maintClass = UpdateSearchIndex::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 58f23df..1c6f9b3 100644 (file)
@@ -170,5 +170,5 @@ class UpdateSpecialPages extends Maintenance {
        }
 }
 
-$maintClass = "UpdateSpecialPages";
+$maintClass = UpdateSpecialPages::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index eb8da57..4c9dcb4 100644 (file)
@@ -199,5 +199,5 @@ WARN
        }
 }
 
-$maintClass = 'UserOptionsMaintenance';
+$maintClass = UserOptionsMaintenance::class;
 require RUN_MAINTENANCE_IF_MAIN;
index ea27a7e..4b07796 100644 (file)
@@ -22,5 +22,5 @@ class ValidateRegistrationFile extends Maintenance {
        }
 }
 
-$maintClass = 'ValidateRegistrationFile';
+$maintClass = ValidateRegistrationFile::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 8c0237f..952b825 100644 (file)
@@ -55,5 +55,5 @@ class ViewCLI extends Maintenance {
        }
 }
 
-$maintClass = "ViewCLI";
+$maintClass = ViewCLI::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 94bd3cb..1fc0f37 100644 (file)
@@ -121,5 +121,5 @@ class WrapOldPasswords extends Maintenance {
        }
 }
 
-$maintClass = "WrapOldPasswords";
+$maintClass = WrapOldPasswords::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 109ab7d..e55e0fe 100644 (file)
@@ -2106,6 +2106,7 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css',
        ],
        'mediawiki.special.preferences' => [
+               'targets' => [ 'desktop', 'mobile' ],
                'scripts' => [
                        'resources/src/mediawiki.special/mediawiki.special.preferences.confirmClose.js',
                        'resources/src/mediawiki.special/mediawiki.special.preferences.convertmessagebox.js',
@@ -2126,6 +2127,7 @@ return [
                ],
        ],
        'mediawiki.special.preferences.styles' => [
+               'targets' => [ 'desktop', 'mobile' ],
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.styles.css',
        ],
        'mediawiki.special.recentchanges' => [
@@ -2208,6 +2210,7 @@ return [
                        'jquery.spinner',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api',
+                       'mediawiki.api.parse',
                        'mediawiki.libs.jpegmeta',
                        'mediawiki.Title',
                        'mediawiki.util',
index a5b136d..d46d009 100644 (file)
@@ -29,6 +29,9 @@
                        if ( color && Array.isArray( color ) && color.length === 3 ) {
                                return color;
                        }
+                       if ( typeof color !== 'string' ) {
+                               return undefined;
+                       }
 
                        // Look for rgb(num,num,num)
                        // eslint-disable-next-line no-cond-assign
@@ -77,7 +80,7 @@
                        }
 
                        // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[ $.trim( color ).toLowerCase() ];
+                       return $.colorUtil.colors[ color.trim().toLowerCase() ];
                },
 
                /**
index 6d67ade..8aa22a8 100644 (file)
                                if ( rowIndex !== lastRowIndex ) {
                                        lastRowIndex = rowIndex;
                                        cellIndex = $( rows[ rowIndex ] ).data( 'columnToCell' )[ column ];
-                                       nodeValue = $.trim( getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ) );
+                                       nodeValue = getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ).trim();
                                }
                        } else {
                                nodeValue = '';
 
        /**
         * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
-        * structure [ [ Integer , Integer ], ... ]
+        * structure [ [ Integer, Integer ], ... ]
         *
         * @param {Array} sortObjects List of sort objects.
         * @return {Array} List of internal sort definitions.
         */
        function convertSortList( sortObjects ) {
                var sortList = [];
-               $.each( sortObjects, function ( i, sortObject ) {
+               sortObjects.forEach( function ( sortObject ) {
                        $.each( sortObject, function ( columnIndex, order ) {
                                var orderIndex = ( order === 'desc' ) ? 1 : 0;
                                sortList.push( [ parseInt( columnIndex, 10 ), orderIndex ] );
                },
                format: function ( s ) {
                        var tsc;
-                       s = $.trim( s.toLowerCase() );
+                       s = s.toLowerCase().trim();
                        if ( ts.collationRegex ) {
                                tsc = ts.collationTable;
                                s = s.replace( ts.collationRegex, function ( match ) {
                        return ts.rgx.url[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.trim( s.replace( ts.rgx.url[ 1 ], '' ) );
+                       return s.replace( ts.rgx.url[ 1 ], '' ).trim();
                },
                type: 'text'
        } );
                },
                format: function ( s ) {
                        var match, y;
-                       s = $.trim( s.toLowerCase() );
+                       s = s.toLowerCase().trim();
 
                        if ( ( match = s.match( ts.dateRegex[ 0 ] ) ) !== null ) {
                                if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgPageContentLanguage' ) === 'en' ) {
        ts.addParser( {
                id: 'number',
                is: function ( s ) {
-                       return $.tablesorter.numberRegex.test( $.trim( s ) );
+                       return $.tablesorter.numberRegex.test( s.trim() );
                },
                format: function ( s ) {
                        return $.tablesorter.formatDigit( s );
index ab1ce27..b87fba7 100644 (file)
@@ -99,7 +99,8 @@
                                rvdifftotext: $textbox.textSelection( 'getContents' ),
                                rvdifftotextpst: true,
                                rvprop: '',
-                               rvsection: section === '' ? undefined : section
+                               rvsection: section === '' ? undefined : section,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } );
 
                        // Wait for the summary before showing the diff so the page doesn't jump twice
 
                        parseRequest = api.post( postData );
                        parseRequest.done( function ( response ) {
-                               var li, newList, $displaytitle, $content, $parent, $list;
+                               var newList, $displaytitle, $content, $parent, $list;
                                if ( response.parse.jsconfigvars ) {
                                        mw.config.set( response.parse.jsconfigvars );
                                }
                                        $( '.catlinks[data-mw="interface"]' ).replaceWith( $content );
                                }
                                if ( response.parse.templates ) {
-                                       newList = [];
-                                       $.each( response.parse.templates, function ( i, template ) {
-                                               li = $( '<li>' )
+                                       newList = response.parse.templates.map( function ( template ) {
+                                               return $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
                                                                        href: mw.util.getUrl( template.title ),
                                                                } )
                                                                .text( template.title )
                                                        );
-                                               newList.push( li );
                                        } );
 
                                        $editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
                                        $( '.limitreport' ).html( response.parse.limitreporthtml );
                                }
                                if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
-                                       newList = [];
-                                       $.each( response.parse.langlinks, function ( i, langlink ) {
+                                       newList = response.parse.langlinks.map( function ( langlink ) {
                                                var bcp47 = mw.language.bcp47( langlink.lang );
-                                               li = $( '<li>' )
+                                               return $( '<li>' )
                                                        .addClass( 'interlanguage-link interwiki-' + langlink.lang )
                                                        .append( $( '<a>' )
                                                                .attr( {
                                                                } )
                                                                .text( langlink.autonym )
                                                        );
-                                               newList.push( li );
                                        } );
                                        $list = $( '#p-lang ul' );
                                        $parent = $list.parent();
index 49e471e..ba93195 100644 (file)
@@ -23,7 +23,7 @@
                        expiryWidget = infuseOrNull( 'mw-input-wpExpiry' );
 
                function updateBlockOptions() {
-                       var blocktarget = $.trim( blockTargetWidget.getValue() ),
+                       var blocktarget = blockTargetWidget.getValue().trim(),
                                isEmpty = blocktarget === '',
                                isIp = mw.util.isIPAddress( blocktarget, true ),
                                isIpRange = isIp && blocktarget.match( /\/\d+$/ ),
index 9592879..ad8a4f4 100644 (file)
@@ -17,7 +17,7 @@
                                        currentApiPromise = undefined;
                                }
 
-                               password = $.trim( password );
+                               password = password.trim();
 
                                if ( password === '' ) {
                                        self.setErrors( [] );
index 9bf6255..9af7ab2 100644 (file)
@@ -61,7 +61,7 @@
 
                timeout: function () {
                        var $spinnerDestCheck, title;
-                       if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+                       if ( !ajaxUploadDestCheck || this.nameToCheck.trim() === '' ) {
                                return;
                        }
                        $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
@@ -71,7 +71,7 @@
                                formatversion: 2,
                                action: 'query',
                                // If title is empty, user input is invalid, the API call will produce details about why
-                               titles: title ? title.getPrefixedText() : this.nameToCheck,
+                               titles: [ title ? title.getPrefixedText() : this.nameToCheck ],
                                prop: 'imageinfo',
                                iiprop: 'uploadwarning',
                                errorformat: 'html',
 
                        $spinner = $.createSpinner().insertAfter( $element );
 
-                       ( new mw.Api() ).get( {
-                               formatversion: 2,
-                               action: 'parse',
-                               text: '{{' + template + '}}',
+                       ( new mw.Api() ).parse( '{{' + template + '}}', {
                                title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
                                prop: 'text',
                                pst: true,
                },
 
                processResult: function ( result, template, $previewContainer ) {
-                       this.responseCache[ template ] = result.parse.text;
+                       this.responseCache[ template ] = result;
                        this.showPreview( this.responseCache[ template ], $previewContainer );
                },
 
                }
 
                // fillDestFile setup
-               $.each( mw.config.get( 'wgUploadSourceIds' ), function ( index, sourceId ) {
+               mw.config.get( 'wgUploadSourceIds' ).forEach( function ( sourceId ) {
                        $( '#' + sourceId ).change( function () {
                                var path, slash, backslash, fname;
                                if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
index 10e19e7..8a61afb 100644 (file)
@@ -82,7 +82,7 @@
                        var apiPromise,
                                d = $.Deferred();
 
-                       if ( $.trim( $usernameInput.val() ) === '' ) {
+                       if ( $usernameInput.val().trim() === '' ) {
                                d.resolve( { valid: true, messages: [] } );
                                return d.promise();
                        }
index d55ed80..4707f78 100644 (file)
                                buttons = slice.call( arguments );
                        }
                        if ( isReady ) {
-                               $.each( buttons, function () {
-                                       insertButton( this );
+                               buttons.forEach( function ( button ) {
+                                       insertButton( button );
                                } );
                        } else {
                                // Push each button into the queue
index 42ef1ac..17da7d8 100644 (file)
@@ -6,6 +6,8 @@
  */
 ( function ( $, mw ) {
 
+       var hasOwn = Object.prototype.hasOwnProperty;
+
        /**
         * @class mw.widgets.PageExistenceCache
         * @private
                queue = this.existenceCheckQueue;
                this.existenceCheckQueue = {};
                titles = Object.keys( queue ).filter( function ( title ) {
-                       if ( cache.existenceCache.hasOwnProperty( title ) ) {
+                       if ( hasOwn.call( cache.existenceCache, title ) ) {
                                queue[ title ].resolve( cache.existenceCache[ title ] );
                        }
-                       return !cache.existenceCache.hasOwnProperty( title );
+                       return !hasOwn.call( cache.existenceCache, title );
                } );
                if ( !titles.length ) {
                        return;
@@ -63,7 +65,7 @@
                        } );
                        titles.forEach( function ( title ) {
                                var normalizedTitle = title;
-                               while ( normalized[ normalizedTitle ] ) {
+                               while ( hasOwn.call( normalized, normalizedTitle ) ) {
                                        normalizedTitle = normalized[ normalizedTitle ];
                                }
                                cache.existenceCache[ title ] = pages[ normalizedTitle ];
@@ -81,7 +83,7 @@
         */
        PageExistenceCache.prototype.checkPageExistence = function ( title ) {
                var key = title.getPrefixedText();
-               if ( !this.existenceCheckQueue[ key ] ) {
+               if ( !hasOwn.call( this.existenceCheckQueue, key ) ) {
                        this.existenceCheckQueue[ key ] = $.Deferred();
                }
                this.processExistenceCheckQueueDebounced();
index d14a47a..3f19509 100644 (file)
@@ -5,7 +5,8 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 ( function ( $, mw ) {
-       var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+       var hasOwn = Object.prototype.hasOwnProperty,
+               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
 
        /**
         * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
                        promises = [],
                        deferred = $.Deferred();
 
-               if ( $.trim( input ) === '' ) {
+               if ( input.trim() === '' ) {
                        deferred.resolve( [] );
                        return deferred.promise();
                }
                        cacheKey = input + searchType.toString();
 
                // Check cache
-               if ( this.searchCache[ cacheKey ] !== undefined ) {
+               if ( hasOwn.call( this.searchCache, cacheKey ) ) {
                        return this.searchCache[ cacheKey ];
                }
 
index 0c6385b..190962c 100644 (file)
@@ -5,6 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 ( function ( $, mw ) {
+       var hasOwn = Object.prototype.hasOwnProperty;
 
        /**
         * Mixin for title widgets
                                titles.push( suggestionPage.title );
                        }
 
-                       redirects = redirectsTo[ suggestionPage.title ] || [];
+                       redirects = hasOwn.call( redirectsTo, suggestionPage.title ) ? redirectsTo[ suggestionPage.title ] : [];
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
                                pageData[ redirects[ i ] ] = {
                                        missing: false,
                // mismatch where normalisation would make them matching (T50476)
 
                pageExistsExact = (
-                       Object.prototype.hasOwnProperty.call( pageData, this.getQueryValue() ) &&
+                       hasOwn.call( pageData, this.getQueryValue() ) &&
                        (
                                !pageData[ this.getQueryValue() ].missing ||
                                pageData[ this.getQueryValue() ].known
                );
                pageExists = pageExistsExact || (
                        titleObj &&
-                       Object.prototype.hasOwnProperty.call( pageData, titleObj.getPrefixedText() ) &&
+                       hasOwn.call( pageData, titleObj.getPrefixedText() ) &&
                        (
                                !pageData[ titleObj.getPrefixedText() ].missing ||
                                pageData[ titleObj.getPrefixedText() ].known
                }
 
                for ( i = 0, len = titles.length; i < len; i++ ) {
-                       page = pageData[ titles[ i ] ] || {};
+                       page = hasOwn.call( pageData, titles[ i ] ) ? pageData[ titles[ i ] ] : {};
                        items.push( this.createOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
                }
 
index 14077e0..04462e3 100644 (file)
                 */
                isCategory: function ( title ) {
                        var apiPromise = this.get( {
+                               formatversion: 2,
                                prop: 'categoryinfo',
                                titles: String( title )
                        } );
 
                        return apiPromise
                                .then( function ( data ) {
-                                       var exists = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categoryinfo ) {
-                                                               exists = true;
-                                                       }
-                                               } );
-                                       }
-                                       return exists;
+                                       return !!data.query.pages[ 0 ].categoryinfo;
                                } )
                                .promise( { abort: apiPromise.abort } );
                },
@@ -46,6 +39,7 @@
                getCategoriesByPrefix: function ( prefix ) {
                        // Fetch with allpages to only get categories that have a corresponding description page.
                        var apiPromise = this.get( {
+                               formatversion: 2,
                                list: 'allpages',
                                apprefix: prefix,
                                apnamespace: mw.config.get( 'wgNamespaceIds' ).category
 
                        return apiPromise
                                .then( function ( data ) {
-                                       var texts = [];
-                                       if ( data.query && data.query.allpages ) {
-                                               $.each( data.query.allpages, function ( i, category ) {
-                                                       texts.push( new mw.Title( category.title ).getMainText() );
-                                               } );
-                                       }
-                                       return texts;
+                                       return data.query.allpages.map( function ( category ) {
+                                               return new mw.Title( category.title ).getMainText();
+                                       } );
                                } )
                                .promise( { abort: apiPromise.abort } );
                },
                 */
                getCategories: function ( title ) {
                        var apiPromise = this.get( {
+                               formatversion: 2,
                                prop: 'categories',
                                titles: String( title )
                        } );
 
                        return apiPromise
                                .then( function ( data ) {
-                                       var titles = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categories ) {
-                                                               if ( titles === false ) {
-                                                                       titles = [];
-                                                               }
-                                                               $.each( page.categories, function ( i, cat ) {
-                                                                       titles.push( new mw.Title( cat.title ) );
-                                                               } );
-                                                       }
-                                               } );
+                                       var page = data.query.pages[ 0 ];
+
+                                       if ( !page.categories ) {
+                                               return false;
                                        }
-                                       return titles;
+                                       return page.categories.map( function ( cat ) {
+                                               return new mw.Title( cat.title );
+                                       } );
                                } )
                                .promise( { abort: apiPromise.abort } );
                }
index a1a4999..688f0b2 100644 (file)
@@ -28,7 +28,7 @@
                        }, options ) ).then( function ( data ) {
                                var result = {};
 
-                               $.each( data.query.allmessages, function ( i, obj ) {
+                               data.query.allmessages.forEach( function ( obj ) {
                                        if ( !obj.missing ) {
                                                result[ obj.name ] = obj.content;
                                        }
index f50e59a..025c111 100644 (file)
@@ -28,7 +28,7 @@
                                {
                                        formatversion: 2,
                                        action: 'watch',
-                                       titles: Array.isArray( pages ) ? pages.join( '|' ) : String( pages )
+                                       titles: Array.isArray( pages ) ? pages : String( pages )
                                },
                                addParams
                        )
index d295ca7..8a44251 100644 (file)
@@ -9,7 +9,7 @@
                        oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen|mw-htmlform-dropdown)/g, '' ),
                        $select = $( '<select>' ),
                        dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
-               oldClass = $.trim( oldClass );
+               oldClass = oldClass.trim();
                $select.attr( {
                        name: name,
                        multiple: 'multiple',
index 0c572d4..4d56940 100644 (file)
         * @param {string[]} categories Array of categories to which this upload will be added.
         */
        ForeignStructuredUpload.prototype.addCategories = function ( categories ) {
-               var i, category;
-
-               for ( i = 0; i < categories.length; i++ ) {
-                       category = categories[ i ];
-                       this.categories.push( category );
-               }
+               // The length of the array must be less than 10000.
+               // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push#Merging_two_arrays
+               Array.prototype.push.apply( this.categories, categories );
        };
 
        /**
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getDescriptions = function () {
-               var i, desc, templateCalls = [];
-
-               for ( i = 0; i < this.descriptions.length; i++ ) {
-                       desc = this.descriptions[ i ];
-                       templateCalls.push(
-                               this.config.format.description
-                                       .replace( '$LANGUAGE', desc.language )
-                                       .replace( '$TEXT', desc.text )
-                       );
-               }
-
-               return templateCalls.join( '\n' );
+               return this.descriptions.map( function ( desc ) {
+                       return this.config.format.description
+                               .replace( '$LANGUAGE', desc.language )
+                               .replace( '$TEXT', desc.text );
+               } ).join( '\n' );
        };
 
        /**
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getCategories = function () {
-               var i, cat, categoryLinks = [];
-
                if ( this.categories.length === 0 ) {
                        return this.config.format.uncategorized;
                }
 
-               for ( i = 0; i < this.categories.length; i++ ) {
-                       cat = this.categories[ i ];
-                       categoryLinks.push( '[[Category:' + cat + ']]' );
-               }
-
-               return categoryLinks.join( '\n' );
+               return this.categories.map( function ( cat ) {
+                       return '[[Category:' + cat + ']]';
+               } ).join( '\n' );
        };
 
        /**
index 53cbd60..9db2771 100644 (file)
                namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
 
                // Normalise additional whitespace
-               title = $.trim( title.replace( /\s/g, ' ' ) );
+               title = title.replace( /\s/g, ' ' ).trim();
 
                // Process initial colon
                if ( title !== '' && title[ 0 ] === ':' ) {
                                ext = parts.pop();
 
                                // Remove whitespace of the name part (that W/O extension)
-                               title = $.trim( parts.join( '.' ) );
+                               title = parts.join( '.' ).trim();
 
                                // Cut, if too long and append file extension
                                title = trimFileNameToByteLength( title, ext );
                        } else {
 
                                // Missing file extension
-                               title = $.trim( parts.join( '.' ) );
+                               title = parts.join( '.' ).trim();
 
                                // Name has no file extension and a fallback wasn't provided either
                                return null;
index 3ade332..06788f5 100644 (file)
                                        $( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),
                                        { recoverable: false }
                                ) );
-                       } else if ( warnings.duplicate !== undefined ) {
-                               $.each( warnings.duplicate, function ( i, filename ) {
+                       } else if ( Array.isArray( warnings.duplicate ) ) {
+                               warnings.duplicate.forEach( function ( filename ) {
                                        var $a = $( '<a>' ).text( filename ),
                                                href = mw.Title.makeTitle( mw.config.get( 'wgNamespaceIds' ).file, filename ).getUrl( {} );
 
index 8b25a0b..ea91afe 100644 (file)
                 * @return {string} Localized namespace name
                 */
                ns: function ( nodes ) {
-                       var ns = $.trim( textify( nodes[ 0 ] ) );
+                       var ns = textify( nodes[ 0 ] ).trim();
                        if ( !/^\d+$/.test( ns ) ) {
                                ns = mw.config.get( 'wgNamespaceIds' )[ ns.replace( / /g, '_' ).toLowerCase() ];
                        }
index 5e0e343..4a3157c 100644 (file)
                compile: function ( src ) {
                        return {
                                render: function () {
-                                       return $( $.parseHTML( $.trim( src ) ) );
+                                       return $( $.parseHTML( src.trim() ) );
                                }
                        };
                }
index 3733e60..c176a67 100644 (file)
@@ -39,7 +39,7 @@ class TestSetup {
                $wgMainStash = 'hash';
                // Use memory job queue
                $wgJobTypeConf = [
-                       'default' => [ 'class' => 'JobQueueMemory', 'order' => 'fifo' ],
+                       'default' => [ 'class' => JobQueueMemory::class, 'order' => 'fifo' ],
                ];
 
                $wgUseDatabaseMessages = false; # Set for future resets
@@ -47,10 +47,10 @@ class TestSetup {
                // Assume UTC for testing purposes
                $wgLocaltimezone = 'UTC';
 
-               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+               $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
 
                // Do not bother updating search tables
-               $wgSearchType = 'SearchEngineDummy';
+               $wgSearchType = SearchEngineDummy::class;
 
                // Generic MediaWiki\Session\SessionManager configuration for tests
                // We use CookieSessionProvider because things might be expecting
index 1c41a6d..82149b3 100644 (file)
@@ -151,6 +151,7 @@ $wgAutoloadClasses += [
 
        # tests/phpunit/maintenance
        'MediaWiki\Tests\Maintenance\DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php",
+       'MediaWiki\Tests\Maintenance\MaintenanceBaseTestCase' => "$testDir/phpunit/maintenance/MaintenanceBaseTestCase.php",
 
        # tests/phpunit/media
        'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
index 81473df..3b02e28 100644 (file)
@@ -2,7 +2,7 @@
 
 use Wikimedia\TestingAccessWrapper;
 
-class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
+abstract class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
        protected static $httpEngine;
        protected $oldHttpEngine;
 
index 6cf1fca..9b5897c 100644 (file)
@@ -290,10 +290,10 @@ class ParserTestRunner {
                // Set up null lock managers
                $setup['wgLockManagers'] = [ [
                        'name' => 'fsLockManager',
-                       'class' => 'NullLockManager',
+                       'class' => NullLockManager::class,
                ], [
                        'name' => 'nullLockManager',
-                       'class' => 'NullLockManager',
+                       'class' => NullLockManager::class,
                ] ];
                $reset = function () {
                        LockManagerGroup::destroySingletons();
@@ -435,7 +435,7 @@ class ParserTestRunner {
 
                return new RepoGroup(
                        [
-                               'class' => 'MockLocalRepo',
+                               'class' => MockLocalRepo::class,
                                'name' => 'local',
                                'url' => 'http://example.com/images',
                                'hashLevels' => 2,
index aa03c0e..e6fa203 100644 (file)
@@ -20701,6 +20701,48 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </ul>
 !! end
 
+!! test
+Gallery (without px units)
+!! wikitext
+<gallery widths="70" heights="40">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/105px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/140px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"widths":"70","heights":"40"},"body":{"extsrc":"\nFile:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="8" width="70"/></a></figure-inline></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery (with invalid units)
+!! wikitext
+<gallery widths="70em" heights="40em">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"widths":"70em","heights":"40em"},"body":{"extsrc":"\nFile:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><figure-inline typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></figure-inline></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 !! test
 Gallery with link that has fragment
 !! options
index 52a565c..84132b9 100644 (file)
@@ -294,8 +294,6 @@ return [
         * to this black-list to inhibit them from being reported.
         */
        'suppress_issue_types' => [
-               // approximate error count: 1
-               "PhanAccessMethodProtected",
                // approximate error count: 29
                "PhanCommentParamOnEmptyParamList",
                // approximate error count: 33
index ed6479c..fe8c917 100644 (file)
@@ -260,7 +260,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                 * which we can't allow, as that would open a new connection for mysql.
                 * Replace with a HashBag. They would not be going to persist anyway.
                 */
-               $hashCache = [ 'class' => 'HashBagOStuff', 'reportDupes' => false ];
+               $hashCache = [ 'class' => HashBagOStuff::class, 'reportDupes' => false ];
                $objectCaches = [
                                CACHE_DB => $hashCache,
                                CACHE_ACCEL => $hashCache,
@@ -273,7 +273,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $defaultOverrides->set( 'ObjectCaches', $objectCaches );
                $defaultOverrides->set( 'MainCacheType', CACHE_NONE );
-               $defaultOverrides->set( 'JobTypeConf', [ 'default' => [ 'class' => 'JobQueueMemory' ] ] );
+               $defaultOverrides->set( 'JobTypeConf', [ 'default' => [ 'class' => JobQueueMemory::class ] ] );
 
                // Use a fast hash algorithm to hash passwords.
                $defaultOverrides->set( 'PasswordDefault', 'A' );
index 1024ecd..9719862 100644 (file)
@@ -40,7 +40,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'skin' => $options['skin'],
                                'target' => 'phpunit',
                ] );
-               $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
+               $ctx = $this->getMockBuilder( ResourceLoaderContext::class )
                        ->setConstructorArgs( [ $resourceLoader, $request ] )
                        ->setMethods( [ 'getDirection' ] )
                        ->getMock();
index 6f09d4c..4b0b187 100644 (file)
@@ -90,7 +90,7 @@ if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
                        || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory )
                )
        ) {
-               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+               $wgLocalisationCacheConf['storeClass'] = LCStoreNull::class;
        }
 }
 
index 24f6596..8c4a488 100644 (file)
@@ -20,7 +20,7 @@ class AutopromoteTest extends MediaWikiTestCase {
                ] );
 
                /** @var PHPUnit_Framework_MockObject_MockObject|User $userMock */
-               $userMock = $this->getMock( 'User', [ 'getEditCount' ] );
+               $userMock = $this->getMock( User::class, [ 'getEditCount' ] );
                if ( $requirement > 0 ) {
                        $userMock->expects( $this->once() )
                                ->method( 'getEditCount' )
index b765494..1e46555 100644 (file)
@@ -174,7 +174,7 @@ class BlockTest extends MediaWikiLangTestCase {
                );
 
                $this->assertInstanceOf(
-                       'Block',
+                       Block::class,
                        $userBlock,
                        "'$username' block block object should be existent"
                );
index 65c5d65..8f0826b 100644 (file)
@@ -717,7 +717,7 @@ hello
                $ep->importFormData( $req );
 
                $this->setExpectedException(
-                       'MWException',
+                       MWException::class,
                        'This content model is not supported: testing'
                );
 
index 7e32770..6695fce 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-/** tests for includes/Html.php */
 
 class HtmlTest extends MediaWikiTestCase {
 
index c7b3ce8..0e96bf4 100644 (file)
@@ -20,6 +20,6 @@ class LicensesTest extends MediaWikiTestCase {
                        'name' => 'AnotherName',
                        'licenses' => $str,
                ] );
-               $this->assertThat( $lc, $this->isInstanceOf( 'Licenses' ) );
+               $this->assertThat( $lc, $this->isInstanceOf( Licenses::class ) );
        }
 }
index 7bbf448..3574545 100644 (file)
@@ -9,14 +9,14 @@ class ListToggleTest extends MediaWikiTestCase {
         * @covers ListToggle::__construct
         */
        public function testConstruct() {
-               $output = $this->getMockBuilder( 'OutputPage' )
+               $output = $this->getMockBuilder( OutputPage::class )
                        ->setMethods( null )
                        ->disableOriginalConstructor()
                        ->getMock();
 
                $listToggle = new ListToggle( $output );
 
-               $this->assertInstanceOf( 'ListToggle', $listToggle );
+               $this->assertInstanceOf( ListToggle::class, $listToggle );
                $this->assertContains( 'mediawiki.checkboxtoggle', $output->getModules() );
                $this->assertContains( 'mediawiki.checkboxtoggle.styles', $output->getModuleStyles() );
        }
@@ -25,7 +25,7 @@ class ListToggleTest extends MediaWikiTestCase {
         * @covers ListToggle::getHTML
         */
        public function testGetHTML() {
-               $output = $this->createMock( 'OutputPage' );
+               $output = $this->createMock( OutputPage::class );
                $output->expects( $this->any() )
                        ->method( 'msg' )
                        ->will( $this->returnCallback( function ( $key ) {
index 91101bd..f705537 100644 (file)
@@ -5,11 +5,8 @@
  * @file
  */
 
-/**
- * Test class for MWNamespace.
- * @todo FIXME: this test file is a mess
- */
 class MWNamespaceTest extends MediaWikiTestCase {
+
        protected function setUp() {
                parent::setUp();
 
@@ -26,15 +23,12 @@ class MWNamespaceTest extends MediaWikiTestCase {
                ] );
        }
 
-# ### START OF TESTS #########################################################
-
        /**
         * @todo Write more texts, handle $wgAllowImageMoving setting
         * @covers MWNamespace::isMovable
         */
        public function testIsMovable() {
                $this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
-               # @todo FIXME: Write more tests!!
        }
 
        /**
@@ -153,18 +147,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $this->assertNull( MWNamespace::getAssociated( NS_SPECIAL ) );
        }
 
-       /**
-        * @todo Implement testExists().
-        */
-       /*
-       public function testExists() {
-               // Remove the following lines when you implement this test.
-               $this->markTestIncomplete(
-                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
-               );
-       }
-       */
-
        /**
         * Test MWNamespace::equals
         * Note if we add a namespace registration system with keys like 'MAIN'
@@ -215,52 +197,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * @todo Implement testGetCanonicalNamespaces().
-        */
-       /*
-       public function testGetCanonicalNamespaces() {
-               // Remove the following lines when you implement this test.
-               $this->markTestIncomplete(
-                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
-               );
-       }
-       */
-       /**
-        * @todo Implement testGetCanonicalName().
-        */
-       /*
-               public function testGetCanonicalName() {
-                       // Remove the following lines when you implement this test.
-                       $this->markTestIncomplete(
-                               'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
-                       );
-               }
-       */
-       /**
-        * @todo Implement testGetCanonicalIndex().
-        */
-       /*
-       public function testGetCanonicalIndex() {
-               // Remove the following lines when you implement this test.
-               $this->markTestIncomplete(
-                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
-               );
-       }
-       */
-
-       /**
-        * @todo Implement testGetValidNamespaces().
-        */
-       /*
-       public function testGetValidNamespaces() {
-               // Remove the following lines when you implement this test.
-               $this->markTestIncomplete(
-                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
-               );
-       }
-       */
-
        public function provideHasTalkNamespace() {
                return [
                        [ NS_MEDIA, false ],
index c1a46fe..9735eeb 100644 (file)
@@ -23,7 +23,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->createMock( 'User' );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
@@ -156,7 +156,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->createMock( 'User' );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
index dbb7799..859a40f 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+
+use Mediawiki\Http\HttpRequestFactory;
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
@@ -9,6 +11,7 @@ use MediaWiki\Services\ServiceDisabledException;
 use MediaWiki\Shell\CommandFactory;
 use MediaWiki\Storage\BlobStore;
 use MediaWiki\Storage\BlobStoreFactory;
+use MediaWiki\Storage\RevisionLookup;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SqlBlobStore;
 
@@ -51,14 +54,14 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
        public function testGetInstance() {
                $services = MediaWikiServices::getInstance();
-               $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $services );
+               $this->assertInstanceOf( MediaWikiServices::class, $services );
        }
 
        public function testForceGlobalInstance() {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $oldServices );
+               $this->assertInstanceOf( MediaWikiServices::class, $oldServices );
                $this->assertNotSame( $oldServices, $newServices );
 
                $theServices = MediaWikiServices::getInstance();
@@ -147,7 +150,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $lbFactory = $this->getMockBuilder( 'LBFactorySimple' )
+               $lbFactory = $this->getMockBuilder( \Wikimedia\Rdbms\LBFactorySimple::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -222,7 +225,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'Test',
                        function () use ( &$serviceCounter ) {
                                $serviceCounter++;
-                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( MediaWiki\Services\DestructibleService::class );
                                $service->expects( $this->once() )->method( 'destroy' );
                                return $service;
                        }
@@ -251,7 +254,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $services->defineService(
                        'Test',
                        function () {
-                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( MediaWiki\Services\DestructibleService::class );
                                $service->expects( $this->never() )->method( 'destroy' );
                                return $service;
                        }
@@ -313,7 +316,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
                        'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
                        'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ],
-                       'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
+                       'DBLoadBalancer' => [ 'DBLoadBalancer', Wikimedia\Rdbms\LoadBalancer::class ],
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                        'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
                        'CryptRand' => [ 'CryptRand', CryptRand::class ],
@@ -339,6 +342,8 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'BlobStore' => [ 'BlobStore', BlobStore::class ],
                        '_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ],
                        'RevisionStore' => [ 'RevisionStore', RevisionStore::class ],
+                       'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ],
+                       'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ],
                ];
        }
 
index f44ae32..54db581 100644 (file)
@@ -68,7 +68,7 @@ class MergeHistoryTest extends MediaWikiTestCase {
        public function testIsValidMergeRevisionLimit() {
                $limit = MergeHistory::REVISION_LIMIT;
 
-               $mh = $this->getMockBuilder( 'MergeHistory' )
+               $mh = $this->getMockBuilder( MergeHistory::class )
                        ->setMethods( [ 'getRevisionCount' ] )
                        ->setConstructorArgs( [
                                Title::newFromText( 'Test' ),
index f99cccd..fa77824 100644 (file)
@@ -27,7 +27,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertSame( $params, $message->getParams() );
                $this->assertEquals( $expectedLang, $message->getLanguage() );
 
-               $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
+               $messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class );
                $messageSpecifier->expects( $this->any() )
                        ->method( 'getKey' )->will( $this->returnValue( $key ) );
                $messageSpecifier->expects( $this->any() )
@@ -200,16 +200,16 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers ::wfMessage
         */
        public function testWfMessage() {
-               $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
-               $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
+               $this->assertInstanceOf( Message::class, wfMessage( 'mainpage' ) );
+               $this->assertInstanceOf( Message::class, wfMessage( 'i-dont-exist-evar' ) );
        }
 
        /**
         * @covers Message::newFromKey
         */
        public function testNewFromKey() {
-               $this->assertInstanceOf( 'Message', Message::newFromKey( 'mainpage' ) );
-               $this->assertInstanceOf( 'Message', Message::newFromKey( 'i-dont-exist-evar' ) );
+               $this->assertInstanceOf( Message::class, Message::newFromKey( 'mainpage' ) );
+               $this->assertInstanceOf( Message::class, Message::newFromKey( 'i-dont-exist-evar' ) );
        }
 
        /**
@@ -812,7 +812,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $msg = unserialize( serialize( $msg ) );
                $this->assertSame( '(<a>foo</a>)', $msg->parse() );
                $title = TestingAccessWrapper::newFromObject( $msg )->title;
-               $this->assertInstanceOf( 'Title', $title );
+               $this->assertInstanceOf( Title::class, $title );
                $this->assertSame( 'Testing', $title->getFullText() );
 
                $msg = new Message( 'mainpage' );
index 44b9707..be28e43 100644 (file)
@@ -311,7 +311,7 @@ class OutputPageTest extends MediaWikiTestCase {
                        'wgResourceLoaderDebug' => false,
                        'wgLoadScript' => 'http://127.0.0.1:8080/w/load.php',
                ] );
-               $class = new ReflectionClass( 'OutputPage' );
+               $class = new ReflectionClass( OutputPage::class );
                $method = $class->getMethod( 'makeResourceLoaderLink' );
                $method->setAccessible( true );
                $ctx = new RequestContext();
@@ -398,7 +398,7 @@ class OutputPageTest extends MediaWikiTestCase {
                $ctx = new RequestContext();
                $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
                $ctx->setLanguage( 'en' );
-               $outputPage = $this->getMockBuilder( 'OutputPage' )
+               $outputPage = $this->getMockBuilder( OutputPage::class )
                        ->setConstructorArgs( [ $ctx ] )
                        ->setMethods( [ 'isUserCssPreview', 'buildCssLinksArray' ] )
                        ->getMock();
@@ -434,7 +434,7 @@ class OutputPageTest extends MediaWikiTestCase {
         */
        public function testVaryHeaders( $calls, $vary, $key ) {
                // get rid of default Vary fields
-               $outputPage = $this->getMockBuilder( 'OutputPage' )
+               $outputPage = $this->getMockBuilder( OutputPage::class )
                        ->setConstructorArgs( [ new RequestContext() ] )
                        ->setMethods( [ 'getCacheVaryCookies' ] )
                        ->getMock();
@@ -539,7 +539,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                'page_title' => 'Test2'
                        ]
                ] );
-               $outputPage = $this->getMockBuilder( 'OutputPage' )
+               $outputPage = $this->getMockBuilder( OutputPage::class )
                        ->setConstructorArgs( [ new RequestContext() ] )
                        ->setMethods( [ 'addCategoryLinksToLBAndGetResult' ] )
                        ->getMock();
index 2f3e569..ed34a8a 100644 (file)
@@ -58,8 +58,8 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                        'wgCapitalLinkOverrides' => [ self::NS_NONCAP => false ],
                ] );
 
-               $this->originalHandlers = TestingAccessWrapper::newFromClass( 'Hooks' )->handlers;
-               TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = [];
+               $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
+               TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
 
                // Clear caches so that our new namespace appears
                MWNamespace::clearCaches();
@@ -74,7 +74,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
 
                parent::tearDown();
 
-               TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = $this->originalHandlers;
+               TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
 
                SpecialPageFactory::resetList();
        }
index 427a95e..511b109 100644 (file)
@@ -837,9 +837,9 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
        public function provideGetContentHandler() {
                // NOTE: we expect the help namespace to always contain wikitext
                return [
-                       [ 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ],
-                       [ 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ],
-                       [ serialize( 'hello world' ), 'Dummy:Hello', null, null, 'DummyContentHandlerForTesting' ],
+                       [ 'hello world', 'Help:Hello', null, null, WikitextContentHandler::class ],
+                       [ 'hello world', 'User:hello/there.css', null, null, CssContentHandler::class ],
+                       [ serialize( 'hello world' ), 'Dummy:Hello', null, null, DummyContentHandlerForTesting::class ],
                ];
        }
 
index c0930e3..3d74ae3 100644 (file)
@@ -36,7 +36,7 @@ class SampleTest extends MediaWikiLangTestCase {
         */
        public function testTitleObjectStringConversion() {
                $title = Title::newFromText( "text" );
-               $this->assertInstanceOf( 'Title', $title, "Title creation" );
+               $this->assertInstanceOf( Title::class, $title, "Title creation" );
                $this->assertEquals( "Text", $title, "Automatic string conversion" );
 
                $title = Title::newFromText( "text", NS_MEDIA );
index ae23a43..54c05ec 100644 (file)
@@ -30,7 +30,7 @@ class StatusTest extends MediaWikiLangTestCase {
         * @covers Status::newFatal
         */
        public function testNewFatalWithMessage() {
-               $message = $this->getMockBuilder( 'Message' )
+               $message = $this->getMockBuilder( Message::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -224,7 +224,7 @@ class StatusTest extends MediaWikiLangTestCase {
        }
 
        protected function getMockMessage( $key = 'key', $params = [] ) {
-               $message = $this->getMockBuilder( 'Message' )
+               $message = $this->getMockBuilder( Message::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $message->expects( $this->atLeastOnce() )
@@ -311,7 +311,7 @@ class StatusTest extends MediaWikiLangTestCase {
         * @covers Status::cleanParams
         */
        public function testCleanParams( $cleanCallback, $params, $expected ) {
-               $method = new ReflectionMethod( 'Status', 'cleanParams' );
+               $method = new ReflectionMethod( Status::class, 'cleanParams' );
                $method->setAccessible( true );
                $status = new Status();
                $status->cleanCallback = $cleanCallback;
@@ -449,23 +449,23 @@ class StatusTest extends MediaWikiLangTestCase {
                Status $status, $expectedParams = [], $expectedKey, $expectedWrapper
        ) {
                $message = $status->getMessage( null, null, 'qqx' );
-               $this->assertInstanceOf( 'Message', $message );
+               $this->assertInstanceOf( Message::class, $message );
                $this->assertEquals( $expectedParams, self::sanitizedMessageParams( $message ),
                        'Message::getParams' );
                $this->assertEquals( $expectedKey, $message->getKey(), 'Message::getKey' );
 
                $message = $status->getMessage( 'wrapper-short', 'wrapper-long' );
-               $this->assertInstanceOf( 'Message', $message );
+               $this->assertInstanceOf( Message::class, $message );
                $this->assertEquals( $expectedWrapper, $message->getKey(), 'Message::getKey with wrappers' );
                $this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
 
                $message = $status->getMessage( 'wrapper' );
-               $this->assertInstanceOf( 'Message', $message );
+               $this->assertInstanceOf( Message::class, $message );
                $this->assertEquals( 'wrapper', $message->getKey(), 'Message::getKey with wrappers' );
                $this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
 
                $message = $status->getMessage( false, 'wrapper' );
-               $this->assertInstanceOf( 'Message', $message );
+               $this->assertInstanceOf( Message::class, $message );
                $this->assertEquals( 'wrapper', $message->getKey(), 'Message::getKey with wrappers' );
                $this->assertCount( 1, $message->getParams(), 'Message::getParams with wrappers' );
        }
@@ -560,7 +560,7 @@ class StatusTest extends MediaWikiLangTestCase {
         * @covers Status::getErrorMessage
         */
        public function testGetErrorMessage() {
-               $method = new ReflectionMethod( 'Status', 'getErrorMessage' );
+               $method = new ReflectionMethod( Status::class, 'getErrorMessage' );
                $method->setAccessible( true );
                $status = new Status();
                $key = 'foo';
@@ -568,7 +568,7 @@ class StatusTest extends MediaWikiLangTestCase {
 
                /** @var Message $message */
                $message = $method->invoke( $status, array_merge( [ $key ], $params ) );
-               $this->assertInstanceOf( 'Message', $message );
+               $this->assertInstanceOf( Message::class, $message );
                $this->assertEquals( $key, $message->getKey() );
                $this->assertEquals( $params, $message->getParams() );
        }
@@ -577,7 +577,7 @@ class StatusTest extends MediaWikiLangTestCase {
         * @covers Status::getErrorMessageArray
         */
        public function testGetErrorMessageArray() {
-               $method = new ReflectionMethod( 'Status', 'getErrorMessageArray' );
+               $method = new ReflectionMethod( Status::class, 'getErrorMessageArray' );
                $method->setAccessible( true );
                $status = new Status();
                $key = 'foo';
@@ -595,7 +595,7 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertInternalType( 'array', $messageArray );
                $this->assertCount( 2, $messageArray );
                foreach ( $messageArray as $message ) {
-                       $this->assertInstanceOf( 'Message', $message );
+                       $this->assertInstanceOf( Message::class, $message );
                        $this->assertEquals( $key, $message->getKey() );
                        $this->assertEquals( $params, $message->getParams() );
                }
index 6d2b09b..dbbef11 100644 (file)
@@ -134,6 +134,18 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
                        [ 'gzip', 'object' ],
                        '2®Àþ2',
                ];
+               yield 'T184749 (windows-1252 encoding), string in string out' => [
+                       'windows-1252',
+                       iconv( 'utf-8', 'windows-1252', "sammansättningar" ),
+                       [],
+                       'sammansättningar',
+               ];
+               yield 'T184749 (windows-1252 encoding), string in string out with gzip' => [
+                       'windows-1252',
+                       gzdeflate( iconv( 'utf-8', 'windows-1252', "sammansättningar" ) ),
+                       [ 'gzip' ],
+                       'sammansättningar',
+               ];
        }
 
        /**
@@ -190,6 +202,7 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
        public function provideBlobs() {
                yield [ '' ];
                yield [ 'someText' ];
+               yield [ "sammansättningar" ];
        }
 
        /**
@@ -203,4 +216,26 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
                $this->assertSame( $blob, $store->getBlob( $address ) );
        }
 
+       /**
+        * @dataProvider provideBlobs
+        * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
+        */
+       public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncoding( $blob ) {
+               $store = $this->getBlobStore( 'windows-1252' );
+               $address = $store->storeBlob( $blob );
+               $this->assertSame( $blob, $store->getBlob( $address ) );
+       }
+
+       /**
+        * @dataProvider provideBlobs
+        * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
+        */
+       public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncodingGzip( $blob ) {
+               $store = $this->getBlobStore( 'windows-1252', true );
+               $address = $store->storeBlob( $blob );
+               $this->assertSame( $blob, $store->getBlob( $address ) );
+       }
+
 }
index 4a803e6..ccccf0f 100644 (file)
@@ -116,7 +116,7 @@ class TemplateParserTest extends MediaWikiTestCase {
                $this->assertEquals( 'rrr', $tp->processTemplate( 'recurse', $data ) );
 
                $tp->enableRecursivePartials( false );
-               $this->setExpectedException( 'Exception' );
+               $this->setExpectedException( Exception::class );
                $tp->processTemplate( 'recurse', $data );
        }
 
index 8882214..63956c1 100644 (file)
@@ -9,7 +9,7 @@ class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
        use MediaWikiCoversValidator;
 
        private function getMockResultWrapper( $row = null, $numRows = 1 ) {
-               $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
+               $resultWrapper = $this->getMockBuilder( Wikimedia\Rdbms\ResultWrapper::class )
                        ->disableOriginalConstructor();
 
                $resultWrapper = $resultWrapper->getMock();
@@ -61,7 +61,7 @@ class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
 
                $this->assertEquals( $resultWrapper, $object->res );
                $this->assertSame( 0, $object->key );
-               $this->assertInstanceOf( 'Title', $object->current );
+               $this->assertInstanceOf( Title::class, $object->current );
                $this->assertEquals( $namespace, $object->current->mNamespace );
                $this->assertEquals( $title, $object->current->mTextform );
        }
@@ -94,7 +94,7 @@ class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
                $title = 'foo';
                $row = $this->getRowWithTitle( $namespace, $title );
                $object = $this->getTitleArrayFromResult( $this->getMockResultWrapper( $row ) );
-               $this->assertInstanceOf( 'Title', $object->current() );
+               $this->assertInstanceOf( Title::class, $object->current() );
                $this->assertEquals( $namespace, $object->current->mNamespace );
                $this->assertEquals( $title, $object->current->mTextform );
        }
index 54cdbe2..f4eb6bf 100644 (file)
@@ -318,7 +318,7 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
         */
        public function testGetOtherPage( $text, $expected ) {
                if ( $expected === null ) {
-                       $this->setExpectedException( 'MWException' );
+                       $this->setExpectedException( MWException::class );
                }
 
                $title = Title::newFromText( $text );
index d12e4b8..c81a078 100644 (file)
@@ -163,7 +163,7 @@ class TitleTest extends MediaWikiTestCase {
         */
        public function testSecureAndSplitValid( $text ) {
                $this->secureAndSplitGlobals();
-               $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
+               $this->assertInstanceOf( Title::class, Title::newFromText( $text ), "Valid: $text" );
        }
 
        /**
@@ -434,7 +434,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->setContentLang( $contLang );
 
                $title = Title::newFromText( $titleText );
-               $this->assertInstanceOf( 'Title', $title,
+               $this->assertInstanceOf( Title::class, $title,
                        "Test must be passed a valid title text, you gave '$titleText'"
                );
                $this->assertEquals( $expected,
index 041e7e3..936f4f5 100644 (file)
@@ -126,7 +126,7 @@ class WebRequestTest extends MediaWikiTestCase {
        protected function mockWebRequest( $data = [] ) {
                // Cannot use PHPUnit getMockBuilder() as it does not support
                // overriding protected properties afterwards
-               $reflection = new ReflectionClass( 'WebRequest' );
+               $reflection = new ReflectionClass( WebRequest::class );
                $req = $reflection->newInstanceWithoutConstructor();
 
                $prop = $reflection->getProperty( 'data' );
index 4a280da..e46fc67 100644 (file)
@@ -55,7 +55,7 @@ class XmlTest extends MediaWikiTestCase {
         * @covers Xml::expandAttributes
         */
        public function testExpandAttributesException() {
-               $this->setExpectedException( 'MWException' );
+               $this->setExpectedException( MWException::class );
                Xml::expandAttributes( 'string' );
        }
 
index f97dd73..4d54334 100644 (file)
@@ -20,7 +20,7 @@ class ActionTest extends MediaWikiTestCase {
                        'disabled' => false,
                        'view' => true,
                        'edit' => true,
-                       'revisiondelete' => 'SpecialPageAction',
+                       'revisiondelete' => SpecialPageAction::class,
                        'dummy' => true,
                        'string' => 'NamedDummyAction',
                        'declared' => 'NonExistingClassName',
index bb4ea75..788d120 100644 (file)
@@ -22,7 +22,7 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                $generator = new MockApiQueryBase( 'generator' );
 
                $manager = self::getManager( '', $allModules, [ 'mock1', 'mock2' ] );
-               $this->assertSame( 'ApiMain', $manager->getSource() );
+               $this->assertSame( ApiMain::class, $manager->getSource() );
                $this->assertSame( false, $manager->isGeneratorDone() );
                $this->assertSame( $allModules, $manager->getRunModules() );
                $manager->addContinueParam( $allModules[0], 'm1continue', [ 1, 2 ] );
index c82edf0..7eac559 100644 (file)
@@ -478,7 +478,7 @@ class ApiEditPageTest extends ApiTestCase {
 
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
-                       'ApiUsageException',
+                       ApiUsageException::class,
                        'Direct editing via API is not supported for content model ' .
                                'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
index 3cf1fde..ed4d683 100644 (file)
@@ -142,7 +142,7 @@ class ApiLoginTest extends ApiTestCase {
                libxml_use_internal_errors( true );
                $sxe = simplexml_load_string( $req->getContent() );
                $this->assertNotInternalType( "bool", $sxe );
-               $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
+               $this->assertThat( $sxe, $this->isInstanceOf( SimpleXMLElement::class ) );
                $this->assertNotInternalType( "null", $sxe->login[0] );
 
                $a = $sxe->login[0]->attributes()->result[0];
index ad334e9..83eba54 100644 (file)
@@ -126,7 +126,7 @@ class ApiMainTest extends ApiTestCase {
                $priv = TestingAccessWrapper::newFromObject( $api );
                $priv->mInternalMode = false;
 
-               $module = $this->getMockBuilder( 'ApiBase' )
+               $module = $this->getMockBuilder( ApiBase::class )
                        ->setConstructorArgs( [ $api, 'mock' ] )
                        ->setMethods( [ 'getConditionalRequestData' ] )
                        ->getMockForAbstractClass();
@@ -223,7 +223,7 @@ class ApiMainTest extends ApiTestCase {
                $priv = TestingAccessWrapper::newFromObject( $api );
                $priv->mInternalMode = false;
 
-               $module = $this->getMockBuilder( 'ApiBase' )
+               $module = $this->getMockBuilder( ApiBase::class )
                        ->setConstructorArgs( [ $api, 'mock' ] )
                        ->setMethods( [ 'getConditionalRequestData' ] )
                        ->getMockForAbstractClass();
@@ -491,7 +491,7 @@ class ApiMainTest extends ApiTestCase {
                )->inLanguage( 'en' )->useDatabase( false )->text();
 
                $dbex = new DBQueryError(
-                       $this->createMock( 'IDatabase' ),
+                       $this->createMock( \Wikimedia\Rdbms\IDatabase::class ),
                        'error', 1234, 'SELECT 1', __METHOD__ );
                $dbtrace = wfMessage( 'api-exception-trace',
                        get_class( $dbex ),
index be17bba..b01b90e 100644 (file)
@@ -24,21 +24,21 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                        'plain class' => [
                                'login',
                                'action',
-                               'ApiLogin',
+                               ApiLogin::class,
                                null,
                        ],
 
                        'with factory' => [
                                'login',
                                'action',
-                               'ApiLogin',
+                               ApiLogin::class,
                                [ $this, 'newApiLogin' ],
                        ],
 
                        'with closure' => [
                                'logout',
                                'action',
-                               'ApiLogout',
+                               ApiLogout::class,
                                function ( ApiMain $main, $action ) {
                                        return new ApiLogout( $main, $action );
                                },
@@ -66,8 +66,8 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
 
                        'simple' => [
                                [
-                                       'login' => 'ApiLogin',
-                                       'logout' => 'ApiLogout',
+                                       'login' => ApiLogin::class,
+                                       'logout' => ApiLogout::class,
                                ],
                                'action',
                        ],
@@ -75,11 +75,11 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                        'with factories' => [
                                [
                                        'login' => [
-                                               'class' => 'ApiLogin',
+                                               'class' => ApiLogin::class,
                                                'factory' => [ $this, 'newApiLogin' ],
                                        ],
                                        'logout' => [
-                                               'class' => 'ApiLogout',
+                                               'class' => ApiLogout::class,
                                                'factory' => function ( ApiMain $main, $action ) {
                                                        return new ApiLogout( $main, $action );
                                                },
@@ -107,14 +107,14 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
 
        public function getModuleProvider() {
                $modules = [
-                       'feedrecentchanges' => 'ApiFeedRecentChanges',
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
+                       'feedrecentchanges' => ApiFeedRecentChanges::class,
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
                        'login' => [
-                               'class' => 'ApiLogin',
+                               'class' => ApiLogin::class,
                                'factory' => [ $this, 'newApiLogin' ],
                        ],
                        'logout' => [
-                               'class' => 'ApiLogout',
+                               'class' => ApiLogout::class,
                                'factory' => function ( ApiMain $main, $action ) {
                                        return new ApiLogout( $main, $action );
                                },
@@ -125,25 +125,25 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                        'legacy entry' => [
                                $modules,
                                'feedrecentchanges',
-                               'ApiFeedRecentChanges',
+                               ApiFeedRecentChanges::class,
                        ],
 
                        'just a class' => [
                                $modules,
                                'feedcontributions',
-                               'ApiFeedContributions',
+                               ApiFeedContributions::class,
                        ],
 
                        'with factory' => [
                                $modules,
                                'login',
-                               'ApiLogin',
+                               ApiLogin::class,
                        ],
 
                        'with closure' => [
                                $modules,
                                'logout',
-                               'ApiLogout',
+                               ApiLogout::class,
                        ],
                ];
        }
@@ -178,8 +178,8 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetModule_null() {
                $modules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -194,13 +194,13 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetNames() {
                $fooModules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $barModules = [
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
-                       'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -220,13 +220,13 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetNamesWithClasses() {
                $fooModules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $barModules = [
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
-                       'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -238,8 +238,8 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
 
                $allNamesWithClasses = $moduleManager->getNamesWithClasses();
                $allModules = array_merge( $fooModules, [
-                       'feedcontributions' => 'ApiFeedContributions',
-                       'feedrecentchanges' => 'ApiFeedRecentChanges',
+                       'feedcontributions' => ApiFeedContributions::class,
+                       'feedrecentchanges' => ApiFeedRecentChanges::class,
                ] );
                $this->assertArrayEquals( $allModules, $allNamesWithClasses );
        }
@@ -249,13 +249,13 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetModuleGroup() {
                $fooModules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $barModules = [
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
-                       'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -272,13 +272,13 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetGroups() {
                $fooModules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $barModules = [
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
-                       'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -294,13 +294,13 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
         */
        public function testGetClassName() {
                $fooModules = [
-                       'login' => 'ApiLogin',
-                       'logout' => 'ApiLogout',
+                       'login' => ApiLogin::class,
+                       'logout' => ApiLogout::class,
                ];
 
                $barModules = [
-                       'feedcontributions' => [ 'class' => 'ApiFeedContributions' ],
-                       'feedrecentchanges' => [ 'class' => 'ApiFeedRecentChanges' ],
+                       'feedcontributions' => [ 'class' => ApiFeedContributions::class ],
+                       'feedrecentchanges' => [ 'class' => ApiFeedRecentChanges::class ],
                ];
 
                $moduleManager = $this->getModuleManager();
@@ -308,19 +308,19 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $moduleManager->addModules( $barModules, 'bar' );
 
                $this->assertEquals(
-                       'ApiLogin',
+                       ApiLogin::class,
                        $moduleManager->getClassName( 'login' )
                );
                $this->assertEquals(
-                       'ApiLogout',
+                       ApiLogout::class,
                        $moduleManager->getClassName( 'logout' )
                );
                $this->assertEquals(
-                       'ApiFeedContributions',
+                       ApiFeedContributions::class,
                        $moduleManager->getClassName( 'feedcontributions' )
                );
                $this->assertEquals(
-                       'ApiFeedRecentChanges',
+                       ApiFeedRecentChanges::class,
                        $moduleManager->getClassName( 'feedrecentchanges' )
                );
                $this->assertFalse(
index cc993d5..209ca07 100644 (file)
@@ -36,7 +36,7 @@ class ApiOpenSearchTest extends MediaWikiTestCase {
        }
 
        private function replaceSearchEngineConfig() {
-               $config = $this->getMockBuilder( 'SearchEngineConfig' )
+               $config = $this->getMockBuilder( SearchEngineConfig::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $this->setService( 'SearchEngineConfig', $config );
@@ -45,10 +45,10 @@ class ApiOpenSearchTest extends MediaWikiTestCase {
        }
 
        private function replaceSearchEngine() {
-               $engine = $this->getMockBuilder( 'SearchEngine' )
+               $engine = $this->getMockBuilder( SearchEngine::class )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $engineFactory = $this->getMockBuilder( 'SearchEngineFactory' )
+               $engineFactory = $this->getMockBuilder( SearchEngineFactory::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $engineFactory->expects( $this->any() )
index 7e45f4d..c0fecf0 100644 (file)
@@ -22,7 +22,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $this->mUserMock = $this->getMockBuilder( 'User' )
+               $this->mUserMock = $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 0d3e63f..f64af6d 100644 (file)
@@ -14,7 +14,7 @@ class ApiFormatRawTest extends ApiFormatTestBase {
         */
        public static function provideGeneralEncoding() {
                $options = [
-                       'class' => 'ApiFormatRaw',
+                       'class' => ApiFormatRaw::class,
                        'factory' => function ( ApiMain $main ) {
                                return new ApiFormatRaw( $main, new ApiFormatJson( $main, 'json' ) );
                        }
@@ -105,7 +105,7 @@ class ApiFormatRawTest extends ApiFormatTestBase {
                        '{"mime":"text/plain","text":"some text","error":"some error"}',
                        [],
                        [
-                               'class' => 'ApiFormatRaw',
+                               'class' => ApiFormatRaw::class,
                                'factory' => function ( ApiMain $main ) use ( &$apiMain ) {
                                        $apiMain = $main;
                                        $printer = new ApiFormatRaw( $main, new ApiFormatJson( $main, 'json' ) );
index c612f26..f0d8384 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- *
- * Created on Feb 6, 2013
- *
  * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index 704c417..2371eea 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Jan 1, 2013
- *
  * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index f3d7cb6..e7588cb 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Created on Feb 10, 2013
- *
  * Copyright © 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
index a3b0df5..b271b70 100644 (file)
@@ -13,7 +13,7 @@ class AbstractAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = $this->getMockForAbstractClass( AbstractAuthenticationProvider::class );
                $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
-               $obj = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface' );
+               $obj = $this->getMockForAbstractClass( \Psr\Log\LoggerInterface::class );
                $provider->setLogger( $obj );
                $this->assertSame( $obj, $providerPriv->logger, 'setLogger' );
 
@@ -21,7 +21,7 @@ class AbstractAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider->setManager( $obj );
                $this->assertSame( $obj, $providerPriv->manager, 'setManager' );
 
-               $obj = $this->getMockForAbstractClass( 'Config' );
+               $obj = $this->getMockForAbstractClass( \Config::class );
                $provider->setConfig( $obj );
                $this->assertSame( $obj, $providerPriv->config, 'setConfig' );
 
index 76d8ee9..cb015df 100644 (file)
@@ -33,7 +33,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPasswordFactory();
-               $this->assertInstanceOf( 'PasswordFactory', $obj );
+               $this->assertInstanceOf( \PasswordFactory::class, $obj );
                $this->assertSame( $obj, $providerPriv->getPasswordFactory() );
        }
 
@@ -46,10 +46,10 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPassword( null );
-               $this->assertInstanceOf( 'Password', $obj );
+               $this->assertInstanceOf( \Password::class, $obj );
 
                $obj = $providerPriv->getPassword( 'invalid' );
-               $this->assertInstanceOf( 'Password', $obj );
+               $this->assertInstanceOf( \Password::class, $obj );
        }
 
        public function testGetNewPasswordExpiry() {
index c18af8b..b8f7b73 100644 (file)
@@ -149,7 +149,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                if ( $canChangeUser !== null ) {
                        $methods[] = 'canChangeUser';
                }
-               $provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( $methods )
                        ->getMock();
                $provider->expects( $this->any() )->method( '__toString' )
@@ -968,7 +968,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        $p->expects( $this->atMost( 1 ) )->method( 'postAuthentication' )
                                ->willReturnCallback( function ( $user, $response ) use ( $constraint, $p ) {
                                        if ( $user !== null ) {
-                                               $this->assertInstanceOf( 'User', $user );
+                                               $this->assertInstanceOf( \User::class, $user );
                                                $this->assertSame( 'UTSysop', $user->getName() );
                                        }
                                        $this->assertInstanceOf( AuthenticationResponse::class, $response );
@@ -1998,7 +1998,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                ->willReturnCallback( function ( $user, $creator, $response )
                                        use ( $constraint, $p, $username )
                                {
-                                       $this->assertInstanceOf( 'User', $user );
+                                       $this->assertInstanceOf( \User::class, $user );
                                        $this->assertSame( $username, $user->getName() );
                                        $this->assertSame( 'UTSysop', $creator->getName() );
                                        $this->assertInstanceOf( AuthenticationResponse::class, $response );
@@ -2262,7 +2262,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Set up lots of mocks...
                $mock = $this->getMockForAbstractClass(
-                       "MediaWiki\\Auth\\PrimaryAuthenticationProvider", []
+                       \MediaWiki\Auth\PrimaryAuthenticationProvider::class, []
                );
                $mock->expects( $this->any() )->method( 'getUniqueId' )
                        ->will( $this->returnValue( 'primary' ) );
@@ -2668,7 +2668,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails
                $session->clear();
-               $user = $this->getMockBuilder( 'User' )
+               $user = $this->getMockBuilder( \User::class )
                        ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnValue( \Status::newFatal( 'because' ) ) );
@@ -2690,7 +2690,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
                $this->assertFalse( $cache->get( $backoffKey ), 'sanity check' );
                $session->clear();
-               $user = $this->getMockBuilder( 'User' )
+               $user = $this->getMockBuilder( \User::class )
                        ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->throwException( new \Exception( 'Excepted' ) ) );
@@ -2714,7 +2714,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails because the user already exists.
                $session->clear();
-               $user = $this->getMockBuilder( 'User' )
+               $user = $this->getMockBuilder( \User::class )
                        ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnCallback( function () use ( $username, &$user ) {
@@ -3474,7 +3474,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        $p->postCalled = false;
                        $p->expects( $this->atMost( 1 ) )->method( 'postAccountLink' )
                                ->willReturnCallback( function ( $user, $response ) use ( $constraint, $p ) {
-                                       $this->assertInstanceOf( 'User', $user );
+                                       $this->assertInstanceOf( \User::class, $user );
                                        $this->assertSame( 'UTSysop', $user->getName() );
                                        $this->assertInstanceOf( AuthenticationResponse::class, $response );
                                        $this->assertThat( $response->status, $constraint );
index 82b0f82..57c3e7e 100644 (file)
@@ -20,7 +20,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
 
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
@@ -51,7 +51,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserSaveSettings() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDB' )
                        ->with( $this->identicalTo( $user ) );
@@ -63,7 +63,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserGroupsChanged() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDBGroups' )
                        ->with(
@@ -79,14 +79,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserLoggedIn() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' )
                        ->with( $this->identicalTo( $user ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'UserLoggedIn', [ $user ] );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -107,14 +107,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnLocalUserCreated() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'initUser' )
                        ->with( $this->identicalTo( $user ), $this->identicalTo( false ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'LocalUserCreated', [ $user, false ] );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'initUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -133,7 +133,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testGetUniqueId() {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertSame(
@@ -149,7 +149,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param bool $allowPasswordChange
         */
        public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPasswordChange' )
                        ->will( $this->returnValue( $allowPasswordChange ) );
@@ -178,7 +178,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->action = AuthManager::ACTION_LOGIN;
                $reqs = [ PasswordAuthenticationRequest::class => $req ];
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->never() )->method( 'authenticate' );
@@ -206,7 +206,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -220,7 +220,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -232,13 +232,13 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
-               $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+               $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
                        ->setMethods( [ 'isLocked' ] )
                        ->disableOriginalConstructor()
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( true ) );
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'getUserInstance', 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -252,7 +252,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -266,7 +266,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'authenticate', 'strict' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -280,7 +280,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'wrongpassword', $ret->message->getKey() );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'authenticate', 'strictUserAuth' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )
@@ -296,7 +296,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'wrongpassword', $ret->message->getKey() );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'domainList', 'validDomain', 'setDomain', 'userExists', 'authenticate' ] )
                        ->getMock();
                $plugin->expects( $this->any() )->method( 'domainList' )
@@ -321,7 +321,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserExists() {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -330,7 +330,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
 
                $this->assertTrue( $provider->testUserExists( 'foo' ) );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -341,7 +341,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserCanAuthenticate() {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -350,19 +350,19 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
 
-               $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+               $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( true ) );
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
                        ->will( $this->returnValue( true ) );
                $plugin->expects( $this->once() )->method( 'getUserInstance' )
                        ->with( $this->callback( function ( $user ) {
-                               $this->assertInstanceOf( 'User', $user );
+                               $this->assertInstanceOf( \User::class, $user );
                                $this->assertEquals( 'Foo', $user->getName() );
                                return true;
                        } ) )
@@ -370,19 +370,19 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertFalse( $provider->testUserCanAuthenticate( 'foo' ) );
 
-               $pluginUser = $this->getMockBuilder( 'AuthPluginUser' )
+               $pluginUser = $this->getMockBuilder( \AuthPluginUser::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( false ) );
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
                        ->will( $this->returnValue( true ) );
                $plugin->expects( $this->once() )->method( 'getUserInstance' )
                        ->with( $this->callback( function ( $user ) {
-                               $this->assertInstanceOf( 'User', $user );
+                               $this->assertInstanceOf( \User::class, $user );
                                $this->assertEquals( 'Foo', $user->getName() );
                                return true;
                        } ) )
@@ -392,7 +392,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderRevokeAccessForUser() {
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'userExists', 'setPassword' ] )
                        ->getMock();
                $plugin->expects( $this->once() )->method( 'userExists' )->willReturn( true );
@@ -404,7 +404,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerRevokeAccessForUser( 'foo' );
 
-               $plugin = $this->getMockBuilder( 'AuthPlugin' )
+               $plugin = $this->getMockBuilder( \AuthPlugin::class )
                        ->setMethods( [ 'domainList', 'userExists', 'setPassword' ] )
                        ->getMock();
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [ 'D1', 'D2', 'D3' ] );
@@ -433,7 +433,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderAllowsPropertyChange() {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPropChange' )
                        ->will( $this->returnCallback( function ( $prop ) {
@@ -453,7 +453,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         */
        public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
                $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
                $plugin->expects( $allow === null ? $this->never() : $this->once() )
                        ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
@@ -502,7 +502,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderChangeAuthenticationData() {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->never() )->method( 'setPassword' );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
@@ -515,7 +515,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -525,7 +525,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerChangeAuthenticationData( $req );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -541,7 +541,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg );
                }
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )
                        ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
                $plugin->expects( $this->any() )->method( 'validDomain' )
@@ -569,7 +569,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param string $expect
         */
        public function testAccountCreationType( $can, $expect ) {
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )
                        ->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) );
@@ -588,7 +588,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testTestForAccountCreation() {
                $user = \User::newFromName( 'foo' );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertEquals(
@@ -606,7 +606,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->action = AuthManager::ACTION_CREATE;
                $reqs = [ PasswordAuthenticationRequest::class => $req ];
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( false ) );
@@ -621,7 +621,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -650,7 +650,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -670,7 +670,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
                );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -689,7 +689,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() );
 
-               $plugin = $this->createMock( 'AuthPlugin' );
+               $plugin = $this->createMock( \AuthPlugin::class );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
                $plugin->expects( $this->any() )->method( 'domainList' )
index 0e549a5..1bc0f31 100644 (file)
@@ -17,9 +17,9 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                $ret = $mock->describeCredentials();
                $this->assertInternalType( 'array', $ret );
                $this->assertArrayHasKey( 'provider', $ret );
-               $this->assertInstanceOf( 'Message', $ret['provider'] );
+               $this->assertInstanceOf( \Message::class, $ret['provider'] );
                $this->assertArrayHasKey( 'account', $ret );
-               $this->assertInstanceOf( 'Message', $ret['account'] );
+               $this->assertInstanceOf( \Message::class, $ret['account'] );
        }
 
        public function testLoadRequestsFromSubmission() {
index b5c8a36..f483b9b 100644 (file)
@@ -19,11 +19,11 @@ abstract class AuthenticationRequestTestCase extends \MediaWikiTestCase {
                        $this->assertType( 'array', $data, "Field $field" );
                        $this->assertArrayHasKey( 'type', $data, "Field $field" );
                        $this->assertArrayHasKey( 'label', $data, "Field $field" );
-                       $this->assertInstanceOf( 'Message', $data['label'], "Field $field, label" );
+                       $this->assertInstanceOf( \Message::class, $data['label'], "Field $field, label" );
 
                        if ( $data['type'] !== 'null' ) {
                                $this->assertArrayHasKey( 'help', $data, "Field $field" );
-                               $this->assertInstanceOf( 'Message', $data['help'], "Field $field, help" );
+                               $this->assertInstanceOf( \Message::class, $data['help'], "Field $field, help" );
                        }
 
                        if ( isset( $data['optional'] ) ) {
@@ -50,7 +50,7 @@ abstract class AuthenticationRequestTestCase extends \MediaWikiTestCase {
                                        $this->assertArrayHasKey( 'options', $data, "Field $field" );
                                        $this->assertType( 'array', $data['options'], "Field $field, options" );
                                        foreach ( $data['options'] as $val => $msg ) {
-                                               $this->assertInstanceOf( 'Message', $msg, "Field $field, option $val" );
+                                               $this->assertInstanceOf( \Message::class, $msg, "Field $field, option $val" );
                                        }
                                        break;
                                case 'checkbox':
index 111c855..4e44547 100644 (file)
@@ -135,12 +135,12 @@ class CheckBlocksSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                );
 
                $status = $provider->testUserForCreation( $blockedUser, AuthManager::AUTOCREATE_SOURCE_SESSION );
-               $this->assertInstanceOf( 'StatusValue', $status );
+               $this->assertInstanceOf( \StatusValue::class, $status );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'cantcreateaccount-text' ) );
 
                $status = $provider->testUserForCreation( $blockedUser, false );
-               $this->assertInstanceOf( 'StatusValue', $status );
+               $this->assertInstanceOf( \StatusValue::class, $status );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'cantcreateaccount-text' ) );
        }
@@ -176,12 +176,12 @@ class CheckBlocksSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->assertEquals( AuthenticationResponse::FAIL, $ret->status );
 
                $status = $provider->testUserForCreation( $newuser, AuthManager::AUTOCREATE_SOURCE_SESSION );
-               $this->assertInstanceOf( 'StatusValue', $status );
+               $this->assertInstanceOf( \StatusValue::class, $status );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'cantcreateaccount-range-text' ) );
 
                $status = $provider->testUserForCreation( $newuser, false );
-               $this->assertInstanceOf( 'StatusValue', $status );
+               $this->assertInstanceOf( \StatusValue::class, $status );
                $this->assertFalse( $status->isOK() );
                $this->assertTrue( $status->hasMessage( 'cantcreateaccount-range-text' ) );
        }
index 3757069..dd02793 100644 (file)
@@ -58,24 +58,24 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram
        public function testBeginSecondaryAccountCreation() {
                $authManager = new AuthManager( new \FauxRequest(), new \HashConfig() );
 
-               $creator = $this->getMockBuilder( 'User' )->getMock();
-               $userWithoutEmail = $this->getMockBuilder( 'User' )->getMock();
+               $creator = $this->getMockBuilder( \User::class )->getMock();
+               $userWithoutEmail = $this->getMockBuilder( \User::class )->getMock();
                $userWithoutEmail->expects( $this->any() )->method( 'getEmail' )->willReturn( '' );
                $userWithoutEmail->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' );
-               $userWithEmailError = $this->getMockBuilder( 'User' )->getMock();
+               $userWithEmailError = $this->getMockBuilder( \User::class )->getMock();
                $userWithEmailError->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
                $userWithEmailError->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithEmailError->expects( $this->any() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newFatal( 'fail' ) );
-               $userExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
+               $userExpectsConfirmation = $this->getMockBuilder( \User::class )->getMock();
                $userExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
                        ->willReturnSelf();
                $userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newGood() );
-               $userNotExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
+               $userNotExpectsConfirmation = $this->getMockBuilder( \User::class )->getMock();
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
index 0fdb08c..38ccb8a 100644 (file)
@@ -15,7 +15,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @return LegacyHookPreAuthenticationProvider
         */
        protected function getProvider() {
-               $request = $this->getMockBuilder( 'FauxRequest' )
+               $request = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
 
@@ -101,7 +101,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                        if ( $msgForLoginUserMigrated !== null ) {
                                $h->will( $this->returnCallback(
                                        function ( $user, &$msg ) use ( $username, $msgForLoginUserMigrated ) {
-                                               $this->assertInstanceOf( 'User', $user );
+                                               $this->assertInstanceOf( \User::class, $user );
                                                $this->assertSame( $username, $user->getName() );
                                                $msg = $msgForLoginUserMigrated;
                                                return false;
@@ -111,7 +111,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                        } else {
                                $h->will( $this->returnCallback(
                                        function ( $user, &$msg ) use ( $username ) {
-                                               $this->assertInstanceOf( 'User', $user );
+                                               $this->assertInstanceOf( \User::class, $user );
                                                $this->assertSame( $username, $user->getName() );
                                                return true;
                                        }
@@ -122,7 +122,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                                                function ( $user, $pass, &$abort, &$msg )
                                                        use ( $username, $password, $abortForAbortLogin, $msgForAbortLogin )
                                                {
-                                                       $this->assertInstanceOf( 'User', $user );
+                                                       $this->assertInstanceOf( \User::class, $user );
                                                        $this->assertSame( $username, $user->getName() );
                                                        if ( $password !== null ) {
                                                                $this->assertSame( $password, $pass );
@@ -137,7 +137,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                                } else {
                                        $h2->will( $this->returnCallback(
                                                function ( $user, $pass, &$abort, &$msg ) use ( $username, $password ) {
-                                                       $this->assertInstanceOf( 'User', $user );
+                                                       $this->assertInstanceOf( \User::class, $user );
                                                        $this->assertSame( $username, $user->getName() );
                                                        if ( $password !== null ) {
                                                                $this->assertSame( $password, $pass );
@@ -160,7 +160,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                if ( $failMsg === null ) {
                        $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
                } else {
-                       $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
+                       $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
                        $this->assertFalse( $status->isOk(), 'should fail (ok)' );
                        $errors = $status->getErrors();
                        $this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
@@ -289,7 +289,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                        ->will( $this->returnCallback( function ( $user, &$error, &$abortStatus )
                                use ( $msg, $status )
                        {
-                               $this->assertInstanceOf( 'User', $user );
+                               $this->assertInstanceOf( \User::class, $user );
                                $this->assertSame( 'User', $user->getName() );
                                $error = $msg;
                                $abortStatus = $status;
@@ -336,7 +336,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->hook( 'AbortNewAccount', $this->never() );
                $this->hook( 'AbortAutoAccount', $this->once() )
                        ->will( $this->returnCallback( function ( $user, &$abortError ) use ( $testUser, $error ) {
-                               $this->assertInstanceOf( 'User', $user );
+                               $this->assertInstanceOf( \User::class, $user );
                                $this->assertSame( $testUser->getName(), $user->getName() );
                                $abortError = $error;
                                return $error === null;
@@ -349,7 +349,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                if ( $failMsg === null ) {
                        $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
                } else {
-                       $this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
+                       $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
                        $this->assertFalse( $status->isOk(), 'should fail (ok)' );
                        $errors = $status->getErrors();
                        $this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
index 3387e7c..1ef675b 100644 (file)
@@ -129,10 +129,10 @@ class PasswordAuthenticationRequestTest extends AuthenticationRequestTestCase {
                $ret = $req->describeCredentials();
                $this->assertInternalType( 'array', $ret );
                $this->assertArrayHasKey( 'provider', $ret );
-               $this->assertInstanceOf( 'Message', $ret['provider'] );
+               $this->assertInstanceOf( \Message::class, $ret['provider'] );
                $this->assertSame( 'authmanager-provider-password', $ret['provider']->getKey() );
                $this->assertArrayHasKey( 'account', $ret );
-               $this->assertInstanceOf( 'Message', $ret['account'] );
+               $this->assertInstanceOf( \Message::class, $ret['account'] );
                $this->assertSame( [ 'UTSysop' ], $ret['account']->getParams() );
        }
 }
index f746515..36be424 100644 (file)
@@ -149,10 +149,10 @@ class PasswordDomainAuthenticationRequestTest extends AuthenticationRequestTestC
                $ret = $req->describeCredentials();
                $this->assertInternalType( 'array', $ret );
                $this->assertArrayHasKey( 'provider', $ret );
-               $this->assertInstanceOf( 'Message', $ret['provider'] );
+               $this->assertInstanceOf( \Message::class, $ret['provider'] );
                $this->assertSame( 'authmanager-provider-password-domain', $ret['provider']->getKey() );
                $this->assertArrayHasKey( 'account', $ret );
-               $this->assertInstanceOf( 'Message', $ret['account'] );
+               $this->assertInstanceOf( \Message::class, $ret['account'] );
                $this->assertSame( 'authmanager-account-password-domain', $ret['account']->getKey() );
                $this->assertSame( [ 'UTSysop', 'd2' ], $ret['account']->getParams() );
        }
index 05c5165..ab4a174 100644 (file)
@@ -70,10 +70,10 @@ class TemporaryPasswordAuthenticationRequestTest extends AuthenticationRequestTe
                $ret = $req->describeCredentials();
                $this->assertInternalType( 'array', $ret );
                $this->assertArrayHasKey( 'provider', $ret );
-               $this->assertInstanceOf( 'Message', $ret['provider'] );
+               $this->assertInstanceOf( \Message::class, $ret['provider'] );
                $this->assertSame( 'authmanager-provider-temporarypassword', $ret['provider']->getKey() );
                $this->assertArrayHasKey( 'account', $ret );
-               $this->assertInstanceOf( 'Message', $ret['account'] );
+               $this->assertInstanceOf( \Message::class, $ret['account'] );
                $this->assertSame( [ 'UTSysop' ], $ret['account']->getParams() );
        }
 }
index 58982de..d03b151 100644 (file)
@@ -121,7 +121,7 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                $user = \User::newFromName( 'RandomUser' );
                $creator = \User::newFromName( $creatorname );
                if ( $hook ) {
-                       $mock = $this->getMockBuilder( 'stdClass' )
+                       $mock = $this->getMockBuilder( stdClass::class )
                                ->setMethods( [ 'onExemptFromAccountCreationThrottle' ] )
                                ->getMock();
                        $mock->expects( $this->any() )->method( 'onExemptFromAccountCreationThrottle' )
index 5eed01c..42957b6 100644 (file)
@@ -19,7 +19,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
         */
        protected function getMockLocalisationCache() {
                global $IP;
-               $lc = $this->getMockBuilder( 'LocalisationCache' )
+               $lc = $this->getMockBuilder( \LocalisationCache::class )
                        ->setConstructorArgs( [ [ 'store' => 'detect' ] ] )
                        ->setMethods( [ 'getMessagesDirs' ] )
                        ->getMock();
index e44de09..ca3ac1b 100644 (file)
@@ -48,7 +48,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
        public function setUp() {
                parent::setUp();
                self::$notifyCallCounter = 0;
-               self::$mockRecentChange = self::getMock( 'RecentChange' );
+               self::$mockRecentChange = self::getMock( RecentChange::class );
 
                $this->setContentLang( 'qqx' );
        }
index acac26f..2355f76 100644 (file)
@@ -168,7 +168,7 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
        }
 
        protected function getSpecialPage() {
-               return $this->getMockBuilder( 'ChangesListSpecialPage' )
+               return $this->getMockBuilder( ChangesListSpecialPage::class )
                        ->setConstructorArgs( [
                                        'ChangesListSpecialPage',
                                        '',
@@ -183,8 +183,8 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
         * @dataProvider provideModifyQuery
         */
        protected function modifyQueryHelper( $groupDefinition, $input ) {
-               $ctx = $this->createMock( 'IContextSource' );
-               $dbr = $this->createMock( 'IDatabase' );
+               $ctx = $this->createMock( IContextSource::class );
+               $dbr = $this->createMock( Wikimedia\Rdbms\IDatabase::class );
                $tables = $fields = $conds = $query_options = $join_conds = [];
 
                $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
index 97b4c08..ac81b28 100644 (file)
@@ -57,7 +57,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
-               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+               $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
@@ -92,7 +92,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
-               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+               $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
@@ -126,7 +126,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                );
                $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
-               $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
+               $this->assertInstanceOf( RCCacheEntry::class, $cacheEntry );
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
index d688928..f9e0bc9 100644 (file)
@@ -9,6 +9,7 @@ class CustomUppercaseCollationTest extends MediaWikiTestCase {
                $this->collation = new CustomUppercaseCollation( [
                        'D',
                        'C',
+                       'Cs',
                        'B'
                ], Language::factory( 'en' ) );
 
@@ -34,6 +35,7 @@ class CustomUppercaseCollationTest extends MediaWikiTestCase {
                        [ '💩 ', 'C', 'Test relocated to end' ],
                        [ 'c', 'b', 'lowercase' ],
                        [ 'x', 'z', 'lowercase original' ],
+                       [ 'Cz', 'Cs', 'digraphs' ],
                        [ 'C50D', 'C100', 'Numbers' ]
                ];
        }
@@ -53,8 +55,14 @@ class CustomUppercaseCollationTest extends MediaWikiTestCase {
                        [ 'afdsa', 'A' ],
                        [ "\xF3\xB3\x80\x80Foo", 'D' ],
                        [ "\xF3\xB3\x80\x81Foo", 'C' ],
-                       [ "\xF3\xB3\x80\x82Foo", 'B' ],
-                       [ "\xF3\xB3\x80\x83Foo", "\xF3\xB3\x80\x83" ],
+                       [ "\xF3\xB3\x80\x82Foo", 'Cs' ],
+                       [ "\xF3\xB3\x80\x83Foo", 'B' ],
+                       [ "\xF3\xB3\x80\x84Foo", "\xF3\xB3\x80\x84" ],
+                       [ 'C', 'C' ],
+                       [ 'Cz', 'C' ],
+                       [ 'Cs', 'Cs' ],
+                       [ 'CS', 'Cs' ],
+                       [ 'cs', 'Cs' ],
                ];
        }
 }
index a4cc446..9ade892 100644 (file)
@@ -17,7 +17,7 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        public function testGivenNonString_normalizeThrowsInvalidArgumentException( $nonString ) {
                $normalizer = new ComposerVersionNormalizer();
 
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
                $normalizer->normalizeSuffix( $nonString );
        }
 
index c0e51d7..ea747af 100644 (file)
@@ -18,7 +18,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
         */
        public function testRegisterInvalid() {
                $factory = new ConfigFactory();
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
                $factory->register( 'invalid', 'Invalid callback' );
        }
 
@@ -87,7 +87,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                $this->assertNotSame( $bar, $newBar, 'don\'t salvage if callbacks differ' );
 
                // the new factory doesn't have quux defined, so the quux instance should not be salvaged
-               $this->setExpectedException( 'ConfigException' );
+               $this->setExpectedException( ConfigException::class );
                $newFactory->makeConfig( 'quux' );
        }
 
@@ -110,7 +110,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
 
                $conf = $factory->makeConfig( 'unittest' );
-               $this->assertInstanceOf( 'Config', $conf );
+               $this->assertInstanceOf( Config::class, $conf );
                $this->assertSame( $conf, $factory->makeConfig( 'unittest' ) );
        }
 
@@ -131,7 +131,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                $factory = new ConfigFactory();
                $factory->register( '*', 'GlobalVarConfig::newInstance' );
                $conf = $factory->makeConfig( 'unittest' );
-               $this->assertInstanceOf( 'Config', $conf );
+               $this->assertInstanceOf( Config::class, $conf );
        }
 
        /**
@@ -139,7 +139,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
         */
        public function testMakeConfigWithNoBuilders() {
                $factory = new ConfigFactory();
-               $this->setExpectedException( 'ConfigException' );
+               $this->setExpectedException( ConfigException::class );
                $factory->makeConfig( 'nobuilderregistered' );
        }
 
@@ -151,7 +151,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                $factory->register( 'unittest', function () {
                        return true; // Not a Config object
                } );
-               $this->setExpectedException( 'UnexpectedValueException' );
+               $this->setExpectedException( UnexpectedValueException::class );
                $factory->makeConfig( 'unittest' );
        }
 
@@ -162,7 +162,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                // NOTE: the global config factory returned here has been overwritten
                // for operation in test mode. It may not reflect LocalSettings.
                $factory = MediaWikiServices::getInstance()->getConfigFactory();
-               $this->assertInstanceOf( 'Config', $factory->makeConfig( 'main' ) );
+               $this->assertInstanceOf( Config::class, $factory->makeConfig( 'main' ) );
        }
 
 }
index a6b220d..db5f73d 100644 (file)
@@ -7,7 +7,7 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
         */
        public function testNewInstance() {
                $config = GlobalVarConfig::newInstance();
-               $this->assertInstanceOf( 'GlobalVarConfig', $config );
+               $this->assertInstanceOf( GlobalVarConfig::class, $config );
                $this->maybeStashGlobal( 'wgBaz' );
                $GLOBALS['wgBaz'] = 'somevalue';
                // Check prefix is set to 'wg'
@@ -24,7 +24,7 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
                $this->maybeStashGlobal( $var );
                $GLOBALS[$var] = $rand;
                $config = new GlobalVarConfig( $prefix );
-               $this->assertInstanceOf( 'GlobalVarConfig', $config );
+               $this->assertInstanceOf( GlobalVarConfig::class, $config );
                $this->assertEquals( $rand, $config->get( 'GlobalVarConfigTest' ) );
        }
 
@@ -83,7 +83,7 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
        public function testGet( $name, $prefix, $expected ) {
                $config = new GlobalVarConfig( $prefix );
                if ( $expected === false ) {
-                       $this->setExpectedException( 'ConfigException', 'GlobalVarConfig::get: undefined option:' );
+                       $this->setExpectedException( ConfigException::class, 'GlobalVarConfig::get: undefined option:' );
                }
                $this->assertEquals( $config->get( $name ), $expected );
        }
index 19b412d..bac8311 100644 (file)
@@ -7,7 +7,7 @@ class HashConfigTest extends MediaWikiTestCase {
         */
        public function testNewInstance() {
                $conf = HashConfig::newInstance();
-               $this->assertInstanceOf( 'HashConfig', $conf );
+               $this->assertInstanceOf( HashConfig::class, $conf );
        }
 
        /**
@@ -15,7 +15,7 @@ class HashConfigTest extends MediaWikiTestCase {
         */
        public function testConstructor() {
                $conf = new HashConfig();
-               $this->assertInstanceOf( 'HashConfig', $conf );
+               $this->assertInstanceOf( HashConfig::class, $conf );
 
                // Test passing arguments to the constructor
                $conf2 = new HashConfig( [
@@ -32,7 +32,7 @@ class HashConfigTest extends MediaWikiTestCase {
                        'one' => '1',
                ] );
                $this->assertEquals( '1', $conf->get( 'one' ) );
-               $this->setExpectedException( 'ConfigException', 'HashConfig::get: undefined option' );
+               $this->setExpectedException( ConfigException::class, 'HashConfig::get: undefined option' );
                $conf->get( 'two' );
        }
 
index d1eb510..fc28395 100644 (file)
@@ -17,7 +17,7 @@ class MultiConfigTest extends MediaWikiTestCase {
 
                $this->assertEquals( 'bar', $multi->get( 'foo' ) );
                $this->assertEquals( 'foo', $multi->get( 'bar' ) );
-               $this->setExpectedException( 'ConfigException', 'MultiConfig::get: undefined option:' );
+               $this->setExpectedException( ConfigException::class, 'MultiConfig::get: undefined option:' );
                $multi->get( 'notset' );
        }
 
index 1462c36..309b7b1 100644 (file)
@@ -22,12 +22,12 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                12312 => 'testing',
                        ],
                        'wgContentHandlers' => [
-                               CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
-                               CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
-                               CONTENT_MODEL_JSON => 'JsonContentHandler',
-                               CONTENT_MODEL_CSS => 'CssContentHandler',
-                               CONTENT_MODEL_TEXT => 'TextContentHandler',
-                               'testing' => 'DummyContentHandlerForTesting',
+                               CONTENT_MODEL_WIKITEXT => WikitextContentHandler::class,
+                               CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
+                               CONTENT_MODEL_JSON => JsonContentHandler::class,
+                               CONTENT_MODEL_CSS => CssContentHandler::class,
+                               CONTENT_MODEL_TEXT => TextContentHandler::class,
+                               'testing' => DummyContentHandlerForTesting::class,
                                'testing-callbacks' => function ( $modelId ) {
                                        return new DummyContentHandlerForTesting( $modelId );
                                }
@@ -248,10 +248,6 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertNull( $text );
        }
 
-       /*
-       public static function makeContent( $text, Title $title, $modelId = null, $format = null ) {}
-       */
-
        public static function dataMakeContent() {
                return [
                        [ 'hallo', 'Help:Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ],
@@ -370,12 +366,6 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertSame( $tag, 'mw-contentmodelchange' );
        }
 
-       /*
-       public function testSupportsSections() {
-               $this->markTestIncomplete( "not yet implemented" );
-       }
-       */
-
        /**
         * @covers ContentHandler::supportsCategories
         */
@@ -404,13 +394,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
        public function provideGetModelForID() {
                return [
-                       [ CONTENT_MODEL_WIKITEXT, 'WikitextContentHandler' ],
-                       [ CONTENT_MODEL_JAVASCRIPT, 'JavaScriptContentHandler' ],
-                       [ CONTENT_MODEL_JSON, 'JsonContentHandler' ],
-                       [ CONTENT_MODEL_CSS, 'CssContentHandler' ],
-                       [ CONTENT_MODEL_TEXT, 'TextContentHandler' ],
-                       [ 'testing', 'DummyContentHandlerForTesting' ],
-                       [ 'testing-callbacks', 'DummyContentHandlerForTesting' ],
+                       [ CONTENT_MODEL_WIKITEXT, WikitextContentHandler::class ],
+                       [ CONTENT_MODEL_JAVASCRIPT, JavaScriptContentHandler::class ],
+                       [ CONTENT_MODEL_JSON, JsonContentHandler::class ],
+                       [ CONTENT_MODEL_CSS, CssContentHandler::class ],
+                       [ CONTENT_MODEL_TEXT, TextContentHandler::class ],
+                       [ 'testing', DummyContentHandlerForTesting::class ],
+                       [ 'testing-callbacks', DummyContentHandlerForTesting::class ],
                ];
        }
 
@@ -442,7 +432,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
 
        private function newSearchEngine() {
-               $searchEngine = $this->getMockBuilder( 'SearchEngine' )
+               $searchEngine = $this->getMockBuilder( SearchEngine::class )
                        ->getMock();
 
                $searchEngine->expects( $this->any() )
@@ -458,7 +448,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * @covers ContentHandler::getDataForSearchIndex
         */
        public function testDataIndexFields() {
-               $mockEngine = $this->createMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( SearchEngine::class );
                $title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
                $page = new WikiPage( $title );
 
index 8f178de..7ca1afc 100644 (file)
@@ -13,7 +13,7 @@ class CssContentHandlerTest extends MediaWikiLangTestCase {
                ] );
                $ch = new CssContentHandler();
                $content = $ch->makeRedirectContent( Title::newFromText( $title ) );
-               $this->assertInstanceOf( 'CssContent', $content );
+               $this->assertInstanceOf( CssContent::class, $content );
                $this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_CSS ) );
        }
 
index ad9d419..9149fc4 100644 (file)
@@ -18,13 +18,13 @@ class FileContentHandlerTest extends MediaWikiLangTestCase {
        }
 
        public function testIndexMapping() {
-               $mockEngine = $this->createMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( SearchEngine::class );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
                        ->willReturnCallback( function ( $name, $type ) {
                                $mockField =
-                                       $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+                                       $this->getMockBuilder( SearchIndexFieldDefinition::class )
                                                ->setMethods( [ 'getMapping' ] )
                                                ->setConstructorArgs( [ $name, $type ] )
                                                ->getMock();
@@ -43,7 +43,7 @@ class FileContentHandlerTest extends MediaWikiLangTestCase {
                        'file_text' => 1,
                ];
                foreach ( $map as $name => $field ) {
-                       $this->assertInstanceOf( 'SearchIndexField', $field );
+                       $this->assertInstanceOf( SearchIndexField::class, $field );
                        $this->assertEquals( $name, $field->getName() );
                        unset( $expect[$name] );
                }
index 080ec96..b5e3ab4 100644 (file)
@@ -13,7 +13,7 @@ class JavaScriptContentHandlerTest extends MediaWikiLangTestCase {
                ] );
                $ch = new JavaScriptContentHandler();
                $content = $ch->makeRedirectContent( Title::newFromText( $title ) );
-               $this->assertInstanceOf( 'JavaScriptContent', $content );
+               $this->assertInstanceOf( JavaScriptContent::class, $content );
                $this->assertEquals( $expected, $content->serialize( CONTENT_FORMAT_JAVASCRIPT ) );
        }
 
index de8e371..7cddbad 100644 (file)
@@ -82,18 +82,18 @@ class JsonContentTest extends MediaWikiLangTestCase {
        }
 
        private function getMockTitle() {
-               return $this->getMockBuilder( 'Title' )
+               return $this->getMockBuilder( Title::class )
                        ->disableOriginalConstructor()
                        ->getMock();
        }
 
        private function getMockUser() {
-               return $this->getMockBuilder( 'User' )
+               return $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
        }
        private function getMockParserOptions() {
-               return $this->getMockBuilder( 'ParserOptions' )
+               return $this->getMockBuilder( ParserOptions::class )
                        ->disableOriginalConstructor()
                        ->getMock();
        }
@@ -146,7 +146,7 @@ class JsonContentTest extends MediaWikiLangTestCase {
        public function testFillParserOutput( $data, $expected ) {
                $obj = new JsonContent( FormatJson::encode( $data ) );
                $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
-               $this->assertInstanceOf( 'ParserOutput', $parserOutput );
+               $this->assertInstanceOf( ParserOutput::class, $parserOutput );
                $this->assertEquals( $expected, $parserOutput->getText() );
        }
 }
index a85215b..6d0a3d5 100644 (file)
@@ -19,13 +19,13 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
        public function testFieldsForIndex() {
                $handler = new TextContentHandler();
 
-               $mockEngine = $this->createMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( SearchEngine::class );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
                        ->willReturnCallback( function ( $name, $type ) {
                                $mockField =
-                                       $this->getMockBuilder( 'SearchIndexFieldDefinition' )
+                                       $this->getMockBuilder( SearchIndexFieldDefinition::class )
                                                ->setConstructorArgs( [ $name, $type ] )
                                                ->getMock();
                                $mockField->expects( $this->atLeastOnce() )->method( 'getMapping' )->willReturn( [
@@ -42,7 +42,7 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
                $fields = $handler->getFieldsForSearchIndex( $mockEngine );
                $mappedFields = [];
                foreach ( $fields as $name => $field ) {
-                       $this->assertInstanceOf( 'SearchIndexField', $field );
+                       $this->assertInstanceOf( SearchIndexField::class, $field );
                        /**
                         * @var $field SearchIndexField
                         */
index 1601493..b548091 100644 (file)
@@ -454,7 +454,7 @@ class TextContentTest extends MediaWikiLangTestCase {
                if ( $expectedNative === false ) {
                        $this->assertFalse( $converted, "conversion to $model was expected to fail!" );
                } else {
-                       $this->assertInstanceOf( 'Content', $converted );
+                       $this->assertInstanceOf( Content::class, $converted );
                        $this->assertEquals( $expectedNative, $converted->getNativeData() );
                }
        }
index 02f82f4..59984d8 100644 (file)
@@ -335,28 +335,11 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->assertSame( $expected, $tag );
        }
 
-       /**
-        * @todo Text case requires database, should be done by a test class in the Database group
-        */
-       /*
-       public function testGetAutoDeleteReason( Title $title, &$hasHistory ) {}
-       */
-
-       /**
-        * @todo Text case requires database, should be done by a test class in the Database group
-        */
-       /*
-       public function testGetUndoContent( Revision $current, Revision $undo,
-               Revision $undoafter = null
-       ) {
-       }
-       */
-
        /**
         * @covers WikitextContentHandler::getDataForSearchIndex
         */
        public function testDataIndexFieldsFile() {
-               $mockEngine = $this->createMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( SearchEngine::class );
                $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
                $page = new WikiPage( $title );
 
index d0996e3..e04f562 100644 (file)
@@ -40,7 +40,7 @@ more stuff
                        [ "WikitextContentTest_testGetSecondaryDataUpdates_1",
                                CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
                                [
-                                       'LinksUpdate' => [
+                                       LinksUpdate::class => [
                                                'mRecursive' => true,
                                                'mLinks' => []
                                        ]
@@ -49,7 +49,7 @@ more stuff
                        [ "WikitextContentTest_testGetSecondaryDataUpdates_2",
                                CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
                                [
-                                       'LinksUpdate' => [
+                                       LinksUpdate::class => [
                                                'mRecursive' => true,
                                                'mLinks' => [
                                                        [ 'World_test_21344' => 0 ]
@@ -446,11 +446,11 @@ just a test"
                return [
                        [ "WikitextContentTest_testGetSecondaryDataUpdates_1",
                                CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
-                               [ 'LinksDeletionUpdate' => [] ]
+                               [ LinksDeletionUpdate::class => [] ]
                        ],
                        [ "WikitextContentTest_testGetSecondaryDataUpdates_2",
                                CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
-                               [ 'LinksDeletionUpdate' => [] ]
+                               [ LinksDeletionUpdate::class => [] ]
                        ],
                        // @todo more...?
                ];
index f0a3606..369aa83 100644 (file)
@@ -3,6 +3,7 @@
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class DatabaseSqliteMock extends DatabaseSqlite {
        private $lastQuery;
@@ -397,7 +398,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
 
                $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
-               $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+               $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Database creation" );
 
                $insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
                $this->assertTrue( $insertion, "Insertion worked" );
@@ -490,7 +491,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
 
                $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
-               $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Failed to create table a" );
+               $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Failed to create table a" );
                $res = $db->select( 'a', '*' );
                $this->assertEquals( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
                $insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
index e52dac6..fa1cfc9 100644 (file)
@@ -25,7 +25,9 @@
 
 use Wikimedia\Rdbms\LBFactorySimple;
 use Wikimedia\Rdbms\LBFactoryMulti;
+use Wikimedia\Rdbms\LoadBalancer;
 use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\DatabaseMysqli;
 use Wikimedia\Rdbms\MySQLMasterPos;
 use Wikimedia\Rdbms\DatabaseDomain;
 
@@ -41,7 +43,7 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @dataProvider getLBFactoryClassProvider
         */
        public function testGetLBFactoryClass( $expected, $deprecated ) {
-               $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
+               $mockDB = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -129,7 +131,7 @@ class LBFactoryTest extends MediaWikiTestCase {
 
                $factory = new LBFactorySimple( [
                        'servers' => $servers,
-                       'loadMonitorClass' => 'LoadMonitorNull'
+                       'loadMonitorClass' => LoadMonitorNull::class
                ] );
                $lb = $factory->getMainLB();
 
@@ -174,7 +176,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'test-db1'  => $wgDBserver,
                                'test-db2'  => $wgDBserver
                        ],
-                       'loadMonitorClass' => 'LoadMonitorNull'
+                       'loadMonitorClass' => LoadMonitorNull::class
                ] );
                $lb = $factory->getMainLB();
 
@@ -199,14 +201,14 @@ class LBFactoryTest extends MediaWikiTestCase {
                $now = microtime( true );
 
                // Master DB 1
-               $mockDB1 = $this->getMockBuilder( 'DatabaseMysqli' )
+               $mockDB1 = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mockDB1->method( 'writesOrCallbacksPending' )->willReturn( true );
                $mockDB1->method( 'lastDoneWrites' )->willReturn( $now );
                $mockDB1->method( 'getMasterPos' )->willReturn( $m1Pos );
                // Load balancer for master DB 1
-               $lb1 = $this->getMockBuilder( 'LoadBalancer' )
+               $lb1 = $this->getMockBuilder( LoadBalancer::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $lb1->method( 'getConnection' )->willReturn( $mockDB1 );
@@ -224,14 +226,14 @@ class LBFactoryTest extends MediaWikiTestCase {
                $lb1->method( 'getMasterPos' )->willReturn( $m1Pos );
                $lb1->method( 'getServerName' )->with( 0 )->willReturn( 'master1' );
                // Master DB 2
-               $mockDB2 = $this->getMockBuilder( 'DatabaseMysqli' )
+               $mockDB2 = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mockDB2->method( 'writesOrCallbacksPending' )->willReturn( true );
                $mockDB2->method( 'lastDoneWrites' )->willReturn( $now );
                $mockDB2->method( 'getMasterPos' )->willReturn( $m2Pos );
                // Load balancer for master DB 2
-               $lb2 = $this->getMockBuilder( 'LoadBalancer' )
+               $lb2 = $this->getMockBuilder( LoadBalancer::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $lb2->method( 'getConnection' )->willReturn( $mockDB2 );
@@ -277,7 +279,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                // (b) Second HTTP request
 
                // Load balancer for master DB 1
-               $lb1 = $this->getMockBuilder( 'LoadBalancer' )
+               $lb1 = $this->getMockBuilder( LoadBalancer::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $lb1->method( 'getServerCount' )->willReturn( 2 );
@@ -285,7 +287,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $lb1->expects( $this->once() )
                        ->method( 'waitFor' )->with( $this->equalTo( $m1Pos ) );
                // Load balancer for master DB 2
-               $lb2 = $this->getMockBuilder( 'LoadBalancer' )
+               $lb2 = $this->getMockBuilder( LoadBalancer::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $lb2->method( 'getServerCount' )->willReturn( 2 );
@@ -337,7 +339,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                        'hostsByName' => [
                                'test-db1' => $wgDBserver,
                        ],
-                       'loadMonitorClass' => 'LoadMonitorNull',
+                       'loadMonitorClass' => LoadMonitorNull::class,
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $wgDBprefix )
                ] );
        }
@@ -501,7 +503,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                        } catch ( \Wikimedia\Rdbms\DBConnectionError $e ) {
                                // expected
                        }
-                       $this->assertInstanceOf( '\Wikimedia\Rdbms\DBConnectionError', $e );
+                       $this->assertInstanceOf( \Wikimedia\Rdbms\DBConnectionError::class, $e );
                        $this->assertFalse( $db->isOpen() );
                } else {
                        \MediaWiki\suppressWarnings();
index 54aa2ac..fe7b710 100644 (file)
@@ -111,7 +111,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $lb = new LoadBalancer( [
                        'servers' => $servers,
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() ),
-                       'loadMonitorClass' => 'LoadMonitorNull'
+                       'loadMonitorClass' => LoadMonitorNull::class
                ] );
 
                $dbw = $lb->getConnection( DB_MASTER );
index 25cfd3c..372f732 100644 (file)
@@ -99,7 +99,7 @@ class MWDebugTest extends MediaWikiTestCase {
 
                MWDebug::appendDebugInfoToApiResult( $context, $result );
 
-               $this->assertInstanceOf( 'ApiResult', $result );
+               $this->assertInstanceOf( ApiResult::class, $result );
                $data = $result->getResultData();
 
                $expectedKeys = [ 'mwVersion', 'phpEngine', 'phpVersion', 'gitRevision', 'gitBranch',
@@ -123,7 +123,7 @@ class MWDebugTest extends MediaWikiTestCase {
         * @return FauxRequest
         */
        private function newApiRequest( array $params, $requestUrl ) {
-               $request = $this->getMockBuilder( 'FauxRequest' )
+               $request = $this->getMockBuilder( FauxRequest::class )
                        ->setMethods( [ 'getRequestURL' ] )
                        ->setConstructorArgs( [
                                $params
index a69b0bf..14e2e27 100644 (file)
@@ -164,7 +164,7 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                                [ $this->anything(), $this->anything(), [ 'lines' ] ]
                        ] );
 
-               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( \Monolog\Formatter\FormatterInterface::class );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
@@ -195,7 +195,7 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->method( 'send' )
                        ->will( $this->returnValue( true ) );
 
-               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( \Monolog\Formatter\FormatterInterface::class );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
index 106b86a..8d94404 100644 (file)
@@ -20,7 +20,7 @@ class ArrayDiffFormatterTest extends MediaWikiTestCase {
        }
 
        private function getMockDiff( $edits ) {
-               $diff = $this->getMockBuilder( 'Diff' )
+               $diff = $this->getMockBuilder( Diff::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $diff->expects( $this->any() )
@@ -30,7 +30,7 @@ class ArrayDiffFormatterTest extends MediaWikiTestCase {
        }
 
        private function getMockDiffOp( $type = null, $orig = [], $closing = [] ) {
-               $diffOp = $this->getMockBuilder( 'DiffOp' )
+               $diffOp = $this->getMockBuilder( DiffOp::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $diffOp->expects( $this->any() )
index e6a1812..dcdb1cd 100644 (file)
@@ -16,7 +16,7 @@ class BadTitleErrorTest extends MediaWikiTestCase {
        }
 
        private function getMockWgOut() {
-               $mock = $this->getMockBuilder( 'OutputPage' )
+               $mock = $this->getMockBuilder( OutputPage::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mock->expects( $this->once() )
index e72865f..49d454e 100644 (file)
@@ -7,7 +7,7 @@
 class ErrorPageErrorTest extends MediaWikiTestCase {
 
        private function getMockMessage() {
-               $mockMessage = $this->getMockBuilder( 'Message' )
+               $mockMessage = $this->getMockBuilder( Message::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mockMessage->expects( $this->once() )
@@ -34,7 +34,7 @@ class ErrorPageErrorTest extends MediaWikiTestCase {
                $title = 'Foo';
                $params = [ 'Baz' ];
 
-               $mock = $this->getMockBuilder( 'OutputPage' )
+               $mock = $this->getMockBuilder( OutputPage::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mock->expects( $this->once() )
index 6c5b3b1..b160554 100644 (file)
@@ -44,7 +44,7 @@ class MWExceptionTest extends MediaWikiTestCase {
        }
 
        private function getMockLanguage() {
-               return $this->getMockBuilder( 'Language' )
+               return $this->getMockBuilder( Language::class )
                        ->disableOriginalConstructor()
                        ->getMock();
        }
@@ -111,8 +111,8 @@ class MWExceptionTest extends MediaWikiTestCase {
 
        public static function provideExceptionClasses() {
                return [
-                       [ 'Exception' ],
-                       [ 'MWException' ],
+                       [ Exception::class ],
+                       [ MWException::class ],
                ];
        }
 
@@ -147,7 +147,7 @@ class MWExceptionTest extends MediaWikiTestCase {
         */
        public static function provideJsonSerializedKeys() {
                $testCases = [];
-               foreach ( [ 'Exception', 'MWException' ] as $exClass ) {
+               foreach ( [ Exception::class, MWException::class ] as $exClass ) {
                        $exTests = [
                                [ 'string', $exClass, 'id' ],
                                [ 'string', $exClass, 'file' ],
index 23bb1e8..15f0896 100644 (file)
@@ -17,7 +17,7 @@ class ThrottledErrorTest extends MediaWikiTestCase {
        }
 
        private function getMockWgOut() {
-               $mock = $this->getMockBuilder( 'OutputPage' )
+               $mock = $this->getMockBuilder( OutputPage::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mock->expects( $this->once() )
index ddcf19b..31ad1ba 100644 (file)
@@ -101,7 +101,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'backends' => [
                                [
                                        'name' => 'localmultitesting1',
-                                       'class' => 'FSFileBackend',
+                                       'class' => FSFileBackend::class,
                                        'containerPaths' => [
                                                'unittest-cont1' => "{$tmpDir}/localtestingmulti1-cont1",
                                                'unittest-cont2' => "{$tmpDir}/localtestingmulti1-cont2" ],
@@ -109,7 +109,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                ],
                                [
                                        'name' => 'localmultitesting2',
-                                       'class' => 'FSFileBackend',
+                                       'class' => FSFileBackend::class,
                                        'containerPaths' => [
                                                'unittest-cont1' => "{$tmpDir}/localtestingmulti2-cont1",
                                                'unittest-cont2' => "{$tmpDir}/localtestingmulti2-cont2" ],
@@ -2411,7 +2411,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = Status::newGood();
                $sl = $this->backend->getScopedFileLocks( $paths, LockManager::LOCK_EX, $status );
-               $this->assertInstanceOf( 'ScopedLock', $sl,
+               $this->assertInstanceOf( ScopedLock::class, $sl,
                        "Scoped locking of files succeeded ($backendName)." );
                $this->assertEquals( [], $status->getErrors(),
                        "Scoped locking of files succeeded ($backendName)." );
@@ -2436,7 +2436,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend(
                        [
                                'name' => 'testing',
-                               'class' => 'MemoryFileBackend',
+                               'class' => MemoryFileBackend::class,
                                'wikiId' => 'meow',
                                'mimeCallback' => $mimeCallback
                        ]
@@ -2471,13 +2471,13 @@ class FileBackendTest extends MediaWikiTestCase {
                                'backends' => [
                                        [ // backend 0
                                                'name' => 'multitesting0',
-                                               'class' => 'MemoryFileBackend',
+                                               'class' => MemoryFileBackend::class,
                                                'isMultiMaster' => false,
                                                'readAffinity' => true
                                        ],
                                        [ // backend 1
                                                'name' => 'multitesting1',
-                                               'class' => 'MemoryFileBackend',
+                                               'class' => MemoryFileBackend::class,
                                                'isMultiMaster' => true
                                        ]
                                ]
@@ -2521,12 +2521,12 @@ class FileBackendTest extends MediaWikiTestCase {
                                'backends' => [
                                        [ // backend 0
                                                'name' => 'multitesting0',
-                                               'class' => 'MemoryFileBackend',
+                                               'class' => MemoryFileBackend::class,
                                                'isMultiMaster' => false
                                        ],
                                        [ // backend 1
                                                'name' => 'multitesting1',
-                                               'class' => 'MemoryFileBackend',
+                                               'class' => MemoryFileBackend::class,
                                                'isMultiMaster' => true
                                        ]
                                ],
index b57af25..35eca28 100644 (file)
@@ -22,7 +22,7 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                $this->backend = TestingAccessWrapper::newFromObject(
                        new SwiftFileBackend( [
                                'name'             => 'local-swift-testing',
-                               'class'            => 'SwiftFileBackend',
+                               'class'            => SwiftFileBackend::class,
                                'wikiId'           => 'unit-testing',
                                'lockManager'      => LockManagerGroup::singleton()->get( 'fsLockManager' ),
                                'swiftAuthUrl'     => 'http://127.0.0.1:8080/auth', // unused
index 0d00fbc..4c9855b 100644 (file)
@@ -112,19 +112,19 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
        }
 
        protected function getMocks() {
-               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+               $dbMock = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
                        ->disableOriginalClone()
                        ->disableOriginalConstructor()
                        ->getMock();
 
-               $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+               $backendMock = $this->getMockBuilder( FSFileBackend::class )
                        ->setConstructorArgs( [ [
                                        'name' => $this->backendName,
                                        'wikiId' => wfWikiID()
                                ] ] )
                        ->getMock();
 
-               $wrapperMock = $this->getMockBuilder( 'FileBackendDBRepoWrapper' )
+               $wrapperMock = $this->getMockBuilder( FileBackendDBRepoWrapper::class )
                        ->setMethods( [ 'getDB' ] )
                        ->setConstructorArgs( [ [
                                        'backend' => $backendMock,
index d1e6dc3..0d3e679 100644 (file)
@@ -50,6 +50,6 @@ class FileRepoTest extends MediaWikiTestCase {
                                'containerPaths' => []
                        ] )
                ] );
-               $this->assertInstanceOf( 'FileRepo', $f );
+               $this->assertInstanceOf( FileRepo::class, $f );
        }
 }
index 205df9c..9beea5b 100644 (file)
@@ -28,7 +28,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        ]
                ] );
 
-               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+               $dbMock = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -44,7 +44,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                                new FakeResultWrapper( [] ) // filearchive
                        ) );
 
-               $repoMock = $this->getMockBuilder( 'LocalRepo' )
+               $repoMock = $this->getMockBuilder( LocalRepo::class )
                        ->setMethods( [ 'getMasterDB' ] )
                        ->setConstructorArgs( [ [
                                        'name' => 'migratefilerepolayouttest',
@@ -57,7 +57,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        ->method( 'getMasterDB' )
                        ->will( $this->returnValue( $dbMock ) );
 
-               $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' )
+               $this->migratorMock = $this->getMockBuilder( MigrateFileRepoLayout::class )
                        ->setMethods( [ 'getRepo' ] )->getMock();
                $this->migratorMock
                        ->expects( $this->any() )
index 6f04c66..5a343f6 100644 (file)
@@ -19,7 +19,7 @@ class RepoGroupTest extends MediaWikiTestCase {
 
        function testForEachForeignRepo() {
                $this->setUpForeignRepo();
-               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( RepoGroupTestHelper::class );
                $fakeCallback->expects( $this->once() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
@@ -29,7 +29,7 @@ class RepoGroupTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgForeignFileRepos', [] );
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
-               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( RepoGroupTestHelper::class );
                $fakeCallback->expects( $this->never() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
@@ -38,7 +38,7 @@ class RepoGroupTest extends MediaWikiTestCase {
        private function setUpForeignRepo() {
                global $wgUploadDirectory;
                $this->setMwGlobals( 'wgForeignFileRepos', [ [
-                       'class' => 'ForeignAPIRepo',
+                       'class' => ForeignAPIRepo::class,
                        'name' => 'wikimediacommons',
                        'backend' => 'wikimediacommons-backend',
                        'apibase' => 'https://commons.wikimedia.org/w/api.php',
index 62e1026..3f4e46b 100644 (file)
@@ -38,7 +38,7 @@ class FileTest extends MediaWikiMediaTestCase {
                $this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
                $this->setMwGlobals( 'wgThumbnailMinimumBucketDistance', $data['minimumBucketDistance'] );
 
-               $fileMock = $this->getMockBuilder( 'File' )
+               $fileMock = $this->getMockBuilder( File::class )
                        ->setConstructorArgs( [ 'fileMock', false ] )
                        ->setMethods( [ 'getWidth' ] )
                        ->getMockForAbstractClass();
@@ -137,11 +137,11 @@ class FileTest extends MediaWikiMediaTestCase {
         * @covers File::getThumbnailSource
         */
        public function testGetThumbnailSource( $data ) {
-               $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+               $backendMock = $this->getMockBuilder( FSFileBackend::class )
                        ->setConstructorArgs( [ [ 'name' => 'backendMock', 'wikiId' => wfWikiID() ] ] )
                        ->getMock();
 
-               $repoMock = $this->getMockBuilder( 'FileRepo' )
+               $repoMock = $this->getMockBuilder( FileRepo::class )
                        ->setConstructorArgs( [ [ 'name' => 'repoMock', 'backend' => $backendMock ] ] )
                        ->setMethods( [ 'fileExists', 'getLocalReference' ] )
                        ->getMock();
@@ -156,13 +156,13 @@ class FileTest extends MediaWikiMediaTestCase {
                        ->method( 'getLocalReference' )
                        ->will( $this->returnValue( $fsFile ) );
 
-               $handlerMock = $this->getMockBuilder( 'BitmapHandler' )
+               $handlerMock = $this->getMockBuilder( BitmapHandler::class )
                        ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
                        ->will( $this->returnValue( $data['supportsBucketing'] ) );
 
-               $fileMock = $this->getMockBuilder( 'File' )
+               $fileMock = $this->getMockBuilder( File::class )
                        ->setConstructorArgs( [ 'fileMock', $repoMock ] )
                        ->setMethods( [ 'getThumbnailBucket', 'getLocalRefPath', 'getHandler' ] )
                        ->getMockForAbstractClass();
@@ -248,22 +248,22 @@ class FileTest extends MediaWikiMediaTestCase {
        public function testGenerateBucketsIfNeeded( $data ) {
                $this->setMwGlobals( 'wgThumbnailBuckets', $data['buckets'] );
 
-               $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+               $backendMock = $this->getMockBuilder( FSFileBackend::class )
                        ->setConstructorArgs( [ [ 'name' => 'backendMock', 'wikiId' => wfWikiID() ] ] )
                        ->getMock();
 
-               $repoMock = $this->getMockBuilder( 'FileRepo' )
+               $repoMock = $this->getMockBuilder( FileRepo::class )
                        ->setConstructorArgs( [ [ 'name' => 'repoMock', 'backend' => $backendMock ] ] )
                        ->setMethods( [ 'fileExists', 'getLocalReference' ] )
                        ->getMock();
 
-               $fileMock = $this->getMockBuilder( 'File' )
+               $fileMock = $this->getMockBuilder( File::class )
                        ->setConstructorArgs( [ 'fileMock', $repoMock ] )
                        ->setMethods( [ 'getWidth', 'getBucketThumbPath', 'makeTransformTmpFile',
                                'generateAndSaveThumb', 'getHandler' ] )
                        ->getMockForAbstractClass();
 
-               $handlerMock = $this->getMockBuilder( 'JpegHandler' )
+               $handlerMock = $this->getMockBuilder( JpegHandler::class )
                        ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
@@ -273,7 +273,7 @@ class FileTest extends MediaWikiMediaTestCase {
                        ->method( 'getHandler' )
                        ->will( $this->returnValue( $handlerMock ) );
 
-               $reflectionMethod = new ReflectionMethod( 'File', 'generateBucketsIfNeeded' );
+               $reflectionMethod = new ReflectionMethod( File::class, 'generateBucketsIfNeeded' );
                $reflectionMethod->setAccessible( true );
 
                $fileMock->expects( $this->any() )
index ffaa2c3..e25e606 100644 (file)
@@ -176,7 +176,7 @@ class LocalFileTest extends MediaWikiTestCase {
                $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
                $this->assertThat(
                        $file,
-                       $this->isInstanceOf( 'LocalFile' ),
+                       $this->isInstanceOf( LocalFile::class ),
                        'wfLocalFile() returns LocalFile for valid Titles'
                );
        }
index c1aa1d7..e7922fd 100644 (file)
@@ -15,7 +15,7 @@ class HTMLCheckMatrixTest extends MediaWikiTestCase {
                try {
                        new HTMLCheckMatrix( [] );
                } catch ( MWException $e ) {
-                       $this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+                       $this->assertInstanceOf( HTMLFormFieldRequiredOptionsException::class, $e );
                        return;
                }
 
index fd3b0b8..7fb2cd4 100644 (file)
@@ -68,7 +68,7 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                $this->assertFalse( $lookup->fetch( 'xyz' ), 'unknown prefix' );
 
                $interwiki = $lookup->fetch( 'de' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
                $this->assertSame( $interwiki, $lookup->fetch( 'de' ), 'in-process caching' );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
@@ -169,13 +169,13 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                $this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
                $interwiki = $lookup->fetch( 'de' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
                $interwiki = $lookup->fetch( 'zz' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
@@ -220,13 +220,13 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                $this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
                $interwiki = $lookup->fetch( 'de' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
                $interwiki = $lookup->fetch( 'zz' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
index 22b1304..0d41c52 100644 (file)
@@ -106,7 +106,7 @@ class InterwikiTest extends MediaWikiTestCase {
                $this->assertFalse( $interwikiLookup->fetch( 'xyz' ), 'unknown prefix' );
 
                $interwiki = $interwikiLookup->fetch( 'de' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertInstanceOf( Interwiki::class, $interwiki );
                $this->assertSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'in-process caching' );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
index edba75c..d5a267e 100644 (file)
@@ -17,7 +17,7 @@ class JobQueueMemoryTest extends PHPUnit_Framework_TestCase {
         */
        private function newJobQueue() {
                return JobQueue::factory( [
-                       'class' => 'JobQueueMemory',
+                       'class' => JobQueueMemory::class,
                        'wiki' => wfWikiID(),
                        'type' => 'null',
                ] );
@@ -54,7 +54,7 @@ class JobQueueMemoryTest extends PHPUnit_Framework_TestCase {
        public function testJobFromSpecInternal() {
                $queue = $this->newJobQueue();
                $job = $queue->jobFromSpecInternal( $this->newJobSpecification() );
-               $this->assertInstanceOf( 'Job', $job );
+               $this->assertInstanceOf( Job::class, $job );
                $this->assertSame( 'null', $job->getType() );
                $this->assertArrayHasKey( 'customParameter', $job->getParams() );
                $this->assertSame( 'Custom title', $job->getTitle()->getText() );
index bd21dc8..0625edd 100644 (file)
@@ -28,7 +28,7 @@ class JobQueueTest extends MediaWikiTestCase {
                        }
                        $baseConfig = $wgJobTypeConf[$name];
                } else {
-                       $baseConfig = [ 'class' => 'JobQueueDBSingle' ];
+                       $baseConfig = [ 'class' => JobQueueDBSingle::class ];
                }
                $baseConfig['type'] = 'null';
                $baseConfig['wiki'] = wfWikiID();
@@ -234,7 +234,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $j = $queue->pop();
                // Make sure ack() of the twin did not delete the sibling data
-               $this->assertType( 'NullJob', $j );
+               $this->assertType( NullJob::class, $j );
        }
 
        /**
index 395d12c..0cab702 100644 (file)
@@ -18,7 +18,7 @@ class JobTest extends MediaWikiTestCase {
        }
 
        public function provideTestToString() {
-               $mockToStringObj = $this->getMockBuilder( 'stdClass' )
+               $mockToStringObj = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ '__toString' ] )->getMock();
                $mockToStringObj->expects( $this->any() )
                        ->method( '__toString' )
@@ -86,7 +86,7 @@ class JobTest extends MediaWikiTestCase {
 
        public function getMockJob( $params ) {
                $mock = $this->getMockForAbstractClass(
-                       'Job',
+                       Job::class,
                        [ 'someCommand', new Title(), $params ],
                        'SomeJob'
                );
index d252c80..a4ab879 100644 (file)
@@ -159,12 +159,12 @@ class FormatJsonTest extends MediaWikiTestCase {
                $this->assertJson( $json );
 
                $st = FormatJson::parse( $json );
-               $this->assertInstanceOf( 'Status', $st );
+               $this->assertInstanceOf( Status::class, $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $expected, $st->getValue() );
 
                $st = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
-               $this->assertInstanceOf( 'Status', $st );
+               $this->assertInstanceOf( Status::class, $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $value, $st->getValue() );
        }
@@ -230,7 +230,7 @@ class FormatJsonTest extends MediaWikiTestCase {
                }
 
                $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
-               $this->assertInstanceOf( 'Status', $st );
+               $this->assertInstanceOf( Status::class, $st );
                if ( $expected === false ) {
                        $this->assertFalse( $st->isOK(), 'Expected isOK() == false' );
                } else {
@@ -256,7 +256,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         */
        public function testParseErrors( $value ) {
                $st = FormatJson::parse( $value );
-               $this->assertInstanceOf( 'Status', $st );
+               $this->assertInstanceOf( Status::class, $st );
                $this->assertFalse( $st->isOK() );
        }
 
@@ -313,7 +313,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         */
        public function testParseStripComments( $json, $expect ) {
                $st = FormatJson::parse( $json, FormatJson::STRIP_COMMENTS );
-               $this->assertInstanceOf( 'Status', $st );
+               $this->assertInstanceOf( Status::class, $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $expect, $st->getValue() );
        }
index 19dc53c..c995840 100644 (file)
@@ -11,7 +11,7 @@ class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
         * @dataProvider provideToString
         */
        public function testToString( $params, $expected ) {
-               $class = new ReflectionClass( 'DeferredStringifier' );
+               $class = new ReflectionClass( DeferredStringifier::class );
                $ds = $class->newInstanceArgs( $params );
                $this->assertEquals( $expected, (string)$ds );
        }
index ba8af93..d09171c 100644 (file)
@@ -33,7 +33,7 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * way as the original underlying callable.
         */
        public function testReturnValuePassedThrough() {
-               $mock = $this->getMockBuilder( 'stdClass' )
+               $mock = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'reverse' ] )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'reverse' )
@@ -50,7 +50,7 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * @requires function apc_store/apcu_store
         */
        public function testCallableMemoized() {
-               $observer = $this->getMockBuilder( 'stdClass' )
+               $observer = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'computeSomething' ] )->getMock();
                $observer->expects( $this->once() )
                        ->method( 'computeSomething' )
index 03814da..18d7d05 100644 (file)
@@ -27,7 +27,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
-                       'class' => 'ObjectFactoryTestFixture',
+                       'class' => ObjectFactoryTestFixture::class,
                        'args' => [
                                function () {
                                        return 'wrapped';
@@ -54,7 +54,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
-                       'class' => 'ObjectFactoryTestFixture',
+                       'class' => ObjectFactoryTestFixture::class,
                        'args' => [
                                function () {
                                        return 'wrapped';
@@ -75,7 +75,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'wrapped', $obj->setterArgs[0] );
 
                $obj = ObjectFactory::getObjectFromSpec( [
-                       'class' => 'ObjectFactoryTestFixture',
+                       'class' => ObjectFactoryTestFixture::class,
                        'args' => [ function () {
                                return 'unwrapped';
                        }, ],
@@ -123,7 +123,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testGetObjectFromClass( $args ) {
                $obj = ObjectFactory::getObjectFromSpec( [
-                       'class' => 'ObjectFactoryTestFixture',
+                       'class' => ObjectFactoryTestFixture::class,
                        'args' => $args,
                ] );
                $this->assertSame( $args, $obj->args );
index c9123b8..e2723b9 100644 (file)
@@ -31,7 +31,7 @@ class XhprofTest extends PHPUnit_Framework_TestCase {
         * @covers Xhprof::enable
         */
        public function testEnable() {
-               $xhprof = new ReflectionClass( 'Xhprof' );
+               $xhprof = new ReflectionClass( Xhprof::class );
                $enabled = $xhprof->getProperty( 'enabled' );
                $enabled->setAccessible( true );
                $enabled->setValue( true );
index 7053fc1..a2c3bdc 100644 (file)
@@ -621,7 +621,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( count( $ids ), $calls, "Values cached" );
 
                // Mock the BagOStuff to assure only one getMulti() call given process caching
-               $localBag = $this->getMockBuilder( 'HashBagOStuff' )
+               $localBag = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'getMulti' ] )->getMock();
                $localBag->expects( $this->exactly( 1 ) )->method( 'getMulti' )->willReturn( [
                        WANObjectCache::VALUE_KEY_PREFIX . 'k1' => 'val-id1',
@@ -1474,7 +1474,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
        }
 
        public function testMcRouterSupport() {
-               $localBag = $this->getMockBuilder( 'EmptyBagOStuff' )
+               $localBag = $this->getMockBuilder( EmptyBagOStuff::class )
                        ->setMethods( [ 'set', 'delete' ] )->getMock();
                $localBag->expects( $this->never() )->method( 'set' );
                $localBag->expects( $this->never() )->method( 'delete' );
index 5e59cfd..a23a2a0 100644 (file)
@@ -27,6 +27,7 @@ use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\Rdbms\DatabaseDomain;
 use Wikimedia\Rdbms\MySQLMasterPos;
 use Wikimedia\Rdbms\DatabaseMysqlBase;
+use Wikimedia\Rdbms\DatabaseMysqli;
 use Wikimedia\Rdbms\Database;
 
 /**
@@ -176,7 +177,7 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getMockForViews() {
-               $db = $this->getMockBuilder( 'DatabaseMysqli' )
+               $db = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->setMethods( [ 'fetchRow', 'query' ] )
                        ->getMock();
@@ -325,7 +326,7 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
         * @covers Wikimedia\Rdbms\DatabaseMysqlBase::getLagFromPtHeartbeat
         */
        public function testPtHeartbeat( $lag ) {
-               $db = $this->getMockBuilder( 'DatabaseMysqli' )
+               $db = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->setMethods( [
                                'getLagDetectionMethod', 'getHeartbeatData', 'getMasterServerInfo' ] )
index 012b0a3..e523a31 100644 (file)
@@ -53,8 +53,8 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
                $this->setMwGlobals( [
                        'wgLogTypes' => [ 'phpunit' ],
-                       'wgLogActionsHandlers' => [ 'phpunit/test' => 'LogFormatter',
-                               'phpunit/param' => 'LogFormatter' ],
+                       'wgLogActionsHandlers' => [ 'phpunit/test' => LogFormatter::class,
+                               'phpunit/param' => LogFormatter::class ],
                        'wgUser' => User::newFromName( 'Testuser' ),
                ] );
 
index 8317e91..eee2981 100644 (file)
@@ -11,11 +11,11 @@ class NewUsersLogFormatterTest extends LogFormatterTestCase {
 
                // Register LogHandler, see $wgNewUserLog in Setup.php
                $this->mergeMwGlobalArrayValue( 'wgLogActionsHandlers', [
-                       'newusers/newusers' => 'NewUsersLogFormatter',
-                       'newusers/create' => 'NewUsersLogFormatter',
-                       'newusers/create2' => 'NewUsersLogFormatter',
-                       'newusers/byemail' => 'NewUsersLogFormatter',
-                       'newusers/autocreate' => 'NewUsersLogFormatter',
+                       'newusers/newusers' => NewUsersLogFormatter::class,
+                       'newusers/create' => NewUsersLogFormatter::class,
+                       'newusers/create2' => NewUsersLogFormatter::class,
+                       'newusers/byemail' => NewUsersLogFormatter::class,
+                       'newusers/autocreate' => NewUsersLogFormatter::class,
                ] );
        }
 
index 0819015..33fd68f 100644 (file)
@@ -12,7 +12,7 @@ class PageLangLogFormatterTest extends LogFormatterTestCase {
                $this->setMwGlobals( 'wgHooks', [] );
                // Register LogHandler, see $wgPageLanguageUseDB in Setup.php
                $this->mergeMwGlobalArrayValue( 'wgLogActionsHandlers', [
-                       'pagelang/pagelang' => 'PageLangLogFormatter',
+                       'pagelang/pagelang' => PageLangLogFormatter::class,
                ] );
        }
 
index c837d26..d0bd698 100644 (file)
@@ -7,7 +7,7 @@ class MailAddressTest extends MediaWikiTestCase {
         */
        public function testConstructor() {
                $ma = new MailAddress( 'foo@bar.baz', 'UserName', 'Real name' );
-               $this->assertInstanceOf( 'MailAddress', $ma );
+               $this->assertInstanceOf( MailAddress::class, $ma );
        }
 
        /**
@@ -17,7 +17,7 @@ class MailAddressTest extends MediaWikiTestCase {
                if ( wfIsWindows() ) {
                        $this->markTestSkipped( 'This test only works on non-Windows platforms' );
                }
-               $user = $this->createMock( 'User' );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )->method( 'getName' )->will(
                        $this->returnValue( 'UserName' )
                );
@@ -29,7 +29,7 @@ class MailAddressTest extends MediaWikiTestCase {
                );
 
                $ma = MailAddress::newFromUser( $user );
-               $this->assertInstanceOf( 'MailAddress', $ma );
+               $this->assertInstanceOf( MailAddress::class, $ma );
                $this->setMwGlobals( 'wgEnotifUseRealName', true );
                $this->assertEquals( 'Real name <foo@bar.baz>', $ma->toString() );
                $this->setMwGlobals( 'wgEnotifUseRealName', false );
index 92a927f..fb96f7d 100644 (file)
@@ -124,7 +124,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $file = new FakeDimensionFile( [ 4000, 4000 ] );
                $handler = new BitmapHandler;
                $params = [ 'width' => '3700' ]; // Still bigger than max size.
-               $this->assertEquals( 'TransformTooBigImageAreaError',
+               $this->assertEquals( TransformTooBigImageAreaError::class,
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
@@ -136,7 +136,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $file->mustRender = true;
                $handler = new BitmapHandler;
                $params = [ 'width' => '5000' ]; // Still bigger than max size.
-               $this->assertEquals( 'TransformTooBigImageAreaError',
+               $this->assertEquals( TransformTooBigImageAreaError::class,
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
 
index 16ae193..0987bd0 100644 (file)
@@ -44,7 +44,7 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
         */
        public function testResolveMultivalueValue( $input, $output ) {
                $formatMetadata = new FormatMetadata();
-               $class = new ReflectionClass( 'FormatMetadata' );
+               $class = new ReflectionClass( FormatMetadata::class );
                $method = $class->getMethod( 'resolveMultivalueValue' );
                $method->setAccessible( true );
                $actualInput = $method->invoke( $formatMetadata, $input );
index a9eaa9e..22de935 100644 (file)
@@ -65,24 +65,6 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $meta['Copyright']['x-default'] );
        }
 
-       /**
-        * Test extraction of pHYs tags, which can tell what the
-        * actual resolution of the image is (aka in dots per meter).
-        */
-       /*
-       public function testPngPhysTag() {
-               $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
-                       'Png-native-test.png' );
-
-               $this->assertArrayHasKey( 'text', $meta );
-               $meta = $meta['text'];
-
-               $this->assertEquals( '2835/100', $meta['XResolution'] );
-               $this->assertEquals( '2835/100', $meta['YResolution'] );
-               $this->assertEquals( 3, $meta['ResolutionUnit'] ); // 3 = cm
-       }
-       */
-
        /**
         * Given a normal static PNG, check the animation metadata returned.
         */
index 7eb5582..432754b 100644 (file)
@@ -90,7 +90,7 @@ class MemcachedBagOStuffTest extends MediaWikiTestCase {
         * @covers MemcachedBagOStuff::validateKeyEncoding
         */
        public function testValidateKeyEncodingThrowsException( $key ) {
-               $this->setExpectedException( 'Exception' );
+               $this->setExpectedException( Exception::class );
                $this->cache->validateKeyEncoding( $key );
        }
 
index f8ce24e..4318852 100644 (file)
@@ -16,13 +16,13 @@ class ObjectCacheTest extends MediaWikiTestCase {
 
        private function setCacheConfig( $arr = [] ) {
                $defaults = [
-                       CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ],
-                       CACHE_DB => [ 'class' => 'SqlBagOStuff' ],
+                       CACHE_NONE => [ 'class' => EmptyBagOStuff::class ],
+                       CACHE_DB => [ 'class' => SqlBagOStuff::class ],
                        CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
                        // Mock ACCEL with 'hash' as being installed.
                        // This makes tests deterministic regardless of APC.
-                       CACHE_ACCEL => [ 'class' => 'HashBagOStuff' ],
-                       'hash' => [ 'class' => 'HashBagOStuff' ],
+                       CACHE_ACCEL => [ 'class' => HashBagOStuff::class ],
+                       'hash' => [ 'class' => HashBagOStuff::class ],
                ];
                $this->setMwGlobals( 'wgObjectCaches', $arr + $defaults );
        }
@@ -70,7 +70,7 @@ class ObjectCacheTest extends MediaWikiTestCase {
 
                $this->setCacheConfig( [
                        // Mock APC not being installed (T160519, T147161)
-                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+                       CACHE_ACCEL => [ 'class' => EmptyBagOStuff::class ]
                ] );
 
                $this->assertInstanceOf(
@@ -91,7 +91,7 @@ class ObjectCacheTest extends MediaWikiTestCase {
 
                $this->setCacheConfig( [
                        // Mock APC not being installed (T160519, T147161)
-                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+                       CACHE_ACCEL => [ 'class' => EmptyBagOStuff::class ]
                ] );
 
                $this->assertInstanceOf(
index 4ef4aab..66754fc 100644 (file)
@@ -18,7 +18,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
        public function setUp() {
                parent::setUp();
                $this->client =
-                       $this->getMockBuilder( 'MultiHttpClient' )
+                       $this->getMockBuilder( MultiHttpClient::class )
                                ->setConstructorArgs( [ [] ] )
                                ->setMethods( [ 'run' ] )
                                ->getMock();
index ea58e4a..6e8c9ce 100644 (file)
@@ -14,7 +14,7 @@ class RedisBagOStuffTest extends PHPUnit_Framework_TestCase {
 
        protected function setUp() {
                parent::setUp();
-               $cache = $this->getMockBuilder( 'RedisBagOStuff' )
+               $cache = $this->getMockBuilder( RedisBagOStuff::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $this->cache = TestingAccessWrapper::newFromObject( $cache );
index bfda3dc..2d7d6cc 100644 (file)
@@ -36,7 +36,7 @@ class WikiPageContentHandlerDbTest extends WikiPageDbTestBase {
                );
 
                $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
+               $this->assertEquals( JavaScriptContentHandler::class, get_class( $page->getContentHandler() ) );
        }
 
 }
index 9a70e61..b7fe47e 100644 (file)
@@ -341,7 +341,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
 
                # sanity check, because this test seems to fail for no reason for some people.
                $c = $page->getContent();
-               $this->assertEquals( 'WikitextContent', get_class( $c ) );
+               $this->assertEquals( WikitextContent::class, get_class( $c ) );
 
                # now, test the actual redirect
                $t = $page->getRedirectTarget();
@@ -1065,15 +1065,15 @@ more stuff
        public function testWikiPageFactory() {
                $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
                $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+               $this->assertEquals( WikiFilePage::class, get_class( $page ) );
 
                $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
                $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+               $this->assertEquals( WikiCategoryPage::class, get_class( $page ) );
 
                $title = Title::makeTitle( NS_MAIN, 'SomePage' );
                $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiPage', get_class( $page ) );
+               $this->assertEquals( WikiPage::class, get_class( $page ) );
        }
 
        /**
index 4721ce6..72390ac 100644 (file)
@@ -14,7 +14,7 @@ class RangeChronologicalPagerTest extends MediaWikiLangTestCase {
         * @dataProvider getDateCondProvider
         */
        public function testGetDateCond( $inputYear, $inputMonth, $inputDay, $expected ) {
-               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
                $this->assertEquals(
                        $expected,
                        wfTimestamp( TS_MW, $pager->getDateCond( $inputYear, $inputMonth, $inputDay ) )
@@ -42,7 +42,7 @@ class RangeChronologicalPagerTest extends MediaWikiLangTestCase {
         * @dataProvider getDateRangeCondProvider
         */
        public function testGetDateRangeCond( $start, $end, $expected ) {
-               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
                $this->assertArrayEquals( $expected, $pager->getDateRangeCond( $start, $end ) );
        }
 
@@ -84,7 +84,7 @@ class RangeChronologicalPagerTest extends MediaWikiLangTestCase {
         * @dataProvider getDateRangeCondInvalidProvider
         */
        public function testGetDateRangeCondInvalid( $start, $end ) {
-               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $pager = $this->getMockForAbstractClass( RangeChronologicalPager::class );
                $this->assertEquals( null, $pager->getDateRangeCond( $start, $end ) );
        }
 
index eb163d3..3910ab6 100644 (file)
@@ -13,7 +13,7 @@ class ReverseChronologicalPagerTest extends MediaWikiLangTestCase {
         * @covers ReverseChronologicalPager::getDateCond
         */
        public function testGetDateCond() {
-               $pager = $this->getMockForAbstractClass( 'ReverseChronologicalPager' );
+               $pager = $this->getMockForAbstractClass( ReverseChronologicalPager::class );
                $timestamp = MWTimestamp::getInstance();
                $db = wfGetDB( DB_MASTER );
 
diff --git a/tests/phpunit/includes/parser/CoreParserFunctionsTest.php b/tests/phpunit/includes/parser/CoreParserFunctionsTest.php
new file mode 100644 (file)
index 0000000..c630447
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @group Database
+ * @covers CoreParserFunctions
+ */
+class CoreParserFunctionsTest extends MediaWikiTestCase {
+
+       public function testGender() {
+               $user = User::createNew( '*Female' );
+               $user->setOption( 'gender', 'female' );
+               $user->saveSettings();
+
+               $msg = ( new RawMessage( '{{GENDER:*Female|m|f|o}}' ) )->parse();
+               $this->assertEquals( $msg, 'f', 'Works unescaped' );
+               $escapedName = wfEscapeWikiText( '*Female' );
+               $msg2 = ( new RawMessage( '{{GENDER:' . $escapedName . '|m|f|o}}' ) )
+                       ->parse();
+               $this->assertEquals( $msg, 'f', 'Works escaped' );
+       }
+
+}
index ab13899..c415b58 100644 (file)
@@ -37,8 +37,8 @@ class PreprocessorTest extends MediaWikiTestCase {
        protected $mPreprocessors;
 
        protected static $classNames = [
-               'Preprocessor_DOM',
-               'Preprocessor_Hash'
+               Preprocessor_DOM::class,
+               Preprocessor_Hash::class
        ];
 
        protected function setUp() {
index 1673410..952f541 100644 (file)
@@ -10,7 +10,7 @@
 class BcryptPasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [ 'bcrypt' => [
-                       'class' => 'BcryptPassword',
+                       'class' => BcryptPassword::class,
                        'cost' => 9,
                ] ];
        }
index 7ed9711..6dfdea6 100644 (file)
@@ -9,7 +9,7 @@ class EncryptedPasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [
                        'both' => [
-                               'class' => 'EncryptedPassword',
+                               'class' => EncryptedPassword::class,
                                'underlying' => 'pbkdf2',
                                'secrets' => [
                                        md5( 'secret1' ),
@@ -18,7 +18,7 @@ class EncryptedPasswordTest extends PasswordTestCase {
                                'cipher' => 'aes-256-cbc',
                        ],
                        'secret1' => [
-                               'class' => 'EncryptedPassword',
+                               'class' => EncryptedPassword::class,
                                'underlying' => 'pbkdf2',
                                'secrets' => [
                                        md5( 'secret1' ),
@@ -26,7 +26,7 @@ class EncryptedPasswordTest extends PasswordTestCase {
                                'cipher' => 'aes-256-cbc',
                        ],
                        'secret2' => [
-                               'class' => 'EncryptedPassword',
+                               'class' => EncryptedPassword::class,
                                'underlying' => 'pbkdf2',
                                'secrets' => [
                                        md5( 'secret2' ),
@@ -34,7 +34,7 @@ class EncryptedPasswordTest extends PasswordTestCase {
                                'cipher' => 'aes-256-cbc',
                        ],
                        'pbkdf2' => [
-                               'class' => 'Pbkdf2Password',
+                               'class' => Pbkdf2Password::class,
                                'algo' => 'sha256',
                                'cost' => '10',
                                'length' => '64',
index cee4fbb..6a965a0 100644 (file)
@@ -8,7 +8,7 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [
                        'testLargeLayeredTop' => [
-                               'class' => 'LayeredParameterizedPassword',
+                               'class' => LayeredParameterizedPassword::class,
                                'types' => [
                                        'testLargeLayeredBottom',
                                        'testLargeLayeredBottom',
@@ -18,13 +18,13 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
                                ],
                        ],
                        'testLargeLayeredBottom' => [
-                               'class' => 'Pbkdf2Password',
+                               'class' => Pbkdf2Password::class,
                                'algo' => 'sha512',
                                'cost' => 1024,
                                'length' => 512,
                        ],
                        'testLargeLayeredFinal' => [
-                               'class' => 'BcryptPassword',
+                               'class' => BcryptPassword::class,
                                'cost' => 5,
                        ]
                ];
index 51e739c..5010082 100644 (file)
@@ -8,7 +8,7 @@
 class MWOldPasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [ 'A' => [
-                       'class' => 'MWOldPassword',
+                       'class' => MWOldPassword::class,
                ] ];
        }
 
index 53a6ad1..5616868 100644 (file)
@@ -8,7 +8,7 @@
 class MWSaltedPasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [ 'B' => [
-                       'class' => 'MWSaltedPassword',
+                       'class' => MWSaltedPassword::class,
                ] ];
        }
 
index 5d585f3..01b0de2 100644 (file)
@@ -6,14 +6,14 @@
 class PasswordFactoryTest extends MediaWikiTestCase {
        public function testRegister() {
                $pf = new PasswordFactory;
-               $pf->register( 'foo', [ 'class' => 'InvalidPassword' ] );
+               $pf->register( 'foo', [ 'class' => InvalidPassword::class ] );
                $this->assertArrayHasKey( 'foo', $pf->getTypes() );
        }
 
        public function testSetDefaultType() {
                $pf = new PasswordFactory;
-               $pf->register( '1', [ 'class' => 'InvalidPassword' ] );
-               $pf->register( '2', [ 'class' => 'InvalidPassword' ] );
+               $pf->register( '1', [ 'class' => InvalidPassword::class ] );
+               $pf->register( '2', [ 'class' => InvalidPassword::class ] );
                $pf->setDefaultType( '1' );
                $this->assertSame( '1', $pf->getDefaultType() );
                $pf->setDefaultType( '2' );
@@ -31,7 +31,7 @@ class PasswordFactoryTest extends MediaWikiTestCase {
        public function testInit() {
                $config = new HashConfig( [
                        'PasswordConfig' => [
-                               'foo' => [ 'class' => 'InvalidPassword' ],
+                               'foo' => [ 'class' => InvalidPassword::class ],
                        ],
                        'PasswordDefault' => 'foo'
                ] );
@@ -43,7 +43,7 @@ class PasswordFactoryTest extends MediaWikiTestCase {
 
        public function testNewFromCiphertext() {
                $pf = new PasswordFactory;
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pw = $pf->newFromCiphertext( ':B:salt:d529e941509eb9e9b9cfaeae1fe7ca23' );
                $this->assertInstanceOf( MWSaltedPassword::class, $pw );
        }
@@ -58,13 +58,13 @@ class PasswordFactoryTest extends MediaWikiTestCase {
         */
        public function testNewFromCiphertextErrors( $hash ) {
                $pf = new PasswordFactory;
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pf->newFromCiphertext( $hash );
        }
 
        public function testNewFromType() {
                $pf = new PasswordFactory;
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pw = $pf->newFromType( 'B' );
                $this->assertInstanceOf( MWSaltedPassword::class, $pw );
        }
@@ -74,26 +74,26 @@ class PasswordFactoryTest extends MediaWikiTestCase {
         */
        public function testNewFromTypeError() {
                $pf = new PasswordFactory;
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pf->newFromType( 'bogus' );
        }
 
        public function testNewFromPlaintext() {
                $pf = new PasswordFactory;
-               $pf->register( 'A', [ 'class' => 'MWOldPassword' ] );
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'A', [ 'class' => MWOldPassword::class ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pf->setDefaultType( 'A' );
 
-               $this->assertInstanceOf( 'InvalidPassword', $pf->newFromPlaintext( null ) );
-               $this->assertInstanceOf( 'MWOldPassword', $pf->newFromPlaintext( 'password' ) );
-               $this->assertInstanceOf( 'MWSaltedPassword',
+               $this->assertInstanceOf( InvalidPassword::class, $pf->newFromPlaintext( null ) );
+               $this->assertInstanceOf( MWOldPassword::class, $pf->newFromPlaintext( 'password' ) );
+               $this->assertInstanceOf( MWSaltedPassword::class,
                        $pf->newFromPlaintext( 'password', $pf->newFromType( 'B' ) ) );
        }
 
        public function testNeedsUpdate() {
                $pf = new PasswordFactory;
-               $pf->register( 'A', [ 'class' => 'MWOldPassword' ] );
-               $pf->register( 'B', [ 'class' => 'MWSaltedPassword' ] );
+               $pf->register( 'A', [ 'class' => MWOldPassword::class ] );
+               $pf->register( 'B', [ 'class' => MWSaltedPassword::class ] );
                $pf->setDefaultType( 'A' );
 
                $this->assertFalse( $pf->needsUpdate( $pf->newFromType( 'A' ) ) );
@@ -105,6 +105,6 @@ class PasswordFactoryTest extends MediaWikiTestCase {
        }
 
        public function testNewInvalidPassword() {
-               $this->assertInstanceOf( 'InvalidPassword', PasswordFactory::newInvalidPassword() );
+               $this->assertInstanceOf( InvalidPassword::class, PasswordFactory::newInvalidPassword() );
        }
 }
index d0177d0..65c9199 100644 (file)
@@ -36,6 +36,6 @@ class PasswordTest extends MediaWikiTestCase {
                $passwordFactory = new PasswordFactory();
                $invalid = $passwordFactory->newFromPlaintext( null );
 
-               $this->assertInstanceOf( 'InvalidPassword', $invalid );
+               $this->assertInstanceOf( InvalidPassword::class, $invalid );
        }
 }
index 605d190..cf851c8 100644 (file)
@@ -9,7 +9,7 @@ class Pbkdf2PasswordFallbackTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [
                        'pbkdf2' => [
-                               'class' => 'Pbkdf2Password',
+                               'class' => Pbkdf2Password::class,
                                'algo' => 'sha256',
                                'cost' => '10000',
                                'length' => '128',
index ff069cd..7e97ab1 100644 (file)
@@ -10,7 +10,7 @@
 class Pbkdf2PasswordTest extends PasswordTestCase {
        protected function getTypeConfigs() {
                return [ 'pbkdf2' => [
-                       'class' => 'Pbkdf2Password',
+                       'class' => Pbkdf2Password::class,
                        'algo' => 'sha256',
                        'cost' => '10000',
                        'length' => '128',
index 6caf3e5..f7f2013 100644 (file)
@@ -21,13 +21,13 @@ class PoolCounterTest extends MediaWikiTestCase {
                        'maxqueue' => 100,
                ];
 
-               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+               $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
                        ->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'someKey' ] )
                        // don't mock anything - the proper syntax would be setMethods(null), but due
                        // to a PHPUnit bug that does not work with getMockForAbstractClass()
                        ->setMethods( [ 'idontexist' ] )
                        ->getMockForAbstractClass();
-               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+               $this->assertInstanceOf( PoolCounter::class, $poolCounter );
        }
 
        public function testConstructWithSlots() {
@@ -39,15 +39,15 @@ class PoolCounterTest extends MediaWikiTestCase {
                        'maxqueue' => 100,
                ];
 
-               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+               $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
                        ->setConstructorArgs( [ $poolCounterConfig, 'testCounter', 'key' ] )
                        ->setMethods( [ 'idontexist' ] ) // don't mock anything
                        ->getMockForAbstractClass();
-               $this->assertInstanceOf( 'PoolCounter', $poolCounter );
+               $this->assertInstanceOf( PoolCounter::class, $poolCounter );
        }
 
        public function testHashKeyIntoSlots() {
-               $poolCounter = $this->getMockBuilder( 'PoolCounterAbstractMock' )
+               $poolCounter = $this->getMockBuilder( PoolCounterAbstractMock::class )
                        // don't mock anything - the proper syntax would be setMethods(null), but due
                        // to a PHPUnit bug that does not work with getMockForAbstractClass()
                        ->setMethods( [ 'idontexist' ] )
index 3e9c567..fdf0152 100644 (file)
@@ -27,8 +27,8 @@ class RCFeedIntegrationTest extends MediaWikiTestCase {
         * @covers MachineReadableRCFeedFormatter::getLine
         */
        public function testNotify() {
-               $feed = $this->getMockBuilder( 'RCFeedEngine' )
-                       ->setConstructorArgs( [ [ 'formatter' => 'JSONRCFeedFormatter' ] ] )
+               $feed = $this->getMockBuilder( RCFeedEngine::class )
+                       ->setConstructorArgs( [ [ 'formatter' => JSONRCFeedFormatter::class ] ] )
                        ->setMethods( [ 'send' ] )
                        ->getMock();
 
@@ -71,7 +71,7 @@ class RCFeedIntegrationTest extends MediaWikiTestCase {
                        'wgRCFeeds' => [
                                'myfeed' => [
                                        'uri' => 'test://localhost:1234',
-                                       'formatter' => 'JSONRCFeedFormatter',
+                                       'formatter' => JSONRCFeedFormatter::class,
                                ],
                        ],
                        'wgRCEngines' => [
index acf4710..4282652 100644 (file)
@@ -332,7 +332,7 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        public function testExtractCredits() {
                $processor = new ExtensionProcessor();
                $processor->extractInfo( $this->dir, self::$default, 1 );
-               $this->setExpectedException( 'Exception' );
+               $this->setExpectedException( Exception::class );
                $processor->extractInfo( $this->dir, self::$default, 1 );
        }
 
index 9b57e1c..a6f69b6 100644 (file)
@@ -28,7 +28,7 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                        'autoloaderPaths' => []
                ];
                $registry = new ExtensionRegistry();
-               $class = new ReflectionClass( 'ExtensionRegistry' );
+               $class = new ReflectionClass( ExtensionRegistry::class );
                $method = $class->getMethod( 'exportExtractedData' );
                $method->setAccessible( true );
                $method->invokeArgs( $registry, [ $info ] );
@@ -287,6 +287,18 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                                        ],
                                ],
                        ],
+                       [
+                               'global is null before',
+                               [
+                                       'NullGlobal' => null,
+                               ],
+                               [
+                                       'NullGlobal' => 'not-null'
+                               ],
+                               [
+                                       'NullGlobal' => null
+                               ],
+                       ],
                ];
        }
 }
index 15d0c2b..6f0de16 100644 (file)
@@ -111,7 +111,7 @@ class VersionCheckerTest extends PHPUnit_Framework_TestCase {
                                ],
                        ] );
 
-               $this->setExpectedException( 'UnexpectedValueException' );
+               $this->setExpectedException( UnexpectedValueException::class );
                $checker->checkArray( [
                        'FakeExtension' => [
                                'FakeDependency' => 'not really valid',
index 7521e88..c00432e 100644 (file)
@@ -14,7 +14,7 @@ class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
                parent::setUp();
                // MediaWiki tests defaults $wgMainWANCache to CACHE_NONE.
                // Use hash instead so that caching is observed
-               $this->wanCache = $this->getMockBuilder( 'WANObjectCache' )
+               $this->wanCache = $this->getMockBuilder( WANObjectCache::class )
                        ->setConstructorArgs( [ [
                                'cache' => new HashBagOStuff(),
                                'pool' => 'test',
@@ -32,7 +32,7 @@ class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
        }
 
        protected function makeBlobStore( $methods = null, $rl = null ) {
-               $blobStore = $this->getMockBuilder( 'MessageBlobStore' )
+               $blobStore = $this->getMockBuilder( MessageBlobStore::class )
                        ->setConstructorArgs( [ $rl ] )
                        ->setMethods( $methods )
                        ->getMock();
index e5b338e..3f5704d 100644 (file)
@@ -59,7 +59,7 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                return [
                        [
                                [
-                                       'class' => 'ResourceLoaderImageModule',
+                                       'class' => ResourceLoaderImageModule::class,
                                        'prefix' => 'oo-ui-icon',
                                        'variants' => self::$commonImageVariants,
                                        'images' => self::$commonImageData,
@@ -100,7 +100,7 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                        ],
                        [
                                [
-                                       'class' => 'ResourceLoaderImageModule',
+                                       'class' => ResourceLoaderImageModule::class,
                                        'selectorWithoutVariant' => '.mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
                                        'selectorWithVariant' =>
                                                '.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
@@ -239,7 +239,7 @@ TEXT
        }
 
        private function getImageMock( ResourceLoaderContext $context, $dataUriReturnValue ) {
-               $image = $this->getMockBuilder( 'ResourceLoaderImage' )
+               $image = $this->getMockBuilder( ResourceLoaderImage::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $image->method( 'getDataUri' )
index 7c7f1cf..0ea4e2b 100644 (file)
@@ -149,9 +149,9 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderModule::expandRelativePaths
         */
        public function testPlaceholderize() {
-               $getRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'getRelativePaths' );
+               $getRelativePaths = new ReflectionMethod( ResourceLoaderModule::class, 'getRelativePaths' );
                $getRelativePaths->setAccessible( true );
-               $expandRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'expandRelativePaths' );
+               $expandRelativePaths = new ReflectionMethod( ResourceLoaderModule::class, 'expandRelativePaths' );
                $expandRelativePaths->setAccessible( true );
 
                $this->setMwGlobals( [
index 491fff6..ea220f1 100644 (file)
@@ -10,7 +10,7 @@ class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
         */
        public function testNonDefaultSkin() {
                $module = new ResourceLoaderOOUIImageModule( [
-                       'class' => 'ResourceLoaderOOUIImageModule',
+                       'class' => ResourceLoaderOOUIImageModule::class,
                        'name' => 'icons',
                        'rootPath' => 'tests/phpunit/data/resourceloader/oouiimagemodule',
                ] );
@@ -22,7 +22,7 @@ class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
                        function () {
                        }
                );
-               $r = new ReflectionMethod( 'ExtensionRegistry', 'exportExtractedData' );
+               $r = new ReflectionMethod( ExtensionRegistry::class, 'exportExtractedData' );
                $r->setAccessible( true );
                $r->invoke( ExtensionRegistry::getInstance(), [
                        'globals' => [],
index 03a609b..564f50b 100644 (file)
@@ -56,7 +56,7 @@ mw.loader.register( [
                                'msg' => 'Version falls back gracefully if getVersionHash throws',
                                'modules' => [
                                        'test.fail' => (
-                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                               ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
                                                        ->setMethods( [ 'getVersionHash' ] )->getMock() )
                                                && $mock->method( 'getVersionHash' )->will(
                                                        $this->throwException( new Exception )
@@ -81,7 +81,7 @@ mw.loader.state( {
                                'msg' => 'Use version from getVersionHash',
                                'modules' => [
                                        'test.version' => (
-                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                               ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
                                                        ->setMethods( [ 'getVersionHash' ] )->getMock() )
                                                && $mock->method( 'getVersionHash' )->willReturn( '1234567' )
                                        ) ? $mock : $mock
@@ -101,7 +101,7 @@ mw.loader.register( [
                                'msg' => 'Re-hash version from getVersionHash if too long',
                                'modules' => [
                                        'test.version' => (
-                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                               ( $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
                                                        ->setMethods( [ 'getVersionHash' ] )->getMock() )
                                                && $mock->method( 'getVersionHash' )->willReturn( '12345678' )
                                        ) ? $mock : $mock
index f45f8ae..0bc558a 100644 (file)
@@ -86,7 +86,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         */
        public function testRegisterInvalidName() {
                $resourceLoader = new EmptyResourceLoader();
-               $this->setExpectedException( 'MWException', "name 'test!invalid' is invalid" );
+               $this->setExpectedException( MWException::class, "name 'test!invalid' is invalid" );
                $resourceLoader->register( 'test!invalid', new ResourceLoaderTestModule() );
        }
 
@@ -95,7 +95,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         */
        public function testRegisterInvalidType() {
                $resourceLoader = new EmptyResourceLoader();
-               $this->setExpectedException( 'MWException', 'ResourceLoader module info type error' );
+               $this->setExpectedException( MWException::class, 'ResourceLoader module info type error' );
                $resourceLoader->register( 'test', new stdClass() );
        }
 
@@ -336,7 +336,9 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         */
        public function testAddSourceDupe() {
                $rl = new ResourceLoader;
-               $this->setExpectedException( 'MWException', 'ResourceLoader duplicate source addition error' );
+               $this->setExpectedException(
+                       MWException::class, 'ResourceLoader duplicate source addition error'
+               );
                $rl->addSource( 'foo', 'https://example.org/w/load.php' );
                $rl->addSource( 'foo', 'https://example.com/w/load.php' );
        }
@@ -346,7 +348,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         */
        public function testAddSourceInvalid() {
                $rl = new ResourceLoader;
-               $this->setExpectedException( 'MWException', 'with no "loadScript" key' );
+               $this->setExpectedException( MWException::class, 'with no "loadScript" key' );
                $rl->addSource( 'foo',  [ 'x' => 'https://example.org/w/load.php' ] );
        }
 
@@ -446,7 +448,7 @@ mw.example();
                ResourceLoader::clearCache();
                $this->setMwGlobals( 'wgResourceLoaderDebug', true );
 
-               $rl = TestingAccessWrapper::newFromClass( 'ResourceLoader' );
+               $rl = TestingAccessWrapper::newFromClass( ResourceLoader::class );
                $this->assertEquals(
                        $case['expected'],
                        $rl->makeLoaderImplementScript(
@@ -465,8 +467,8 @@ mw.example();
         * @covers ResourceLoader::makeLoaderImplementScript
         */
        public function testMakeLoaderImplementScriptInvalid() {
-               $this->setExpectedException( 'MWException', 'Invalid scripts error' );
-               $rl = TestingAccessWrapper::newFromClass( 'ResourceLoader' );
+               $this->setExpectedException( MWException::class, 'Invalid scripts error' );
+               $rl = TestingAccessWrapper::newFromClass( ResourceLoader::class );
                $rl->makeLoaderImplementScript(
                        'test', // name
                        123, // scripts
@@ -753,7 +755,7 @@ mw.example();
                        'foo' => self::getSimpleModuleMock( 'foo();' ),
                        'ferry' => self::getFailFerryMock(),
                        'bar' => self::getSimpleModuleMock( 'bar();' ),
-                       'startup' => [ 'class' => 'ResourceLoaderStartUpModule' ],
+                       'startup' => [ 'class' => ResourceLoaderStartUpModule::class ],
                ] );
                $context = $this->getResourceLoaderContext(
                        [
index 78eec6a..0aa37d2 100644 (file)
@@ -12,7 +12,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
         */
        public function testConstructor( $params ) {
                $module = new ResourceLoaderWikiModule( $params );
-               $this->assertInstanceOf( 'ResourceLoaderWikiModule', $module );
+               $this->assertInstanceOf( ResourceLoaderWikiModule::class, $module );
        }
 
        public static function provideConstructor() {
@@ -97,7 +97,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
         * @dataProvider provideIsKnownEmpty
         */
        public function testIsKnownEmpty( $titleInfo, $group, $expected ) {
-               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getTitleInfo', 'getGroup' ] )
                        ->getMock();
                $module->expects( $this->any() )
@@ -106,7 +106,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                $module->expects( $this->any() )
                        ->method( 'getGroup' )
                        ->will( $this->returnValue( $group ) );
-               $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+               $context = $this->getMockBuilder( ResourceLoaderContext::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $this->assertEquals( $expected, $module->isKnownEmpty( $context ) );
@@ -157,14 +157,14 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                ];
                $expected = $titleInfo;
 
-               $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getPages' ] )
                        ->getMock();
                $module->method( 'getPages' )->willReturn( $pages );
                // Can't mock static methods
                $module::$returnFetchTitleInfo = $titleInfo;
 
-               $context = $this->getMockBuilder( 'ResourceLoaderContext' )
+               $context = $this->getMockBuilder( ResourceLoaderContext::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -192,7 +192,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                ];
                $expected = $titleInfo;
 
-               $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getPages' ] )
                        ->getMock();
                $module->method( 'getPages' )->willReturn( $pages );
@@ -231,7 +231,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                $titleInfo = [];
 
                // Set up objects
-               $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getPages' ] ) ->getMock();
                $module->method( 'getPages' )->willReturn( $pages );
                $module::$returnFetchTitleInfo = $titleInfo;
@@ -299,7 +299,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
         */
        public function testGetContent( $expected, $title ) {
                $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
-               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getContentObj' ] ) ->getMock();
                $module->expects( $this->any() )
                        ->method( 'getContentObj' )->willReturn( null );
@@ -331,7 +331,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
        public function testGetContentForRedirects() {
                // Set up context and module object
                $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
-               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+               $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
                        ->setMethods( [ 'getPages', 'getContentObj' ] )
                        ->getMock();
                $module->expects( $this->any() )
index 4c5bab3..3f59295 100644 (file)
@@ -63,8 +63,8 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $this->search = MediaWikiServices::getInstance()->newSearchEngine();
                $this->search->setNamespaces( [] );
 
-               $this->originalHandlers = TestingAccessWrapper::newFromClass( 'Hooks' )->handlers;
-               TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = [];
+               $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers;
+               TestingAccessWrapper::newFromClass( Hooks::class )->handlers = [];
 
                SpecialPageFactory::resetList();
        }
@@ -72,7 +72,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
        public function tearDown() {
                parent::tearDown();
 
-               TestingAccessWrapper::newFromClass( 'Hooks' )->handlers = $this->originalHandlers;
+               TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers;
 
                SpecialPageFactory::resetList();
        }
@@ -337,7 +337,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
         * @covers PrefixSearch::searchBackend
         */
        public function testSearchBackend( array $case ) {
-               $search = $stub = $this->getMockBuilder( 'SearchEngine' )
+               $search = $stub = $this->getMockBuilder( SearchEngine::class )
                        ->setMethods( [ 'completionSearchBackend' ] )->getMock();
 
                $return = SearchSuggestionSet::fromStrings( $case['provision'] );
index 9711eab..e807776 100644 (file)
@@ -220,12 +220,12 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                /**
                 * @var $mockEngine SearchEngine
                 */
-               $mockEngine = $this->getMockBuilder( 'SearchEngine' )
+               $mockEngine = $this->getMockBuilder( SearchEngine::class )
                        ->setMethods( [ 'makeSearchFieldMapping' ] )->getMock();
 
                $mockFieldBuilder = function ( $name, $type ) {
                        $mockField =
-                               $this->getMockBuilder( 'SearchIndexFieldDefinition' )->setConstructorArgs( [
+                               $this->getMockBuilder( SearchIndexFieldDefinition::class )->setConstructorArgs( [
                                        $name,
                                        $type
                                ] )->getMock();
@@ -258,7 +258,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                $fields = $mockEngine->getSearchIndexFields();
                $this->assertArrayHasKey( 'language', $fields );
                $this->assertArrayHasKey( 'category', $fields );
-               $this->assertInstanceOf( 'SearchIndexField', $fields['testField'] );
+               $this->assertInstanceOf( SearchIndexField::class, $fields['testField'] );
 
                $mapping = $fields['testField']->getMapping( $mockEngine );
                $this->assertArrayHasKey( 'testData', $mapping );
@@ -287,7 +287,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
        }
 
        public function addAugmentors( &$setAugmentors, &$rowAugmentors ) {
-               $setAugmentor = $this->createMock( 'ResultSetAugmentor' );
+               $setAugmentor = $this->createMock( ResultSetAugmentor::class );
                $setAugmentor->expects( $this->once() )
                        ->method( 'augmentAll' )
                        ->willReturnCallback( function ( SearchResultSet $resultSet ) {
@@ -301,7 +301,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        } );
                $setAugmentors['testSet'] = $setAugmentor;
 
-               $rowAugmentor = $this->createMock( 'ResultAugmentor' );
+               $rowAugmentor = $this->createMock( ResultAugmentor::class );
                $rowAugmentor->expects( $this->exactly( 2 ) )
                        ->method( 'augment' )
                        ->willReturnCallback( function ( SearchResult $result ) {
index f4f5650..768ed91 100644 (file)
@@ -71,7 +71,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+               $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
 
                $services->getService( $name );
        }
@@ -113,7 +113,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+               $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
 
                $services->peekService( $name );
        }
@@ -143,7 +143,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                        return $theService;
                } );
 
-               $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
+               $this->setExpectedException( MediaWiki\Services\ServiceAlreadyDefinedException::class );
 
                $services->defineService( $name, function () use ( $theService ) {
                        return $theService;
@@ -240,7 +240,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                ];
 
                // loading the same file twice should fail, because
-               $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
+               $this->setExpectedException( MediaWiki\Services\ServiceAlreadyDefinedException::class );
 
                $services->loadWiringFiles( $wiringFiles );
        }
@@ -298,7 +298,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+               $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
 
                $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
@@ -318,7 +318,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                // create the service, so it can no longer be redefined
                $services->getService( $name );
 
-               $this->setExpectedException( 'MediaWiki\Services\CannotReplaceActiveServiceException' );
+               $this->setExpectedException( MediaWiki\Services\CannotReplaceActiveServiceException::class );
 
                $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
@@ -328,7 +328,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDisableService() {
                $services = $this->newServiceContainer( [ 'Foo' ] );
 
-               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+               $destructible = $this->getMockBuilder( MediaWiki\Services\DestructibleService::class )
                        ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
@@ -367,7 +367,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $this->assertContains( 'Bar', $services->getServiceNames() );
                $this->assertContains( 'Qux', $services->getServiceNames() );
 
-               $this->setExpectedException( 'MediaWiki\Services\ServiceDisabledException' );
+               $this->setExpectedException( MediaWiki\Services\ServiceDisabledException::class );
                $services->getService( 'Qux' );
        }
 
@@ -377,7 +377,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+               $this->setExpectedException( MediaWiki\Services\NoSuchServiceException::class );
 
                $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
@@ -387,7 +387,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDestroy() {
                $services = $this->newServiceContainer();
 
-               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+               $destructible = $this->getMockBuilder( MediaWiki\Services\DestructibleService::class )
                        ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
@@ -406,7 +406,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                // destroy the container
                $services->destroy();
 
-               $this->setExpectedException( 'MediaWiki\Services\ContainerDisabledException' );
+               $this->setExpectedException( MediaWiki\Services\ContainerDisabledException::class );
                $services->getService( 'Bar' );
        }
 
index 90550d2..4767994 100644 (file)
@@ -184,7 +184,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
        public function testNewSessionInfoForRequest() {
                $provider = $this->getProvider();
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMockBuilder( 'FauxRequest' )
+               $request = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
@@ -212,7 +212,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider->setLogger( $logger );
 
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMockBuilder( 'FauxRequest' )
+               $request = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
@@ -264,7 +264,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                ], $logger->getBuffer() );
                $logger->clearBuffer();
 
-               $request2 = $this->getMockBuilder( 'FauxRequest' )
+               $request2 = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'getIP' ] )->getMock();
                $request2->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
index a47fd9a..c1df365 100644 (file)
@@ -157,7 +157,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                );
 
                $msg = $provider->whyNoSession();
-               $this->assertInstanceOf( 'Message', $msg );
+               $this->assertInstanceOf( \Message::class, $msg );
                $this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
        }
 
@@ -415,7 +415,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                );
                TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
-               $mock = $this->getMockBuilder( 'stdClass' )
+               $mock = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'onUserSetCookies' ] )
                        ->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
@@ -563,14 +563,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+               $sentResponse = $this->getMockBuilder( \FauxResponse::class )
                        ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
                        ->will( $this->returnValue( true ) );
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+               $sentRequest = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
@@ -608,7 +608,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
                // Anonymous user
-               $mock = $this->getMockBuilder( 'stdClass' )
+               $mock = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
index 086fa28..6dd32fc 100644 (file)
@@ -91,7 +91,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                $this->assertFalse( $provider->canChangeUser() );
 
                $msg = $provider->whyNoSession();
-               $this->assertInstanceOf( 'Message', $msg );
+               $this->assertInstanceOf( \Message::class, $msg );
                $this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
        }
 
@@ -158,7 +158,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+               $sentResponse = $this->getMockBuilder( \FauxResponse::class )
                        ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )
                        ->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
@@ -166,7 +166,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+               $sentRequest = $this->getMockBuilder( \FauxRequest::class )
                        ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
index 0981f02..8cb4302 100644 (file)
@@ -14,7 +14,7 @@ class MetadataMergeExceptionTest extends MediaWikiTestCase {
                $data = [ 'foo' => 'bar' ];
 
                $ex = new MetadataMergeException();
-               $this->assertInstanceOf( 'UnexpectedValueException', $ex );
+               $this->assertInstanceOf( \UnexpectedValueException::class, $ex );
                $this->assertSame( [], $ex->getContext() );
 
                $ex2 = new MetadataMergeException( 'Message', 42, $ex, $data );
index 0a2e84e..54a31b5 100644 (file)
@@ -109,7 +109,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                $reset[] = $this->getResetter( $rProp );
 
                $this->setMwGlobals( [
-                       'wgSessionProviders' => [ [ 'class' => 'DummySessionProvider' ] ],
+                       'wgSessionProviders' => [ [ 'class' => \DummySessionProvider::class ] ],
                        'wgObjectCacheSessionExpiry' => 2,
                ] );
 
index e0d1c30..88f58cf 100644 (file)
@@ -142,7 +142,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertSame( self::SESSIONID, $backend->getId() );
                $this->assertSame( $id, $backend->getSessionId() );
                $this->assertSame( $this->provider, $backend->getProvider() );
-               $this->assertInstanceOf( 'User', $backend->getUser() );
+               $this->assertInstanceOf( User::class, $backend->getUser() );
                $this->assertSame( 'UTSysop', $backend->getUser()->getName() );
                $this->assertSame( $info->wasPersisted(), $backend->isPersistent() );
                $this->assertSame( $info->wasRemembered(), $backend->shouldRememberUser() );
@@ -164,7 +164,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertSame( self::SESSIONID, $backend->getId() );
                $this->assertSame( $id, $backend->getSessionId() );
                $this->assertSame( $this->provider, $backend->getProvider() );
-               $this->assertInstanceOf( 'User', $backend->getUser() );
+               $this->assertInstanceOf( User::class, $backend->getUser() );
                $this->assertTrue( $backend->getUser()->isAnon() );
                $this->assertSame( $info->wasPersisted(), $backend->isPersistent() );
                $this->assertSame( $info->wasRemembered(), $backend->shouldRememberUser() );
@@ -258,7 +258,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        public function testResetId() {
                $id = session_id();
 
-               $builder = $this->getMockBuilder( 'DummySessionProvider' )
+               $builder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistsSessionId', 'sessionIdWasReset' ] );
 
                $this->provider = $builder->getMock();
@@ -294,7 +294,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testPersist() {
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'persistSession' );
                $backend = $this->getBackend();
@@ -314,7 +314,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testUnpersist() {
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'unpersistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'unpersistSession' );
                $backend = $this->getBackend();
@@ -367,7 +367,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        public function testSetUser() {
                $user = static::getTestSysop()->getUser();
 
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'canChangeUser' ] )->getMock();
                $this->provider->expects( $this->any() )->method( 'canChangeUser' )
                        ->will( $this->returnValue( false ) );
@@ -498,7 +498,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                        ->setMethods( [ 'onSessionMetadata' ] )->getMock();
                $neverHook->expects( $this->never() )->method( 'onSessionMetadata' );
 
-               $builder = $this->getMockBuilder( 'DummySessionProvider' )
+               $builder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistSession', 'unpersistSession' ] );
 
                $neverProvider = $builder->getMock();
@@ -746,7 +746,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
                // Not persistent
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
@@ -772,7 +772,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Persistent
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->atLeastOnce() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
@@ -799,7 +799,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Not persistent, not expiring
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
@@ -940,7 +940,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testGetAllowedUserRights() {
-               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $this->provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'getAllowedUserRights' ] )
                        ->getMock();
                $this->provider->expects( $this->any() )->method( 'getAllowedUserRights' )
index 9eb46bc..6c989f3 100644 (file)
@@ -23,7 +23,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'SessionCacheType' => 'testSessionStore',
                        'ObjectCacheSessionExpiry' => 100,
                        'SessionProviders' => [
-                               [ 'class' => 'DummySessionProvider' ],
+                               [ 'class' => \DummySessionProvider::class ],
                        ]
                ] );
                $this->logger = new \TestLogger( false, function ( $m ) {
@@ -138,7 +138,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $id2 = '';
                $idEmpty = 'empty-session-------------------';
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods(
                                [ 'provideSessionInfo', 'newSessionInfo', '__toString', 'describe', 'unpersistSession' ]
                        );
@@ -397,7 +397,7 @@ class SessionManagerTest extends MediaWikiTestCase {
 
                // Failure to create an empty session
                $manager = $this->getManager();
-               $provider = $this->getMockBuilder( 'DummySessionProvider' )
+               $provider = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] )
                        ->getMock();
                $provider->expects( $this->any() )->method( 'provideSessionInfo' )
@@ -422,7 +422,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $pmanager = TestingAccessWrapper::newFromObject( $manager );
                $request = new \FauxRequest();
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] );
 
                $expectId = null;
@@ -646,7 +646,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $user = User::newFromName( 'UTSysop' );
                $manager = $this->getManager();
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'invalidateSessionsForUser', '__toString' ] );
 
                $provider1 = $providerBuilder->getMock();
@@ -674,7 +674,7 @@ class SessionManagerTest extends MediaWikiTestCase {
        public function testGetVaryHeaders() {
                $manager = $this->getManager();
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'getVaryHeaders', '__toString' ] );
 
                $provider1 = $providerBuilder->getMock();
@@ -718,7 +718,7 @@ class SessionManagerTest extends MediaWikiTestCase {
        public function testGetVaryCookies() {
                $manager = $this->getManager();
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'getVaryCookies', '__toString' ] );
 
                $provider1 = $providerBuilder->getMock();
@@ -751,7 +751,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = TestingAccessWrapper::newFromObject( $realManager );
 
                $this->config->set( 'SessionProviders', [
-                       [ 'class' => 'DummySessionProvider' ],
+                       [ 'class' => \DummySessionProvider::class ],
                ] );
                $providers = $manager->getProviders();
                $this->assertArrayHasKey( 'DummySessionProvider', $providers );
@@ -761,8 +761,8 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertSame( $realManager, $provider->getManager() );
 
                $this->config->set( 'SessionProviders', [
-                       [ 'class' => 'DummySessionProvider' ],
-                       [ 'class' => 'DummySessionProvider' ],
+                       [ 'class' => \DummySessionProvider::class ],
+                       [ 'class' => \DummySessionProvider::class ],
                ] );
                $manager->sessionProviders = null;
                try {
@@ -780,7 +780,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = TestingAccessWrapper::newFromObject( $this->getManager() );
                $manager->setLogger( new \Psr\Log\NullLogger() );
 
-               $mock = $this->getMockBuilder( 'stdClass' )
+               $mock = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'shutdown' ] )->getMock();
                $mock->expects( $this->once() )->method( 'shutdown' );
 
@@ -871,7 +871,7 @@ class SessionManagerTest extends MediaWikiTestCase {
        public function testPreventSessionsForUser() {
                $manager = $this->getManager();
 
-               $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
+               $providerBuilder = $this->getMockBuilder( \DummySessionProvider::class )
                        ->setMethods( [ 'preventSessionsForUser', '__toString' ] );
 
                $provider1 = $providerBuilder->getMock();
index c38edd6..4d79a95 100644 (file)
@@ -41,7 +41,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo->getId() );
                $this->assertSame( $user->getName(), $userinfo->getName() );
                $this->assertSame( $user->getToken( true ), $userinfo->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo->getUser() );
                $userinfo2 = $userinfo->verified();
                $this->assertNotSame( $userinfo2, $userinfo );
                $this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
@@ -51,7 +51,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo2->getId() );
                $this->assertSame( $user->getName(), $userinfo2->getName() );
                $this->assertSame( $user->getToken( true ), $userinfo2->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo2->getUser() );
                $this->assertSame( $userinfo2, $userinfo2->verified() );
                $this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
 
@@ -76,7 +76,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo->getId() );
                $this->assertSame( $user->getName(), $userinfo->getName() );
                $this->assertSame( $user->getToken( true ), $userinfo->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo->getUser() );
                $userinfo2 = $userinfo->verified();
                $this->assertNotSame( $userinfo2, $userinfo );
                $this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
@@ -86,7 +86,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo2->getId() );
                $this->assertSame( $user->getName(), $userinfo2->getName() );
                $this->assertSame( $user->getToken( true ), $userinfo2->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo2->getUser() );
                $this->assertSame( $userinfo2, $userinfo2->verified() );
                $this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
 
@@ -103,7 +103,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo->getId() );
                $this->assertSame( $user->getName(), $userinfo->getName() );
                $this->assertSame( '', $userinfo->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo->getUser() );
                $userinfo2 = $userinfo->verified();
                $this->assertNotSame( $userinfo2, $userinfo );
                $this->assertSame( "<-:{$user->getId()}:{$user->getName()}>", (string)$userinfo );
@@ -113,7 +113,7 @@ class UserInfoTest extends MediaWikiTestCase {
                $this->assertSame( $user->getId(), $userinfo2->getId() );
                $this->assertSame( $user->getName(), $userinfo2->getName() );
                $this->assertSame( '', $userinfo2->getToken() );
-               $this->assertInstanceOf( 'User', $userinfo2->getUser() );
+               $this->assertInstanceOf( User::class, $userinfo2->getUser() );
                $this->assertSame( $userinfo2, $userinfo2->verified() );
                $this->assertSame( "<+:{$user->getId()}:{$user->getName()}>", (string)$userinfo2 );
 
index adf95e6..0fdcf6d 100644 (file)
@@ -42,13 +42,13 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
 
                $sites = $store->getSites();
 
-               $this->assertInstanceOf( 'SiteList', $sites );
+               $this->assertInstanceOf( SiteList::class, $sites );
 
                /**
                 * @var Site $site
                 */
                foreach ( $sites as $site ) {
-                       $this->assertInstanceOf( 'Site', $site );
+                       $this->assertInstanceOf( Site::class, $site );
                }
 
                foreach ( $testSites as $site ) {
@@ -79,11 +79,11 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
                $this->assertTrue( $store->saveSites( $sites ) );
 
                $site = $store->getSite( 'ertrywuutr' );
-               $this->assertInstanceOf( 'Site', $site );
+               $this->assertInstanceOf( Site::class, $site );
                $this->assertEquals( 'en', $site->getLanguageCode() );
 
                $site = $store->getSite( 'sdfhxujgkfpth' );
-               $this->assertInstanceOf( 'Site', $site );
+               $this->assertInstanceOf( Site::class, $site );
                $this->assertEquals( 'nl', $site->getLanguageCode() );
        }
 
@@ -91,7 +91,7 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
         * @covers CachingSiteStore::reset
         */
        public function testReset() {
-               $dbSiteStore = $this->getMockBuilder( 'SiteStore' )
+               $dbSiteStore = $this->getMockBuilder( SiteStore::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index ae85f8a..7c16f6c 100644 (file)
@@ -51,13 +51,13 @@ class DBSiteStoreTest extends MediaWikiTestCase {
 
                $sites = $store->getSites();
 
-               $this->assertInstanceOf( 'SiteList', $sites );
+               $this->assertInstanceOf( SiteList::class, $sites );
 
                /**
                 * @var Site $site
                 */
                foreach ( $sites as $site ) {
-                       $this->assertInstanceOf( 'Site', $site );
+                       $this->assertInstanceOf( Site::class, $site );
                }
 
                foreach ( $expectedSites as $site ) {
@@ -88,13 +88,13 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                $this->assertTrue( $store->saveSites( $sites ) );
 
                $site = $store->getSite( 'ertrywuutr' );
-               $this->assertInstanceOf( 'Site', $site );
+               $this->assertInstanceOf( Site::class, $site );
                $this->assertEquals( 'en', $site->getLanguageCode() );
                $this->assertTrue( is_int( $site->getInternalId() ) );
                $this->assertTrue( $site->getInternalId() >= 0 );
 
                $site = $store->getSite( 'sdfhxujgkfpth' );
-               $this->assertInstanceOf( 'Site', $site );
+               $this->assertInstanceOf( Site::class, $site );
                $this->assertEquals( 'nl', $site->getLanguageCode() );
                $this->assertTrue( is_int( $site->getInternalId() ) );
                $this->assertTrue( $site->getInternalId() >= 0 );
index ed6fbfe..05aa6d3 100644 (file)
@@ -66,7 +66,7 @@ class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getSiteLookup( SiteList $sites ) {
-               $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+               $siteLookup = $this->getMockBuilder( SiteLookup::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 09cdea7..3a41b5f 100644 (file)
@@ -34,7 +34,7 @@ class SiteExporterTest extends PHPUnit_Framework_TestCase {
        use MediaWikiCoversValidator;
 
        public function testConstructor_InvalidArgument() {
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
 
                new SiteExporter( 'Foo' );
        }
@@ -77,7 +77,7 @@ class SiteExporterTest extends PHPUnit_Framework_TestCase {
        }
 
        private function newSiteStore( SiteList $sites ) {
-               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+               $store = $this->getMockBuilder( SiteStore::class )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
index 8a43bf8..373dcc2 100644 (file)
@@ -34,7 +34,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        use MediaWikiCoversValidator;
 
        private function newSiteImporter( array $expectedSites, $errorCount ) {
-               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+               $store = $this->getMockBuilder( SiteStore::class )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
@@ -46,7 +46,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
                        ->method( 'getSites' )
                        ->will( $this->returnValue( new SiteList() ) );
 
-               $errorHandler = $this->getMockBuilder( 'Psr\Log\LoggerInterface' )->getMock();
+               $errorHandler = $this->getMockBuilder( Psr\Log\LoggerInterface::class )->getMock();
                $errorHandler->expects( $this->exactly( $errorCount ) )
                        ->method( 'error' );
 
@@ -148,9 +148,9 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        }
 
        public function testImportFromXML_malformed() {
-               $this->setExpectedException( 'Exception' );
+               $this->setExpectedException( Exception::class );
 
-               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
+               $store = $this->getMockBuilder( SiteStore::class )->getMock();
                $importer = new SiteImporter( $store );
                $importer->importFromXML( 'THIS IS NOT XML' );
        }
index 59f046b..ac5f956 100644 (file)
@@ -283,12 +283,12 @@ class SiteTest extends MediaWikiTestCase {
         * @covers Site::unserialize
         */
        public function testSerialization( Site $site ) {
-               $this->assertInstanceOf( 'Serializable', $site );
+               $this->assertInstanceOf( Serializable::class, $site );
 
                $serialization = serialize( $site );
                $newInstance = unserialize( $serialization );
 
-               $this->assertInstanceOf( 'Site', $newInstance );
+               $this->assertInstanceOf( Site::class, $newInstance );
 
                $this->assertEquals( $serialization, serialize( $newInstance ) );
        }
index 6514beb..c411ed8 100644 (file)
@@ -100,7 +100,7 @@ class SitesCacheFileBuilderTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getSiteLookup( SiteList $sites ) {
-               $siteLookup = $this->getMockBuilder( 'SiteLookup' )
+               $siteLookup = $this->getMockBuilder( SiteLookup::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 0944ea2..4289fd9 100644 (file)
@@ -11,7 +11,7 @@ class SkinFactoryTest extends MediaWikiTestCase {
                        return new SkinFallback();
                } );
                $this->assertTrue( true ); // No exception thrown
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
                $factory->register( 'invalid', 'Invalid', 'Invalid callback' );
        }
 
@@ -20,7 +20,7 @@ class SkinFactoryTest extends MediaWikiTestCase {
         */
        public function testMakeSkinWithNoBuilders() {
                $factory = new SkinFactory();
-               $this->setExpectedException( 'SkinException' );
+               $this->setExpectedException( SkinException::class );
                $factory->makeSkin( 'nobuilderregistered' );
        }
 
@@ -32,7 +32,7 @@ class SkinFactoryTest extends MediaWikiTestCase {
                $factory->register( 'unittest', 'Unittest', function () {
                        return true; // Not a Skin object
                } );
-               $this->setExpectedException( 'UnexpectedValueException' );
+               $this->setExpectedException( UnexpectedValueException::class );
                $factory->makeSkin( 'unittest' );
        }
 
@@ -46,8 +46,8 @@ class SkinFactoryTest extends MediaWikiTestCase {
                } );
 
                $skin = $factory->makeSkin( 'testfallback' );
-               $this->assertInstanceOf( 'Skin', $skin );
-               $this->assertInstanceOf( 'SkinFallback', $skin );
+               $this->assertInstanceOf( Skin::class, $skin );
+               $this->assertInstanceOf( SkinFallback::class, $skin );
                $this->assertEquals( 'fallback', $skin->getSkinName() );
        }
 
index e8260ac..5b3fbfa 100644 (file)
@@ -13,7 +13,7 @@ class SkinTemplateTest extends MediaWikiTestCase {
         * @dataProvider makeListItemProvider
         */
        public function testMakeListItem( $expected, $key, $item, $options, $message ) {
-               $template = $this->getMockForAbstractClass( 'BaseTemplate' );
+               $template = $this->getMockForAbstractClass( BaseTemplate::class );
 
                $this->assertEquals(
                        $expected,
index f79f6e4..9ac546d 100644 (file)
@@ -83,7 +83,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
                SpecialPageFactory::resetList();
 
                $page = SpecialPageFactory::getPage( 'testdummy' );
-               $this->assertInstanceOf( 'SpecialPage', $page );
+               $this->assertInstanceOf( SpecialPage::class, $page );
 
                $page2 = SpecialPageFactory::getPage( 'testdummy' );
                $this->assertEquals( $shouldReuseInstance, $page2 === $page, "Should re-use instance:" );
@@ -93,7 +93,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
         * @covers SpecialPageFactory::getNames
         */
        public function testGetNames() {
-               $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => 'SpecialAllPages' ] );
+               $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => SpecialAllPages::class ] );
                SpecialPageFactory::resetList();
 
                $names = SpecialPageFactory::getNames();
index c665f3c..2ad3972 100644 (file)
@@ -67,7 +67,7 @@ class SpecialPageTest extends MediaWikiTestCase {
                $specialPage->getContext()->setUser( $user );
                $specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
 
-               $this->setExpectedException( 'UserNotLoggedIn', $expected );
+               $this->setExpectedException( UserNotLoggedIn::class, $expected );
 
                // $specialPage->requireLogin( [ $reason [, $title ] ] )
                call_user_func_array(
index 1208a20..1d87a3a 100644 (file)
@@ -20,7 +20,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
        /** List query pages that can not be tested automatically */
        protected $manualTest = [
-               'LinkSearchPage'
+               LinkSearchPage::class
        ];
 
        /**
@@ -30,7 +30,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
         * https://bugs.mysql.com/bug.php?id=10327
         */
        protected $reopensTempTable = [
-               'BrokenRedirects',
+               BrokenRedirects::class,
        ];
 
        /**
index ab3ac55..05a63db 100644 (file)
@@ -19,7 +19,7 @@ class SpecialEditWatchlistTest extends SpecialPageTestBase {
        }
 
        public function testNotLoggedIn_throwsException() {
-               $this->setExpectedException( 'UserNotLoggedIn' );
+               $this->setExpectedException( UserNotLoggedIn::class );
                $this->executeSpecialPage();
        }
 
index c8158ae..bdfbb62 100644 (file)
@@ -25,7 +25,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
                // Set a low limit
                $this->setMwGlobals( 'wgMaxSigChars', 2 );
 
-               $user = $this->createMock( 'User' );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
index 94924ee..f0a5726 100644 (file)
@@ -194,7 +194,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                );
 
                $mockSearchEngine = $this->mockSearchEngine( $searchResults );
-               $search = $this->getMockBuilder( 'SpecialSearch' )
+               $search = $this->getMockBuilder( SpecialSearch::class )
                        ->setMethods( [ 'getSearchEngine' ] )
                        ->getMock();
                $search->expects( $this->any() )
@@ -213,7 +213,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
        }
 
        protected function mockSearchEngine( $results ) {
-               $mock = $this->getMockBuilder( 'SearchEngine' )
+               $mock = $this->getMockBuilder( SearchEngine::class )
                        ->setMethods( [ 'searchText', 'searchTitle' ] )
                        ->getMock();
 
index 2ecef79..80bd365 100644 (file)
@@ -9,7 +9,7 @@ class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
         */
        public function testGetQueryInfo( $msgContent, $expected ) {
                $msg = new RawMessage( $msgContent );
-               $mockContext = $this->getMockBuilder( 'RequestContext' )->getMock();
+               $mockContext = $this->getMockBuilder( RequestContext::class )->getMock();
                $mockContext->method( 'msg' )->willReturn( $msg );
                $special = new UncategorizedCategoriesPage();
                $special->setContext( $mockContext );
index a0fe339..5adbed8 100644 (file)
@@ -56,7 +56,7 @@ class SpecialWatchlistTest extends SpecialPageTestBase {
        }
 
        public function testNotLoggedIn_throwsException() {
-               $this->setExpectedException( 'UserNotLoggedIn' );
+               $this->setExpectedException( UserNotLoggedIn::class );
                $this->executeSpecialPage();
        }
 
index 25ff186..f2fccc7 100644 (file)
@@ -68,7 +68,7 @@ class ForeignTitleTest extends MediaWikiTestCase {
        }
 
        public function testUnknownNamespaceError() {
-               $this->setExpectedException( 'MWException' );
+               $this->setExpectedException( MWException::class );
                $title = new ForeignTitle( null, 'this', 'that' );
                $title->getNamespaceId();
        }
index e7ac940..e1b98ec 100644 (file)
@@ -64,7 +64,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
         * @return GenderCache
         */
        private function getGenderCache() {
-               $genderCache = $this->getMockBuilder( 'GenderCache' )
+               $genderCache = $this->getMockBuilder( GenderCache::class )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -385,7 +385,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
         * @dataProvider provideParseTitle_invalid
         */
        public function testParseTitle_invalid( $text ) {
-               $this->setExpectedException( 'MalformedTitleException' );
+               $this->setExpectedException( MalformedTitleException::class );
 
                $codec = $this->makeCodec( 'en' );
                $codec->parseTitle( $text, NS_MAIN );
index 93ce080..008cf5d 100644 (file)
@@ -80,7 +80,7 @@ class SubpageImportTitleFactoryTest extends MediaWikiTestCase {
         * @dataProvider failureProvider
         */
        public function testFailures( Title $rootPage ) {
-               $this->setExpectedException( 'MWException' );
+               $this->setExpectedException( MWException::class );
                new SubpageImportTitleFactory( $rootPage );
        }
 }
index f833554..d221b43 100644 (file)
@@ -78,7 +78,7 @@ class TitleValueTest extends MediaWikiTestCase {
         * @dataProvider badConstructorProvider
         */
        public function testConstructionErrors( $ns, $text, $fragment, $interwiki ) {
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
                new TitleValue( $ns, $text, $fragment, $interwiki );
        }
 
index f46ad20..39acbb0 100644 (file)
@@ -105,7 +105,7 @@ class UploadStashTest extends MediaWikiTestCase {
                        $stash->stashFile( $this->tmpFile );
                        $this->fail( 'Expected UploadStashFileException not thrown' );
                } catch ( UploadStashFileException $e ) {
-                       $this->assertInstanceOf( 'ILocalizedException', $e );
+                       $this->assertInstanceOf( ILocalizedException::class, $e );
                } catch ( Exception $e ) {
                        $this->fail( 'Unexpected exception class ' . get_class( $e ) );
                }
index 09cf350..3bbc2df 100644 (file)
@@ -32,14 +32,14 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->testUser = $this->getMutableTestUser();
                $this->testUserName = $this->testUser->getUser()->getName();
 
-               $mock1 = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock1 = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock1->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( true ) );
                $mock1->expects( $this->any() )->method( 'lookupUserNames' )
                        ->will( $this->returnValue( [ $this->testUserName => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
                $mock1->expects( $this->never() )->method( 'lookupCentralIds' );
 
-               $mock2 = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock2 = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock2->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( false ) );
                $mock2->expects( $this->any() )->method( 'lookupUserNames' )
@@ -96,7 +96,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        public function testBasics() {
                $user = $this->testUser->getUser();
                $bp = BotPassword::newFromUser( $user, 'BotPassword' );
-               $this->assertInstanceOf( 'BotPassword', $bp );
+               $this->assertInstanceOf( BotPassword::class, $bp );
                $this->assertTrue( $bp->isSaved() );
                $this->assertSame( 42, $bp->getUserCentralId() );
                $this->assertSame( 'BotPassword', $bp->getAppId() );
@@ -124,7 +124,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'user' => $user,
                        'appId' => 'DoesNotExist'
                ] );
-               $this->assertInstanceOf( 'BotPassword', $bp );
+               $this->assertInstanceOf( BotPassword::class, $bp );
                $this->assertFalse( $bp->isSaved() );
                $this->assertSame( 42, $bp->getUserCentralId() );
                $this->assertSame( 'DoesNotExist', $bp->getAppId() );
@@ -137,7 +137,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'restrictions' => MWRestrictions::newFromJson( '{"IPAddresses":["127.0.0.0/8"]}' ),
                        'grants' => [ 'test' ],
                ] );
-               $this->assertInstanceOf( 'BotPassword', $bp );
+               $this->assertInstanceOf( BotPassword::class, $bp );
                $this->assertFalse( $bp->isSaved() );
                $this->assertSame( 43, $bp->getUserCentralId() );
                $this->assertSame( 'DoesNotExist2', $bp->getAppId() );
@@ -149,7 +149,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'centralId' => 45,
                        'appId' => 'DoesNotExist'
                ] );
-               $this->assertInstanceOf( 'BotPassword', $bp );
+               $this->assertInstanceOf( BotPassword::class, $bp );
                $this->assertFalse( $bp->isSaved() );
                $this->assertSame( 45, $bp->getUserCentralId() );
                $this->assertSame( 'DoesNotExist', $bp->getAppId() );
@@ -159,7 +159,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'user' => $user,
                        'appId' => 'BotPassword'
                ] );
-               $this->assertInstanceOf( 'BotPassword', $bp );
+               $this->assertInstanceOf( BotPassword::class, $bp );
                $this->assertFalse( $bp->isSaved() );
 
                $this->assertNull( BotPassword::newUnsaved( [
@@ -187,12 +187,12 @@ class BotPasswordTest extends MediaWikiTestCase {
                $bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
 
                $password = $bp->getPassword();
-               $this->assertInstanceOf( 'Password', $password );
+               $this->assertInstanceOf( Password::class, $password );
                $this->assertTrue( $password->equals( 'foobaz' ) );
 
                $bp->centralId = 44;
                $password = $bp->getPassword();
-               $this->assertInstanceOf( 'InvalidPassword', $password );
+               $this->assertInstanceOf( InvalidPassword::class, $password );
 
                $bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
                $dbw = wfGetDB( DB_MASTER );
@@ -203,21 +203,21 @@ class BotPasswordTest extends MediaWikiTestCase {
                        __METHOD__
                );
                $password = $bp->getPassword();
-               $this->assertInstanceOf( 'InvalidPassword', $password );
+               $this->assertInstanceOf( InvalidPassword::class, $password );
        }
 
        public function testInvalidateAllPasswordsForUser() {
                $bp1 = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
                $bp2 = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 43, 'BotPassword' ) );
 
-               $this->assertNotInstanceOf( 'InvalidPassword', $bp1->getPassword(), 'sanity check' );
-               $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword(), 'sanity check' );
+               $this->assertNotInstanceOf( InvalidPassword::class, $bp1->getPassword(), 'sanity check' );
+               $this->assertNotInstanceOf( InvalidPassword::class, $bp2->getPassword(), 'sanity check' );
                BotPassword::invalidateAllPasswordsForUser( $this->testUserName );
-               $this->assertInstanceOf( 'InvalidPassword', $bp1->getPassword() );
-               $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword() );
+               $this->assertInstanceOf( InvalidPassword::class, $bp1->getPassword() );
+               $this->assertNotInstanceOf( InvalidPassword::class, $bp2->getPassword() );
 
                $bp = TestingAccessWrapper::newFromObject( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
-               $this->assertInstanceOf( 'InvalidPassword', $bp->getPassword() );
+               $this->assertInstanceOf( InvalidPassword::class, $bp->getPassword() );
        }
 
        public function testRemoveAllPasswordsForUser() {
@@ -312,7 +312,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                );
 
                // Failed restriction
-               $request = $this->getMockBuilder( 'FauxRequest' )
+               $request = $this->getMockBuilder( FauxRequest::class )
                        ->setMethods( [ 'getIP' ] )
                        ->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
@@ -333,7 +333,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'sanity check'
                );
                $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
-               $this->assertInstanceOf( 'Status', $status );
+               $this->assertInstanceOf( Status::class, $status );
                $this->assertTrue( $status->isGood() );
                $session = $status->getValue();
                $this->assertInstanceOf( MediaWiki\Session\Session::class, $session );
@@ -368,7 +368,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertFalse( $bp->save( 'update', $passwordHash ) );
                $this->assertTrue( $bp->save( 'insert', $passwordHash ) );
                $bp2 = BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST );
-               $this->assertInstanceOf( 'BotPassword', $bp2 );
+               $this->assertInstanceOf( BotPassword::class, $bp2 );
                $this->assertEquals( $bp->getUserCentralId(), $bp2->getUserCentralId() );
                $this->assertEquals( $bp->getAppId(), $bp2->getAppId() );
                $this->assertEquals( $bp->getToken(), $bp2->getToken() );
@@ -376,7 +376,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertEquals( $bp->getGrants(), $bp2->getGrants() );
                $pw = TestingAccessWrapper::newFromObject( $bp )->getPassword();
                if ( $password === null ) {
-                       $this->assertInstanceOf( 'InvalidPassword', $pw );
+                       $this->assertInstanceOf( InvalidPassword::class, $pw );
                } else {
                        $this->assertTrue( $pw->equals( $password ) );
                }
@@ -388,11 +388,11 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertTrue( $bp->save( 'update' ) );
                $this->assertNotEquals( $token, $bp->getToken() );
                $bp2 = BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST );
-               $this->assertInstanceOf( 'BotPassword', $bp2 );
+               $this->assertInstanceOf( BotPassword::class, $bp2 );
                $this->assertEquals( $bp->getToken(), $bp2->getToken() );
                $pw = TestingAccessWrapper::newFromObject( $bp )->getPassword();
                if ( $password === null ) {
-                       $this->assertInstanceOf( 'InvalidPassword', $pw );
+                       $this->assertInstanceOf( InvalidPassword::class, $pw );
                } else {
                        $this->assertTrue( $pw->equals( $password ) );
                }
index 789cf08..dc9fe2a 100644 (file)
@@ -9,16 +9,16 @@ use Wikimedia\TestingAccessWrapper;
 class CentralIdLookupTest extends MediaWikiTestCase {
 
        public function testFactory() {
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
 
                $this->setMwGlobals( [
                        'wgCentralIdLookupProviders' => [
-                               'local' => [ 'class' => 'LocalIdLookup' ],
-                               'local2' => [ 'class' => 'LocalIdLookup' ],
+                               'local' => [ 'class' => LocalIdLookup::class ],
+                               'local2' => [ 'class' => LocalIdLookup::class ],
                                'mock' => [ 'factory' => function () use ( $mock ) {
                                        return $mock;
                                } ],
-                               'bad' => [ 'class' => 'stdClass' ],
+                               'bad' => [ 'class' => stdClass::class ],
                        ],
                        'wgCentralIdLookupProvider' => 'mock',
                ] );
@@ -29,13 +29,13 @@ class CentralIdLookupTest extends MediaWikiTestCase {
 
                $local = CentralIdLookup::factory( 'local' );
                $this->assertNotSame( $mock, $local );
-               $this->assertInstanceOf( 'LocalIdLookup', $local );
+               $this->assertInstanceOf( LocalIdLookup::class, $local );
                $this->assertSame( $local, CentralIdLookup::factory( 'local' ) );
                $this->assertSame( 'local', $local->getProviderId() );
 
                $local2 = CentralIdLookup::factory( 'local2' );
                $this->assertNotSame( $local, $local2 );
-               $this->assertInstanceOf( 'LocalIdLookup', $local2 );
+               $this->assertInstanceOf( LocalIdLookup::class, $local2 );
                $this->assertSame( 'local2', $local2->getProviderId() );
 
                $this->assertNull( CentralIdLookup::factory( 'unconfigured' ) );
@@ -44,14 +44,14 @@ class CentralIdLookupTest extends MediaWikiTestCase {
 
        public function testCheckAudience() {
                $mock = TestingAccessWrapper::newFromObject(
-                       $this->getMockForAbstractClass( 'CentralIdLookup' )
+                       $this->getMockForAbstractClass( CentralIdLookup::class )
                );
 
                $user = static::getTestSysop()->getUser();
                $this->assertSame( $user, $mock->checkAudience( $user ) );
 
                $user = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
-               $this->assertInstanceOf( 'User', $user );
+               $this->assertInstanceOf( User::class, $user );
                $this->assertSame( 0, $user->getId() );
 
                $this->assertNull( $mock->checkAudience( CentralIdLookup::AUDIENCE_RAW ) );
@@ -65,7 +65,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
        }
 
        public function testNameFromCentralId() {
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->once() )->method( 'lookupCentralIds' )
                        ->with(
                                $this->equalTo( [ 15 => null ] ),
@@ -86,7 +86,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
         * @param bool $succeeds
         */
        public function testLocalUserFromCentralId( $name, $succeeds ) {
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( true ) );
                $mock->expects( $this->once() )->method( 'lookupCentralIds' )
@@ -101,13 +101,13 @@ class CentralIdLookupTest extends MediaWikiTestCase {
                        42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
                );
                if ( $succeeds ) {
-                       $this->assertInstanceOf( 'User', $user );
+                       $this->assertInstanceOf( User::class, $user );
                        $this->assertSame( $name, $user->getName() );
                } else {
                        $this->assertNull( $user );
                }
 
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( false ) );
                $mock->expects( $this->once() )->method( 'lookupCentralIds' )
@@ -133,7 +133,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
        }
 
        public function testCentralIdFromName() {
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->once() )->method( 'lookupUserNames' )
                        ->with(
                                $this->equalTo( [ 'FooBar' => 0 ] ),
@@ -149,7 +149,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
        }
 
        public function testCentralIdFromLocalUser() {
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( true ) );
                $mock->expects( $this->once() )->method( 'lookupUserNames' )
@@ -167,7 +167,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
                        )
                );
 
-               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock = $this->getMockForAbstractClass( CentralIdLookup::class );
                $mock->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( false ) );
                $mock->expects( $this->never() )->method( 'lookupUserNames' );
index cf980b1..beaacec 100644 (file)
@@ -7,7 +7,7 @@
 class UserArrayFromResultTest extends MediaWikiTestCase {
 
        private function getMockResultWrapper( $row = null, $numRows = 1 ) {
-               $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
+               $resultWrapper = $this->getMockBuilder( Wikimedia\Rdbms\ResultWrapper::class )
                        ->disableOriginalConstructor();
 
                $resultWrapper = $resultWrapper->getMock();
@@ -57,7 +57,7 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
 
                $this->assertEquals( $resultWrapper, $object->res );
                $this->assertSame( 0, $object->key );
-               $this->assertInstanceOf( 'User', $object->current );
+               $this->assertInstanceOf( User::class, $object->current );
                $this->assertEquals( $username, $object->current->mName );
        }
 
@@ -88,7 +88,7 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
                $username = 'addshore';
                $userRow = $this->getRowWithUsername( $username );
                $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $userRow ) );
-               $this->assertInstanceOf( 'User', $object->current() );
+               $this->assertInstanceOf( User::class, $object->current() );
                $this->assertEquals( $username, $object->current()->mName );
        }
 
index ea7f715..4c1a5fd 100644 (file)
@@ -121,7 +121,7 @@ class UserTest extends MediaWikiTestCase {
                $this->assertContains( 'nukeworld', $rights );
 
                // Add a Session that limits rights
-               $mock = $this->getMockBuilder( stdclass::class )
+               $mock = $this->getMockBuilder( stdClass::class )
                        ->setMethods( [ 'getAllowedUserRights', 'deregisterSession', 'getSessionId' ] )
                        ->getMock();
                $mock->method( 'getAllowedUserRights' )->willReturn( [ 'test', 'writetest' ] );
index d80a61c..f06a353 100644 (file)
@@ -241,7 +241,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        protected function mockDb() {
                // @TODO: mock from Database
                // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
-               $databaseMysql = $this->getMockBuilder( 'DatabaseMysqli' )
+               $databaseMysql = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $databaseMysql->expects( $this->any() )
index 4c05326..c411e53 100644 (file)
@@ -21,7 +21,7 @@ class MWRestrictionsTest extends PHPUnit_Framework_TestCase {
         */
        public function testNewDefault() {
                $ret = MWRestrictions::newDefault();
-               $this->assertInstanceOf( 'MWRestrictions', $ret );
+               $this->assertInstanceOf( MWRestrictions::class, $ret );
                $this->assertSame(
                        '{"IPAddresses":["0.0.0.0/0","::/0"]}',
                        $ret->toJson()
@@ -41,7 +41,7 @@ class MWRestrictionsTest extends PHPUnit_Framework_TestCase {
        public function testArray( $data, $expect ) {
                if ( $expect === true ) {
                        $ret = MWRestrictions::newFromArray( $data );
-                       $this->assertInstanceOf( 'MWRestrictions', $ret );
+                       $this->assertInstanceOf( MWRestrictions::class, $ret );
                        $this->assertSame( $data, $ret->toArray() );
                } else {
                        try {
@@ -89,7 +89,7 @@ class MWRestrictionsTest extends PHPUnit_Framework_TestCase {
        public function testJson( $json, $expect ) {
                if ( is_array( $expect ) ) {
                        $ret = MWRestrictions::newFromJson( $json );
-                       $this->assertInstanceOf( 'MWRestrictions', $ret );
+                       $this->assertInstanceOf( MWRestrictions::class, $ret );
                        $this->assertSame( $expect, $ret->toArray() );
 
                        $this->assertSame( $json, $ret->toJson( false ) );
@@ -180,7 +180,7 @@ class MWRestrictionsTest extends PHPUnit_Framework_TestCase {
        public function provideCheck() {
                $ret = [];
 
-               $mockBuilder = $this->getMockBuilder( 'FauxRequest' )
+               $mockBuilder = $this->getMockBuilder( FauxRequest::class )
                        ->setMethods( [ 'getIP' ] );
 
                foreach ( self::provideCheckIP() as $checkIP ) {
index 230c935..c6b8bdd 100644 (file)
@@ -18,7 +18,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
         * @covers UIDGenerator::newTimestampedUID88
         */
        public function testTimestampedUID( $method, $digitlen, $bits, $tbits, $hostbits ) {
-               $id = call_user_func( [ 'UIDGenerator', $method ] );
+               $id = call_user_func( [ UIDGenerator::class, $method ] );
                $this->assertEquals( true, ctype_digit( $id ), "UID made of digit characters" );
                $this->assertLessThanOrEqual( $digitlen, strlen( $id ),
                        "UID has the right number of digits" );
@@ -27,7 +27,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
 
                $ids = [];
                for ( $i = 0; $i < 300; $i++ ) {
-                       $ids[] = call_user_func( [ 'UIDGenerator', $method ] );
+                       $ids[] = call_user_func( [ UIDGenerator::class, $method ] );
                }
 
                $lastId = array_shift( $ids );
index 82a1193..6dbb106 100644 (file)
@@ -1118,7 +1118,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        $this->getMockNonAnonUserWithId( 1 ),
                        new TitleValue( 0, 'SomeDbKey' )
                );
-               $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+               $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
                $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
@@ -1317,7 +1317,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        $this->getMockNonAnonUserWithId( 1 ),
                        new TitleValue( 0, 'SomeDbKey' )
                );
-               $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+               $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
                $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
@@ -1457,7 +1457,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $this->assertInternalType( 'array', $watchedItems );
                $this->assertCount( 2, $watchedItems );
                foreach ( $watchedItems as $watchedItem ) {
-                       $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+                       $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                }
                $this->assertEquals(
                        new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
@@ -1516,7 +1516,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        $this->getMockReadOnlyMode()
                );
 
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( InvalidArgumentException::class );
                $store->getWatchedItemsForUser(
                        $this->getMockNonAnonUserWithId( 1 ),
                        [ 'sort' => 'foo' ]
diff --git a/tests/phpunit/maintenance/MaintenanceBaseTestCase.php b/tests/phpunit/maintenance/MaintenanceBaseTestCase.php
new file mode 100644 (file)
index 0000000..bdcf7e5
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use Maintenance;
+use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
+
+abstract class MaintenanceBaseTestCase extends MediaWikiTestCase {
+
+       /**
+        * The main Maintenance instance that is used for testing, wrapped and mockable.
+        *
+        * @var Maintenance
+        */
+       protected $maintenance;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->maintenance = $this->createMaintenance();
+       }
+
+       /**
+        * Do a little stream cleanup to prevent output in case the child class
+        * hasn't tested the capture buffer.
+        */
+       protected function tearDown() {
+               if ( $this->maintenance ) {
+                       $this->maintenance->cleanupChanneled();
+               }
+
+               // This is smelly, but maintenance scripts usually produce output, so
+               // we anticipate and ignore with a regex that will catch everything.
+               //
+               // If you call $this->expectOutputRegex in your subclass, this guard
+               // won't be triggered, and your specific pattern will be respected.
+               if ( !$this->hasExpectationOnOutput() ) {
+                       $this->expectOutputRegex( '/.*/' );
+               }
+
+               parent::tearDown();
+       }
+
+       /**
+        * @return string Class name
+        *
+        * Subclasses must implement this in order to use the $this->maintenance
+        * variable.  Normally, it will be set like:
+        *     return PopulateDatabaseMaintenance::class;
+        *
+        * If you need to change the way your maintenance class is constructed,
+        * override createMaintenance.
+        */
+       abstract protected function getMaintenanceClass();
+
+       /**
+        * Called by setUp to initialize $this->maintenance.
+        *
+        * @return object The Maintenance instance to test.
+        */
+       protected function createMaintenance() {
+               $className = $this->getMaintenanceClass();
+               $obj = new $className();
+
+               // We use TestingAccessWrapper in order to access protected internals
+               // such as `output()`.
+               return TestingAccessWrapper::newFromObject( $obj );
+       }
+
+       /**
+        * Asserts the output before and after simulating shutdown
+        *
+        * This function simulates shutdown of self::maintenance.
+        *
+        * @param string $preShutdownOutput Expected output before simulating shutdown
+        * @param bool $expectNLAppending Whether or not shutdown simulation is expected
+        *   to add a newline to the output. If false, $preShutdownOutput is the
+        *   expected output after shutdown simulation. Otherwise,
+        *   $preShutdownOutput with an appended newline is the expected output
+        *   after shutdown simulation.
+        */
+       protected function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
+               $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
+                               "Output before shutdown simulation" );
+
+               $this->maintenance->cleanupChanneled();
+
+               $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
+               $this->expectOutputString( $postShutdownOutput );
+       }
+
+}
index 2813c58..141561f 100644 (file)
@@ -4,190 +4,32 @@ namespace MediaWiki\Tests\Maintenance;
 
 use Maintenance;
 use MediaWiki\MediaWikiServices;
-use MediaWikiTestCase;
-
-/**
- * Makes parts of Maintenance class API visible for testing, and makes up for a
- * stream closing hack in Maintenance.php.
- *
- * This class is solely used for being able to test Maintenance right now
- * without having to apply major refactorings to fix some design issues in
- * Maintenance.php. Before adding more functions here, please consider whether
- * this approach is correct, or a refactoring Maintenance to separate concerns
- * is more appropriate.
- *
- * Upon refactoring, keep in mind that besides the maintenance scripts themselves
- * and tests right here, some extensions including Extension:Maintenance make
- * use of the Maintenance class.
- *
- * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
- * call simulateShutdown on MaintenanceFixup instance before a test ends.
- *
- * FIXME:
- * It would be great if we were able to use PHPUnit's getMockForAbstractClass
- * instead of the MaintenanceFixup hack below. However, we cannot do so
- * without changing method visibility and without working around hacks in
- * Maintenance.php
- *
- * For the same reason, we cannot just use FakeMaintenance.
- */
-class MaintenanceFixup extends Maintenance {
-
-       // --- Making up for the register_shutdown_function hack in Maintenance.php
-
-       /**
-        * The test case that generated this instance.
-        *
-        * This member is motivated by allowing the destructor to check whether or not
-        * the test failed, in order to avoid unnecessary nags about omitted shutdown
-        * simulation.
-        * But as it is already available, we also usi it to flagging tests as failed
-        *
-        * @var MediaWikiTestCase
-        */
-       private $testCase;
-
-       /**
-        * shutdownSimulated === true if simulateShutdown has done its work
-        *
-        * @var bool
-        */
-       private $shutdownSimulated = false;
-
-       /**
-        * Simulates what Maintenance wants to happen at script's end.
-        */
-       public function simulateShutdown() {
-               if ( $this->shutdownSimulated ) {
-                       $this->testCase->fail( __METHOD__ . " called more than once" );
-               }
-
-               // The cleanup action.
-               $this->outputChanneled( false );
-
-               // Bookkeeping that we simulated the clean up.
-               $this->shutdownSimulated = true;
-       }
-
-       // Note that the "public" here does not change visibility
-       public function outputChanneled( $msg, $channel = null ) {
-               if ( $this->shutdownSimulated ) {
-                       if ( $msg !== false ) {
-                               $this->testCase->fail( "Already past simulated shutdown, but msg is "
-                                       . "not false. Did the hack in Maintenance.php change? Please "
-                                       . "adapt the test case or Maintenance.php" );
-                       }
-
-                       // The current call is the one registered via register_shutdown_function.
-                       // We can safely ignore it, as we simulated this one via simulateShutdown
-                       // before (if we did not, the destructor of this instance will warn about
-                       // it)
-                       return;
-               }
-
-               call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
-       }
-
-       /**
-        * Safety net around register_shutdown_function of Maintenance.php
-        */
-       public function __destruct() {
-               if ( !$this->shutdownSimulated ) {
-                       // Someone generated a MaintenanceFixup instance without calling
-                       // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
-                       // flag this illegal usage. However, we are already in a destruktor, which
-                       // would trigger undefined behavior. Hence, we can only report to the
-                       // error output :( Hopefully people read the PHPUnit output.
-                       $name = $this->testCase->getName();
-                       fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " for test $name "
-                               . "destructed without calling simulateShutdown method. Call "
-                               . "simulateShutdown on the instance before it gets destructed." );
-               }
-
-               // The following guard is required, as PHP does not offer default destructors :(
-               if ( is_callable( "parent::__destruct" ) ) {
-                       parent::__destruct();
-               }
-       }
-
-       public function __construct( MediaWikiTestCase $testCase ) {
-               parent::__construct();
-               $this->testCase = $testCase;
-       }
-
-       // --- Making protected functions visible for test
-
-       public function output( $out, $channel = null ) {
-               // Just to make PHP not nag about signature mismatches, we copied
-               // Maintenance::output signature. However, we do not use (or rely on)
-               // those variables. Instead we pass to Maintenance::output whatever we
-               // receive at runtime.
-               return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
-       }
-
-       public function addOption( $name, $description, $required = false,
-               $withArg = false, $shortName = false, $multiOccurance = false
-       ) {
-               return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
-       }
-
-       public function getOption( $name, $default = null ) {
-               return call_user_func_array( [ "parent", __FUNCTION__ ], func_get_args() );
-       }
-
-       // --- Requirements for getting instance of abstract class
-
-       public function execute() {
-               $this->testCase->fail( __METHOD__ . " called unexpectedly" );
-       }
-}
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @covers Maintenance
  */
-class MaintenanceTest extends MediaWikiTestCase {
+class MaintenanceTest extends MaintenanceBaseTestCase {
 
        /**
-        * The main Maintenance instance that is used for testing.
-        *
-        * @var MaintenanceFixup
+        * @see MaintenanceBaseTestCase::getMaintenanceClass
         */
-       private $m;
-
-       protected function setUp() {
-               parent::setUp();
-               $this->m = new MaintenanceFixup( $this );
-       }
-
-       protected function tearDown() {
-               if ( $this->m ) {
-                       $this->m->simulateShutdown();
-                       $this->m = null;
-               }
-               parent::tearDown();
+       protected function getMaintenanceClass() {
+               return Maintenance::class;
        }
 
        /**
-        * asserts the output before and after simulating shutdown
+        * @see MaintenanceBaseTestCase::createMaintenance
         *
-        * This function simulates shutdown of self::m.
-        *
-        * @param string $preShutdownOutput Expected output before simulating shutdown
-        * @param bool $expectNLAppending Whether or not shutdown simulation is expected
-        *   to add a newline to the output. If false, $preShutdownOutput is the
-        *   expected output after shutdown simulation. Otherwise,
-        *   $preShutdownOutput with an appended newline is the expected output
-        *   after shutdown simulation.
+        * Note to extension authors looking for a model to follow: This function
+        * is normally not needed in a maintenance test, it's only overridden here
+        * because Maintenance is abstract.
         */
-       private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
-               $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
-                       "Output before shutdown simulation" );
-
-               $this->m->simulateShutdown();
-               $this->m = null;
+       protected function createMaintenance() {
+               $className = $this->getMaintenanceClass();
+               $obj = $this->getMockForAbstractClass( $className );
 
-               $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
-               $this->expectOutputString( $postShutdownOutput );
+               return TestingAccessWrapper::newFromObject( $obj );
        }
 
        // Although the following tests do not seem to be too consistent (compare for
@@ -195,632 +37,445 @@ class MaintenanceTest extends MediaWikiTestCase {
        // test.*Intermittent.* tests), the objective of these tests is not to describe
        // consistent behavior, but rather currently existing behavior.
 
-       function testOutputEmpty() {
-               $this->m->output( "" );
-               $this->assertOutputPrePostShutdown( "", false );
-       }
-
-       function testOutputString() {
-               $this->m->output( "foo" );
-               $this->assertOutputPrePostShutdown( "foo", false );
-       }
-
-       function testOutputStringString() {
-               $this->m->output( "foo" );
-               $this->m->output( "bar" );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputStringNL() {
-               $this->m->output( "foo\n" );
-               $this->assertOutputPrePostShutdown( "foo\n", false );
-       }
-
-       function testOutputStringNLNL() {
-               $this->m->output( "foo\n\n" );
-               $this->assertOutputPrePostShutdown( "foo\n\n", false );
-       }
-
-       function testOutputStringNLString() {
-               $this->m->output( "foo\nbar" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", false );
-       }
-
-       function testOutputStringNLStringNL() {
-               $this->m->output( "foo\nbar\n" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputStringNLStringNLLinewise() {
-               $this->m->output( "foo\n" );
-               $this->m->output( "bar\n" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputStringNLStringNLArbitrary() {
-               $this->m->output( "" );
-               $this->m->output( "foo" );
-               $this->m->output( "" );
-               $this->m->output( "\n" );
-               $this->m->output( "ba" );
-               $this->m->output( "" );
-               $this->m->output( "r\n" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputStringNLStringNLArbitraryAgain() {
-               $this->m->output( "" );
-               $this->m->output( "foo" );
-               $this->m->output( "" );
-               $this->m->output( "\nb" );
-               $this->m->output( "a" );
-               $this->m->output( "" );
-               $this->m->output( "r\n" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputWNullChannelEmpty() {
-               $this->m->output( "", null );
-               $this->assertOutputPrePostShutdown( "", false );
-       }
-
-       function testOutputWNullChannelString() {
-               $this->m->output( "foo", null );
-               $this->assertOutputPrePostShutdown( "foo", false );
-       }
-
-       function testOutputWNullChannelStringString() {
-               $this->m->output( "foo", null );
-               $this->m->output( "bar", null );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputWNullChannelStringNL() {
-               $this->m->output( "foo\n", null );
-               $this->assertOutputPrePostShutdown( "foo\n", false );
-       }
-
-       function testOutputWNullChannelStringNLNL() {
-               $this->m->output( "foo\n\n", null );
-               $this->assertOutputPrePostShutdown( "foo\n\n", false );
-       }
-
-       function testOutputWNullChannelStringNLString() {
-               $this->m->output( "foo\nbar", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar", false );
-       }
-
-       function testOutputWNullChannelStringNLStringNL() {
-               $this->m->output( "foo\nbar\n", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputWNullChannelStringNLStringNLLinewise() {
-               $this->m->output( "foo\n", null );
-               $this->m->output( "bar\n", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputWNullChannelStringNLStringNLArbitrary() {
-               $this->m->output( "", null );
-               $this->m->output( "foo", null );
-               $this->m->output( "", null );
-               $this->m->output( "\n", null );
-               $this->m->output( "ba", null );
-               $this->m->output( "", null );
-               $this->m->output( "r\n", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
-               $this->m->output( "", null );
-               $this->m->output( "foo", null );
-               $this->m->output( "", null );
-               $this->m->output( "\nb", null );
-               $this->m->output( "a", null );
-               $this->m->output( "", null );
-               $this->m->output( "r\n", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputWChannelString() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo", true );
-       }
-
-       function testOutputWChannelStringNL() {
-               $this->m->output( "foo\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo", true );
-       }
-
-       function testOutputWChannelStringNLNL() {
-               // If this test fails, note that output takes strings with double line
-               // endings (although output's implementation in this situation calls
-               // outputChanneled with a string ending in a nl ... which is not allowed
-               // according to the documentation of outputChanneled)
-               $this->m->output( "foo\n\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\n", true );
-       }
-
-       function testOutputWChannelStringNLString() {
-               $this->m->output( "foo\nbar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputWChannelStringNLStringNL() {
-               $this->m->output( "foo\nbar\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputWChannelStringNLStringNLLinewise() {
-               $this->m->output( "foo\n", "bazChannel" );
-               $this->m->output( "bar\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
-       }
-
-       function testOutputWChannelStringNLStringNLArbitrary() {
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "\n", "bazChannel" );
-               $this->m->output( "ba", "bazChannel" );
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "r\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
-       }
-
-       function testOutputWChannelStringNLStringNLArbitraryAgain() {
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "\nb", "bazChannel" );
-               $this->m->output( "a", "bazChannel" );
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "r\n", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputWMultipleChannelsChannelChange() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "bar", "bazChannel" );
-               $this->m->output( "qux", "quuxChannel" );
-               $this->m->output( "corge", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
-       }
-
-       function testOutputWMultipleChannelsChannelChangeNL() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "bar\n", "bazChannel" );
-               $this->m->output( "qux\n", "quuxChannel" );
-               $this->m->output( "corge", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
-       }
-
-       function testOutputWAndWOChannelStringStartWO() {
-               $this->m->output( "foo" );
-               $this->m->output( "bar", "bazChannel" );
-               $this->m->output( "qux" );
-               $this->m->output( "quux", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar\nquxquux", true );
-       }
-
-       function testOutputWAndWOChannelStringStartW() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "bar" );
-               $this->m->output( "qux", "bazChannel" );
-               $this->m->output( "quux" );
-               $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", false );
-       }
-
-       function testOutputWChannelTypeSwitch() {
-               $this->m->output( "foo", 1 );
-               $this->m->output( "bar", 1.0 );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputIntermittentEmpty() {
-               $this->m->output( "foo" );
-               $this->m->output( "" );
-               $this->m->output( "bar" );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputIntermittentFalse() {
-               $this->m->output( "foo" );
-               $this->m->output( false );
-               $this->m->output( "bar" );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputIntermittentFalseAfterOtherChannel() {
-               $this->m->output( "qux", "quuxChannel" );
-               $this->m->output( "foo" );
-               $this->m->output( false );
-               $this->m->output( "bar" );
-               $this->assertOutputPrePostShutdown( "qux\nfoobar", false );
-       }
-
-       function testOutputWNullChannelIntermittentEmpty() {
-               $this->m->output( "foo", null );
-               $this->m->output( "", null );
-               $this->m->output( "bar", null );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputWNullChannelIntermittentFalse() {
-               $this->m->output( "foo", null );
-               $this->m->output( false, null );
-               $this->m->output( "bar", null );
-               $this->assertOutputPrePostShutdown( "foobar", false );
-       }
-
-       function testOutputWChannelIntermittentEmpty() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( "", "bazChannel" );
-               $this->m->output( "bar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
-       }
-
-       function testOutputWChannelIntermittentFalse() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->output( false, "bazChannel" );
-               $this->m->output( "bar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
-       }
-
-       // Note that (per documentation) outputChanneled does take strings that end
-       // in \n, hence we do not test such strings.
-
-       function testOutputChanneledEmpty() {
-               $this->m->outputChanneled( "" );
-               $this->assertOutputPrePostShutdown( "\n", false );
-       }
-
-       function testOutputChanneledString() {
-               $this->m->outputChanneled( "foo" );
-               $this->assertOutputPrePostShutdown( "foo\n", false );
-       }
-
-       function testOutputChanneledStringString() {
-               $this->m->outputChanneled( "foo" );
-               $this->m->outputChanneled( "bar" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledStringNLString() {
-               $this->m->outputChanneled( "foo\nbar" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledStringNLStringNLArbitraryAgain() {
-               $this->m->outputChanneled( "" );
-               $this->m->outputChanneled( "foo" );
-               $this->m->outputChanneled( "" );
-               $this->m->outputChanneled( "\nb" );
-               $this->m->outputChanneled( "a" );
-               $this->m->outputChanneled( "" );
-               $this->m->outputChanneled( "r" );
-               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
-       }
-
-       function testOutputChanneledWNullChannelEmpty() {
-               $this->m->outputChanneled( "", null );
-               $this->assertOutputPrePostShutdown( "\n", false );
-       }
-
-       function testOutputChanneledWNullChannelString() {
-               $this->m->outputChanneled( "foo", null );
-               $this->assertOutputPrePostShutdown( "foo\n", false );
-       }
-
-       function testOutputChanneledWNullChannelStringString() {
-               $this->m->outputChanneled( "foo", null );
-               $this->m->outputChanneled( "bar", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledWNullChannelStringNLString() {
-               $this->m->outputChanneled( "foo\nbar", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
-               $this->m->outputChanneled( "", null );
-               $this->m->outputChanneled( "foo", null );
-               $this->m->outputChanneled( "", null );
-               $this->m->outputChanneled( "\nb", null );
-               $this->m->outputChanneled( "a", null );
-               $this->m->outputChanneled( "", null );
-               $this->m->outputChanneled( "r", null );
-               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
-       }
-
-       function testOutputChanneledWChannelString() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo", true );
-       }
-
-       function testOutputChanneledWChannelStringNLString() {
-               $this->m->outputChanneled( "foo\nbar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputChanneledWChannelStringString() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "bar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
-       }
-
-       function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
-               $this->m->outputChanneled( "", "bazChannel" );
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "", "bazChannel" );
-               $this->m->outputChanneled( "\nb", "bazChannel" );
-               $this->m->outputChanneled( "a", "bazChannel" );
-               $this->m->outputChanneled( "", "bazChannel" );
-               $this->m->outputChanneled( "r", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputChanneledWMultipleChannelsChannelChange() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "bar", "bazChannel" );
-               $this->m->outputChanneled( "qux", "quuxChannel" );
-               $this->m->outputChanneled( "corge", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
-       }
-
-       function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "bar", null );
-               $this->m->outputChanneled( "qux", null );
-               $this->m->outputChanneled( "corge", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
-       }
-
-       function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "bar", null );
-               $this->m->outputChanneled( "qux", null );
-               $this->m->outputChanneled( "corge", "quuxChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
-       }
-
-       function testOutputChanneledWAndWOChannelStringStartWO() {
-               $this->m->outputChanneled( "foo" );
-               $this->m->outputChanneled( "bar", "bazChannel" );
-               $this->m->outputChanneled( "qux" );
-               $this->m->outputChanneled( "quux", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", true );
-       }
-
-       function testOutputChanneledWAndWOChannelStringStartW() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "bar" );
-               $this->m->outputChanneled( "qux", "bazChannel" );
-               $this->m->outputChanneled( "quux" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", false );
-       }
-
-       function testOutputChanneledWChannelTypeSwitch() {
-               $this->m->outputChanneled( "foo", 1 );
-               $this->m->outputChanneled( "bar", 1.0 );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
-       }
-
-       function testOutputChanneledWOChannelIntermittentEmpty() {
-               $this->m->outputChanneled( "foo" );
-               $this->m->outputChanneled( "" );
-               $this->m->outputChanneled( "bar" );
-               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
-       }
-
-       function testOutputChanneledWOChannelIntermittentFalse() {
-               $this->m->outputChanneled( "foo" );
-               $this->m->outputChanneled( false );
-               $this->m->outputChanneled( "bar" );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledWNullChannelIntermittentEmpty() {
-               $this->m->outputChanneled( "foo", null );
-               $this->m->outputChanneled( "", null );
-               $this->m->outputChanneled( "bar", null );
-               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
-       }
-
-       function testOutputChanneledWNullChannelIntermittentFalse() {
-               $this->m->outputChanneled( "foo", null );
-               $this->m->outputChanneled( false, null );
-               $this->m->outputChanneled( "bar", null );
-               $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
-       }
-
-       function testOutputChanneledWChannelIntermittentEmpty() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( "", "bazChannel" );
-               $this->m->outputChanneled( "bar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foobar", true );
+       /**
+        * @dataProvider provideOutputData
+        */
+       function testOutput( $outputs, $expected, $extraNL ) {
+               foreach ( $outputs as $data ) {
+                       if ( is_array( $data ) ) {
+                               list( $msg, $channel ) = $data;
+                       } else {
+                               $msg = $data;
+                               $channel = null;
+                       }
+                       $this->maintenance->output( $msg, $channel );
+               }
+               $this->assertOutputPrePostShutdown( $expected, $extraNL );
+       }
+
+       public function provideOutputData() {
+               return [
+                       [ [ "" ], "", false ],
+                       [ [ "foo" ], "foo", false ],
+                       [ [ "foo", "bar" ], "foobar", false ],
+                       [ [ "foo\n" ], "foo\n", false ],
+                       [ [ "foo\n\n" ], "foo\n\n", false ],
+                       [ [ "foo\nbar" ], "foo\nbar", false ],
+                       [ [ "foo\nbar\n" ], "foo\nbar\n", false ],
+                       [ [ "foo\n", "bar\n" ], "foo\nbar\n", false ],
+                       [ [ "", "foo", "", "\n", "ba", "", "r\n" ], "foo\nbar\n", false ],
+                       [ [ "", "foo", "", "\nb", "a", "", "r\n" ], "foo\nbar\n", false ],
+                       [ [ [ "foo", "bazChannel" ] ], "foo", true ],
+                       [ [ [ "foo\n", "bazChannel" ] ], "foo", true ],
+
+                       // If this test fails, note that output takes strings with double line
+                       // endings (although output's implementation in this situation calls
+                       // outputChanneled with a string ending in a nl ... which is not allowed
+                       // according to the documentation of outputChanneled)
+                       [ [ [ "foo\n\n", "bazChannel" ] ], "foo\n", true ],
+                       [ [ [ "foo\nbar", "bazChannel" ] ], "foo\nbar", true ],
+                       [ [ [ "foo\nbar\n", "bazChannel" ] ], "foo\nbar", true ],
+                       [
+                               [
+                                       [ "foo\n", "bazChannel" ],
+                                       [ "bar\n", "bazChannel" ],
+                               ],
+                               "foobar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "", "bazChannel" ],
+                                       [ "foo", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "\n", "bazChannel" ],
+                                       [ "ba", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "r\n", "bazChannel" ],
+                               ],
+                               "foobar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "", "bazChannel" ],
+                                       [ "foo", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "\nb", "bazChannel" ],
+                                       [ "a", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "r\n", "bazChannel" ],
+                               ],
+                               "foo\nbar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                                       [ "qux", "quuxChannel" ],
+                                       [ "corge", "bazChannel" ],
+                               ],
+                               "foobar\nqux\ncorge",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar\n", "bazChannel" ],
+                                       [ "qux\n", "quuxChannel" ],
+                                       [ "corge", "bazChannel" ],
+                               ],
+                               "foobar\nqux\ncorge",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", null ],
+                                       [ "bar", "bazChannel" ],
+                                       [ "qux", null ],
+                                       [ "quux", "bazChannel" ],
+                               ],
+                               "foobar\nquxquux",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", null ],
+                                       [ "qux", "bazChannel" ],
+                                       [ "quux", null ],
+                               ],
+                               "foo\nbarqux\nquux",
+                               false
+                       ],
+                       [
+                               [
+                                       [ "foo", 1 ],
+                                       [ "bar", 1.0 ],
+                               ],
+                               "foo\nbar",
+                               true
+                       ],
+                       [ [ "foo", "", "bar" ], "foobar", false ],
+                       [ [ "foo", false, "bar" ], "foobar", false ],
+                       [
+                               [
+                                       [ "qux", "quuxChannel" ],
+                                       "foo",
+                                       false,
+                                       "bar"
+                               ],
+                               "qux\nfoobar",
+                               false
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                               ],
+                               "foobar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ false, "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                               ],
+                               "foobar",
+                               true
+                       ],
+               ];
        }
 
-       function testOutputChanneledWChannelIntermittentFalse() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->outputChanneled( false, "bazChannel" );
-               $this->m->outputChanneled( "bar", "bazChannel" );
-               $this->assertOutputPrePostShutdown( "foo\nbar", true );
+       /**
+        * @dataProvider provideOutputChanneledData
+        */
+       function testOutputChanneled( $outputs, $expected, $extraNL ) {
+               foreach ( $outputs as $data ) {
+                       if ( is_array( $data ) ) {
+                               list( $msg, $channel ) = $data;
+                       } else {
+                               $msg = $data;
+                               $channel = null;
+                       }
+                       $this->maintenance->outputChanneled( $msg, $channel );
+               }
+               $this->assertOutputPrePostShutdown( $expected, $extraNL );
+       }
+
+       public function provideOutputChanneledData() {
+               return [
+                       [ [ "" ], "\n", false ],
+                       [ [ "foo" ], "foo\n", false ],
+                       [ [ "foo", "bar" ], "foo\nbar\n", false ],
+                       [ [ "foo\nbar" ], "foo\nbar\n", false ],
+                       [ [ "", "foo", "", "\nb", "a", "", "r" ], "\nfoo\n\n\nb\na\n\nr\n", false ],
+                       [ [ [ "foo", "bazChannel" ] ], "foo", true ],
+                       [
+                               [
+                                       [ "foo\nbar", "bazChannel" ]
+                               ],
+                               "foo\nbar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                               ],
+                               "foobar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "", "bazChannel" ],
+                                       [ "foo", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "\nb", "bazChannel" ],
+                                       [ "a", "bazChannel" ],
+                                       [ "", "bazChannel" ],
+                                       [ "r", "bazChannel" ],
+                               ],
+                               "foo\nbar",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                                       [ "qux", "quuxChannel" ],
+                                       [ "corge", "bazChannel" ],
+                               ],
+                               "foobar\nqux\ncorge",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", "bazChannel" ],
+                                       [ "qux", "quuxChannel" ],
+                                       [ "corge", "bazChannel" ],
+                               ],
+                               "foobar\nqux\ncorge",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", null ],
+                                       [ "qux", null ],
+                                       [ "corge", "bazChannel" ],
+                               ],
+                               "foo\nbar\nqux\ncorge",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", null ],
+                                       [ "bar", "bazChannel" ],
+                                       [ "qux", null ],
+                                       [ "quux", "bazChannel" ],
+                               ],
+                               "foo\nbar\nqux\nquux",
+                               true
+                       ],
+                       [
+                               [
+                                       [ "foo", "bazChannel" ],
+                                       [ "bar", null ],
+                                       [ "qux", "bazChannel" ],
+                                       [ "quux", null ],
+                               ],
+                               "foo\nbar\nqux\nquux\n",
+                               false
+                       ],
+                       [
+                               [
+                                       [ "foo", 1 ],
+                                       [ "bar", 1.0 ],
+                               ],
+                               "foo\nbar",
+                               true
+                       ],
+                       [ [ "foo", "", "bar" ], "foo\n\nbar\n", false ],
+                       [ [ "foo", false, "bar" ], "foo\nbar\n", false ],
+               ];
        }
 
        function testCleanupChanneledClean() {
-               $this->m->cleanupChanneled();
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "", false );
        }
 
        function testCleanupChanneledAfterOutput() {
-               $this->m->output( "foo" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo", false );
        }
 
        function testCleanupChanneledAfterOutputWNullChannel() {
-               $this->m->output( "foo", null );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo", null );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo", false );
        }
 
        function testCleanupChanneledAfterOutputWChannel() {
-               $this->m->output( "foo", "bazChannel" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo", "bazChannel" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterNLOutput() {
-               $this->m->output( "foo\n" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo\n" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterNLOutputWNullChannel() {
-               $this->m->output( "foo\n", null );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo\n", null );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterNLOutputWChannel() {
-               $this->m->output( "foo\n", "bazChannel" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->output( "foo\n", "bazChannel" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterOutputChanneledWOChannel() {
-               $this->m->outputChanneled( "foo" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->outputChanneled( "foo" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterOutputChanneledWNullChannel() {
-               $this->m->outputChanneled( "foo", null );
-               $this->m->cleanupChanneled();
+               $this->maintenance->outputChanneled( "foo", null );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testCleanupChanneledAfterOutputChanneledWChannel() {
-               $this->m->outputChanneled( "foo", "bazChannel" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->outputChanneled( "foo", "bazChannel" );
+               $this->maintenance->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\n", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutput() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->output( "foo" );
+               $this->maintenance->output( "foo" );
                $m2->output( "bar" );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->output( "foo", null );
+               $this->maintenance->output( "foo", null );
                $m2->output( "bar", null );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->output( "foo", "bazChannel" );
+               $this->maintenance->output( "foo", "bazChannel" );
                $m2->output( "bar", "bazChannel" );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar\n", true );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->output( "foo\n", null );
+               $this->maintenance->output( "foo\n", null );
                $m2->output( "bar\n", null );
 
                $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->output( "foo\n", "bazChannel" );
+               $this->maintenance->output( "foo\n", "bazChannel" );
                $m2->output( "bar\n", "bazChannel" );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar\n", true );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->outputChanneled( "foo" );
+               $this->maintenance->outputChanneled( "foo" );
                $m2->outputChanneled( "bar" );
 
                $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->outputChanneled( "foo", null );
+               $this->maintenance->outputChanneled( "foo", null );
                $m2->outputChanneled( "bar", null );
 
                $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foo\nbar\n", false );
        }
 
        function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->maintenance->outputChanneled( "foo", "bazChannel" );
                $m2->outputChanneled( "bar", "bazChannel" );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before shutdown simulation (m2)" );
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar\n", true );
        }
 
        function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
-               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->maintenance->outputChanneled( "foo", "bazChannel" );
                $m2->outputChanneled( "bar", "bazChannel" );
 
                $this->assertEquals( "foobar", $this->getActualOutput(),
                        "Output before first cleanup" );
-               $this->m->cleanupChanneled();
+               $this->maintenance->cleanupChanneled();
                $this->assertEquals( "foobar\n", $this->getActualOutput(),
                        "Output after first cleanup" );
                $m2->cleanupChanneled();
                $this->assertEquals( "foobar\n\n", $this->getActualOutput(),
                        "Output after second cleanup" );
 
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
                $this->assertOutputPrePostShutdown( "foobar\n\n", false );
        }
 
@@ -828,10 +483,10 @@ class MaintenanceTest extends MediaWikiTestCase {
         * @covers Maintenance::getConfig
         */
        public function testGetConfig() {
-               $this->assertInstanceOf( 'Config', $this->m->getConfig() );
+               $this->assertInstanceOf( 'Config', $this->maintenance->getConfig() );
                $this->assertSame(
                        MediaWikiServices::getInstance()->getMainConfig(),
-                       $this->m->getConfig()
+                       $this->maintenance->getConfig()
                );
        }
 
@@ -840,12 +495,13 @@ class MaintenanceTest extends MediaWikiTestCase {
         */
        public function testSetConfig() {
                $conf = $this->createMock( 'Config' );
-               $this->m->setConfig( $conf );
-               $this->assertSame( $conf, $this->m->getConfig() );
+               $this->maintenance->setConfig( $conf );
+               $this->assertSame( $conf, $this->maintenance->getConfig() );
        }
 
        function testParseArgs() {
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
+
                // Create an option with an argument allowed to be specified multiple times
                $m2->addOption( 'multi', 'This option does stuff', false, true, false, true );
                $m2->loadWithArgv( [ '--multi', 'this1', '--multi', 'this2' ] );
@@ -854,9 +510,9 @@ class MaintenanceTest extends MediaWikiTestCase {
                $this->assertEquals( [ [ 'multi', 'this1' ], [ 'multi', 'this2' ] ],
                        $m2->orderedOptions );
 
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
 
-               $m2 = new MaintenanceFixup( $this );
+               $m2 = $this->createMaintenance();
 
                $m2->addOption( 'multi', 'This option does stuff', false, false, false, true );
                $m2->loadWithArgv( [ '--multi', '--multi' ] );
@@ -864,9 +520,10 @@ class MaintenanceTest extends MediaWikiTestCase {
                $this->assertEquals( [ 1, 1 ], $m2->getOption( 'multi' ) );
                $this->assertEquals( [ [ 'multi', 1 ], [ 'multi', 1 ] ], $m2->orderedOptions );
 
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
+
+               $m2 = $this->createMaintenance();
 
-               $m2 = new MaintenanceFixup( $this );
                // Create an option with an argument allowed to be specified multiple times
                $m2->addOption( 'multi', 'This option doesn\'t actually support multiple occurrences' );
                $m2->loadWithArgv( [ '--multi=yo' ] );
@@ -874,6 +531,6 @@ class MaintenanceTest extends MediaWikiTestCase {
                $this->assertEquals( 'yo', $m2->getOption( 'multi' ) );
                $this->assertEquals( [ [ 'multi', 'yo' ] ], $m2->orderedOptions );
 
-               $m2->simulateShutdown();
+               $m2->cleanupChanneled();
        }
 }
index ce7197d..ad9bf3e 100644 (file)
@@ -179,7 +179,7 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
                ];
 
                // The mock itself
-               $prefetchMock = $this->getMockBuilder( 'BaseDump' )
+               $prefetchMock = $this->getMockBuilder( BaseDump::class )
                        ->setMethods( [ 'prefetch' ] )
                        ->disableOriginalConstructor()
                        ->getMock();
index cbc74f4..6d86551 100644 (file)
@@ -50,7 +50,7 @@ class ApiStructureTest extends MediaWikiTestCase {
         */
        private function checkMessage( $msg, $what ) {
                $msg = ApiBase::makeMessage( $msg, self::getMain()->getContext() );
-               $this->assertInstanceOf( 'Message', $msg, "$what message" );
+               $this->assertInstanceOf( Message::class, $msg, "$what message" );
                $this->assertTrue( $msg->exists(), "$what message {$msg->getKey()} exists" );
        }
 
index f2e6858..6fb428b 100644 (file)
@@ -30,7 +30,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $tmpGlobals['wgStylePath'] = '/skins';
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgLocalFileRepo'] = [
-                       'class' => 'LocalRepo',
+                       'class' => LocalRepo::class,
                        'name' => 'local',
                        'url' => 'http://example.com/images',
                        'hashLevels' => 2,
index fb2957b..1850f6f 100644 (file)
@@ -165,7 +165,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
                $logger2 = LoggerFactory::getInstance( 'foo' );
 
                $this->assertNotSame( $logger1, $logger2 );
-               $this->assertInstanceOf( '\Psr\Log\LoggerInterface', $logger2 );
+               $this->assertInstanceOf( \Psr\Log\LoggerInterface::class, $logger2 );
        }
 
        /**
diff --git a/tests/selenium/pageobjects/delete.page.js b/tests/selenium/pageobjects/delete.page.js
new file mode 100644 (file)
index 0000000..bd28ca8
--- /dev/null
@@ -0,0 +1,52 @@
+'use strict';
+const Page = require( './page' );
+
+class DeletePage extends Page {
+
+       get reason() { return browser.element( '#wpReason' ); }
+       get watch() { return browser.element( '#wpWatch' ); }
+       get submit() { return browser.element( '#wpConfirmB' ); }
+       get displayedContent() { return browser.element( '#mw-content-text' ); }
+
+       open( name ) {
+               super.open( name + '&action=delete' );
+       }
+
+       delete( name, reason ) {
+               this.open( name );
+               this.reason.setValue( reason );
+               this.submit.click();
+       }
+
+       apiDelete( name, reason ) {
+               const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html
+                       baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html
+                       Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw
+                       client = new Bot( {
+                               protocol: baseUrl.protocol,
+                               server: baseUrl.hostname,
+                               port: baseUrl.port,
+                               path: baseUrl.path,
+                               username: browser.options.username,
+                               password: browser.options.password,
+                               debug: false
+                       } );
+
+               return new Promise( ( resolve, reject ) => {
+                       client.logIn( function ( err ) {
+                               if ( err ) {
+                                       console.log( err );
+                                       return reject( err );
+                               }
+                               client.delete( name, reason, function ( err ) {
+                                       if ( err ) {
+                                               return reject( err );
+                                       }
+                                       resolve();
+                               } );
+                       } );
+               } );
+       }
+
+}
+module.exports = new DeletePage();
diff --git a/tests/selenium/pageobjects/restore.page.js b/tests/selenium/pageobjects/restore.page.js
new file mode 100644 (file)
index 0000000..ef47438
--- /dev/null
@@ -0,0 +1,21 @@
+'use strict';
+const Page = require( './page' );
+
+class RestorePage extends Page {
+
+       get reason() { return browser.element( '#wpComment' ); }
+       get submit() { return browser.element( '#mw-undelete-submit' ); }
+       get displayedContent() { return browser.element( '#mw-content-text' ); }
+
+       open( name ) {
+               browser.url( '/index.php?title=Special:Undelete/' + name );
+       }
+
+       restore( name, reason ) {
+               this.open( name );
+               this.reason.setValue( reason );
+               this.submit.click();
+       }
+
+}
+module.exports = new RestorePage();
index bdbd41b..0061d0c 100644 (file)
@@ -19,5 +19,9 @@ class UserLoginPage extends Page {
                this.loginButton.click();
        }
 
+       loginAdmin() {
+               this.login( browser.options.username, browser.options.password );
+       }
+
 }
 module.exports = new UserLoginPage();
diff --git a/tests/selenium/pageobjects/usermessage.page.js b/tests/selenium/pageobjects/usermessage.page.js
new file mode 100644 (file)
index 0000000..7faf347
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict';
+const Page = require( './page' );
+
+class UserMessagePage extends Page {
+       get usermessage() { return browser.element( 'div.usermessage' ); }
+}
+module.exports = new UserMessagePage();
index e59da78..376dce5 100644 (file)
@@ -1,5 +1,7 @@
 'use strict';
 const assert = require( 'assert' ),
+       DeletePage = require( '../pageobjects/delete.page' ),
+       RestorePage = require( '../pageobjects/restore.page' ),
        EditPage = require( '../pageobjects/edit.page' ),
        HistoryPage = require( '../pageobjects/history.page' ),
        UserLoginPage = require( '../pageobjects/userlogin.page' );
@@ -36,6 +38,28 @@ describe( 'Page', function () {
 
        } );
 
+       it( 'should be re-creatable', function () {
+               let initialContent = getTestString();
+
+               // create
+               browser.call( function () {
+                       return EditPage.apiEdit( name, initialContent );
+               } );
+
+               // delete
+               browser.call( function () {
+                       return DeletePage.apiDelete( name, 'delete prior to recreate' );
+               } );
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content );
+
+       } );
+
        it( 'should be editable', function () {
 
                // create
@@ -65,4 +89,48 @@ describe( 'Page', function () {
 
        } );
 
+       it( 'should be deletable', function () {
+
+               // login
+               UserLoginPage.loginAdmin();
+
+               // create
+               browser.call( function () {
+                       return EditPage.apiEdit( name, content );
+               } );
+
+               // delete
+               DeletePage.delete( name, content + '-deletereason' );
+
+               // check
+               assert.equal(
+                       DeletePage.displayedContent.getText(),
+                       '"' + name + '" has been deleted. See deletion log for a record of recent deletions.\nReturn to Main Page.'
+               );
+
+       } );
+
+       it( 'should be restorable', function () {
+
+               // login
+               UserLoginPage.loginAdmin();
+
+               // create
+               browser.call( function () {
+                       return EditPage.apiEdit( name, content );
+               } );
+
+               // delete
+               browser.call( function () {
+                       return DeletePage.apiDelete( name, content + '-deletereason' );
+               } );
+
+               // restore
+               RestorePage.restore( name, content + '-restorereason' );
+
+               // check
+               assert.equal( RestorePage.displayedContent.getText(), name + ' has been restored\nConsult the deletion log for a record of recent deletions and restorations.' );
+
+       } );
+
 } );
index 3f3872d..102acd6 100644 (file)
@@ -2,7 +2,9 @@
 const assert = require( 'assert' ),
        CreateAccountPage = require( '../pageobjects/createaccount.page' ),
        PreferencesPage = require( '../pageobjects/preferences.page' ),
-       UserLoginPage = require( '../pageobjects/userlogin.page' );
+       UserLoginPage = require( '../pageobjects/userlogin.page' ),
+       UserMessagePage = require( '../pageobjects/usermessage.page' ),
+       EditPage = require( '../pageobjects/edit.page' );
 
 describe( 'User', function () {
 
@@ -66,4 +68,24 @@ describe( 'User', function () {
 
        } );
 
+       it( 'should be able to view new message banner', function () {
+
+               // create user
+               browser.call( function () {
+                       return CreateAccountPage.apiCreateAccount( username, password );
+               } );
+
+               // create talk page with content
+               browser.call( function () {
+                       return EditPage.apiEdit( 'User_talk:' + username, Math.random().toString() );
+               } );
+
+               // log in
+               UserLoginPage.login( username, password );
+
+               // check
+               assert.equal( UserMessagePage.usermessage.getText(), 'You have a new message (last change).' );
+
+       } );
+
 } );
index 7c3e757..02ac0b0 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -572,7 +572,7 @@ function wfExtractThumbParams( $file, $params ) {
  * @return void
  */
 function wfThumbErrorText( $status, $msgText ) {
-       wfThumbError( $status, htmlspecialchars( $msgText ) );
+       wfThumbError( $status, htmlspecialchars( $msgText, ENT_NOQUOTES ) );
 }
 
 /**
@@ -602,9 +602,10 @@ function wfThumbError( $status, $msgHtml, $msgText = null, $context = [] ) {
        if ( $wgShowHostnames ) {
                header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
                $url = htmlspecialchars(
-                       isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : ''
+                       isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '',
+                       ENT_NOQUOTES
                );
-               $hostname = htmlspecialchars( wfHostname() );
+               $hostname = htmlspecialchars( wfHostname(), ENT_NOQUOTES );
                $debug = "<!-- $url -->\n<!-- $hostname -->\n";
        } else {
                $debug = '';