Merge "InstantCommons: do not cache thumbs"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 25 Jan 2017 22:39:33 +0000 (22:39 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 25 Jan 2017 22:39:33 +0000 (22:39 +0000)
1230 files changed:
.gitignore
.mailmap
CREDITS
Gemfile
Gemfile.lock
Gruntfile.js
README
RELEASE-NOTES-1.29
autoload.php
composer.json
docs/contenthandler.txt
docs/extension.schema.json [deleted file]
docs/extension.schema.v2.json [new file with mode: 0644]
docs/hooks.txt
includes/AuthPlugin.php
includes/Block.php
includes/Category.php
includes/CategoryFinder.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/DerivativeRequest.php
includes/DummyLinker.php
includes/EditPage.php
includes/FileDeleteForm.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/Linker.php
includes/MWGrants.php
includes/MWNamespace.php
includes/MagicWord.php
includes/MediaWiki.php
includes/Message.php
includes/MovePage.php
includes/OutputPage.php
includes/PageProps.php
includes/PathRouter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteConfiguration.php
includes/Title.php
includes/WatchedItemQueryService.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebStart.php
includes/WikiMap.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiCSPReport.php
includes/api/ApiChangeAuthenticationData.php
includes/api/ApiCheckToken.php
includes/api/ApiClearHasMsg.php
includes/api/ApiClientLogin.php
includes/api/ApiComparePages.php
includes/api/ApiContinuationManager.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiErrorFormatter.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLinkAccount.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php
includes/api/ApiMergeHistory.php
includes/api/ApiMessage.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.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/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.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/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDisabled.php
includes/api/ApiQueryFilearchive.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/ApiQueryMyStashedFiles.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.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/ApiRemoveAuthenticationData.php
includes/api/ApiResetPassword.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiSetPageLanguage.php [new file with mode: 0755]
includes/api/ApiStashEdit.php
includes/api/ApiTag.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUsageException.php [new file with mode: 0644]
includes/api/ApiUserrights.php
includes/api/ApiValidatePassword.php [new file with mode: 0644]
includes/api/ApiWatch.php
includes/api/i18n/ar.json
includes/api/i18n/ast.json
includes/api/i18n/be-tarask.json
includes/api/i18n/bn.json
includes/api/i18n/br.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/diq.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/ia.json
includes/api/i18n/id.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json
includes/api/i18n/lv.json
includes/api/i18n/mk.json
includes/api/i18n/nb.json
includes/api/i18n/nl.json
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/api/i18n/ta.json
includes/api/i18n/te.json
includes/api/i18n/udm.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/FileCacheBase.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/CategoryMembershipChange.php
includes/changetags/ChangeTags.php
includes/collation/Collation.php
includes/collation/CollationFa.php [new file with mode: 0644]
includes/collation/IcuCollation.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/WikitextContent.php
includes/db/CloneDatabase.php
includes/db/DatabaseMssql.php
includes/db/DatabaseOracle.php
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/deferred/LinksDeletionUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DiffEngine.php
includes/diff/DifferenceEngine.php
includes/exception/ErrorPageError.php
includes/exception/LocalizedException.php [new file with mode: 0644]
includes/exception/MWContentSerializationException.php [new file with mode: 0644]
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/exception/MWUnknownContentModelException.php [new file with mode: 0644]
includes/exception/PermissionsError.php
includes/export/XmlDumpWriter.php
includes/externalstore/ExternalStoreDB.php
includes/filerepo/FSRepo.php [deleted file]
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/TempFileRepo.php [new file with mode: 0644]
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/SlideshowImageGallery.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/htmlform/fields/HTMLButtonField.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLSizeFilterField.php
includes/htmlform/fields/HTMLTagFilter.php
includes/htmlform/fields/HTMLTextField.php
includes/http/CurlHttpRequest.php
includes/http/Http.php
includes/http/PhpHttpRequest.php
includes/import/ImportStreamSource.php
includes/import/WikiImporter.php
includes/import/WikiRevision.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/ar.json
includes/installer/i18n/be.json
includes/installer/i18n/bg.json
includes/installer/i18n/cs.json
includes/installer/i18n/diq.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/hu.json
includes/installer/i18n/id.json
includes/installer/i18n/it.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/lki.json
includes/installer/i18n/mk.json
includes/installer/i18n/my.json
includes/installer/i18n/nb.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/pms.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.json
includes/installer/i18n/sd.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/war.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/JobRunner.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/json/FormatJson.php
includes/libs/ExplodeIterator.php
includes/libs/HashRing.php
includes/libs/HtmlArmor.php
includes/libs/IEUrlExtension.php
includes/libs/MapCacheLRU.php
includes/libs/StringUtils.php
includes/libs/Xhprof.php
includes/libs/eventrelayer/EventRelayer.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/lockmanager/LockManager.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/mime/mime.info
includes/libs/mime/mime.types
includes/libs/objectcache/APCUBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/MaintainableDBConnRef.php [new file with mode: 0644]
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBReplicationWaitError.php
includes/libs/rdbms/field/MssqlField.php
includes/libs/rdbms/field/MySQLField.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/redis/RedisConnectionPool.php
includes/libs/stats/NullStatsdDataFactory.php
includes/libs/xmp/XMP.php
includes/logging/BlockLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/mail/MailAddress.php
includes/mail/UserMailer.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/CategoryPage.php
includes/page/ImageHistoryPseudoPager.php
includes/page/ImagePage.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/TablePager.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/ParameterizedPassword.php
includes/password/Password.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/ProfilerXhprof.php
includes/registration/CoreVersionChecker.php [deleted file]
includes/registration/ExtensionJsonValidationError.php [new file with mode: 0644]
includes/registration/ExtensionJsonValidator.php [new file with mode: 0644]
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/VersionChecker.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevDelArchiveItem.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelRevisionItem.php
includes/search/DummySearchIndexFieldDefinition.php
includes/search/ResultAugmentor.php
includes/search/ResultSetAugmentor.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchSuggestion.php
includes/search/SearchSuggestionSet.php
includes/site/HashSiteStore.php
includes/skins/SkinTemplate.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialApiHelp.php
includes/specials/SpecialBlock.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialImport.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedimages.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/CategoryPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/MergeHistoryPager.php
includes/specials/pagers/NewFilesPager.php
includes/tidy/Balancer.php
includes/tidy/RaggettWrapper.php
includes/title/MalformedTitleException.php
includes/title/MediaWikiTitleCodec.php
includes/title/TitleValue.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/user/User.php
includes/utils/ZipDirectoryReader.php
includes/widget/search/BasicSearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/DidYouMeanWidget.php [new file with mode: 0644]
includes/widget/search/FullSearchResultWidget.php [new file with mode: 0644]
includes/widget/search/InterwikiSearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/SearchFormWidget.php [new file with mode: 0644]
includes/widget/search/SearchResultWidget.php [new file with mode: 0644]
includes/widget/search/SimpleSearchResultWidget.php [new file with mode: 0644]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageFi.php
languages/classes/LanguageHe.php [deleted file]
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageRu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUk.php
languages/data/ZhConversion.php
languages/data/grammarTransformations/he.json [new file with mode: 0644]
languages/data/grammarTransformations/uk.json [new file with mode: 0644]
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/av.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/dv.json
languages/i18n/el.json
languages/i18n/en-gb.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gor.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lij.json
languages/i18n/liv.json
languages/i18n/lki.json
languages/i18n/lo.json
languages/i18n/lt.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sd.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/udm.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAb.php
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAk.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesArq.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAy.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBan.php
languages/messages/MessagesBar.php
languages/messages/MessagesBbc_latn.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBh.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBm.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesBug.php
languages/messages/MessagesBxr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCbk_zam.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesCo.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDe_at.php
languages/messages/MessagesDe_ch.php
languages/messages/MessagesDe_formal.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesDv.php
languages/messages/MessagesDz.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEml.php
languages/messages/MessagesEn.php
languages/messages/MessagesEn_gb.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFf.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrc.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGn.php
languages/messages/MessagesGot.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHr.php
languages/messages/MessagesHrx.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHt.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIi.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKg.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKs.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesKs_deva.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKv.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLbe.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMo.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesNl.php
languages/messages/MessagesNl_informal.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesNv.php
languages/messages/MessagesOc.php
languages/messages/MessagesOlo.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPdt.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPi.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRgn.php
languages/messages/MessagesRm.php
languages/messages/MessagesRmy.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesRup.php [new file with mode: 0644]
languages/messages/MessagesRuq_cyrl.php
languages/messages/MessagesRuq_latn.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSg.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTy.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVls.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZa.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_cn.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_hk.php
languages/messages/MessagesZh_sg.php
languages/messages/MessagesZh_tw.php
maintenance/archives/patch-externallinks-el_index_60.sql [new file with mode: 0644]
maintenance/backup.inc
maintenance/cdb.php
maintenance/eval.php
maintenance/findHooks.php
maintenance/generateJsonI18n.php
maintenance/importDump.php
maintenance/importImages.inc [deleted file]
maintenance/importImages.php
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/manageJobs.php [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/oracle/archives/patch-externallinks-el_index_60.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/populateInterwiki.php [new file with mode: 0644]
maintenance/postgres/tables.sql
maintenance/rebuildFileCache.php
maintenance/rebuildtextindex.php
maintenance/refreshImageMetadata.php
maintenance/storage/compressOld.php
maintenance/tables.sql
maintenance/validateRegistrationFile.php
maintenance/view.php [new file with mode: 0644]
mw-config/index.php
package.json
resources/Resources.php
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/hif-latn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/tr.json
resources/lib/oojs-ui/i18n/tt-cyrl.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons-wikimedia.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg [new file with mode: 0644]
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.language/languages/he.js [deleted file]
resources/src/mediawiki.language/languages/ru.js [deleted file]
resources/src/mediawiki.language/languages/uk.js [deleted file]
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js [new file with mode: 0644]
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.changeslist.css
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.special/mediawiki.special.watchlist.js
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.widgets.datetime/DateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.js
resources/src/mediawiki.widgets.datetime/DiscordianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/options.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/datetime.js [deleted file]
resources/src/mediawiki/htmlform/hide-if.js
resources/src/mediawiki/htmlform/htmlform.js
resources/src/mediawiki/htmlform/styles.css
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.requestIdleCallback.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/page/gallery-slideshow.js
resources/src/mediawiki/page/rollback.js
resources/src/mediawiki/page/watch.js
resources/src/oojs-ui-local.js
resources/src/startup.js
tests/browser/features/login.feature
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/support/pages/create_account_page.rb
tests/browser/features/support/pages/login_page.rb
tests/common/TestSetup.php
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/DbTestPreviewer.php
tests/parser/DbTestRecorder.php
tests/parser/DjVuSupport.php
tests/parser/ParserTestPrinter.php
tests/parser/ParserTestResultNormalizer.php
tests/parser/ParserTestRunner.php
tests/parser/TestFileReader.php
tests/parser/TestRecorder.php
tests/parser/parserTests.txt
tests/phan/bin/phan [new file with mode: 0755]
tests/phan/bin/postprocess-phan.php [new file with mode: 0644]
tests/phan/config.php [new file with mode: 0644]
tests/phan/issues/.gitkeep [new file with mode: 0644]
tests/phan/stubs/README [new file with mode: 0644]
tests/phan/stubs/hhvm.php [new file with mode: 0644]
tests/phan/stubs/mail.php [new file with mode: 0644]
tests/phan/stubs/wikidiff.php [new file with mode: 0644]
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/media/say-test.opus [new file with mode: 0644]
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/TestLogger.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/api/ApiOpenSearchTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiUnblockTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/MockApi.php
tests/phpunit/includes/api/MockApiQueryBase.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/pager/ReverseChronologicalPagerTest.php
tests/phpunit/includes/registration/CoreVersionCheckerTest.php [deleted file]
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialEditWatchlistTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php [new file with mode: 0644]
tests/phpunit/includes/tidy/BalancerTest.php
tests/phpunit/includes/tidy/html5lib-tests.json
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/languages/classes/LanguageHeTest.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
tests/phpunit/structure/ExtensionJsonValidationTest.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/CoreParserTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/startup.test.js
wiki.phtml [deleted file]

index 01a11bf..b2c4d45 100644 (file)
@@ -71,3 +71,4 @@ Thumbs.db
 /tags
 /.htaccess
 /.htpasswd
+/tests/phan/issues
index dd968e8..7aa3257 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -93,6 +93,7 @@ Chad Horohoe <chadh@wikimedia.org>
 Chad Horohoe <chadh@wikimedia.org> <demon@users.mediawiki.org>
 Charles Melbye <charlie@yourwiki.net> <charlie@users.mediawiki.org>
 Chiefwei <chiefwei1989@gmail.com>
+Chris Koerner <ckoerner@wikimedia.org>
 Chris McMahon <cmcmahon@wikimedia.org>
 Chris Steipp <csteipp@wikimedia.org>
 Christian Aistleitner <christian@quelltextlich.at>
@@ -100,6 +101,8 @@ Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Williams <orbit@framezero.com>
 Christian Williams <orbit@framezero.com> <christian@localhost>
 Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
+Christoph Jauera <christoph.jauera@wikimedia.de>
+Christoph Jauera <christoph.jauera@wikimedia.de> <christoph.fischer@wikimedia.de>
 Christopher Johnson <root@bugzilla.wmde.de>
 church of emacs <churchofemacs@users.mediawiki.org>
 Cindy Cicalese <cicalese@mitre.org>
@@ -115,12 +118,14 @@ Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
 Daniel Friesen <mediawiki@danielfriesen.name> <pub-github@nadir-seen-fire.com>
 Daniel Kinzler <daniel.kinzler@wikimedia.de>
 Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
+Daniel Renfro <bluecurio@gmail.com> <drenfro@vistaprint.com>
 Danny B. <Wikipedia.Danny.B@email.cz>
 Danny B. <Wikipedia.Danny.B@email.cz> <danny.b@email.cz>
 Danny B. <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
 Danny B. <Wikipedia.Danny.B@email.cz> <wikimedia.danny.b@email.cz>
 Darian Anthony Patrick <dpatrick@wikimedia.org>
 Darkdragon09 <ubuntu@ip-172-31-39-38.us-west-2.compute.internal>
+David Causse <dcausse@wikimedia.org>
 David Chan <david@sheetmusic.org.uk>
 Dereckson <dereckson@espace-win.org>
 Derk-Jan Hartman <hartman@videolan.org>
@@ -134,6 +139,7 @@ Ebrahim Byagowi <ebrahim@gnu.org>
 Ed Sanders <esanders@wikimedia.org>
 Elliott Eggleston <eeggleston@wikimedia.org>
 Elliott Eggleston <eeggleston@wikimedia.org> <ejegg@ejegg.com>
+Emad Elwany <emadelwany@hotmail.com>
 Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
 Emufarmers <emufarmers@gmail.com>
 Emufarmers <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
@@ -201,6 +207,7 @@ Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
 Jason Richey <jasonr@wikia.com> <urichj00@users.mediawiki.org>
 Jeff Hall <jeffreyehall@gmail.com>
 Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
+Jeff Hobson <jhobson@wikimedia.org>
 Jeff Janes <jeff.janes@gmail.com>
 Jeremy Postlethwaite <jpostlethwaite@wikimedia.org> <jpostlethwaite@users.mediawiki.org>
 Jeroen De Dauw <jeroendedauw@gmail.com>
@@ -208,6 +215,7 @@ Jeroen De Dauw <jeroendedauw@gmail.com> <jeroendedauw@users.mediawiki.org>
 Jesús Martínez Novo <martineznovo@gmail.com>
 Jiabao <jiabao.foss@gmail.com>
 Jimmy Collins <jimmy.collins@web.de> <collinj@users.mediawiki.org>
+Joel Sahleen <jsahleen@wikimedia.org>
 John Du Hart <john@compwhizii.net> <johnduhart@users.mediawiki.org>
 Jon Harald Søby <jhsoby@gmail.com> <jhsoby@users.mediawiki.org>
 Jon Robson <jrobson@wikimedia.org>
@@ -217,6 +225,8 @@ Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
 JuneHyeon Bae <devunt@gmail.com>
 Jure Kajzer <freak@drajv.si>
 Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Justin Du <justin.d128@gmail.com>
+Kai Nissen <kai.nissen@wikimedia.de>
 Karun Dambiec <karun.84@gmx.de>
 Katie Filbert <aude.wiki@gmail.com>
 Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
@@ -236,6 +246,7 @@ liangent <liangent@gmail.com>
 Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
 Ljudusika <plo2000@i.ua>
 Luis Felipe Schenone <schenonef@gmail.com>
+Luke Welling <lwelling@wikimedia.org>
 Lupo <lupo.bugzilla@gmail.com>
 m4tx <m4tx@m4tx.pl>
 Madman <madman.enwiki@gmail.com>
@@ -281,11 +292,14 @@ Mwalker <mwalker@wikimedia.org>
 MZMcBride <g@mzmcbride.com>
 nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
 Namit <namit.ohri@gmail.com>
+Nathan Larson <nathanlarson3141@gmail.com>
+Nathan Larson <nathanlarson3141@gmail.com> <tjlsangria@gmail.com>
 Nathaniel Herman <redwwjd@yahoo.com> <pinky@users.mediawiki.org>
 Neil Kandalgaonkar <neilk@wikimedia.org> <neilk@users.mediawiki.org>
 Nemo bis <federicoleva@tiscali.it>
 nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
 Nick Jenkins <nickpj@gmail.com> <nickj@users.mediawiki.org>
+Niharika Kohli <nkohli@wikimedia.org>
 Nik Everett <neverett@wikimedia.org>
 Niklas Laxström <niklas.laxstrom@gmail.com>
 Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
@@ -406,7 +420,6 @@ Timo Tijhof <krinklemail@gmail.com> <krinkle@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com> <timo@wikimedia.org>
 Timo Tijhof <krinklemail@gmail.com> <ttijhof@wikimedia.org>
 Tina Johnson <tinajohnson.1234@gmail.com>
-Tisane <nathanlarson3141@gmail.com>
 Tjones <tjones@wikimedia.org>
 Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
 Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
@@ -438,6 +451,7 @@ Yongmin Hong <revi@member.fsf.org> <reviwiki@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org>
 Yuri Astrakhan <yurik@wikimedia.org> <yuriastrakhan@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
+Yuriy Shnitkovskiy <bmp2558@gmail.com>
 Yusuke Matsubara <whym@whym.org>
 Yuvi Panda <yuvipanda@gmail.com>
 Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
diff --git a/CREDITS b/CREDITS
index d9ff970..b37edf2 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,10 +1,9 @@
-{{int:version-credits-summary}}
-<!--
+{{int:version-credits-summary}} <!--
 MediaWiki 1.28 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.
--->
-<!-- Please notice that the following can be found parsed under Special:Version/Credits -->
+
+The following list can be found parsed under Special:Version/Credits -->
 
 == Contributors ==
 <!-- Updates to this list made with maintenance/updateCredits.php -->
diff --git a/Gemfile b/Gemfile
index 8a349bf..8bbd00f 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.2'
+gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
 gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 982619a..8243874 100644 (file)
@@ -13,55 +13,58 @@ GEM
       gherkin (~> 2.12)
       multi_json (>= 1.7.5, < 2.0)
       multi_test (>= 0.1.2)
-    data_magic (0.22)
+    data_magic (1.0)
       faker (>= 1.1.2)
       yml_reader (>= 0.6)
     diff-lcs (1.2.5)
-    domain_name (0.5.20160615)
+    domain_name (0.5.20161129)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.6.6)
+    faker (1.7.1)
       i18n (~> 0.5)
-    faraday (0.9.2)
+    faraday (0.10.0)
       multipart-post (>= 1.2, < 3)
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    faraday_middleware (0.10.0)
-      faraday (>= 0.7.4, < 0.10)
+    faraday_middleware (0.10.1)
+      faraday (>= 0.7.4, < 1.0)
     ffi (1.9.14)
     gherkin (2.12.2)
       multi_json (~> 1.3)
-    headless (2.2.3)
-    http-cookie (1.0.2)
+    headless (2.3.1)
+    http-cookie (1.0.3)
       domain_name (~> 0.5)
     i18n (0.7.0)
-    json (1.8.3)
+    json (2.0.2)
     mediawiki_api (0.7.0)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
       faraday_middleware (~> 0.10, >= 0.10.0)
-    mediawiki_selenium (1.7.2)
+    mediawiki_selenium (1.7.4)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
-      json (~> 1.8, >= 1.8.1)
+      json (~> 2.0, >= 2.0.2)
       mediawiki_api (~> 0.7, >= 0.7.0)
       page-object (~> 1.0)
       rest-client (~> 1.6, >= 1.6.7)
       rspec-core (~> 2.14, >= 2.14.4)
       rspec-expectations (~> 2.14, >= 2.14.4)
+      selenium-webdriver (< 3)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.99.2)
+    mime-types (2.99.3)
     multi_json (1.12.1)
     multi_test (0.1.2)
     multipart-post (2.0.0)
+    net-http-persistent (2.9.4)
     netrc (0.11.0)
-    page-object (1.2.0)
+    page-object (1.2.2)
+      net-http-persistent (~> 2.9.4)
       page_navigation (>= 0.9)
-      selenium-webdriver (>= 2.44.0)
-      watir-webdriver (>= 0.6.11)
-    page_navigation (0.9)
-      data_magic (>= 0.14)
+      selenium-webdriver (>= 2.53.0)
+      watir-webdriver (>= 0.6.11, < 0.9.9)
+    page_navigation (0.10)
+      data_magic (>= 0.22)
     parser (2.2.2.6)
       ast (>= 1.1, < 3.0)
     powerpack (0.1.1)
@@ -87,7 +90,7 @@ GEM
       rubyzip (~> 1.0)
       websocket (~> 1.0)
     syntax (1.2.1)
-    thor (0.19.1)
+    thor (0.19.4)
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.2)
@@ -100,6 +103,9 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.7, >= 1.7.2)
+  mediawiki_selenium (~> 1.7, >= 1.7.4)
   rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
+
+BUNDLED WITH
+   1.13.7
index 55b7932..4cc9721 100644 (file)
@@ -14,7 +14,10 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-karma' );
        grunt.loadNpmTasks( 'grunt-stylelint' );
 
-       karmaProxy[ wgScriptPath ] = wgServer + wgScriptPath;
+       karmaProxy[ wgScriptPath ] = {
+               target: wgServer + wgScriptPath,
+               changeOrigin: true
+       };
 
        grunt.initConfig( {
                eslint: {
@@ -85,6 +88,9 @@ module.exports = function ( grunt ) {
                        main: {
                                browsers: [ 'Chrome' ]
                        },
+                       chromium: {
+                               browsers: [ 'Chromium' ]
+                       },
                        more: {
                                browsers: [ 'Chrome', 'Firefox' ]
                        }
diff --git a/README b/README
index 6d3ab80..ad9b9d9 100644 (file)
--- a/README
+++ b/README
@@ -19,7 +19,7 @@ RELEASE-NOTES, INSTALL, and UPGRADE.
 * Ready to get started?
 ** https://www.mediawiki.org/wiki/Special:MyLanguage/Download
 * Looking for the technical manual?
-** https://www.mediawiki.org/wiki/Special:MyLangyage/Manual:Contents
+** https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents
 * Seeking help from a person?
 ** https://www.mediawiki.org/wiki/Special:MyLanguage/Communication
 * Looking to file a bug report or a feature request?
index 1c90e88..d0738e2 100644 (file)
@@ -6,18 +6,48 @@ MediaWiki 1.29 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.29 ===
-* Default cookie expiration time has been reduced to 30 days. Login cookie expiration time is
-  kept at 180 days.
+* Default cookie expiration time has been reduced to 30 days. Login cookie
+  expiration time is kept at 180 days.
 * A new configuration variable has been added: $wgCookieSetOnAutoblock. This
   determines whether to set a cookie when a user is autoblocked. Doing so means
   that a blocked user, even after logging out and moving to a new IP address,
   will still be blocked.
 * The resetpassword right and associated password reset capture feature has
   been removed.
+* The $error parameter to the EmailUser hook should be set to a Status object
+  or boolean false. This should be compatible with at least MediaWiki 1.23 if
+  not earlier. Returning a raw HTML string is now deprecated.
+* The $message parameter to the ApiCheckCanExecute hook should be set to an
+  ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a
+  code for ApiBase::parseMsg() will no longer work.
+* ApiBase::$messageMap is no longer public. Code attempting to access it will
+  result in a PHP fatal error.
+* $wgUserEmailUseReplyTo is now true by default to work around restrictive DMARC
+  policies.
+* Subpages are now enabled by default in the Template namespace. Set
+  $wgNamespacesWithSubpages[NS_TEMPLATE] to false to keep the old behavior.
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
 
 === New features in 1.29 ===
-* (T5233) A cookie can now be set when a user is autoblocked, to track that user if
-  they move to a new IP address. This is disabled by default.
+* (T5233) A cookie can now be set when a user is autoblocked, to track that user
+  if they move to a new IP address. This is disabled by default.
+* Added ILocalizedException interface to standardize the use of localized
+  exceptions, largely so the API can handle them more sensibly.
+* Blocks created automatically by MediaWiki, such as for configured proxies or
+  dnsbls, are now indicated as such and use a new i18n message when displayed.
+* Added new $wgHTTPImportTimeout setting. Sets timeout for
+  downloading the XML dump during a transwiki import in seconds.
+* Parser limit report is now available in machine-readable format to JavaScript
+  via mw.config.get('wgPageParseReport').
+* Added $wgSoftBlockRanges, to allow for automatically blocking anonymous edits
+  from certain IP ranges (e.g. private IPs).
+* (T59603) Added new magic word {{PAGELANGUAGE}} which returns the language code
+  of the page being parsed.
+* HTML5 form validation attributes will no longer be suppressed. Originally
+  browsers had poor support for them, but modern browsers handle them fine.
+  This might affect some forms that used them and only worked because the
+  attributes were not actually being set.
 
 === External library changes in 1.29 ===
 
@@ -29,6 +59,8 @@ production.
 ==== Removed and replaced external libraries ====
 
 === Bug fixes in 1.29 ===
+* (T62604) Core parser functions returning a number now format the number according
+  to the page content language, not wiki content language.
 
 === Action API changes in 1.29 ===
 * Submitting sensitive authentication request parameters to action=clientlogin,
@@ -37,8 +69,52 @@ production.
   body instead.
 * The capture option for action=resetpassword has been removed
 * action=clearhasmsg now requires a POST.
+* (T47843) API errors and warnings may be requested in non-English languages
+  using the new 'errorformat', 'errorlang', and 'errorsuselocal' parameters.
+* API error codes may have changed. Most notably, errors from modules using
+  parameter prefixes (e.g. all query submodules) will no longer be prefixed.
+* ApiPageSet-using modules will report the 'invalidreason' using the specified
+  'errorformat'.
+* action=emailuser may return a "Warnings" status, and now returns 'warnings' and
+  'errors' subelements (as applicable) instead of 'message'.
+* action=imagerotate returns an 'errors' subelement rather than 'errormessage'.
+* action=move now reports errors when moving the talk page as an array under
+  key 'talkmove-errors', rather than using 'talkmove-error-code' and
+  'talkmove-error-info'. The format for subpage move errors has also changed.
+* action=revisiondelete no longer includes a "rendered" property on warnings
+  and errors for each item. Use errorformat=wikitext if you're wanting parsed
+  output.
+* action=rollback no longer returns a "messageHtml" property. Use
+  errorformat=html if you're wanting HTML formatting of error messages.
+* action=upload now reports optional stash failures as an array under key
+  'stasherrors' rather than a 'stashfailed' text string.
+* action=watch reports 'errors' and 'warnings' instead of a single 'error', and
+  no longer returns a 'message' on success.
+* Added action=validatepassword to validate passwords for the account creation
+  and password change forms.
 
 === Action API internal changes in 1.29 ===
+* New methods were added to ApiBase to handle errors and warnings using i18n
+  keys. Methods for using hard-coded English messages were deprecated:
+  * ApiBase::dieUsage() was deprecated
+  * ApiBase::dieUsageMsg() was deprecated
+  * ApiBase::dieUsageMsgOrDebug() was deprecated
+  * ApiBase::getErrorFromStatus() was deprecated
+  * ApiBase::parseMsg() was deprecated
+  * ApiBase::setWarning() was deprecated
+* ApiBase::$messageMap is no longer public. Code attempting to access it will
+  result in a PHP fatal error.
+* The $message parameter to the ApiCheckCanExecute hook should be set to an
+  ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a
+  code for ApiBase::parseMsg() will no longer work.
+* UsageException is deprecated in favor of ApiUsageException. For the time
+  being ApiUsageException is a subclass of UsageException to allow things that
+  catch only UsageException to still function properly.
+* If, for some strange reason, code was using an ApiErrorFormatter instead of
+  ApiErrorFormatter_BackCompat, note that the result format has changed and
+  various methods now take a module path rather than a module name.
+* ApiMessageTrait::getApiCode() now strips 'apierror-' and 'apiwarn-' prefixes
+  from the message key, and maps some message keys for backwards compatibility.
 
 === Languages updated in 1.29 ===
 
@@ -46,6 +122,16 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
+* Based as always on linguistic studies on intelligibility and language
+  knowledge by geography, language fallbacks have been expanded. When a
+  translation is missing in the user's preferred interface language, the
+  corresponding translation for the fallback language will be used instead.
+  English will only be used as last resort when there are no translations.
+  Some configurations (such as date formats and gender namespaces) have also
+  been updated when using the fallback language's configuration was inadequate.
+  The new or reinstated language fallbacks are (after cs ↔ sk in 1.28):
+  hsb ↔ dsb, io → eo, mdf → ru, pnt → el, roa-tara → it.
+
 ==== No fallback for Ukrainian ====
 * (T39314) The fallback from Ukrainian to Russian was removed. The Ukrainian
   language will now use the default fallback language: English. When a translation
@@ -62,11 +148,64 @@ changes to languages because of Phabricator reports.
 * Xml::escapeJsString() (deprecated in 1.21) was removed.
 * Article::getText() and Article::prepareTextForEdit() (deprecated in 1.21)
   were removed.
-* Article::getAutosummary() and WikiPage::getAutosummary (deprecated in 1.21)
-  were removed.
-* Hooks ArticleViewCustom, EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21)
+* Article::getAutosummary() and WikiPage::getAutosummary() (deprecated in 1.21)
   were removed.
+* Hook ArticleViewCustom (deprecated in 1.21) was removed. Use ArticleContentViewCustom
+  instead.
+* Hooks EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21) were removed.
 * Class RevisiondeleteAction (deprecated in 1.25) was removed.
+* WikiPage::prepareTextForEdit() (deprecated in 1.21) was removed.
+* WikiPage::getText() (deprecated in 1.21) was removed.
+* Article::fetchContent() (deprecated in 1.21) was removed.
+* User::getPassword() (deprecated in 1.27) was removed.
+* User::getTemporaryPassword() (deprecated in 1.27) was removed.
+* User::isPasswordReminderThrottled() (deprecated in 1.27) was removed.
+* Class FSRepo (deprecated in 1.19) was removed.
+* WebRequest::checkSessionCookie() (deprecated in 1.27) was removed. Use
+  \MediaWiki\Session\SessionManager::singleton()->getPersistedSessionId() instead.
+* Class ImageGallery (deprecated in 1.22) was removed.
+  Use ImageGalleryBase::factory instead.
+* Title::moveNoAuth() (deprecated in 1.25) was removed. Use MovePage class instead.
+* Hook UnknownAction (deprecated in 1.19) was actually deprecated (it will now
+  emit warnings). Create a subclass of Action and add it to $wgActions instead.
+* WikiRevision::getText() (deprecated since 1.21) is no longer marked deprecated.
+* Linker::getInterwikiLinkAttributes() (deprecated since 1.25) was removed.
+* Linker::getInternalLinkAttributes() (deprecated since 1.25) was removed.
+* Linker::getInternalLinkAttributesObj() (deprecated since 1.25) was removed.
+* Linker::getLinkAttributesInternal() (deprecated since 1.25) was removed.
+* RedisConnectionPool::handleException (deprecated since 1.23) was removed.
+* The static properties mw.Api.errors and mw.Api.warnings, containing incomplete
+  and outdated lists of errors/warnings returned by the API, are now deprecated.
+* wiki.phtml entry point was removed.  Refer to index.php instead. If you want "wiki.phtml"
+  URLs to continue to work, set up redirects. In Apache, this can be done by enabling
+  mod_rewrite and adding the following rules to your configuration:
+
+    RewriteEngine On
+    RewriteBase /
+    RewriteRule ^/w/wiki\.phtml$ /w/index.php [R=301,L]
+* Hook ArticleAfterFetchContent (deprecated in 1.21) was removed.
+  Use ArticleAfterFetchContentObject instead.
+* Hook ArticleInsertComplete (deprecated in 1.21) was removed.
+  Use PageContentInsertComplete instead.
+* Hook ArticleSave (deprecated in 1.21) was removed.
+  Use PageContentSave instead.
+* Hook ArticleSaveComplete (deprecated in 1.21) was removed.
+  Use PageContentSaveComplete instead.
+* Hook EditFilterMerged (deprecated in 1.21) was removed.
+  Use EditFilterMergedContent instead.
+* Hook EditPageGetPreviewText (deprecated in 1.21) was removed.
+  Use EditPageGetPreviewContent instead.
+* Hook TitleIsCssOrJsPage (deprecated in 1.21) was removed.
+  Use ContentHandlerDefaultModelFor instead.
+* Hook TitleIsWikitextPage (deprecated in 1.21) was removed.
+  Use ContentHandlerDefaultModelFor instead.
+* Article::getContent() (deprecated in 1.21) was removed.
+* Revision::getText() (deprecated in 1.21) was removed.
+* Article::doEdit() and WikiPage::doEdit() (deprecated in 1.21) were removed.
+* Parser::replaceUnusualEscapes() (deprecated in 1.24) was removed.
+* Article::doEditContent() was marked as deprecated, to be removed in 1.30
+  or later.
+* ContentHandler::runLegacyHooks() was removed.
 
 == Compatibility ==
 
index f74128a..7ed08df 100644 (file)
@@ -139,13 +139,16 @@ $wgAutoloadLocalClasses = [
        'ApiRsd' => __DIR__ . '/includes/api/ApiRsd.php',
        'ApiSerializable' => __DIR__ . '/includes/api/ApiSerializable.php',
        'ApiSetNotificationTimestamp' => __DIR__ . '/includes/api/ApiSetNotificationTimestamp.php',
+       'ApiSetPageLanguage' => __DIR__ . '/includes/api/ApiSetPageLanguage.php',
        'ApiStashEdit' => __DIR__ . '/includes/api/ApiStashEdit.php',
        'ApiTag' => __DIR__ . '/includes/api/ApiTag.php',
        'ApiTokens' => __DIR__ . '/includes/api/ApiTokens.php',
        'ApiUnblock' => __DIR__ . '/includes/api/ApiUnblock.php',
        'ApiUndelete' => __DIR__ . '/includes/api/ApiUndelete.php',
        'ApiUpload' => __DIR__ . '/includes/api/ApiUpload.php',
+       'ApiUsageException' => __DIR__ . '/includes/api/ApiUsageException.php',
        'ApiUserrights' => __DIR__ . '/includes/api/ApiUserrights.php',
+       'ApiValidatePassword' => __DIR__ . '/includes/api/ApiValidatePassword.php',
        'ApiWatch' => __DIR__ . '/includes/api/ApiWatch.php',
        'ArchivedFile' => __DIR__ . '/includes/filerepo/file/ArchivedFile.php',
        'ArrayDiffFormatter' => __DIR__ . '/includes/diff/ArrayDiffFormatter.php',
@@ -259,6 +262,7 @@ $wgAutoloadLocalClasses = [
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
        'CollationEt' => __DIR__ . '/includes/collation/CollationEt.php',
+       'CollationFa' => __DIR__ . '/includes/collation/CollationFa.php',
        'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
        'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
@@ -292,7 +296,6 @@ $wgAutoloadLocalClasses = [
        'CopyJobQueue' => __DIR__ . '/maintenance/copyJobQueue.php',
        'CoreParserFunctions' => __DIR__ . '/includes/parser/CoreParserFunctions.php',
        'CoreTagHooks' => __DIR__ . '/includes/parser/CoreTagHooks.php',
-       'CoreVersionChecker' => __DIR__ . '/includes/registration/CoreVersionChecker.php',
        'CreateAndPromote' => __DIR__ . '/maintenance/createAndPromote.php',
        'CreateFileOp' => __DIR__ . '/includes/libs/filebackend/fileop/CreateFileOp.php',
        'CreditsAction' => __DIR__ . '/includes/actions/CreditsAction.php',
@@ -428,6 +431,8 @@ $wgAutoloadLocalClasses = [
        'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
        'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
        'ExportSites' => __DIR__ . '/maintenance/exportSites.php',
+       'ExtensionJsonValidationError' => __DIR__ . '/includes/registration/ExtensionJsonValidationError.php',
+       'ExtensionJsonValidator' => __DIR__ . '/includes/registration/ExtensionJsonValidator.php',
        'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
        'ExtensionProcessor' => __DIR__ . '/includes/registration/ExtensionProcessor.php',
        'ExtensionRegistry' => __DIR__ . '/includes/registration/ExtensionRegistry.php',
@@ -443,7 +448,6 @@ $wgAutoloadLocalClasses = [
        'FSFileBackendList' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.php',
        'FSFileOpHandle' => __DIR__ . '/includes/libs/filebackend/FSFileBackend.php',
        'FSLockManager' => __DIR__ . '/includes/libs/lockmanager/FSLockManager.php',
-       'FSRepo' => __DIR__ . '/includes/filerepo/FSRepo.php',
        'FakeAuthTemplate' => __DIR__ . '/includes/specialpage/LoginSignupSpecialPage.php',
        'FakeConverter' => __DIR__ . '/languages/FakeConverter.php',
        'FakeMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
@@ -595,6 +599,7 @@ $wgAutoloadLocalClasses = [
        'ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
        'ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
        'ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
+       'ILocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
        'IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'IP' => __DIR__ . '/includes/libs/IP.php',
        'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
@@ -604,7 +609,6 @@ $wgAutoloadLocalClasses = [
        'IdentityCollation' => __DIR__ . '/includes/collation/IdentityCollation.php',
        'ImageBuilder' => __DIR__ . '/maintenance/rebuildImages.php',
        'ImageCleanup' => __DIR__ . '/maintenance/cleanupImages.php',
-       'ImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
        'ImageGalleryBase' => __DIR__ . '/includes/gallery/ImageGalleryBase.php',
        'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php',
        'ImageHistoryList' => __DIR__ . '/includes/page/ImageHistoryList.php',
@@ -612,6 +616,7 @@ $wgAutoloadLocalClasses = [
        'ImageListPager' => __DIR__ . '/includes/specials/pagers/ImageListPager.php',
        'ImagePage' => __DIR__ . '/includes/page/ImagePage.php',
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
+       'ImportImages' => __DIR__ . '/maintenance/importImages.php',
        'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php',
        'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
@@ -691,7 +696,6 @@ $wgAutoloadLocalClasses = [
        'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
        'LanguageGa' => __DIR__ . '/languages/classes/LanguageGa.php',
        'LanguageGan' => __DIR__ . '/languages/classes/LanguageGan.php',
-       'LanguageHe' => __DIR__ . '/languages/classes/LanguageHe.php',
        'LanguageHsb' => __DIR__ . '/languages/classes/LanguageHsb.php',
        'LanguageHu' => __DIR__ . '/languages/classes/LanguageHu.php',
        'LanguageHy' => __DIR__ . '/languages/classes/LanguageHy.php',
@@ -756,6 +760,7 @@ $wgAutoloadLocalClasses = [
        'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php',
        'LocalisationCache' => __DIR__ . '/includes/cache/localisation/LocalisationCache.php',
        'LocalisationCacheBulkLoad' => __DIR__ . '/includes/cache/localisation/LocalisationCacheBulkLoad.php',
+       'LocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
        'LockManager' => __DIR__ . '/includes/libs/lockmanager/LockManager.php',
        'LockManagerGroup' => __DIR__ . '/includes/filebackend/lockmanager/LockManagerGroup.php',
        'LogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
@@ -773,7 +778,7 @@ $wgAutoloadLocalClasses = [
        'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
        'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
        'MWCallableUpdate' => __DIR__ . '/includes/deferred/MWCallableUpdate.php',
-       'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWContentSerializationException' => __DIR__ . '/includes/exception/MWContentSerializationException.php',
        'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
        'MWCryptHash' => __DIR__ . '/includes/libs/MWCryptHash.php',
        'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
@@ -794,16 +799,18 @@ $wgAutoloadLocalClasses = [
        'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
        'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
        'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
-       'MWUnknownContentModelException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWUnknownContentModelException' => __DIR__ . '/includes/exception/MWUnknownContentModelException.php',
        'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php',
        'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
        'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
        'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
        'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php',
        'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php',
        'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php',
+       'ManageJobs' => __DIR__ . '/maintenance/manageJobs.php',
        'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
        'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php',
        'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
@@ -926,6 +933,13 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\DateTimeInputWidget' => __DIR__ . '/includes/widget/DateTimeInputWidget.php',
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\SearchInputWidget' => __DIR__ . '/includes/widget/SearchInputWidget.php',
+       'MediaWiki\\Widget\\Search\\BasicSearchResultSetWidget' => __DIR__ . '/includes/widget/search/BasicSearchResultSetWidget.php',
+       'MediaWiki\\Widget\\Search\\DidYouMeanWidget' => __DIR__ . '/includes/widget/search/DidYouMeanWidget.php',
+       'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php',
+       'MediaWiki\\Widget\\Search\\InterwikiSearchResultSetWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultSetWidget.php',
+       'MediaWiki\\Widget\\Search\\SearchFormWidget' => __DIR__ . '/includes/widget/search/SearchFormWidget.php',
+       'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php',
+       'MediaWiki\\Widget\\Search\\SimpleSearchResultWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
@@ -1080,6 +1094,7 @@ $wgAutoloadLocalClasses = [
        'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
+       'PopulateInterwiki' => __DIR__ . '/maintenance/populateInterwiki.php',
        'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php',
        'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php',
        'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php',
@@ -1419,7 +1434,7 @@ $wgAutoloadLocalClasses = [
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TagLogFormatter' => __DIR__ . '/includes/logging/TagLogFormatter.php',
        'TempFSFile' => __DIR__ . '/includes/libs/filebackend/fsfile/TempFSFile.php',
-       'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'TempFileRepo' => __DIR__ . '/includes/filerepo/TempFileRepo.php',
        'TemplateParser' => __DIR__ . '/includes/TemplateParser.php',
        'TemplatesOnThisPageFormatter' => __DIR__ . '/includes/TemplatesOnThisPageFormatter.php',
        'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
@@ -1501,7 +1516,7 @@ $wgAutoloadLocalClasses = [
        'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UppercaseCollation' => __DIR__ . '/includes/collation/UppercaseCollation.php',
-       'UsageException' => __DIR__ . '/includes/api/ApiMain.php',
+       'UsageException' => __DIR__ . '/includes/api/ApiUsageException.php',
        'User' => __DIR__ . '/includes/user/User.php',
        'UserArray' => __DIR__ . '/includes/user/UserArray.php',
        'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
@@ -1520,7 +1535,9 @@ $wgAutoloadLocalClasses = [
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
        'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
        'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
+       'VersionChecker' => __DIR__ . '/includes/registration/VersionChecker.php',
        'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
+       'ViewCLI' => __DIR__ . '/maintenance/view.php',
        'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
        'WANObjectCache' => __DIR__ . '/includes/libs/objectcache/WANObjectCache.php',
index 19ca238..e825152 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.18.1",
+               "oojs/oojs-ui": "0.18.4",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
@@ -53,7 +53,7 @@
                "monolog/monolog": "~1.18.2",
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
-               "phpunit/phpunit": "4.8.24",
+               "phpunit/phpunit": "4.8.31",
                "wikimedia/avro": "1.7.7"
        },
        "suggest": {
index 6209b14..5f379e7 100644 (file)
@@ -21,10 +21,6 @@ ContentHandler::getDefaultModelFor($title) as follows:
 * The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
 * Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .css or .js, respectively.
   Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
-* The hook TitleIsCssOrJsPage may be used to force a page to use the CSS or JavaScript model.
-  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
-* The hook TitleIsWikitextPage may be used to force a page to use the wikitext model.
-  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
 * Otherwise, the wikitext model is used.
 
 Note that is currently no mechanism to convert a page from one content model to another, and there is no guarantee that
diff --git a/docs/extension.schema.json b/docs/extension.schema.json
deleted file mode 100644 (file)
index 30feaef..0000000
+++ /dev/null
@@ -1,719 +0,0 @@
-{
-       "$schema": "http://json-schema.org/schema#",
-       "description": "MediaWiki extension.json schema",
-       "type": "object",
-       "properties": {
-               "manifest_version": {
-                       "type": "integer",
-                       "description": "Version of the extension.json schema the extension.json file is in.",
-                       "required": true
-               },
-               "name": {
-                       "type": "string",
-                       "description": "The extension's canonical name.",
-                       "required": true
-               },
-               "namemsg": {
-                       "type": "string",
-                       "description": "i18n message key of the extension's name."
-               },
-               "type": {
-                       "type": "string",
-                       "description": "The extension's type, as an index to $wgExtensionCredits.",
-                       "default": "other"
-               },
-               "author": {
-                       "type": [
-                               "string",
-                               "array"
-                       ],
-                       "description": "Extension's authors.",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "version": {
-                       "type": "string",
-                       "description": "The version of this release of the extension."
-               },
-               "url": {
-                       "type": "string",
-                       "description": "URL to the homepage for the extension.",
-                       "format": "uri"
-               },
-               "description": {
-                       "type": "string",
-                       "description": "Raw description of the extension."
-               },
-               "descriptionmsg": {
-                       "type": "string",
-                       "description": "Message key for a i18n message describing the extension."
-               },
-               "license-name": {
-                       "type": "string",
-                       "description": "SPDX identifier for the license under which the extension is released."
-               },
-               "requires": {
-                       "type": "object",
-                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
-                       "properties": {
-                               "MediaWiki": {
-                                       "type": "string",
-                                       "description": "Version constraint string against MediaWiki core."
-                               }
-                       }
-               },
-               "ResourceFileModulePaths": {
-                       "type": "object",
-                       "description": "Default paths to use for all ResourceLoader file modules",
-                       "additionalProperties": false,
-                       "properties": {
-                               "localBasePath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all local paths, relative to current directory"
-                               },
-                               "remoteExtPath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
-                               },
-                               "remoteSkinPath": {
-                                       "type": "string",
-                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
-                               }
-                       }
-               },
-               "ResourceModules": {
-                       "type": "object",
-                       "description": "ResourceLoader modules to register",
-                       "patternProperties": {
-                               "^[a-zA-Z0-9-\\.]+$": {
-                                       "type": "object",
-                                       "anyOf": [
-                                               {
-                                                       "description": "A ResourceLoaderFileModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "localBasePath": {
-                                                                       "type": "string",
-                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
-                                                               },
-                                                               "remoteBasePath": {
-                                                                       "type": "string",
-                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
-                                                               },
-                                                               "remoteExtPath": {
-                                                                       "type": "string",
-                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
-                                                               },
-                                                               "skipFunction": {
-                                                                       "type": "string",
-                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
-                                                               },
-                                                               "scripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to always include (array of file paths)",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "languageScripts": {
-                                                                       "type": "object",
-                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
-                                                                       "patternProperties": {
-                                                                               "^[a-zA-Z0-9-]{2,}$": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "skinScripts": {
-                                                                       "type": "object",
-                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
-                                                                       "patternProperties": {
-                                                                               ".+": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "debugScripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to include in debug contexts",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "loaderScripts": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Scripts to include in the startup module",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "dependencies": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Modules which must be loaded before this module",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "styles": {
-                                                                       "type": ["string", "array", "object"],
-                                                                       "description": "Styles to always load",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "skinStyles": {
-                                                                       "type": "object",
-                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
-                                                                       "patternProperties": {
-                                                                               ".+": {
-                                                                                       "type": [
-                                                                                               "string",
-                                                                                               "array"
-                                                                                       ],
-                                                                                       "items": {
-                                                                                               "type": "string"
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               },
-                                                               "messages": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "Messages to always load",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "group": {
-                                                                       "type": "string",
-                                                                       "description": "Group with which this module should be loaded"
-                                                               },
-                                                               "deprecated": {
-                                                                       "type": ["object", "boolean"],
-                                                                       "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
-                                                               },
-                                                               "position": {
-                                                                       "type": "string",
-                                                                       "description": "Position on the page to load this module at",
-                                                                       "enum": [
-                                                                               "bottom",
-                                                                               "top"
-                                                                       ]
-                                                               },
-                                                               "templates": {
-                                                                       "type": ["object", "array"],
-                                                                       "description": "Templates to be loaded for client-side usage"
-                                                               },
-                                                               "targets": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "ResourceLoader target the module can run on",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "noflip": {
-                                                                       "type": "boolean",
-                                                                       "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "A ResourceLoaderWikiModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "class": {
-                                                                       "enum": ["ResourceLoaderWikiModule"]
-                                                               },
-                                                               "group": {
-                                                                       "type": "string",
-                                                                       "description": "Group with which this module should be loaded"
-                                                               },
-                                                               "position": {
-                                                                       "type": "string",
-                                                                       "description": "Position on the page to load this module at",
-                                                                       "enum": [
-                                                                               "bottom",
-                                                                               "top"
-                                                                       ]
-                                                               },
-                                                               "targets": {
-                                                                       "type": ["string", "array"],
-                                                                       "description": "ResourceLoader target the module can run on",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "scripts": {
-                                                                       "type": "array",
-                                                                       "description": "A list of on-wiki pages containing JavaScript that should be loaded",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               },
-                                                               "styles": {
-                                                                       "type": "array",
-                                                                       "description": "A list of on-wiki pages containing CSS that should be loaded",
-                                                                       "items": {
-                                                                               "type": "string"
-                                                                       }
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "A ResourceLoaderImageModule definition",
-                                                       "additionalProperties": false,
-                                                       "properties": {
-                                                               "class": {
-                                                                       "enum": ["ResourceLoaderImageModule"]
-                                                               },
-                                                               "data": {
-                                                                       "type": "string"
-                                                               },
-                                                               "prefix": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selector": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selectorWithoutVariant": {
-                                                                       "type": "string"
-                                                               },
-                                                               "selectorWithVariant": {
-                                                                       "type": "string"
-                                                               },
-                                                               "variants": {
-                                                                       "type": "object"
-                                                               },
-                                                               "images": {
-                                                                       "type": "object"
-                                                               },
-                                                               "position": {
-                                                                       "enum": [
-                                                                               "top",
-                                                                               "bottom"
-                                                                       ]
-                                                               }
-                                                       }
-                                               },
-                                               {
-                                                       "description": "An arbitrary ResourceLoaderModule definition",
-                                                       "properties": {
-                                                               "class": {
-                                                                       "type": "string",
-                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
-                                                               }
-                                                       },
-                                                       "required": ["class"]
-                                               }
-                                       ]
-                               }
-                       }
-               },
-               "ResourceModuleSkinStyles": {
-                       "type": "object",
-                       "description": "ResourceLoader modules for custom skin styles"
-               },
-               "ResourceLoaderSources": {
-                       "type": "object",
-                       "description": "ResourceLoader sources to register"
-               },
-               "ResourceLoaderLESSVars": {
-                       "type": "object",
-                       "description": "ResourceLoader LESS variables"
-               },
-               "ConfigRegistry": {
-                       "type": "object",
-                       "description": "Registry of factory functions to create Config objects"
-               },
-               "SessionProviders": {
-                       "type": "object",
-                       "description": "Session providers"
-               },
-               "AuthManagerAutoConfig": {
-                       "type": "object",
-                       "description": "AuthManager auto-configuration",
-                       "additionalProperties": false,
-                       "properties": {
-                               "preauth": {
-                                       "type": "object",
-                                       "description": "Pre-authentication providers"
-                               },
-                               "primaryauth": {
-                                       "type": "object",
-                                       "description": "Primary authentication providers"
-                               },
-                               "secondaryauth": {
-                                       "type": "object",
-                                       "description": "Secondary authentication providers"
-                               }
-                       }
-               },
-               "CentralIdLookupProviders": {
-                       "type": "object",
-                       "description": "Central ID lookup providers"
-               },
-               "ChangeCredentialsBlacklist": {
-                       "type": "object",
-                       "description": "AuthenticationRequest classes which can only be used internally for credentials change"
-               },
-               "RemoveCredentialsBlacklist": {
-                       "type": "object",
-                       "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
-               },
-               "namespaces": {
-                       "type": "array",
-                       "description": "Method to add extra namespaces",
-                       "items": {
-                               "type": "object",
-                               "properties": {
-                                       "id": {
-                                               "type": "integer"
-                                       },
-                                       "constant": {
-                                               "type": "string"
-                                       },
-                                       "name": {
-                                               "type": "string"
-                                       },
-                                       "gender": {
-                                               "type": "object",
-                                               "properties": {
-                                                       "male": {
-                                                               "type": "string"
-                                                       },
-                                                       "female": {
-                                                               "type": "string"
-                                                       }
-                                               }
-                                       },
-                                       "subpages": {
-                                               "type": "boolean",
-                                               "default": false
-                                       },
-                                       "content": {
-                                               "type": "boolean",
-                                               "default": false
-                                       },
-                                       "defaultcontentmodel": {
-                                               "type": "string"
-                                       },
-                                       "protection": {
-                                               "type": ["string", "array"],
-                                               "description": "Userright(s) required to edit in this namespace"
-                                       },
-                                       "capitallinkoverride": {
-                                               "type": "boolean",
-                                               "description": "Set $wgCapitalLinks on a per-namespace basis"
-                                       },
-                                       "conditional": {
-                                               "type": "boolean",
-                                               "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
-                                               "default": false
-                                       }
-                               },
-                               "required": ["id", "constant", "name"]
-                       }
-               },
-               "TrackingCategories": {
-                       "type": "array",
-                       "description": "Tracking category message keys",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "DefaultUserOptions": {
-                       "type": "object",
-                       "description": "Default values of user options"
-               },
-               "HiddenPrefs": {
-                       "type": "array",
-                       "description": "Preferences users cannot set",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "GroupPermissions": {
-                       "type": "object",
-                       "description": "Default permissions to give to user groups",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "RevokePermissions": {
-                       "type": "object",
-                       "description": "Default permissions to revoke from user groups",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "GrantPermissions": {
-                       "type": "object",
-                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z]+$": {
-                                                       "type": "boolean"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "GrantPermissionGroups": {
-                       "type": "object",
-                       "description": "Map of grants to their UI grouping",
-                       "patternProperties": {
-                               "^[a-z]+$": {
-                                       "type": "string"
-                               }
-                       }
-               },
-               "ImplicitGroups": {
-                       "type": "array",
-                       "description": "Implicit groups"
-               },
-               "GroupsAddToSelf": {
-                       "type": "object",
-                       "description": "Groups a user can add to themselves"
-               },
-               "GroupsRemoveFromSelf": {
-                       "type": "object",
-                       "description": "Groups a user can remove from themselves"
-               },
-               "AddGroups": {
-                       "type": "object",
-                       "description": "Groups a user can add to users"
-               },
-               "RemoveGroups": {
-                       "type": "object",
-                       "description": "Groups a user can remove from users"
-               },
-               "AvailableRights": {
-                       "type": "array",
-                       "description": "User rights added by the extension",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "ContentHandlers": {
-                       "type": "object",
-                       "description": "Mapping of model ID to class name",
-                       "patternProperties": {
-                               "^[A-Za-z]+$": {
-                                       "type": "string"
-                               }
-                       }
-               },
-               "RateLimits": {
-                       "type": "object",
-                       "description": "Rate limits"
-               },
-               "RecentChangesFlags": {
-                       "type": "object",
-                       "description": "Flags (letter symbols) shown on RecentChanges pages"
-               },
-               "MediaHandlers": {
-                       "type": "object",
-                       "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
-               },
-               "ExtensionFunctions": {
-                       "type": [
-                               "array",
-                               "string"
-                       ],
-                       "description": "Function to call after setup has finished",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "ExtensionMessagesFiles": {
-                       "type": "object",
-                       "description": "File paths containing PHP internationalization data"
-               },
-               "MessagesDirs": {
-                       "type": "object",
-                       "description": "Directory paths containing JSON internationalization data"
-               },
-               "ExtensionEntryPointListFiles": {
-                       "type": "object"
-               },
-               "SpecialPages": {
-                       "type": "object",
-                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
-               },
-               "AutoloadClasses": {
-                       "type": "object"
-               },
-               "Hooks": {
-                       "type": [ "string", "object" ],
-                       "description": "Hooks this extension uses (mapping of hook name to callback)"
-               },
-               "JobClasses": {
-                       "type": "object",
-                       "description": "Job types this extension implements (mapping of job type to class name)"
-               },
-               "LogTypes": {
-                       "type": "array",
-                       "description": "List of new log types this extension uses"
-               },
-               "LogRestrictions": {
-                       "type": "object"
-               },
-               "FilterLogTypes": {
-                       "type": "object"
-               },
-               "ActionFilteredLogs": {
-                       "type": "object",
-                       "description": "List of log types which can be filtered by log actions",
-                       "patternProperties": {
-                               "^[a-z-]+$": {
-                                       "type": "object",
-                                       "patternProperties": {
-                                               "^[a-z-]+$": {
-                                                       "type": "array",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "LogNames": {
-                       "type": "object"
-               },
-               "LogHeaders": {
-                       "type": "object"
-               },
-               "LogActions": {
-                       "type": "object"
-               },
-               "LogActionsHandlers": {
-                       "type": "object"
-               },
-               "Actions": {
-                       "type": "object"
-               },
-               "APIModules": {
-                       "type": "object"
-               },
-               "APIFormatModules": {
-                       "type": "object"
-               },
-               "APIMetaModules": {
-                       "type": "object"
-               },
-               "APIPropModules": {
-                       "type": "object"
-               },
-               "APIListModules": {
-                       "type": "object"
-               },
-               "ValidSkinNames": {
-                       "type": "object"
-               },
-               "FeedClasses": {
-                       "type": "object",
-                       "description": "Available feeds objects"
-               },
-               "SkinOOUIThemes": {
-                       "type": "object"
-               },
-               "PasswordPolicy": {
-                       "type": "object",
-                       "description": "Password policies"
-               },
-               "FileExtensions": {
-                       "type": "array",
-                       "description": "Preferred file extensions for uploading",
-                       "items": {
-                               "type": "string"
-                       }
-               },
-               "callback": {
-                       "type": [
-                               "array",
-                               "string"
-                       ],
-                       "description": "A function to be called right after MediaWiki processes this file"
-               },
-               "config_prefix": {
-                       "type": "string",
-                       "default": "wg",
-                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
-               },
-               "config": {
-                       "type": "object",
-                       "description": "Configuration options for this extension",
-                       "patternProperties": {
-                               "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
-                                       "type": "object",
-                                       "properties": {
-                                               "value": {
-                                                       "required": true
-                                               },
-                                               "merge_strategy": {
-                                                       "type": "string",
-                                                       "enum": [
-                                                               "array_merge_recursive",
-                                                               "array_replace_recursive",
-                                                               "array_plus_2d",
-                                                               "array_plus",
-                                                               "array_merge"
-                                                       ],
-                                                       "default": "array_merge"
-                                               },
-                                               "path": {
-                                                       "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
-                                                       "type": "boolean",
-                                                       "default": false
-                                               },
-                                               "description": {
-                                                       "type": ["string", "array"],
-                                                       "description": "A description of the config setting, mostly for documentation/developers"
-                                               }
-                                       }
-                               }
-                       }
-               },
-               "ParserTestFiles": {
-                       "type": "array",
-                       "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
-               },
-               "ServiceWiringFiles": {
-                       "type": "array",
-                       "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
-               },
-               "load_composer_autoloader": {
-                       "type": "boolean",
-                       "description": "Load the composer autoloader for this extension, if one is present"
-               }
-       }
-}
diff --git a/docs/extension.schema.v2.json b/docs/extension.schema.v2.json
new file mode 100644 (file)
index 0000000..a5543d1
--- /dev/null
@@ -0,0 +1,727 @@
+{
+       "$schema": "http://json-schema.org/schema#",
+       "description": "MediaWiki extension.json schema",
+       "type": "object",
+       "properties": {
+               "manifest_version": {
+                       "type": "integer",
+                       "description": "Version of the extension.json schema the extension.json file is in.",
+                       "required": true
+               },
+               "name": {
+                       "type": "string",
+                       "description": "The extension's canonical name.",
+                       "required": true
+               },
+               "namemsg": {
+                       "type": "string",
+                       "description": "i18n message key of the extension's name."
+               },
+               "type": {
+                       "type": "string",
+                       "description": "The extension's type, as an index to $wgExtensionCredits.",
+                       "default": "other"
+               },
+               "author": {
+                       "type": [
+                               "string",
+                               "array"
+                       ],
+                       "description": "Extension's authors.",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "version": {
+                       "type": "string",
+                       "description": "The version of this release of the extension."
+               },
+               "url": {
+                       "type": "string",
+                       "description": "URL to the homepage for the extension.",
+                       "format": "uri"
+               },
+               "description": {
+                       "type": "string",
+                       "description": "Raw description of the extension."
+               },
+               "descriptionmsg": {
+                       "type": "string",
+                       "description": "Message key for a i18n message describing the extension."
+               },
+               "license-name": {
+                       "type": "string",
+                       "description": "SPDX identifier for the license under which the extension is released."
+               },
+               "requires": {
+                       "type": "object",
+                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "properties": {
+                               "MediaWiki": {
+                                       "type": "string",
+                                       "description": "Version constraint string against MediaWiki core."
+                               },
+                               "extensions": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific extensions."
+                               },
+                               "skins": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific skins."
+                               }
+                       }
+               },
+               "ResourceFileModulePaths": {
+                       "type": "object",
+                       "description": "Default paths to use for all ResourceLoader file modules",
+                       "additionalProperties": false,
+                       "properties": {
+                               "localBasePath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all local paths, relative to current directory"
+                               },
+                               "remoteExtPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+                               },
+                               "remoteSkinPath": {
+                                       "type": "string",
+                                       "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+                               }
+                       }
+               },
+               "ResourceModules": {
+                       "type": "object",
+                       "description": "ResourceLoader modules to register",
+                       "patternProperties": {
+                               "^[a-zA-Z0-9-\\.]+$": {
+                                       "type": "object",
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "skipFunction": {
+                                                                       "type": "string",
+                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group with which this module should be loaded"
+                                                               },
+                                                               "deprecated": {
+                                                                       "type": ["object", "boolean"],
+                                                                       "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": ["object", "array"],
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "noflip": {
+                                                                       "type": "boolean",
+                                                                       "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderWikiModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderWikiModule"]
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group with which this module should be loaded"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "scripts": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing JavaScript that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": "array",
+                                                                       "description": "A list of on-wiki pages containing CSS that should be loaded",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
+                                                       }
+                                               },
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
+                                               }
+                                       ]
+                               }
+                       }
+               },
+               "ResourceModuleSkinStyles": {
+                       "type": "object",
+                       "description": "ResourceLoader modules for custom skin styles"
+               },
+               "ResourceLoaderSources": {
+                       "type": "object",
+                       "description": "ResourceLoader sources to register"
+               },
+               "ResourceLoaderLESSVars": {
+                       "type": "object",
+                       "description": "ResourceLoader LESS variables"
+               },
+               "ConfigRegistry": {
+                       "type": "object",
+                       "description": "Registry of factory functions to create Config objects"
+               },
+               "SessionProviders": {
+                       "type": "object",
+                       "description": "Session providers"
+               },
+               "AuthManagerAutoConfig": {
+                       "type": "object",
+                       "description": "AuthManager auto-configuration",
+                       "additionalProperties": false,
+                       "properties": {
+                               "preauth": {
+                                       "type": "object",
+                                       "description": "Pre-authentication providers"
+                               },
+                               "primaryauth": {
+                                       "type": "object",
+                                       "description": "Primary authentication providers"
+                               },
+                               "secondaryauth": {
+                                       "type": "object",
+                                       "description": "Secondary authentication providers"
+                               }
+                       }
+               },
+               "CentralIdLookupProviders": {
+                       "type": "object",
+                       "description": "Central ID lookup providers"
+               },
+               "ChangeCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials change"
+               },
+               "RemoveCredentialsBlacklist": {
+                       "type": "object",
+                       "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
+               },
+               "namespaces": {
+                       "type": "array",
+                       "description": "Method to add extra namespaces",
+                       "items": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer"
+                                       },
+                                       "constant": {
+                                               "type": "string"
+                                       },
+                                       "name": {
+                                               "type": "string"
+                                       },
+                                       "gender": {
+                                               "type": "object",
+                                               "properties": {
+                                                       "male": {
+                                                               "type": "string"
+                                                       },
+                                                       "female": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       },
+                                       "subpages": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "content": {
+                                               "type": "boolean",
+                                               "default": false
+                                       },
+                                       "defaultcontentmodel": {
+                                               "type": "string"
+                                       },
+                                       "protection": {
+                                               "type": ["string", "array"],
+                                               "description": "Userright(s) required to edit in this namespace"
+                                       },
+                                       "capitallinkoverride": {
+                                               "type": "boolean",
+                                               "description": "Set $wgCapitalLinks on a per-namespace basis"
+                                       },
+                                       "conditional": {
+                                               "type": "boolean",
+                                               "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+                                               "default": false
+                                       }
+                               },
+                               "required": ["id", "constant", "name"]
+                       }
+               },
+               "TrackingCategories": {
+                       "type": "array",
+                       "description": "Tracking category message keys",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "DefaultUserOptions": {
+                       "type": "object",
+                       "description": "Default values of user options"
+               },
+               "HiddenPrefs": {
+                       "type": "array",
+                       "description": "Preferences users cannot set",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "GroupPermissions": {
+                       "type": "object",
+                       "description": "Default permissions to give to user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "RevokePermissions": {
+                       "type": "object",
+                       "description": "Default permissions to revoke from user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissions": {
+                       "type": "object",
+                       "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "GrantPermissionGroups": {
+                       "type": "object",
+                       "description": "Map of grants to their UI grouping",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "ImplicitGroups": {
+                       "type": "array",
+                       "description": "Implicit groups"
+               },
+               "GroupsAddToSelf": {
+                       "type": "object",
+                       "description": "Groups a user can add to themselves"
+               },
+               "GroupsRemoveFromSelf": {
+                       "type": "object",
+                       "description": "Groups a user can remove from themselves"
+               },
+               "AddGroups": {
+                       "type": "object",
+                       "description": "Groups a user can add to users"
+               },
+               "RemoveGroups": {
+                       "type": "object",
+                       "description": "Groups a user can remove from users"
+               },
+               "AvailableRights": {
+                       "type": "array",
+                       "description": "User rights added by the extension",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ContentHandlers": {
+                       "type": "object",
+                       "description": "Mapping of model ID to class name",
+                       "patternProperties": {
+                               "^[A-Za-z]+$": {
+                                       "type": "string"
+                               }
+                       }
+               },
+               "RateLimits": {
+                       "type": "object",
+                       "description": "Rate limits"
+               },
+               "RecentChangesFlags": {
+                       "type": "object",
+                       "description": "Flags (letter symbols) shown on RecentChanges pages"
+               },
+               "MediaHandlers": {
+                       "type": "object",
+                       "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+               },
+               "ExtensionFunctions": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "Function to call after setup has finished",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "ExtensionMessagesFiles": {
+                       "type": "object",
+                       "description": "File paths containing PHP internationalization data"
+               },
+               "MessagesDirs": {
+                       "type": "object",
+                       "description": "Directory paths containing JSON internationalization data"
+               },
+               "ExtensionEntryPointListFiles": {
+                       "type": "object"
+               },
+               "SpecialPages": {
+                       "type": "object",
+                       "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+               },
+               "AutoloadClasses": {
+                       "type": "object"
+               },
+               "Hooks": {
+                       "type": [ "string", "object" ],
+                       "description": "Hooks this extension uses (mapping of hook name to callback)"
+               },
+               "JobClasses": {
+                       "type": "object",
+                       "description": "Job types this extension implements (mapping of job type to class name)"
+               },
+               "LogTypes": {
+                       "type": "array",
+                       "description": "List of new log types this extension uses"
+               },
+               "LogRestrictions": {
+                       "type": "object"
+               },
+               "FilterLogTypes": {
+                       "type": "object"
+               },
+               "ActionFilteredLogs": {
+                       "type": "object",
+                       "description": "List of log types which can be filtered by log actions",
+                       "patternProperties": {
+                               "^[a-z-]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z-]+$": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "LogNames": {
+                       "type": "object"
+               },
+               "LogHeaders": {
+                       "type": "object"
+               },
+               "LogActions": {
+                       "type": "object"
+               },
+               "LogActionsHandlers": {
+                       "type": "object"
+               },
+               "Actions": {
+                       "type": "object"
+               },
+               "APIModules": {
+                       "type": "object"
+               },
+               "APIFormatModules": {
+                       "type": "object"
+               },
+               "APIMetaModules": {
+                       "type": "object"
+               },
+               "APIPropModules": {
+                       "type": "object"
+               },
+               "APIListModules": {
+                       "type": "object"
+               },
+               "ValidSkinNames": {
+                       "type": "object"
+               },
+               "FeedClasses": {
+                       "type": "object",
+                       "description": "Available feeds objects"
+               },
+               "SkinOOUIThemes": {
+                       "type": "object"
+               },
+               "PasswordPolicy": {
+                       "type": "object",
+                       "description": "Password policies"
+               },
+               "FileExtensions": {
+                       "type": "array",
+                       "description": "Preferred file extensions for uploading",
+                       "items": {
+                               "type": "string"
+                       }
+               },
+               "callback": {
+                       "type": [
+                               "array",
+                               "string"
+                       ],
+                       "description": "A function to be called right after MediaWiki processes this file"
+               },
+               "config_prefix": {
+                       "type": "string",
+                       "default": "wg",
+                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+               },
+               "config": {
+                       "type": "object",
+                       "description": "Configuration options for this extension",
+                       "patternProperties": {
+                               "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+                                       "type": "object",
+                                       "properties": {
+                                               "value": {
+                                                       "required": true
+                                               },
+                                               "merge_strategy": {
+                                                       "type": "string",
+                                                       "enum": [
+                                                               "array_merge_recursive",
+                                                               "array_replace_recursive",
+                                                               "array_plus_2d",
+                                                               "array_plus",
+                                                               "array_merge"
+                                                       ],
+                                                       "default": "array_merge"
+                                               },
+                                               "path": {
+                                                       "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
+                                                       "type": "boolean",
+                                                       "default": false
+                                               },
+                                               "description": {
+                                                       "type": ["string", "array"],
+                                                       "description": "A description of the config setting, mostly for documentation/developers"
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "ParserTestFiles": {
+                       "type": "array",
+                       "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+               },
+               "ServiceWiringFiles": {
+                       "type": "array",
+                       "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
+               },
+               "load_composer_autoloader": {
+                       "type": "boolean",
+                       "description": "Load the composer autoloader for this extension, if one is present"
+               }
+       }
+}
index 0254e06..803c20d 100644 (file)
@@ -358,8 +358,12 @@ authenticate and authorize API clients before executing the module. Return
 false and set a message to cancel the request.
 $module: Module object
 $user: Current user
-&$message: API usage message to die with, as a message key or array
-  as accepted by ApiBase::dieUsageMsg.
+&$message: API message to die with. Specific values accepted depend on the
+ MediaWiki version:
+ * 1.29+: IApiMessage, Message, string message key, or key+parameters array to
+   pass to ApiBase::dieWithError().
+ * 1.27+: IApiMessage, or a key or key+parameters in ApiBase::$messageMap.
+ * Earlier: A key or key+parameters in ApiBase::$messageMap.
 
 'APIEditBeforeSave': DEPRECATED! Use EditFilterMergedContent instead.
 Before saving a page with api.php?action=edit, after
@@ -588,6 +592,10 @@ Use this hook to extend action=tokens with new token types.
 &$tokenTypes: supported token types in format 'type' => callback function
   used to retrieve this type of tokens.
 
+'ApiValidatePassword': Called from ApiValidatePassword.
+$module: ApiValidatePassword instance.
+&$r: Result array.
+
 'Article::MissingArticleConditions': Before fetching deletion & move log entries
 to display a message of a non-existing page being deleted/moved, give extensions
 a chance to hide their (unrelated) log entries.
@@ -595,12 +603,6 @@ a chance to hide their (unrelated) log entries.
   AND in the final query)
 $logTypes: Array of log types being queried
 
-'ArticleAfterFetchContent': DEPRECATED! Use ArticleAfterFetchContentObject
-instead.
-After fetching content of an article from the database.
-&$article: the article (object) being loaded from the database
-&$content: the content (string) of the article
-
 'ArticleAfterFetchContentObject': After fetching content of an article from the
 database.
 &$article: the article (object) being loaded from the database
@@ -669,18 +671,6 @@ Wiki::articleFromTitle().
 &$article: Article (object) that will be returned
 $context: IContextSource (object)
 
-'ArticleInsertComplete': DEPRECATED! Use PageContentInsertComplete.
-After a new article is created.
-$wikiPage: WikiPage created
-$user: User creating the article
-$text: New content
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-
 'ArticleMergeComplete': After merging to article using Special:Mergehistory.
 $targetTitle: target title (object)
 $destTitle: destination title (object)
@@ -732,30 +722,6 @@ $user: the user who did the rollback
 $revision: the revision the page was reverted back to
 $current: the reverted revision
 
-'ArticleSave': DEPRECATED! Use PageContentSave instead.
-Before an article is saved.
-$wikiPage: the WikiPage (object) being saved
-$user: the user (object) saving the article
-$text: the new article text
-$summary: the article summary (comment)
-$isminor: minor flag
-$iswatch: watch flag
-$section: section #
-
-'ArticleSaveComplete': DEPRECATED! Use PageContentSaveComplete instead.
-After an article has been updated.
-$wikiPage: WikiPage modified
-$user: User performing the modification
-$text: New content
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-$status: Status object about to be returned by doEditContent()
-$baseRevId: the rev ID (or false) this edit was based on
-
 'ArticleUndelete': When one or more revisions of an article are restored.
 &$title: Title corresponding to the article restored
 $create: Whether or not the restoration caused the page to be created (i.e. it
@@ -1070,6 +1036,12 @@ $params: tag params
 $rc: RecentChange being tagged when the tagging accompanies the action or null
 $user: User who performed the tagging when the tagging is subsequent to the action or null
 
+'ChangeUserGroups': Called before user groups are changed.
+$performer: The User who will perform the change
+$user: The User whose groups will be changed
+&$add: The groups that will be added
+&$remove: The groups that will be removed
+
 'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
 $collationName: Name of the collation in question
 &$collationObject: Null. Replace with a subclass of the Collation class that
@@ -1186,6 +1158,18 @@ $page: SpecialPage object for DeletedContributions
 $row: the DB row for this line
 &$classes: the classes to add to the surrounding <li>
 
+'DifferenceEngineAfterLoadNewText': called in DifferenceEngine::loadNewText()
+after the new revision's content has been loaded into the class member variable
+$differenceEngine->mNewContent but before returning true from this function.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineLoadTextAfterNewContentIsLoaded': called in
+DifferenceEngine::loadText() after the new revision's content has been loaded
+into the class member variable $differenceEngine->mNewContent but before
+checking if the variable's value is null.
+This hook can be used to inject content into said class member variable.
+$differenceEngine: DifferenceEngine object
+
 'DifferenceEngineMarkPatrolledLink': Allows extensions to change the "mark as patrolled" link
 which is shown both on the diff header as well as on the bottom of a page, usually
 wrapped in a span element which has class="patrollink".
@@ -1264,6 +1248,12 @@ $differenceEngine: DifferenceEngine object
 object into the diff view
 $out: OutputPage object
 
+'DifferenceEngineShowDiffPageMaybeShowMissingRevision': called in
+DifferenceEngine::showDiffPage() when revision data cannot be loaded.
+Return false in order to prevent displaying the missing revision message
+(i.e. to prevent DifferenceEngine::showMissingRevision() from being called).
+$differenceEngine: DifferenceEngine object
+
 'DiffRevisionTools': Override or extend the revision tools available from the
 diff view, i.e. undo, etc.
 $newRev: Revision object of the "new" revision
@@ -1301,12 +1291,6 @@ $section: Section being edited
 &$error: Error message to return
 $summary: Edit summary for page
 
-'EditFilterMerged': DEPRECATED! Use EditFilterMergedContent instead.
-Post-section-merge edit filter.
-$editor: EditPage instance (object)
-$text: content of the edit box
-&$error: error message to return
-$summary: Edit summary for page
 
 'EditFilterMergedContent': Post-section-merge edit filter.
 This may be triggered by the EditPage or any other facility that modifies page
@@ -1415,13 +1399,6 @@ types using the ContentHandler facility.
 $editPage: EditPage object
 &$content: Content object to be previewed (may be replaced by hook function)
 
-'EditPageGetPreviewText': DEPRECATED! Use EditPageGetPreviewContent instead.
-Allow modifying the wikitext that will be previewed. Note that it is preferable
-to implement previews for different data types using the ContentHandler
-facility.
-$editPage: EditPage object
-&$toparse: wikitext that will be parsed
-
 'EditPageNoSuchSection': When a section edit request is given for an
 non-existent section
 &$editpage: The current EditPage object
@@ -1444,7 +1421,7 @@ true to allow those checks to occur, and false if checking is done.
 &$from: MailAddress object of sending user
 &$subject: subject of the mail
 &$text: text of the mail
-&$error: Out-param for an error
+&$error: Out-param for an error. Should be set to a Status object or boolean false.
 
 'EmailUserCC': Before sending the copy of the email to the author.
 &$to: MailAddress object of receiving user
@@ -2198,6 +2175,7 @@ $text: new contents of the page.
 'MessagesPreLoad': When loading a message from the database.
 $title: title of the message (string)
 &$message: value (string), change it to the message you want to define
+$code: code (string) denoting the language to try.
 
 'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
 $mimeMagic: Instance of MimeMagic.
@@ -2363,6 +2341,7 @@ $revision: New Revision of the article (can be null for edits that change
   nothing)
 $status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
+$undidRevId: the rev ID (or 0) this edit undid
 
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 &$article: the article that the history is loading for
@@ -2844,11 +2823,11 @@ $terms: Search terms, for highlighting
 
 'ShowSearchHitTitle': Customise display of search hit title/link.
 &$title: Title to link to
-&$text: Text to use for the link
-$result: The search result
-$terms: The search terms entered
-$page: The SpecialSearch object
-&$query: Query string to be appended to the link
+&$titleSnippet: Label for the link representing the search result. Typically the article title.
+$result: The SearchResult object
+$terms: String of the search terms entered
+$specialSearch: The SpecialSearch object
+&$query: Array of query string parameters for the link representing the search result.
 
 'SidebarBeforeOutput': Allows to edit sidebar just before it is output by skins.
 Warning: This hook is run on each display. You should consider to use
@@ -3280,13 +3259,6 @@ by the isKnown method.
 $title: Title object that is being checked
 &$isKnown: Boolean|null; whether MediaWiki currently thinks this page is known
 
-'TitleIsCssOrJsPage': DEPRECATED! Use ContentHandlerDefaultModelFor instead.
-Called when determining if a page is a CSS or JS page.
-$title: Title object that is being checked
-&$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
-  Hooks may change this value to override the return value of
-  Title::isCssOrJsPage().
-
 'TitleIsMovable': Called when determining if it is possible to move a page. Note
 that this hook is not called for interwiki pages or pages in immovable
 namespaces: for these, isMovable() always returns false.
@@ -3295,13 +3267,6 @@ $title: Title object that is being checked
   Hooks may change this value to override the return value of
   Title::isMovable().
 
-'TitleIsWikitextPage': DEPRECATED! Use ContentHandlerDefaultModelFor instead.
-Called when determining if a page is a wikitext or should
-be handled by separate handler (via ArticleViewCustom).
-$title: Title object that is being checked
-&$result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
-  Hooks may change this value to override the return value of
-  Title::isWikitextPage()
 
 'TitleMove': Before moving an article (title).
 $old: old title
@@ -3351,6 +3316,15 @@ $user: Current user object
 $title: Title object to purge
 &$urls: An array of URLs to purge from the caches, to be manipulated.
 
+'UnblockUser': Before an IP address or user is unblocked.
+&$block: The Block object about to be saved
+&$user: The user performing the unblock (not the one being unblocked)
+&$reason: If the hook is aborted, the error message to be returned in an array
+
+'UnblockUserComplete': After an IP address or user has been unblocked.
+$block: The Block object that was saved
+$user: The user who performed the unblock (not the one being unblocked)
+
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
 PageArchive object has been created but before any further processing is done.
 &$archive: PageArchive object
@@ -3377,8 +3351,9 @@ Since 1.24: Paths pointing to a directory will be recursively scanned for
 test case files matching the suffix "Test.php".
 &$paths: list of test cases and directories to search.
 
-'UnknownAction': An unknown "action" has occurred (useful for defining your own
-actions).
+'UnknownAction': DEPRECATED! To add an action in an extension,
+create a subclass of Action, and add a new key to $wgActions.
+An unknown "action" has occurred (useful for defining your own actions).
 $action: action name
 $article: article "acted on"
 
index 0b65593..b85e1d6 100644 (file)
@@ -73,7 +73,7 @@ class AuthPlugin {
        /**
         * Modify options in the login template.
         *
-        * @param UserLoginTemplate $template
+        * @param BaseTemplate $template
         * @param string $type 'signup' or 'login'. Added in 1.16.
         */
        public function modifyUITemplate( &$template, &$type ) {
index 8663d03..9d3a2f9 100644 (file)
@@ -74,6 +74,9 @@ class Block {
        /** @var bool */
        protected $isAutoblocking;
 
+       /** @var string|null */
+       protected $systemBlockType;
+
        # TYPE constants
        const TYPE_USER = 1;
        const TYPE_IP = 2;
@@ -99,6 +102,10 @@ class Block {
         *     blockEmail bool      Disallow sending emails
         *     allowUsertalk bool   Allow the target to edit its own talk page
         *     byText string        Username of the blocker (for foreign users)
+        *     systemBlock string   Indicate that this block is automatically
+        *                          created by MediaWiki rather than being stored
+        *                          in the database. Value is a string to return
+        *                          from self::getSystemBlockType().
         *
         * @since 1.26 accepts $options array instead of individual parameters; order
         * of parameters above reflects the original order
@@ -119,6 +126,7 @@ class Block {
                        'blockEmail'      => false,
                        'allowUsertalk'   => false,
                        'byText'          => '',
+                       'systemBlock'     => null,
                ];
 
                if ( func_num_args() > 1 || !is_array( $options ) ) {
@@ -162,6 +170,7 @@ class Block {
                $this->prevents( 'createaccount', (bool)$options['createAccount'] );
 
                $this->mFromMaster = false;
+               $this->systemBlockType = $options['systemBlock'];
        }
 
        /**
@@ -461,6 +470,11 @@ class Block {
         */
        public function insert( $dbw = null ) {
                global $wgBlockDisablesLogin;
+
+               if ( $this->getSystemBlockType() !== null ) {
+                       throw new MWException( 'Cannot insert a system block into the database' );
+               }
+
                wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
 
                if ( $dbw === null ) {
@@ -741,13 +755,20 @@ class Block {
                        return false;
                }
 
+               # Don't autoblock for system blocks
+               if ( $this->getSystemBlockType() !== null ) {
+                       throw new MWException( 'Cannot autoblock from a system block' );
+               }
+
                # Check for presence on the autoblock whitelist.
                if ( self::isWhitelistedFromAutoblocks( $autoblockIP ) ) {
                        return false;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $block = $this;
                # Allow hooks to cancel the autoblock.
-               if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$this ] ) ) {
+               if ( !Hooks::run( 'AbortAutoblock', [ $autoblockIP, &$block ] ) ) {
                        wfDebug( "Autoblock aborted by hook.\n" );
                        return false;
                }
@@ -934,6 +955,14 @@ class Block {
                return $this->mId;
        }
 
+       /**
+        * Get the system block type, if any
+        * @return string|null
+        */
+       public function getSystemBlockType() {
+               return $this->systemBlockType;
+       }
+
        /**
         * Get/set a flag determining whether the master is used for reads
         *
@@ -1419,8 +1448,7 @@ class Block {
 
        /**
         * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
-        * the same as the block's, unless it's greater than $wgCookieExpiration in which case
-        * $wgCookieExpiration will be used instead (defaults to 30 days).
+        * the same as the block's, to a maximum of 24 hours.
         *
         * An empty value can also be set, in order to retain the cookie but remove the block ID
         * (e.g. as used in User::getBlockedStatus).
@@ -1430,18 +1458,18 @@ class Block {
         */
        public function setCookie( WebResponse $response, $setEmpty = false ) {
                // Calculate the default expiry time.
-               $config = RequestContext::getMain()->getConfig();
-               $defaultExpiry = wfTimestamp() + $config->get( 'CookieExpiration' );
+               $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
 
                // Use the Block's expiry time only if it's less than the default.
-               $expiry = wfTimestamp( TS_UNIX, $this->getExpiry() );
-               if ( $expiry > $defaultExpiry ) {
-                       // The *default* default expiry is 30 days.
-                       $expiry = $defaultExpiry;
+               $expiryTime = $this->getExpiry();
+               if ( $expiryTime === 'infinity' || $expiryTime > $maxExpiryTime ) {
+                       $expiryTime = $maxExpiryTime;
                }
 
+               // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
                $cookieValue = $setEmpty ? '' : $this->getId();
-               $response->setCookie( 'BlockID', $cookieValue, $expiry );
+               $expiryValue = DateTime::createFromFormat( "YmdHis", $expiryTime );
+               $response->setCookie( 'BlockID', $cookieValue, $expiryValue->format( "U" ) );
        }
 
        /**
@@ -1469,14 +1497,18 @@ class Block {
                 * This could be a username, an IP range, or a single IP. */
                $intended = $this->getTarget();
 
+               $systemBlockType = $this->getSystemBlockType();
+
                $lang = $context->getLanguage();
                return [
-                       $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+                       $systemBlockType !== null
+                               ? 'systemblockedtext'
+                               : ( $this->mAuto ? 'autoblockedtext' : 'blockedtext' ),
                        $link,
                        $reason,
                        $context->getRequest()->getIP(),
                        $this->getByName(),
-                       $this->getId(),
+                       $systemBlockType !== null ? $systemBlockType : $this->getId(),
                        $lang->formatExpiry( $this->mExpiry ),
                        (string)$intended,
                        $lang->userTimeAndDate( $this->mTimestamp, $context->getUser() ),
index 1ebd605..d558dbc 100644 (file)
@@ -168,7 +168,7 @@ class Category {
         * @param Title $title Optional title object for the category represented by
         *   the given row. May be provided if it is already known, to avoid having
         *   to re-create a title object later.
-        * @return Category
+        * @return Category|false
         */
        public static function newFromRow( $row, $title = null ) {
                $cat = new self();
index 4efa2ff..504b35f 100644 (file)
@@ -40,7 +40,6 @@
  *     $a = $cf->run();
  *     print implode( ',' , $a );
  * @endcode
- *
  */
 class CategoryFinder {
        /** @var int[] The original article IDs passed to the seed function */
index 4c4b8bb..31369b0 100644 (file)
@@ -67,7 +67,7 @@ class CategoryViewer extends ContextSource {
        /** @var Collation */
        public $collation;
 
-       /** @var ImageGallery */
+       /** @var ImageGalleryBase */
        public $gallery;
 
        /** @var Category Category object for this page. */
@@ -632,11 +632,12 @@ class CategoryViewer extends ContextSource {
        private function pagingLinks( $first, $last, $type = '' ) {
                $prevLink = $this->msg( 'prev-page' )->text();
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( $first != '' ) {
                        $prevQuery = $this->query;
                        $prevQuery["{$type}until"] = $first;
                        unset( $prevQuery["{$type}from"] );
-                       $prevLink = Linker::linkKnown(
+                       $prevLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $prevLink,
                                [],
@@ -650,7 +651,7 @@ class CategoryViewer extends ContextSource {
                        $lastQuery = $this->query;
                        $lastQuery["{$type}from"] = $last;
                        unset( $lastQuery["{$type}until"] );
-                       $nextLink = Linker::linkKnown(
+                       $nextLink = $linkRenderer->makeKnownLink(
                                $this->addFragmentToTitle( $this->title, $type ),
                                $nextLink,
                                [],
index 5557dca..086b615 100644 (file)
@@ -443,7 +443,6 @@ $wgImgAuthUrlPathMap = [];
  * Properties required for all repos:
  *   - class            The class name for the repository. May come from the core or an extension.
  *                      The core repository classes are FileRepo, LocalRepo, ForeignDBRepo.
- *                      FSRepo is also supported for backwards compatibility.
  *
  *   - name             A unique name for the repository (but $wgLocalFileRepo should be 'local').
  *                      The name should consist of alpha-numeric characters.
@@ -1585,14 +1584,15 @@ $wgEnableEmail = true;
 $wgEnableUserEmail = true;
 
 /**
- * Set to true to put the sending user's email in a Reply-To header
- * instead of From. ($wgPasswordSender will be used as From.)
+ * If true put the sending user's email in a Reply-To header
+ * instead of From (false). ($wgPasswordSender will be used as From.)
  *
  * Some mailers (eg SMTP) set the SMTP envelope sender to the From value,
  * which can cause problems with SPF validation and leak recipient addresses
- * when bounces are sent to the sender.
+ * when bounces are sent to the sender. In addition, DMARC restrictions
+ * can cause emails to fail to be received when false.
  */
-$wgUserEmailUseReplyTo = false;
+$wgUserEmailUseReplyTo = true;
 
 /**
  * Minimum time, in hours, which must elapse between password reminder
@@ -2031,7 +2031,6 @@ $wgDBmysql5 = false;
  * is in this case an unwanted overhead that just slows things down.
  *
  * @warning EXPERIMENTAL!
- *
  */
 $wgDBOracleDRCP = false;
 
@@ -4016,6 +4015,7 @@ $wgNamespacesWithSubpages = [
        NS_FILE_TALK => true,
        NS_MEDIAWIKI => true,
        NS_MEDIAWIKI_TALK => true,
+       NS_TEMPLATE => true,
        NS_TEMPLATE_TALK => true,
        NS_HELP => true,
        NS_HELP_TALK => true,
@@ -4788,7 +4788,7 @@ $wgReservedUsernames = [
  */
 $wgDefaultUserOptions = [
        'ccmeonemails' => 0,
-       'cols' => 80,
+       'cols' => 80, // @deprecated since 1.29 No longer used in core
        'date' => 'default',
        'diffonly' => 0,
        'disablemail' => 0,
@@ -4816,8 +4816,9 @@ $wgDefaultUserOptions = [
        'previewonfirst' => 0,
        'previewontop' => 1,
        'rcdays' => 7,
+       'rcenhancedfilters' => 0,
        'rclimit' => 50,
-       'rows' => 25,
+       'rows' => 25, // @deprecated since 1.29 No longer used in core
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
        'showtoolbar' => 1,
@@ -4850,7 +4851,9 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [];
+$wgHiddenPrefs = [
+       'rcenhancedfilters',
+];
 
 /**
  * Characters to prevent during new account creations.
@@ -5322,26 +5325,60 @@ $wgAutoConfirmAge = 0;
 $wgAutoConfirmCount = 0;
 
 /**
- * Automatically add a usergroup to any user who matches certain conditions.
- *
- * @todo Redocument $wgAutopromote
- *
- * The format is
- *   [ '&' or '|' or '^' or '!', cond1, cond2, ... ]
- * where cond1, cond2, ... are themselves conditions; *OR*
- *   APCOND_EMAILCONFIRMED, *OR*
- *   [ APCOND_EMAILCONFIRMED ], *OR*
- *   [ APCOND_EDITCOUNT, number of edits ], *OR*
- *   [ APCOND_AGE, seconds since registration ], *OR*
- *   [ APCOND_INGROUPS, group1, group2, ... ], *OR*
- *   [ APCOND_ISIP, ip ], *OR*
- *   [ APCOND_IPINRANGE, range ], *OR*
- *   [ APCOND_AGE_FROM_EDIT, seconds since first edit ], *OR*
- *   [ APCOND_BLOCKED ], *OR*
- *   [ APCOND_ISBOT ], *OR*
- *   similar constructs defined by extensions.
- *
- * If $wgEmailAuthentication is off, APCOND_EMAILCONFIRMED will be true for any
+ * Array containing the conditions of automatic promotion of a user to specific groups.
+ *
+ * The basic syntax for `$wgAutopromote` is:
+ *
+ *     $wgAutopromote = array(
+ *         'groupname' => cond,
+ *         'group2' => cond2,
+ *     );
+ *
+ * A `cond` may be:
+ *  - a single condition without arguments:
+ *      Note that Autopromote wraps a single non-array value into an array
+ *      e.g. `APCOND_EMAILCONFIRMED` OR
+ *           array( `APCOND_EMAILCONFIRMED` )
+ *  - a single condition with arguments:
+ *      e.g. `array( APCOND_EDITCOUNT, 100 )`
+ *  - a set of conditions:
+ *      e.g. `array( 'operand', cond1, cond2, ... )`
+ *
+ * When constructing a set of conditions, the following conditions are available:
+ *  - `&` (**AND**):
+ *      promote if user matches **ALL** conditions
+ *  - `|` (**OR**):
+ *      promote if user matches **ANY** condition
+ *  - `^` (**XOR**):
+ *      promote if user matches **ONLY ONE OF THE CONDITIONS**
+ *  - `!` (**NOT**):
+ *      promote if user matces **NO** condition
+ *  - array( APCOND_EMAILCONFIRMED ):
+ *      true if user has a confirmed e-mail
+ *  - array( APCOND_EDITCOUNT, number of edits ):
+ *      true if user has the at least the number of edits as the passed parameter
+ *  - array( APCOND_AGE, seconds since registration ):
+ *      true if the length of time since the user created his/her account
+ *      is at least the same length of time as the passed parameter
+ *  - array( APCOND_AGE_FROM_EDIT, seconds since first edit ):
+ *      true if the length of time since the user made his/her first edit
+ *      is at least the same length of time as the passed parameter
+ *  - array( APCOND_INGROUPS, group1, group2, ... ):
+ *      true if the user is a member of each of the passed groups
+ *  - array( APCOND_ISIP, ip ):
+ *      true if the user has the passed IP address
+ *  - array( APCOND_IPINRANGE, range ):
+ *      true if the user has an IP address in the range of the passed parameter
+ *  - array( APCOND_BLOCKED ):
+ *      true if the user is blocked
+ *  - array( APCOND_ISBOT ):
+ *      true if the user is a bot
+ *  - similar constructs can be defined by extensions
+ *
+ * The sets of conditions are evaluated recursively, so you can use nested sets of conditions
+ * linked by operands.
+ *
+ * Note that if $wgEmailAuthentication is disabled, APCOND_EMAILCONFIRMED will be true for any
  * user who has provided an e-mail address.
  */
 $wgAutopromote = [
@@ -5511,6 +5548,15 @@ $wgDnsBlacklistUrls = [ 'http.dnsbl.sorbs.net.' ];
  */
 $wgProxyWhitelist = [];
 
+/**
+ * IP ranges that should be considered soft-blocked (anon-only, account
+ * creation allowed). The intent is to use this to prevent anonymous edits from
+ * shared resources such as Wikimedia Labs.
+ * @since 1.29
+ * @var string[]
+ */
+$wgSoftBlockRanges = [];
+
 /**
  * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
  * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
@@ -8054,6 +8100,12 @@ $wgShellLocale = 'en_US.utf8';
  */
 $wgHTTPTimeout = 25;
 
+/**
+ * Timeout for HTTP requests done internally for transwiki imports, in seconds.
+ * @since 1.29
+ */
+$wgHTTPImportTimeout = 25;
+
 /**
  * Timeout for Asynchronous (background) HTTP requests, in seconds.
  */
@@ -8104,10 +8156,7 @@ $wgJobRunRate = 1;
  *
  * @since 1.23
  */
-$wgRunJobsAsync = (
-       !function_exists( 'register_postsend_function' ) &&
-       !function_exists( 'fastcgi_finish_request' )
-);
+$wgRunJobsAsync = false;
 
 /**
  * Number of rows to update per job
@@ -8182,7 +8231,19 @@ $wgRedirectOnLogin = null;
  * The remaining elements are passed through to the class as constructor
  * parameters.
  *
- * @par Example:
+ * @par Example using local redis instance:
+ * @code
+ *   $wgPoolCounterConf = [ 'ArticleView' => [
+ *     'class' => 'PoolCounterRedis',
+ *     'timeout' => 15, // wait timeout in seconds
+ *     'workers' => 1, // maximum number of active threads in each pool
+ *     'maxqueue' => 5, // maximum number of total threads in each pool
+ *     'servers' => [ '127.0.0.1' ],
+ *     'redisConfig' => []
+ *   ] ];
+ * @endcode
+ *
+ * @par Example using C daemon from https://www.mediawiki.org/wiki/Extension:PoolCounter:
  * @code
  *   $wgPoolCounterConf = [ 'ArticleView' => [
  *     'class' => 'PoolCounter_Client',
@@ -8190,7 +8251,7 @@ $wgRedirectOnLogin = null;
  *     'workers' => 5, // maximum number of active threads in each pool
  *     'maxqueue' => 50, // maximum number of total threads in each pool
  *     ... any extension-specific options...
- *   ];
+ *   ] ];
  * @endcode
  */
 $wgPoolCounterConf = null;
@@ -8462,6 +8523,23 @@ $wgCSPFalsePositiveUrls = [
        'https://d5p.de17a.com' => true,
 ];
 
+/**
+ * The following variables define 3 user experience levels:
+ *
+ *  - newcomer: has not yet reached the 'learner' level
+ *
+ *  - learner: has at least $wgLearnerEdits and has been
+ *             a member for $wgLearnerMemberSince days
+ *             but has not yet reached the 'experienced' level.
+ *
+ *  - experienced: has at least $wgExperiencedUserEdits edits and
+ *                 has been a member for $wgExperiencedUserMemberSince days.
+ */
+$wgLearnerEdits = 10;
+$wgLearnerMemberSince = 4; # days
+$wgExperiencedUserEdits = 500;
+$wgExperiencedUserMemberSince = 30; # days
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 0616898..35c2a2d 100644 (file)
  * @file
  */
 
+require_once __DIR__ . '/libs/mime/defines.php';
+require_once __DIR__ . '/libs/time/defines.php';
+require_once __DIR__ . '/libs/rdbms/defines.php';
+require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
+
 /**
  * @defgroup Constants MediaWiki constants
  */
@@ -97,8 +102,6 @@ define( 'CACHE_MEMCACHED', 2 );  // MemCached, must specify servers in $wgMemCac
 define( 'CACHE_ACCEL', 3 );      // APC, XCache or WinCache
 /**@}*/
 
-require_once __DIR__ . '/libs/mime/defines.php';
-
 /**@{
  * Antivirus result codes, for use in $wgAntivirusSetup.
  */
@@ -153,16 +156,6 @@ define( 'EDIT_AUTOSUMMARY', 64 );
 define( 'EDIT_INTERNAL', 128 );
 /**@}*/
 
-/**
- * Database related
- */
-require_once __DIR__ . '/libs/rdbms/defines.php';
-
-/**
- * Unicode and normalisation related
- */
-require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
-
 /**@{
  * Hook support constants
  */
index 4c149ae..487e86c 100644 (file)
@@ -49,10 +49,6 @@ class DerivativeRequest extends FauxRequest {
                return $this->base->getCookie( $key, $prefix, $default );
        }
 
-       public function checkSessionCookie() {
-               return $this->base->checkSessionCookie();
-       }
-
        public function getHeader( $name, $flags = 0 ) {
                return $this->base->getHeader( $name, $flags );
        }
index fc94a63..9aa6aeb 100644 (file)
@@ -5,48 +5,6 @@
  */
 class DummyLinker {
 
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInterwikiLinkAttributes(
-                       $title,
-                       $unused,
-                       $class
-               );
-       }
-
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInternalLinkAttributes(
-                       $title,
-                       $unused,
-                       $class
-               );
-       }
-
-       /**
-        * @deprecated since 1.27
-        */
-       public function getInternalLinkAttributesObj(
-               $nt,
-               $unused = null,
-               $class = '',
-               $title = false
-       ) {
-               wfDeprecated( __METHOD__, '1.27' );
-               return Linker::getInternalLinkAttributesObj(
-                       $nt,
-                       $unused,
-                       $class,
-                       $title
-               );
-       }
-
        /**
         * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
         */
index f37ce34..e070ca3 100644 (file)
@@ -295,7 +295,7 @@ class EditPage {
        /** @var bool Has a summary been preset using GET parameter &summary= ? */
        public $hasPresetSummary = false;
 
-       /** @var bool */
+       /** @var Revision|bool */
        public $mBaseRevision = false;
 
        /** @var bool */
@@ -498,6 +498,9 @@ class EditPage {
                $this->enableApiEditOverride = $enableOverride;
        }
 
+       /**
+        * @deprecated since 1.29, call edit directly
+        */
        function submit() {
                $this->edit();
        }
@@ -661,7 +664,11 @@ class EditPage {
                $remove = [];
                foreach ( $permErrors as $error ) {
                        if ( ( $this->preview || $this->diff )
-                               && ( $error[0] == 'blockedtext' || $error[0] == 'autoblockedtext' )
+                               && (
+                                       $error[0] == 'blockedtext' ||
+                                       $error[0] == 'autoblockedtext' ||
+                                       $error[0] == 'systemblockedtext'
+                               )
                        ) {
                                $remove[] = $error;
                        }
@@ -1617,15 +1624,7 @@ class EditPage {
         */
        protected function runPostMergeFilters( Content $content, Status $status, User $user ) {
                // Run old style post-section-merge edit filter
-               if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged',
-                       [ $this, $content, &$this->hookError, $this->summary ],
-                       '1.21'
-               ) ) {
-                       # Error messages etc. could be handled within the hook...
-                       $status->fatal( 'hookaborted' );
-                       $status->value = self::AS_HOOK_ERROR;
-                       return false;
-               } elseif ( $this->hookError != '' ) {
+               if ( $this->hookError != '' ) {
                        # ...or the hook could be expecting us to produce an error
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR_EXPECTED;
@@ -2142,7 +2141,8 @@ class EditPage {
                        false,
                        $wgUser,
                        $content->getDefaultFormat(),
-                       $this->changeTags
+                       $this->changeTags,
+                       $this->undidRev
                );
 
                if ( !$doEditStatus->isOK() ) {
@@ -2597,7 +2597,9 @@ class EditPage {
                        $previewOutput = $this->getPreviewText();
                }
 
-               Hooks::run( 'EditPage::showEditForm:initial', [ &$this, &$wgOut ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPage::showEditForm:initial', [ &$editPage, &$wgOut ] );
 
                $this->setHeaders();
 
@@ -2674,7 +2676,9 @@ class EditPage {
                        . Xml::closeElement( 'div' )
                );
 
-               Hooks::run( 'EditPage::showEditForm:fields', [ &$this, &$wgOut ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPage::showEditForm:fields', [ &$editPage, &$wgOut ] );
 
                // Put these up at the top to ensure they aren't lost on early form submission
                $this->showFormBeforeText();
@@ -2834,7 +2838,7 @@ class EditPage {
         * @param Title[] $templates
         * @return string HTML
         */
-       protected function makeTemplatesOnThisPageList( array $templates ) {
+       public function makeTemplatesOnThisPageList( array $templates ) {
                $templateListFormatter = new TemplatesOnThisPageFormatter(
                        $this->context, MediaWikiServices::getInstance()->getLinkRenderer()
                );
@@ -3536,7 +3540,9 @@ HTML
        protected function showConflict() {
                global $wgOut;
 
-               if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$editPage, &$wgOut ] ) ) {
                        $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                        $stats->increment( 'edit.failures.conflict' );
                        // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
@@ -3570,6 +3576,7 @@ HTML
         */
        public function getCancelLink() {
                $cancelParams = [];
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                } elseif ( $this->getContextTitle()->isRedirect() ) {
@@ -3577,9 +3584,9 @@ HTML
                }
                $attrs = [ 'id' => 'mw-editform-cancel' ];
 
-               return Linker::linkKnown(
+               return $linkRenderer->makeKnownLink(
                        $this->getContextTitle(),
-                       $this->context->msg( 'cancel' )->parse(),
+                       new HtmlArmor( $this->context->msg( 'cancel' )->parse() ),
                        Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ),
                        $cancelParams
                );
@@ -3768,7 +3775,6 @@ HTML
                        }
 
                        $hook_args = [ $this, &$content ];
-                       ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args, '1.25' );
                        Hooks::run( 'EditPageGetPreviewContent', $hook_args );
 
                        $parserResult = $this->doPreviewParse( $content );
@@ -4064,7 +4070,10 @@ HTML
                                $checkboxes['watch'] = $watchThisHtml;
                        }
                }
-               Hooks::run( 'EditPageBeforeEditChecks', [ &$this, &$checkboxes, &$tabindex ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ] );
                return $checkboxes;
        }
 
@@ -4113,7 +4122,9 @@ HTML
                $buttons['diff'] = Html::submitButton( $this->context->msg( 'showdiff' )->text(),
                        $attribs );
 
-               Hooks::run( 'EditPageBeforeEditButtons', [ &$this, &$buttons, &$tabindex ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageBeforeEditButtons', [ &$editPage, &$buttons, &$tabindex ] );
                return $buttons;
        }
 
@@ -4127,7 +4138,10 @@ HTML
                $wgOut->prepareErrorPage( $this->context->msg( 'nosuchsectiontitle' ) );
 
                $res = $this->context->msg( 'nosuchsectiontext', $this->section )->parseAsBlock();
-               Hooks::run( 'EditPageNoSuchSection', [ &$this, &$res ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $editPage = $this;
+               Hooks::run( 'EditPageNoSuchSection', [ &$editPage, &$res ] );
                $wgOut->addHTML( $res );
 
                $wgOut->returnToMain( false, $this->mTitle );
@@ -4422,8 +4436,8 @@ HTML
                $attribs = $customAttribs + [
                                'accesskey' => ',',
                                'id' => $name,
-                               'cols' => $user->getIntOption( 'cols' ),
-                               'rows' => $user->getIntOption( 'rows' ),
+                               'cols' => 80,
+                               'rows' => 25,
                                // Avoid PHP notices when appending preferences
                                // (appending allows customAttribs['style'] to still work).
                                'style' => ''
index e6223e8..82af081 100644 (file)
@@ -21,6 +21,7 @@
  * @author Rob Church <robchur@gmail.com>
  * @ingroup Media
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * File deletion user interface
@@ -152,7 +153,7 @@ class FileDeleteForm {
         * @param User $user User object performing the request
         * @param array $tags Tags to apply to the deletion action
         * @throws MWException
-        * @return bool|Status
+        * @return Status
         */
        public static function doDelete( &$title, &$file, &$oldimage, $reason,
                $suppress, User $user = null, $tags = []
@@ -301,9 +302,10 @@ class FileDeleteForm {
 
                        if ( $wgUser->isAllowed( 'editinterface' ) ) {
                                $title = wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->getTitle();
-                               $link = Linker::linkKnown(
+                               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                               $link = $linkRenderer->makeKnownLink(
                                        $title,
-                                       wfMessage( 'filedelete-edit-reasonlist' )->escaped(),
+                                       wfMessage( 'filedelete-edit-reasonlist' )->text(),
                                        [],
                                        [ 'action' => 'edit' ]
                                );
index de7e8c2..4351acc 100644 (file)
@@ -46,7 +46,7 @@ class GitInfo {
        protected $cache = [];
 
        /**
-        * Map of repo URLs to viewer URLs. Access via static method getViewers().
+        * @var array|false Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
        private static $viewers = false;
 
index b3ccc56..5343248 100644 (file)
@@ -545,7 +545,7 @@ function wfAppendQuery( $url, $query ) {
  * @param string $url Either fully-qualified or a local path + query
  * @param string $defaultProto One of the PROTO_* constants. Determines the
  *    protocol to use if $url or $wgServer is protocol-relative
- * @return string Fully-qualified URL, current-path-relative URL or false if
+ * @return string|false Fully-qualified URL, current-path-relative URL or false if
  *    no valid URL can be constructed
  */
 function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
@@ -1385,12 +1385,16 @@ function wfGetLangObj( $langcode = false ) {
  * @see Message::__construct
  */
 function wfMessage( $key /*...*/ ) {
+       $message = new Message( $key );
+
+       // We call Message::params() to reduce code duplication
        $params = func_get_args();
        array_shift( $params );
-       if ( isset( $params[0] ) && is_array( $params[0] ) ) {
-               $params = $params[0];
+       if ( $params ) {
+               call_user_func_array( [ $message, 'params' ], $params );
        }
-       return new Message( $key, $params );
+
+       return $message;
 }
 
 /**
@@ -1995,10 +1999,6 @@ function wfRestoreWarnings() {
        MediaWiki\suppressWarnings( true );
 }
 
-# Autodetect, convert and provide timestamps of various types
-
-require_once __DIR__ . '/libs/time/defines.php';
-
 /**
  * Get a timestamp string in one of various formats
  *
@@ -3518,7 +3518,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
        # Run the extension hook
        $bad = false;
        if ( !Hooks::run( 'BadImage', [ $name, &$bad ] ) ) {
-               return $bad;
+               return (bool)$bad;
        }
 
        $cache = ObjectCache::getLocalServerInstance( 'hash' );
index b17a2f5..3d86201 100644 (file)
@@ -239,7 +239,7 @@ class HistoryBlobStub {
        }
 
        /**
-        * @return string
+        * @return string|false
         */
        function getText() {
                if ( isset( self::$blobCache[$this->mOldId] ) ) {
index 511781d..f4f86be 100644 (file)
@@ -176,22 +176,13 @@ class Hooks {
                                throw new MWException( 'Invalid callback ' . $func . ' in hooks for ' . $event . "\n" );
                        }
 
-                       /*
-                        * Call the hook. The documentation of call_user_func_array says
-                        * false is returned on failure. However, if the function signature
-                        * does not match the call signature, PHP will issue an warning and
-                        * return null instead. The following code catches that warning and
-                        * provides better error message.
-                        */
-                       $retval = null;
-                       $badhookmsg = null;
-                       $hook_args = array_merge( $hook, $args );
-
                        // mark hook as deprecated, if deprecation version is specified
                        if ( $deprecatedVersion !== null ) {
                                wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
                        }
 
+                       // Call the hook.
+                       $hook_args = array_merge( $hook, $args );
                        $retval = call_user_func_array( $callback, $hook_args );
 
                        // Process the return value.
index 0b6b655..b46ea81 100644 (file)
@@ -485,22 +485,6 @@ class Html {
                        // and better compression anyway.
                        $key = strtolower( $key );
 
-                       // Bug 23769: Blacklist all form validation attributes for now.  Current
-                       // (June 2010) WebKit has no UI, so the form just refuses to submit
-                       // without telling the user why, which is much worse than failing
-                       // server-side validation.  Opera is the only other implementation at
-                       // this time, and has ugly UI, so just kill the feature entirely until
-                       // we have at least one good implementation.
-
-                       // As the default value of "1" for "step" rejects decimal
-                       // numbers to be entered in 'type="number"' fields, allow
-                       // the special case 'step="any"'.
-
-                       if ( in_array( $key, [ 'max', 'min', 'pattern', 'required' ] )
-                               || $key === 'step' && $value !== 'any' ) {
-                               continue;
-                       }
-
                        // https://www.w3.org/TR/html401/index/attributes.html ("space-separated")
                        // https://www.w3.org/TR/html5/index.html#attributes-1 ("space-separated")
                        $spaceSeparatedListAttributes = [
index d3d1f38..94b145e 100644 (file)
@@ -38,102 +38,6 @@ class Linker {
        const TOOL_LINKS_NOBLOCK = 1;
        const TOOL_LINKS_EMAIL = 2;
 
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title The title text for the link, URL-encoded (???) but
-        *   not HTML-escaped
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute; if an empty
-        *   string is passed, which is the default value, defaults to 'external'.
-        * @return string
-        */
-       static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
-               global $wgContLang;
-
-               wfDeprecated( __METHOD__, '1.25' );
-
-               # @todo FIXME: We have a whole bunch of handling here that doesn't happen in
-               # getExternalLinkAttributes, why?
-               $title = urldecode( $title );
-               $title = $wgContLang->checkTitleEncoding( $title );
-               $title = preg_replace( '/[\\x00-\\x1f]/', ' ', $title );
-
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an internal link.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title The title text for the link, URL-encoded (???) but
-        *   not HTML-escaped
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute, default none
-        * @return string
-        */
-       static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               $title = urldecode( $title );
-               $title = strtr( $title, '_', ' ' );
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an internal
-        * link, given the Title object for the page we want to link to.
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param Title $nt
-        * @param string $unused Unused
-        * @param string $class The contents of the class attribute, default none
-        * @param string|bool $title Optional (unescaped) string to use in the title
-        *   attribute; if false, default to the name of the page we're linking to
-        * @return string
-        */
-       static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               if ( $title === false ) {
-                       $title = $nt->getPrefixedText();
-               }
-               return self::getLinkAttributesInternal( $title, $class );
-       }
-
-       /**
-        * Common code for getLinkAttributesX functions
-        *
-        * @since 1.16.3
-        * @deprecated since 1.25
-        *
-        * @param string $title
-        * @param string $class
-        *
-        * @return string
-        */
-       private static function getLinkAttributesInternal( $title, $class ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               $title = htmlspecialchars( $title );
-               $class = htmlspecialchars( $class );
-               $r = '';
-               if ( $class != '' ) {
-                       $r .= " class=\"$class\"";
-               }
-               if ( $title != '' ) {
-                       $r .= " title=\"$title\"";
-               }
-               return $r;
-       }
-
        /**
         * Return the CSS colour of a known link
         *
@@ -2217,4 +2121,3 @@ class Linker {
        }
 
 }
-
index 58efdc7..c7c54fd 100644 (file)
@@ -17,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A collection of public static functions to deal with grants.
@@ -178,9 +179,10 @@ class MWGrants {
         * @return string (proto-relative) HTML link
         */
        public static function getGrantsLink( $grant, $lang = null ) {
-               return \Linker::linkKnown(
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               return $linkRenderer->makeKnownLink(
                        \SpecialPage::getTitleFor( 'Listgrants', false, $grant ),
-                       htmlspecialchars( self::grantName( $grant, $lang ) )
+                       self::grantName( $grant, $lang )
                );
        }
 
index 61e34ee..4c5561f 100644 (file)
@@ -28,7 +28,6 @@
  *
  * These are synonyms for the names given in the language file
  * Users and translators should not change them
- *
  */
 class MWNamespace {
 
index 391e05a..5968e87 100644 (file)
@@ -169,6 +169,7 @@ class MagicWord {
                'localtimestamp',
                'directionmark',
                'contentlanguage',
+               'pagelanguage',
                'numberofadmins',
                'cascadingsources',
        ];
index eaa1c99..faca533 100644 (file)
@@ -495,8 +495,15 @@ class MediaWiki {
                        $action->show();
                        return;
                }
-
-               if ( Hooks::run( 'UnknownAction', [ $request->getVal( 'action', 'view' ), $page ] ) ) {
+               // NOTE: deprecated hook. Add to $wgActions instead
+               if ( Hooks::run(
+                       'UnknownAction',
+                       [
+                               $request->getVal( 'action', 'view' ),
+                               $page
+                       ],
+                       '1.19'
+               ) ) {
                        $output->setStatusCode( 404 );
                        $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
                }
index 7e5cc7d..fd67613 100644 (file)
@@ -488,18 +488,32 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @since 1.17
         *
-        * @param mixed ... Parameters as strings, or a single argument that is
-        * an array of strings.
+        * @param mixed ... Parameters as strings or arrays from
+        *  Message::numParam() and the like, or a single array of parameters.
         *
         * @return Message $this
         */
        public function params( /*...*/ ) {
                $args = func_get_args();
-               if ( isset( $args[0] ) && is_array( $args[0] ) ) {
-                       $args = $args[0];
+
+               // If $args has only one entry and it's an array, then it's either a
+               // non-varargs call or it happens to be a call with just a single
+               // "special" parameter. Since the "special" parameters don't have any
+               // numeric keys, we'll test that to differentiate the cases.
+               if ( count( $args ) === 1 && isset( $args[0] ) && is_array( $args[0] ) ) {
+                       if ( $args[0] === [] ) {
+                               $args = [];
+                       } else {
+                               foreach ( $args[0] as $key => $value ) {
+                                       if ( is_int( $key ) ) {
+                                               $args = $args[0];
+                                               break;
+                                       }
+                               }
+                       }
                }
-               $args_values = array_values( $args );
-               $this->parameters = array_merge( $this->parameters, $args_values );
+
+               $this->parameters = array_merge( $this->parameters, array_values( $args ) );
                return $this;
        }
 
@@ -1040,9 +1054,9 @@ class Message implements MessageSpecifier, Serializable {
        /**
         * @since 1.22
         *
-        * @param number $period
+        * @param int $period
         *
-        * @return number[] Array with a single "period" key.
+        * @return int[] Array with a single "period" key.
         */
        public static function timeperiodParam( $period ) {
                return [ 'period' => $period ];
@@ -1291,8 +1305,9 @@ class Message implements MessageSpecifier, Serializable {
         */
        protected function formatListParam( array $params, $listType, $format ) {
                if ( !isset( self::$listTypeMap[$listType] ) ) {
-                       $warning = 'Invalid list type for message "' . $this->getKey() . '": ' .
-                               htmlspecialchars( serialize( $param ) );
+                       $warning = 'Invalid list type for message "' . $this->getKey() . '": '
+                               . htmlspecialchars( $listType )
+                               . ' (params are ' . htmlspecialchars( serialize( $params ) ) . ')';
                        trigger_error( $warning, E_USER_WARNING );
                        $e = new Exception;
                        wfDebugLog( 'Bug58676', $warning . "\n" . $e->getTraceAsString() );
index cbb4651..ae12ba5 100644 (file)
@@ -233,9 +233,11 @@ class MovePage {
         * @param User $user
         * @param string $reason
         * @param bool $createRedirect
+        * @param string[] $changeTags Change tags to apply to the entry in the move log. Caller
+        *  should perform permission checks with ChangeTags::canAddTagsAccompanyingChange
         * @return Status
         */
-       public function move( User $user, $reason, $createRedirect ) {
+       public function move( User $user, $reason, $createRedirect, array $changeTags = [] ) {
                global $wgCategoryCollation;
 
                Hooks::run( 'TitleMove', [ $this->oldTitle, $this->newTitle, $user ] );
@@ -265,7 +267,8 @@ class MovePage {
                $protected = $this->oldTitle->isProtected();
 
                // Do the actual move; if this fails, it will throw an MWException(!)
-               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect );
+               $nullRevision = $this->moveToInternal( $user, $this->newTitle, $reason, $createRedirect,
+                       $changeTags );
 
                // Refresh the sortkey for this row.  Be careful to avoid resetting
                // cl_timestamp, which may disturb time-based lists on some sites.
@@ -356,6 +359,7 @@ class MovePage {
                                '4::oldtitle' => $this->oldTitle->getPrefixedText(),
                        ] );
                        $logEntry->setRelations( [ 'pr_id' => $logRelationsValues ] );
+                       $logEntry->setTags( $changeTags );
                        $logId = $logEntry->insert();
                        $logEntry->publish( $logId );
                }
@@ -424,18 +428,21 @@ class MovePage {
         * Move page to a title which is either a redirect to the
         * source page or nonexistent
         *
-        * @fixme This was basically directly moved from Title, it should be split into smaller functions
+        * @todo This was basically directly moved from Title, it should be split into
+        *   smaller functions
         * @param User $user the User doing the move
         * @param Title $nt The page to move to, which should be a redirect or non-existent
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
         *   if the user has the suppressredirect right
+        * @param string[] $changeTags Change tags to apply to the entry in the move log
         * @return Revision the revision created by the move
         * @throws MWException
         */
-       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true ) {
-               global $wgContLang;
+       private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
 
+               global $wgContLang;
                if ( $nt->exists() ) {
                        $moveOverRedirect = true;
                        $logType = 'move_redir';
@@ -458,7 +465,7 @@ class MovePage {
                                /* $commit */ false,
                                $errs,
                                $user,
-                               [],
+                               $changeTags,
                                'delete_redir'
                        );
 
@@ -529,7 +536,8 @@ class MovePage {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
 
-               $nullRevision->insertOn( $dbw );
+               $nullRevId = $nullRevision->insertOn( $dbw );
+               $logEntry->setAssociatedRevId( $nullRevId );
 
                # Change the name of the target page:
                $dbw->update( 'page',
@@ -584,18 +592,22 @@ class MovePage {
                                        'user' => $user->getId(),
                                        'comment' => $comment,
                                        'content' => $redirectContent ] );
-                               $redirectRevision->insertOn( $dbw );
+                               $redirectRevId = $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
                                Hooks::run( 'NewRevisionFromEditComplete',
                                        [ $redirectArticle, $redirectRevision, false, $user ] );
 
                                $redirectArticle->doEditUpdates( $redirectRevision, $user, [ 'created' => true ] );
+
+                               ChangeTags::addTags( $changeTags, null, $redirectRevId, null );
                        }
                }
 
                # Log the move
                $logid = $logEntry->insert();
+
+               $logEntry->setTags( $changeTags );
                $logEntry->publish( $logid );
 
                return $nullRevision;
index bae871e..fd28f4a 100644 (file)
@@ -299,6 +299,9 @@ class OutputPage extends ContextSource {
         */
        private $copyrightUrl;
 
+       /** @var array Profiling data */
+       private $limitReportJSData = [];
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -1266,10 +1269,12 @@ class OutputPage extends ContextSource {
                        }
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
                # Add the remaining categories to the skin
                if ( Hooks::run(
                        'OutputPageMakeCategoryLinks',
-                       [ &$this, $categories, &$this->mCategoryLinks ] )
+                       [ &$outputPage, $categories, &$this->mCategoryLinks ] )
                ) {
                        $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                        foreach ( $categories as $category => $type ) {
@@ -1802,16 +1807,23 @@ class OutputPage extends ContextSource {
                        }
                }
 
-               // enable OOUI if requested via ParserOutput
+               // Enable OOUI if requested via ParserOutput
                if ( $parserOutput->getEnableOOUI() ) {
                        $this->enableOOUI();
                }
 
+               // Include parser limit report
+               if ( !$this->limitReportJSData ) {
+                       $this->limitReportJSData = $parserOutput->getLimitReportJSData();
+               }
+
                // Link flags are ignored for now, but may in the future be
                // used to mark individual language links.
                $linkFlags = [];
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
                Hooks::run( 'LanguageLinks', [ $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ] );
-               Hooks::run( 'OutputPageParserOutput', [ &$this, $parserOutput ] );
+               Hooks::run( 'OutputPageParserOutput', [ &$outputPage, $parserOutput ] );
        }
 
        /**
@@ -1839,7 +1851,9 @@ class OutputPage extends ContextSource {
         */
        public function addParserOutputText( $parserOutput ) {
                $text = $parserOutput->getText();
-               Hooks::run( 'OutputPageBeforeHTML', [ &$this, &$text ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $outputPage = $this;
+               Hooks::run( 'OutputPageBeforeHTML', [ &$outputPage, &$text ] );
                $this->addHTML( $text );
        }
 
@@ -2176,7 +2190,7 @@ class OutputPage extends ContextSource {
         * if there isn't one. This is used by Skin to determine whether to enable
         * JavaScript frame-breaking, for clients that don't support X-Frame-Options.
         *
-        * @return string
+        * @return string|false
         */
        public function getFrameOptions() {
                $config = $this->getConfig();
@@ -2303,7 +2317,7 @@ class OutputPage extends ContextSource {
                                $response->header( "Content-Type: text/html; charset=utf-8" );
                                if ( $config->get( 'DebugRedirects' ) ) {
                                        $url = htmlspecialchars( $redirect );
-                                       print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
+                                       print "<!DOCTYPE html>\n<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
                                        print "</body>\n</html>\n";
                                } else {
@@ -2358,9 +2372,11 @@ class OutputPage extends ContextSource {
                        }
                        MWDebug::addModules( $this );
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $outputPage = $this;
                        // Hook that allows last minute changes to the output page, e.g.
                        // adding of CSS or Javascript by extensions.
-                       Hooks::run( 'BeforePageDisplay', [ &$this, &$sk ] );
+                       Hooks::run( 'BeforePageDisplay', [ &$outputPage, &$sk ] );
 
                        try {
                                $sk->outputPage();
@@ -2499,9 +2515,10 @@ class OutputPage extends ContextSource {
                                        $query['returntoquery'] = wfArrayToCgi( $returntoquery );
                                }
                        }
-                       $loginLink = Linker::linkKnown(
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $loginLink = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Userlogin' ),
-                               $this->msg( 'loginreqlink' )->escaped(),
+                               $this->msg( 'loginreqlink' )->text(),
                                [],
                                $query
                        );
@@ -2997,6 +3014,14 @@ class OutputPage extends ContextSource {
                        }
                }
 
+               if ( $this->limitReportJSData ) {
+                       $chunks[] = ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeConfigSetScript(
+                                       [ 'wgPageParseReport' => $this->limitReportJSData ]
+                               )
+                       );
+               }
+
                return self::combineWrappedStrings( $chunks );
        }
 
@@ -3538,7 +3563,6 @@ class OutputPage extends ContextSource {
        protected function buildExemptModules() {
                global $wgContLang;
 
-               $resourceLoader = $this->getResourceLoader();
                $chunks = [];
                // Things that go after the ResourceLoaderDynamicStyles marker
                $append = [];
@@ -3679,8 +3703,9 @@ class OutputPage extends ContextSource {
                } else {
                        $remotePath = $remotePathPrefix;
                }
-               if ( strpos( $path, $remotePath ) !== 0 ) {
-                       // Path is outside wgResourceBasePath, ignore.
+               if ( strpos( $path, $remotePath ) !== 0 || substr( $path, 0, 2 ) === '//' ) {
+                       // - Path is outside wgResourceBasePath, ignore.
+                       // - Path is protocol-relative. Fixes T155310. Not supported by RelPath lib.
                        return $path;
                }
                $path = RelPath\getRelativePath( $path, $remotePath );
index d09e1fb..382d089 100644 (file)
@@ -25,7 +25,6 @@ use Wikimedia\ScopedCallback;
  * Gives access to properties of a page.
  *
  * @since 1.27
- *
  */
 class PageProps {
 
index 049b32f..cc6fc4a 100644 (file)
@@ -364,7 +364,7 @@ class PathRouterPatternReplacer {
         * difference between a $1 that was not replaced and a $1 that was part of
         * the content a $1 was replaced with.
         * @param string $value
-        * @return string
+        * @return string|false
         */
        public function replace( $value ) {
                $this->error = false;
index d40e0c1..a5e9d77 100644 (file)
@@ -55,8 +55,6 @@ class Preferences {
        /** @var array */
        protected static $saveFilters = [
                'timecorrection' => [ 'Preferences', 'filterTimezoneInput' ],
-               'cols' => [ 'Preferences', 'filterIntval' ],
-               'rows' => [ 'Preferences', 'filterIntval' ],
                'rclimit' => [ 'Preferences', 'filterIntval' ],
                'wllimit' => [ 'Preferences', 'filterIntval' ],
                'searchlimit' => [ 'Preferences', 'filterIntval' ],
@@ -495,9 +493,9 @@ class Preferences {
                                        } else {
                                                $disableEmailPrefs = true;
                                                $emailauthenticated = $context->msg( 'emailnotauthenticated' )->parse() . '<br />' .
-                                                       Linker::linkKnown(
+                                                       $linkRenderer->makeKnownLink(
                                                                SpecialPage::getTitleFor( 'Confirmemail' ),
-                                                               $context->msg( 'emailconfirmlink' )->escaped()
+                                                               $context->msg( 'emailconfirmlink' )->text()
                                                        ) . '<br />';
                                                $emailauthenticationclass = "mw-email-not-authenticated";
                                        }
@@ -696,19 +694,23 @@ class Preferences {
                $tzOptions = self::getTimezoneOptions( $context );
 
                $tzSetting = $tzOffset;
-               if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
-                       $minDiff = $tz[1];
-                       $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
-               } elseif ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
+               if ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
                        !in_array( $tzOffset, HTMLFormField::flattenOptions( $tzOptions ) )
                ) {
-                       # Timezone offset can vary with DST
-                       $userTZ = timezone_open( $tz[2] );
-                       if ( $userTZ !== false ) {
-                               $minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 );
+                       // Timezone offset can vary with DST
+                       try {
+                               $userTZ = new DateTimeZone( $tz[2] );
+                               $minDiff = floor( $userTZ->getOffset( new DateTime( 'now' ) ) / 60 );
                                $tzSetting = "ZoneInfo|$minDiff|{$tz[2]}";
+                       } catch ( Exception $e ) {
+                               // User has an invalid time zone set. Fall back to just using the offset
+                               $tz[0] = 'Offset';
                        }
                }
+               if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
+                       $minDiff = $tz[1];
+                       $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
+               }
 
                $defaultPreferences['timecorrection'] = [
                        'class' => 'HTMLSelectOrOtherField',
@@ -813,20 +815,7 @@ class Preferences {
                                ]
                        ];
                }
-               $defaultPreferences['cols'] = [
-                       'type' => 'int',
-                       'label-message' => 'columns',
-                       'section' => 'editing/editor',
-                       'min' => 4,
-                       'max' => 1000,
-               ];
-               $defaultPreferences['rows'] = [
-                       'type' => 'int',
-                       'label-message' => 'rows',
-                       'section' => 'editing/editor',
-                       'min' => 4,
-                       'max' => 1000,
-               ];
+
                if ( $user->isAllowed( 'minoredit' ) ) {
                        $defaultPreferences['minordefault'] = [
                                'type' => 'toggle',
@@ -834,6 +823,7 @@ class Preferences {
                                'label-message' => 'tog-minordefault',
                        ];
                }
+
                $defaultPreferences['forceeditsummary'] = [
                        'type' => 'toggle',
                        'section' => 'editing/editor',
@@ -952,11 +942,12 @@ class Preferences {
                                'raw' => [ 'EditWatchlist', 'raw' ],
                                'clear' => [ 'EditWatchlist', 'clear' ],
                        ];
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                        foreach ( $editWatchlistModes as $editWatchlistMode => $mode ) {
                                // Messages: prefs-editwatchlist-edit, prefs-editwatchlist-raw, prefs-editwatchlist-clear
-                               $editWatchlistLinks[] = Linker::linkKnown(
+                               $editWatchlistLinks[] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( $mode[0], $mode[1] ),
-                                       $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse()
+                                       new HtmlArmor( $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse() )
                                );
                        }
 
@@ -1218,7 +1209,8 @@ class Preferences {
                $pixels = $context->msg( 'unit-pixel' )->text();
 
                foreach ( $context->getConfig()->get( 'ImageLimits' ) as $index => $limits ) {
-                       $display = "{$limits[0]}×{$limits[1]}" . $pixels;
+                       // Note: A left-to-right marker (\u200e) is inserted, see T144386
+                       $display = "{$limits[0]}" . json_decode( '"\u200e"' ) . "×{$limits[1]}" . $pixels;
                        $ret[$display] = $index;
                }
 
@@ -1390,6 +1382,24 @@ class Preferences {
                $data = explode( '|', $tz, 3 );
                switch ( $data[0] ) {
                        case 'ZoneInfo':
+                               $valid = false;
+
+                               if ( count( $data ) === 3 ) {
+                                       // Make sure this timezone exists
+                                       try {
+                                               new DateTimeZone( $data[2] );
+                                               // If the constructor didn't throw, we know it's valid
+                                               $valid = true;
+                                       } catch ( Exception $e ) {
+                                               // Not a valid timezone
+                                       }
+                               }
+
+                               if ( !$valid ) {
+                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
+                                       return 'Offset|' . intval( $tz[1] );
+                               }
+                               return $tz;
                        case 'System':
                                return $tz;
                        default:
@@ -1408,7 +1418,7 @@ class Preferences {
                                # Max is +14:00 and min is -12:00, see:
                                # https://en.wikipedia.org/wiki/Timezone
                                $minDiff = min( $minDiff, 840 );  # 14:00
-                               $minDiff = max( $minDiff, - 720 ); # -12:00
+                               $minDiff = max( $minDiff, -720 ); # -12:00
                                return 'Offset|' . $minDiff;
                }
        }
index 04c17e4..48b1d72 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * Handles searching prefixes of titles and finding any page
  * names that match. Used largely by the OpenSearch implementation.
- * @deprecated Since 1.27, Use SearchEngine::prefixSearchSubpages or SearchEngine::completionSearch
+ * @deprecated Since 1.27, Use SearchEngine::defaultPrefixSearch or SearchEngine::completionSearch
  *
  * @ingroup Search
  */
@@ -369,7 +369,7 @@ abstract class PrefixSearch {
 
 /**
  * Performs prefix search, returning Title objects
- * @deprecated Since 1.27, Use SearchEngine::prefixSearchSubpages or SearchEngine::completionSearch
+ * @deprecated Since 1.27, Use SearchEngine::defaultPrefixSearch or SearchEngine::completionSearch
  * @ingroup Search
  */
 class TitlePrefixSearch extends PrefixSearch {
index 451635e..a68c36f 100644 (file)
@@ -22,6 +22,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handles the page protection UI and backend
@@ -148,7 +149,7 @@ class ProtectionForm {
         *
         * @param string $action
         *
-        * @return string 14-char timestamp or "infinity", or false if the input was invalid
+        * @return string|false 14-char timestamp or "infinity", or false if the input was invalid
         */
        function getExpiry( $action ) {
                if ( $this->mExpirySelection[$action] == 'existing' ) {
@@ -543,9 +544,10 @@ class ProtectionForm {
                $out .= Xml::closeElement( 'fieldset' );
 
                if ( $user->isAllowed( 'editinterface' ) ) {
-                       $link = Linker::linkKnown(
+                       $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+                       $link = $linkRenderer->makeKnownLink(
                                $context->msg( 'protect-dropdown' )->inContentLanguage()->getTitle(),
-                               $context->msg( 'protect-edit-reasonlist' )->escaped(),
+                               $context->msg( 'protect-edit-reasonlist' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
index b812191..d9e42ff 100644 (file)
@@ -874,7 +874,7 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision's user id without regard for the current user's permissions
         *
-        * @return string
+        * @return int
         * @deprecated since 1.25, use getUser( Revision::RAW )
         */
        public function getRawUser() {
@@ -1035,28 +1035,6 @@ class Revision implements IDBAccessObject {
                return (int)$this->mDeleted;
        }
 
-       /**
-        * Fetch revision text if it's available to the specified audience.
-        * If the specified audience does not have the ability to view this
-        * revision, an empty string will be returned.
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        *
-        * @deprecated since 1.21, use getContent() instead
-        * @return string
-        */
-       public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $content = $this->getContent( $audience, $user );
-               return ContentHandler::getContentText( $content ); # returns the raw content text, if applicable
-       }
-
        /**
         * Fetch revision content if it's available to the specified audience.
         * If the specified audience does not have the ability to view this
@@ -1131,7 +1109,7 @@ class Revision implements IDBAccessObject {
         *
         * @return string The content model id associated with this revision,
         *     see the CONTENT_MODEL_XXX constants.
-        **/
+        */
        public function getContentModel() {
                if ( !$this->mContentModel ) {
                        $title = $this->getTitle();
@@ -1155,7 +1133,7 @@ class Revision implements IDBAccessObject {
         *
         * @return string The content format id associated with this revision,
         *     see the CONTENT_FORMAT_XXX constants.
-        **/
+        */
        public function getContentFormat() {
                if ( !$this->mContentFormat ) {
                        $handler = $this->getContentHandler();
@@ -1269,7 +1247,7 @@ class Revision implements IDBAccessObject {
         *   (same as the the wiki $row was loaded from) or false to indicate the local
         *   wiki (this is the default). Otherwise, it must be a symbolic wiki database
         *   identifier as understood by the LoadBalancer class.
-        * @return string Text the text requested or false on failure
+        * @return string|false Text the text requested or false on failure
         */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
 
@@ -1505,7 +1483,9 @@ class Revision implements IDBAccessObject {
                        );
                }
 
-               Hooks::run( 'RevisionInsertComplete', [ &$this, $data, $flags ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $revision = $this;
+               Hooks::run( 'RevisionInsertComplete', [ &$revision, $data, $flags ] );
 
                return $this->mId;
        }
index fb444bd..53cf699 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * List for revision table items for a single page
  */
@@ -268,6 +270,14 @@ abstract class RevisionItemBase {
         * This is used to show the list in HTML form, by the special page.
         */
        abstract public function getHTML();
+
+       /**
+        * Returns an instance of LinkRenderer
+        * @return \MediaWiki\Linker\LinkRenderer
+        */
+       protected function getLinkRenderer() {
+               return MediaWikiServices::getInstance()->getLinkRenderer();
+       }
 }
 
 class RevisionList extends RevisionListBase {
@@ -353,13 +363,14 @@ class RevisionItem extends RevisionItemBase {
         * @return string
         */
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
-               return Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+               return $linkRenderer->makeKnownLink(
                        $this->list->title,
                        $date,
                        [],
@@ -381,9 +392,10 @@ class RevisionItem extends RevisionItemBase {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->context->msg( 'diff' )->escaped();
                } else {
-                       return Linker::linkKnown(
+                       $linkRenderer = $this->getLinkRenderer();
+                       return $linkRenderer->makeKnownLink(
                                        $this->list->title,
-                                       $this->list->msg( 'diff' )->escaped(),
+                                       $this->list->msg( 'diff' )->text(),
                                        [],
                                        [
                                                'diff' => $this->revision->getId(),
index 44e4e3e..42b166d 100644 (file)
@@ -1119,6 +1119,7 @@ class Sanitizer {
                        '>'    => '&gt;',   // we've received invalid input
                        '"'    => '&quot;', // which should have been escaped.
                        '{'    => '&#123;',
+                       '}'    => '&#125;', // prevent unpaired language conversion syntax
                        '['    => '&#91;',
                        "''"   => '&#39;&#39;',
                        'ISBN' => '&#73;SBN',
@@ -1262,8 +1263,9 @@ class Sanitizer {
        static function escapeHtmlAllowEntities( $html ) {
                $html = Sanitizer::decodeCharReferences( $html );
                # It seems wise to escape ' as well as ", as a matter of course.  Can't
-               # hurt.
-               $html = htmlspecialchars( $html, ENT_QUOTES );
+               # hurt. Use ENT_SUBSTITUTE so that incorrectly truncated multibyte characters
+               # don't cause the entire string to disappear.
+               $html = htmlspecialchars( $html, ENT_QUOTES | ENT_SUBSTITUTE );
                return $html;
        }
 
index 4fec472..ce82702 100644 (file)
@@ -71,8 +71,14 @@ return [
        },
 
        'SiteLookup' => function( MediaWikiServices $services ) {
-               // Use the default SiteStore as the SiteLookup implementation for now
-               return $services->getSiteStore();
+               $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' );
+
+               if ( $cacheFile !== false ) {
+                       return new FileBasedSiteLookup( $cacheFile );
+               } else {
+                       // Use the default SiteStore as the SiteLookup implementation for now
+                       return $services->getSiteStore();
+               }
        },
 
        'ConfigFactory' => function( MediaWikiServices $services ) {
index c452779..01ba1e8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Include most things that are needed to make %MediaWiki work.
+ * Include most things that are needed to make MediaWiki work.
  *
  * This file is included by WebStart.php and doMaintenance.php so that both
  * web and maintenance scripts share a final set up phase to include necessary
@@ -36,8 +36,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 $fname = 'Setup.php';
 $ps_setup = Profiler::instance()->scopedProfileIn( $fname );
 
-// If any extensions are still queued, force load them
+// Load queued extensions
 ExtensionRegistry::getInstance()->loadFromQueue();
+// Don't let any other extensions load
+ExtensionRegistry::getInstance()->finish();
 
 // Check to see if we are at the file scope
 if ( !isset( $wgVersion ) ) {
@@ -497,10 +499,6 @@ if ( $wgDebugToolbar && !$wgCommandLineMode ) {
        MWDebug::init();
 }
 
-if ( !class_exists( 'AutoLoader' ) ) {
-       require_once "$IP/includes/AutoLoader.php";
-}
-
 // Reset the global service locator, so any services that have already been created will be
 // re-created while taking into account any custom settings and extensions.
 MediaWikiServices::resetGlobalInstance( new GlobalVarConfig(), 'quick' );
@@ -878,7 +876,6 @@ if ( !$wgCommandLineMode ) {
        Pingback::schedulePingback();
 }
 
-wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
 Profiler::instance()->scopedProfileOut( $ps_extensions );
index 885f926..8d9256b 100644 (file)
@@ -274,7 +274,7 @@ class SiteConfiguration {
         * @param string $from
         * @param string $to
         * @param string|array $in
-        * @return string
+        * @return string|array
         */
        function doReplace( $from, $to, $in ) {
                if ( is_string( $in ) ) {
index 3c51bae..5cf911f 100644 (file)
@@ -835,7 +835,7 @@ class Title implements LinkTarget {
        /**
         * Returns the DB name of the distant wiki which owns the object.
         *
-        * @return string The DB name
+        * @return string|false The DB name
         */
        public function getTransWikiID() {
                if ( !$this->isExternal() ) {
@@ -974,7 +974,7 @@ class Title implements LinkTarget {
        /**
         * Get the namespace text
         *
-        * @return string Namespace text
+        * @return string|false Namespace text
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
@@ -1233,12 +1233,6 @@ class Title implements LinkTarget {
                        && ( $this->hasContentModel( CONTENT_MODEL_CSS )
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
-               # @note This hook is also called in ContentHandler::getDefaultModel.
-               #   It's called here again to make sure hook functions can force this
-               #   method to return true even outside the MediaWiki namespace.
-
-               Hooks::run( 'TitleIsCssOrJsPage', [ $this, &$isCssOrJsPage ], '1.25' );
-
                return $isCssOrJsPage;
        }
 
@@ -1627,7 +1621,7 @@ class Title implements LinkTarget {
         *
         * @since 1.19 (r105919)
         * @param array|string $query
-        * @param bool $query2
+        * @param string|string[]|bool $query2
         * @return string
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
@@ -1663,8 +1657,8 @@ class Title implements LinkTarget {
         *
         * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
-        * @param array|string $query
-        * @param bool $query2
+        * @param string|string[] $query
+        * @param string|string[]|bool $query2
         * @param string $proto Protocol type to use in URL
         * @return string The URL
         */
@@ -1681,8 +1675,9 @@ class Title implements LinkTarget {
 
                # Finally, add the fragment.
                $url .= $this->getFragmentForURL();
-
-               Hooks::run( 'GetFullURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetFullURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1696,11 +1691,11 @@ class Title implements LinkTarget {
         *  valid to link, locally, to the current Title.
         * @see self::newFromText to produce a Title object.
         *
-        * @param string|array $query An optional query string,
+        * @param string|string[] $query An optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
-        * @param array $query2 An optional secondary query array. This one MUST
+        * @param string|string[]|bool $query2 An optional secondary query array. This one MUST
         *   be an array. If a string is passed it will be interpreted as a deprecated
         *   variant argument and urlencoded into a variant= argument.
         *   This second query argument will be added to the $query
@@ -1728,7 +1723,9 @@ class Title implements LinkTarget {
                        $dbkey = wfUrlencode( $this->getPrefixedDBkey() );
                        if ( $query == '' ) {
                                $url = str_replace( '$1', $dbkey, $wgArticlePath );
-                               Hooks::run( 'GetLocalURL::Article', [ &$this, &$url ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $titleRef = $this;
+                               Hooks::run( 'GetLocalURL::Article', [ &$titleRef, &$url ] );
                        } else {
                                global $wgVariantArticlePath, $wgActionPaths, $wgContLang;
                                $url = false;
@@ -1772,8 +1769,9 @@ class Title implements LinkTarget {
                                        $url = "{$wgScript}?title={$dbkey}&{$query}";
                                }
                        }
-
-                       Hooks::run( 'GetLocalURL::Internal', [ &$this, &$url, $query ] );
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $titleRef = $this;
+                       Hooks::run( 'GetLocalURL::Internal', [ &$titleRef, &$url, $query ] );
 
                        // @todo FIXME: This causes breakage in various places when we
                        // actually expected a local URL and end up with dupe prefixes.
@@ -1781,7 +1779,9 @@ class Title implements LinkTarget {
                                $url = $wgServer . $url;
                        }
                }
-               Hooks::run( 'GetLocalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetLocalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1795,7 +1795,7 @@ class Title implements LinkTarget {
         * The result obviously should not be URL-escaped, but does need to be
         * HTML-escaped if it's being output in HTML.
         *
-        * @param array $query
+        * @param string|string[] $query
         * @param bool $query2
         * @param string|int|bool $proto A PROTO_* constant on how the URL should be expanded,
         *                               or false (default) for no expansion
@@ -1830,7 +1830,9 @@ class Title implements LinkTarget {
                $query = self::fixUrlQueryArgs( $query, $query2 );
                $server = $wgInternalServer !== false ? $wgInternalServer : $wgServer;
                $url = wfExpandUrl( $server . $this->getLocalURL( $query ), PROTO_HTTP );
-               Hooks::run( 'GetInternalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetInternalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -1848,7 +1850,9 @@ class Title implements LinkTarget {
        public function getCanonicalURL( $query = '', $query2 = false ) {
                $query = self::fixUrlQueryArgs( $query, $query2 );
                $url = wfExpandUrl( $this->getLocalURL( $query ) . $this->getFragmentForURL(), PROTO_CANONICAL );
-               Hooks::run( 'GetCanonicalURL', [ &$this, &$url, $query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               Hooks::run( 'GetCanonicalURL', [ &$titleRef, &$url, $query ] );
                return $url;
        }
 
@@ -2052,18 +2056,22 @@ class Title implements LinkTarget {
        private function checkPermissionHooks( $action, $user, $errors, $rigor, $short ) {
                // Use getUserPermissionsErrors instead
                $result = '';
-               if ( !Hooks::run( 'userCan', [ &$this, &$user, $action, &$result ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               if ( !Hooks::run( 'userCan', [ &$titleRef, &$user, $action, &$result ] ) ) {
                        return $result ? [] : [ [ 'badaccess-group0' ] ];
                }
                // Check getUserPermissionsErrors hook
-               if ( !Hooks::run( 'getUserPermissionsErrors', [ &$this, &$user, $action, &$result ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $titleRef = $this;
+               if ( !Hooks::run( 'getUserPermissionsErrors', [ &$titleRef, &$user, $action, &$result ] ) ) {
                        $errors = $this->resultToError( $errors, $result );
                }
                // Check getUserPermissionsErrorsExpensive hook
                if (
                        $rigor !== 'quick'
                        && !( $short && count( $errors ) > 0 )
-                       && !Hooks::run( 'getUserPermissionsErrorsExpensive', [ &$this, &$user, $action, &$result ] )
+                       && !Hooks::run( 'getUserPermissionsErrorsExpensive', [ &$titleRef, &$user, $action, &$result ] )
                ) {
                        $errors = $this->resultToError( $errors, $result );
                }
@@ -3595,18 +3603,6 @@ class Title implements LinkTarget {
                );
        }
 
-       /**
-        * Move this page without authentication
-        *
-        * @deprecated since 1.25 use MovePage class instead
-        * @param Title $nt The new page Title
-        * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
-        */
-       public function moveNoAuth( &$nt ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return $this->moveTo( $nt, false );
-       }
-
        /**
         * Check whether a given move operation would be valid.
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
@@ -3670,9 +3666,12 @@ class Title implements LinkTarget {
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create a redirect from the old title to the new title.
         *  Ignored if the user doesn't have the suppressredirect right.
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
-       public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true ) {
+       public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
+
                global $wgUser;
                $err = $this->isValidMoveOperation( $nt, $auth, $reason );
                if ( is_array( $err ) ) {
@@ -3686,7 +3685,7 @@ class Title implements LinkTarget {
                }
 
                $mp = new MovePage( $this, $nt );
-               $status = $mp->move( $wgUser, $reason, $createRedirect );
+               $status = $mp->move( $wgUser, $reason, $createRedirect, $changeTags );
                if ( $status->isOK() ) {
                        return true;
                } else {
@@ -3702,24 +3701,32 @@ class Title implements LinkTarget {
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create redirects from the old subpages to
         *     the new ones Ignored if the user doesn't have the 'suppressredirect' right
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return array Array with old page titles as keys, and strings (new page titles) or
-        *     arrays (errors) as values, or an error array with numeric indices if no pages
-        *     were moved
+        *     getUserPermissionsErrors()-like arrays (errors) as values, or a
+        *     getUserPermissionsErrors()-like error array with numeric indices if
+        *     no pages were moved
         */
-       public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true ) {
+       public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true,
+               array $changeTags = [] ) {
+
                global $wgMaximumMovedPages;
                // Check permissions
                if ( !$this->userCan( 'move-subpages' ) ) {
-                       return [ 'cant-move-subpages' ];
+                       return [
+                               [ 'cant-move-subpages' ],
+                       ];
                }
                // Do the source and target namespaces support subpages?
                if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
-                       return [ 'namespace-nosubpages',
-                               MWNamespace::getCanonicalName( $this->getNamespace() ) ];
+                       return [
+                               [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $this->getNamespace() ) ],
+                       ];
                }
                if ( !MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
-                       return [ 'namespace-nosubpages',
-                               MWNamespace::getCanonicalName( $nt->getNamespace() ) ];
+                       return [
+                               [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $nt->getNamespace() ) ],
+                       ];
                }
 
                $subpages = $this->getSubpages( $wgMaximumMovedPages + 1 );
@@ -3728,9 +3735,9 @@ class Title implements LinkTarget {
                foreach ( $subpages as $oldSubpage ) {
                        $count++;
                        if ( $count > $wgMaximumMovedPages ) {
-                               $retval[$oldSubpage->getPrefixedText()] =
-                                               [ 'movepage-max-pages',
-                                                       $wgMaximumMovedPages ];
+                               $retval[$oldSubpage->getPrefixedText()] = [
+                                       [ 'movepage-max-pages', $wgMaximumMovedPages ],
+                               ];
                                break;
                        }
 
@@ -3757,7 +3764,7 @@ class Title implements LinkTarget {
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
 
-                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect );
+                       $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect, $changeTags );
                        if ( $success === true ) {
                                $retval[$oldSubpage->getPrefixedText()] = $newSubpage->getPrefixedText();
                        } else {
@@ -4436,7 +4443,7 @@ class Title implements LinkTarget {
         * Get the last touched timestamp
         *
         * @param IDatabase $db Optional db
-        * @return string Last-touched timestamp
+        * @return string|false Last-touched timestamp
         */
        public function getTouched( $db = null ) {
                if ( $db === null ) {
index 0c3d52a..c80e4a5 100644 (file)
@@ -422,10 +422,7 @@ class WatchedItemQueryService {
                        $ownersToken = $watchlistOwner->getOption( 'watchlisttoken' );
                        $token = $options['watchlistOwnerToken'];
                        if ( $ownersToken == '' || !hash_equals( $ownersToken, $token ) ) {
-                               throw new UsageException(
-                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
-                                       'bad_wltoken'
-                               );
+                               throw ApiUsageException::newWithMessage( null, 'apierror-bad-watchlist-token', 'bad_wltoken' );
                        }
                        return $watchlistOwner->getId();
                }
@@ -474,7 +471,7 @@ class WatchedItemQueryService {
        }
 
        private function getStartEndConds( IDatabase $db, array $options ) {
-               if ( !isset( $options['start'] ) && ! isset( $options['end'] ) ) {
+               if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
                        return [];
                }
 
index cc4779e..3cdc59c 100644 (file)
@@ -668,7 +668,7 @@ class WatchedItemStore implements StatsdAwareInterface {
 
        /**
         * @param User $user The user to set the timestamp for
-        * @param string $timestamp Set the update timestamp to this value
+        * @param string|null $timestamp Set the update timestamp to this value
         * @param LinkTarget[] $targets List of targets to update. Default to all targets
         *
         * @return bool success
@@ -687,9 +687,13 @@ class WatchedItemStore implements StatsdAwareInterface {
                        $conds[] = $batch->constructSet( 'wl', $dbw );
                }
 
+               if ( $timestamp !== null ) {
+                       $timestamp = $dbw->timestamp( $timestamp );
+               }
+
                $success = $dbw->update(
                        'watchlist',
-                       [ 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp ) ],
+                       [ 'wl_notificationtimestamp' => $timestamp ],
                        $conds,
                        __METHOD__
                );
index 3ef3bc1..3bbdc3f 100644 (file)
@@ -238,7 +238,7 @@ class WebRequest {
         * This is for use prior to Setup.php, when no WebRequest object is available.
         * At other times, use the non-static function getProtocol().
         *
-        * @return array
+        * @return string
         */
        public static function detectProtocol() {
                if ( ( !empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' ) ||
@@ -757,22 +757,6 @@ class WebRequest {
                return $this->sessionId;
        }
 
-       /**
-        * Returns true if the request has a persistent session.
-        * This does not necessarily mean that the user is logged in!
-        *
-        * @deprecated since 1.27, use
-        *  \MediaWiki\Session\SessionManager::singleton()->getPersistedSessionId()
-        *  instead.
-        * @return bool
-        */
-       public function checkSessionCookie() {
-               global $wgInitialSessionId;
-               wfDeprecated( __METHOD__, '1.27' );
-               return $wgInitialSessionId !== null &&
-                       $this->getSession()->getId() === (string)$wgInitialSessionId;
-       }
-
        /**
         * Get a cookie from the $_COOKIE jar
         *
@@ -1099,6 +1083,7 @@ class WebRequest {
                header( 'Content-Type: text/html' );
                $encUrl = htmlspecialchars( $url );
                echo <<<HTML
+<!DOCTYPE html>
 <html>
 <head>
 <title>Security redirect</title>
index d063ce3..6e4fb09 100644 (file)
@@ -133,9 +133,7 @@ if ( ob_get_level() == 0 ) {
        ob_start( 'wfOutputHandler' );
 }
 
-if ( !defined( 'MW_NO_SETUP' ) ) {
-       require_once "$IP/includes/Setup.php";
-}
+require_once "$IP/includes/Setup.php";
 
 # Multiple DBs or commits might be used; keep the request as transactional as possible
 if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
index 37f85ea..f7b8d2f 100644 (file)
@@ -141,7 +141,7 @@ class WikiMap {
         * @param string $wikiID Wiki'd id (generally database name)
         * @param string $page Page name (must be normalised before calling this function!)
         * @param string $text Link's text; optional, default to $page
-        * @return string HTML link or false if the wiki was not found
+        * @return string|false HTML link or false if the wiki was not found
         */
        public static function makeForeignLink( $wikiID, $page, $text = null ) {
                if ( !$text ) {
index e124c38..8f18046 100644 (file)
@@ -563,6 +563,36 @@ class Xml {
                        . Xml::closeElement( 'select' );
        }
 
+       /**
+        * Converts textual drop-down list to array
+        *
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
+        * @return array
+        */
+       public static function getArrayFromWikiTextList( $list = '' ) {
+               $options = [];
+
+               foreach ( explode( "\n", $list ) as $option ) {
+                       $value = trim( $option );
+                       if ( $value == '' ) {
+                               continue;
+                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
+                               // A new group is starting ...
+                               $value = trim( substr( $value, 1 ) );
+                               $options[] = $value;
+                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
+                               // groupmember
+                               $value = trim( substr( $value, 2 ) );
+                               $options[] = $value;
+                       } else {
+                               // groupless reason list
+                               $options[] = $value;
+                       }
+               }
+               return $options;
+       }
+
        /**
         * Shortcut for creating fieldsets.
         *
index 9573cac..e8aec1c 100644 (file)
@@ -168,7 +168,7 @@ class HistoryAction extends FormlessAction {
                $year = $request->getInt( 'year' );
                $month = $request->getInt( 'month' );
                $tagFilter = $request->getVal( 'tagfilter' );
-               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
+               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter, false, $this->getContext() );
 
                /**
                 * Option to show only revisions that have been (partially) hidden via RevisionDelete
@@ -428,7 +428,10 @@ class HistoryPager extends ReverseChronologicalPager {
                        $queryInfo['options'],
                        $this->tagFilter
                );
-               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$this, &$queryInfo ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $historyPager = $this;
+               Hooks::run( 'PageHistoryPager::getQueryInfo', [ &$historyPager, &$queryInfo ] );
 
                return $queryInfo;
        }
index 49b9ab7..5fb83b3 100644 (file)
@@ -261,28 +261,29 @@ class InfoAction extends FormlessAction {
                // Language in which the page content is (supposed to be) written
                $pageLang = $title->getPageLanguage()->getCode();
 
+               $pageLangHtml = $pageLang . ' - ' .
+                       Language::fetchLanguageName( $pageLang, $lang->getCode() );
+               // Link to Special:PageLanguage with pre-filled page title if user has permissions
                if ( $config->get( 'PageLanguageUseDB' )
-                       && $this->getTitle()->userCan( 'pagelang', $this->getUser() )
+                       && $title->userCan( 'pagelang', $user )
                ) {
-                       // Link to Special:PageLanguage with pre-filled page title if user has permissions
-                       $titleObj = SpecialPage::getTitleFor( 'PageLanguage', $title->getPrefixedText() );
-                       $langDisp = $linkRenderer->makeLink(
-                               $titleObj,
-                               $this->msg( 'pageinfo-language' )->text()
-                       );
-               } else {
-                       // Display just the message
-                       $langDisp = $this->msg( 'pageinfo-language' )->escaped();
+                       $pageLangHtml .= ' ' . $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink(
+                               SpecialPage::getTitleValueFor( 'PageLanguage', $title->getPrefixedText() ),
+                               $this->msg( 'pageinfo-language-change' )->text()
+                       ) )->escaped();
                }
 
-               $pageInfo['header-basic'][] = [ $langDisp,
-                       Language::fetchLanguageName( $pageLang, $lang->getCode() )
-                       . ' ' . $this->msg( 'parentheses', $pageLang )->escaped() ];
+               $pageInfo['header-basic'][] = [
+                       $this->msg( 'pageinfo-language' )->escaped(),
+                       $pageLangHtml
+               ];
 
                // Content model of the page
                $modelHtml = htmlspecialchars( ContentHandler::getLocalizedName( $title->getContentModel() ) );
                // If the user can change it, add a link to Special:ChangeContentModel
-               if ( $title->quickUserCan( 'editcontentmodel' ) ) {
+               if ( $config->get( 'ContentHandlerUseDB' )
+                       && $title->userCan( 'editcontentmodel', $user )
+               ) {
                        $modelHtml .= ' ' . $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink(
                                SpecialPage::getTitleValueFor( 'ChangeContentModel', $title->getPrefixedText() ),
                                $this->msg( 'pageinfo-content-model-change' )->text()
@@ -474,7 +475,7 @@ class InfoAction extends FormlessAction {
                        }
                        $expiry = $title->getRestrictionExpiry( $restrictionType );
                        $formattedexpiry = $this->msg( 'parentheses',
-                               $this->getLanguage()->formatExpiry( $expiry ) )->escaped();
+                               $lang->formatExpiry( $expiry ) )->escaped();
                        $message .= $this->msg( 'word-separator' )->escaped() . $formattedexpiry;
 
                        // Messages: restriction-edit, restriction-move, restriction-create,
index 5bf24f6..d8c8bc3 100644 (file)
@@ -108,7 +108,9 @@ class RawAction extends FormlessAction {
                        $response->statusHeader( 404 );
                }
 
-               if ( !Hooks::run( 'RawPageViewBeforeOutput', [ &$this, &$text ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $rawAction = $this;
+               if ( !Hooks::run( 'RawPageViewBeforeOutput', [ &$rawAction, &$text ] ) ) {
                        wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
                }
 
index 2511e3b..5d12590 100644 (file)
@@ -56,8 +56,8 @@ class ApiAMCreateAccount extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 6fafebf..5327d7a 100644 (file)
@@ -93,7 +93,7 @@ class ApiAuthManagerHelper {
        /**
         * Call $manager->securitySensitiveOperationStatus()
         * @param string $operation Operation being checked.
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function securitySensitiveOperation( $operation ) {
                $status = AuthManager::singleton()->securitySensitiveOperationStatus( $operation );
@@ -102,14 +102,10 @@ class ApiAuthManagerHelper {
                                return;
 
                        case AuthManager::SEC_REAUTH:
-                               $this->module->dieUsage(
-                                       'You have not authenticated recently in this session, please reauthenticate.', 'reauthenticate'
-                               );
+                               $this->module->dieWithError( 'apierror-reauthenticate' );
 
                        case AuthManager::SEC_FAIL:
-                               $this->module->dieUsage(
-                                       'This action is not available as your identify cannot be verified.', 'cannotreauthenticate'
-                               );
+                               $this->module->dieWithError( 'apierror-cannotreauthenticate' );
 
                        default:
                                throw new UnexpectedValueException( "Unknown status \"$status\"" );
index 0cd46e4..b8dd464 100644 (file)
@@ -180,6 +180,12 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_ALL = 17;
 
+       /**
+        * (int[]) When PARAM_TYPE is 'namespace', include these as additional possible values.
+        * @since 1.29
+        */
+       const PARAM_EXTRA_NAMESPACES = 18;
+
        /**@}*/
 
        const ALL_DEFAULT_STRING = '*';
@@ -545,7 +551,7 @@ abstract class ApiBase extends ContextSource {
         * @since 1.25
         * @param string $path
         * @return ApiBase|null
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function getModuleFromPath( $path ) {
                $module = $this->getMain();
@@ -565,14 +571,14 @@ abstract class ApiBase extends ContextSource {
                        $manager = $parent->getModuleManager();
                        if ( $manager === null ) {
                                $errorPath = implode( '+', array_slice( $parts, 0, $i ) );
-                               $this->dieUsage( "The module \"$errorPath\" has no submodules", 'badmodule' );
+                               $this->dieWithError( [ 'apierror-badmodule-nosubmodules', $errorPath ], 'badmodule' );
                        }
                        $module = $manager->getModule( $parts[$i] );
 
                        if ( $module === null ) {
                                $errorPath = $i ? implode( '+', array_slice( $parts, 0, $i ) ) : $parent->getModuleName();
-                               $this->dieUsage(
-                                       "The module \"$errorPath\" does not have a submodule \"{$parts[$i]}\"",
+                               $this->dieWithError(
+                                       [ 'apierror-badmodule-badsubmodule', $errorPath, wfEscapeWikiText( $parts[$i] ) ],
                                        'badmodule'
                                );
                        }
@@ -670,11 +676,18 @@ abstract class ApiBase extends ContextSource {
        /**
         * This method mangles parameter name based on the prefix supplied to the constructor.
         * Override this method to change parameter name during runtime
-        * @param string $paramName Parameter name
-        * @return string Prefixed parameter name
+        * @param string|string[] $paramName Parameter name
+        * @return string|string[] Prefixed parameter name
+        * @since 1.29 accepts an array of strings
         */
        public function encodeParamName( $paramName ) {
-               return $this->mModulePrefix . $paramName;
+               if ( is_array( $paramName ) ) {
+                       return array_map( function ( $name ) {
+                               return $this->mModulePrefix . $name;
+                       }, $paramName );
+               } else {
+                       return $this->mModulePrefix . $paramName;
+               }
        }
 
        /**
@@ -725,20 +738,32 @@ abstract class ApiBase extends ContextSource {
        public function requireOnlyOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage(
-                               "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together',
-                               'invalidparammix' );
+                       $this->dieWithError( [
+                               'apierror-invalidparammix',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $intersection )
+                               ) ),
+                               count( $intersection ),
+                       ] );
                } elseif ( count( $intersection ) == 0 ) {
-                       $this->dieUsage(
-                               "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required',
-                               'missingparam'
-                       );
+                       $this->dieWithError( [
+                               'apierror-missingparam-one-of',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $required )
+                               ) ),
+                               count( $required ),
+                       ], 'missingparam' );
                }
        }
 
@@ -751,16 +776,21 @@ abstract class ApiBase extends ContextSource {
        public function requireMaxOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage(
-                               "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together',
-                               'invalidparammix'
-                       );
+                       $this->dieWithError( [
+                               'apierror-invalidparammix',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $intersection )
+                               ) ),
+                               count( $intersection ),
+                       ] );
                }
        }
 
@@ -774,7 +804,6 @@ abstract class ApiBase extends ContextSource {
        public function requireAtLeastOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
-               $p = $this->getModulePrefix();
 
                $intersection = array_intersect(
                        array_keys( array_filter( $params, [ $this, 'parameterNotEmpty' ] ) ),
@@ -782,8 +811,16 @@ abstract class ApiBase extends ContextSource {
                );
 
                if ( count( $intersection ) == 0 ) {
-                       $this->dieUsage( "At least one of the parameters {$p}" .
-                               implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+                       $this->dieWithError( [
+                               'apierror-missingparam-at-least-one-of',
+                               Message::listParam( array_map(
+                                       function ( $p ) {
+                                               return '<var>' . $this->encodeParamName( $p ) . '</var>';
+                                       },
+                                       array_values( $required )
+                               ) ),
+                               count( $required ),
+                       ], 'missingparam' );
                }
        }
 
@@ -812,10 +849,8 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( $badParams ) {
-                       $this->dieUsage(
-                               'The following parameters were found in the query string, but must be in the POST body: '
-                                       . join( ', ', $badParams ),
-                               'mustpostparams'
+                       $this->dieWithError(
+                               [ 'apierror-mustpostparams', join( ', ', $badParams ), count( $badParams ) ]
                        );
                }
        }
@@ -848,10 +883,10 @@ abstract class ApiBase extends ContextSource {
                if ( isset( $params['title'] ) ) {
                        $titleObj = Title::newFromText( $params['title'] );
                        if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                        if ( !$titleObj->canExist() ) {
-                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+                               $this->dieWithError( 'apierror-pagecannotexist' );
                        }
                        $pageObj = WikiPage::factory( $titleObj );
                        if ( $load !== false ) {
@@ -863,13 +898,41 @@ abstract class ApiBase extends ContextSource {
                        }
                        $pageObj = WikiPage::newFromID( $params['pageid'], $load );
                        if ( !$pageObj ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['pageid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
                        }
                }
 
                return $pageObj;
        }
 
+       /**
+        * Get a Title object from a title or pageid param, if possible.
+        * Can die, if no param is set or if the title or page id is not valid.
+        *
+        * @since 1.29
+        * @param array $params
+        * @return Title
+        */
+       public function getTitleFromTitleOrPageId( $params ) {
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               $titleObj = null;
+               if ( isset( $params['title'] ) ) {
+                       $titleObj = Title::newFromText( $params['title'] );
+                       if ( !$titleObj || $titleObj->isExternal() ) {
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
+                       }
+                       return $titleObj;
+               } elseif ( isset( $params['pageid'] ) ) {
+                       $titleObj = Title::newFromID( $params['pageid'] );
+                       if ( !$titleObj ) {
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
+                       }
+               }
+
+               return $titleObj;
+       }
+
        /**
         * Return true if we're to watch the page, false if not, null if no change.
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
@@ -924,44 +987,41 @@ abstract class ApiBase extends ContextSource {
                // Some classes may decide to change parameter names
                $encParamName = $this->encodeParamName( $paramName );
 
+               // Shorthand
                if ( !is_array( $paramSettings ) ) {
-                       $default = $paramSettings;
-                       $multi = false;
-                       $type = gettype( $paramSettings );
-                       $dupes = false;
-                       $deprecated = false;
-                       $required = false;
-                       $allowAll = false;
-               } else {
-                       $default = isset( $paramSettings[self::PARAM_DFLT] )
-                               ? $paramSettings[self::PARAM_DFLT]
-                               : null;
-                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
-                               ? $paramSettings[self::PARAM_ISMULTI]
-                               : false;
-                       $type = isset( $paramSettings[self::PARAM_TYPE] )
-                               ? $paramSettings[self::PARAM_TYPE]
-                               : null;
-                       $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
-                               ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
-                               : false;
-                       $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
-                               ? $paramSettings[self::PARAM_DEPRECATED]
-                               : false;
-                       $required = isset( $paramSettings[self::PARAM_REQUIRED] )
-                               ? $paramSettings[self::PARAM_REQUIRED]
-                               : false;
-                       $allowAll = isset( $paramSettings[self::PARAM_ALL] )
-                               ? $paramSettings[self::PARAM_ALL]
-                               : false;
-
-                       // When type is not given, and no choices, the type is the same as $default
-                       if ( !isset( $type ) ) {
-                               if ( isset( $default ) ) {
-                                       $type = gettype( $default );
-                               } else {
-                                       $type = 'NULL'; // allow everything
-                               }
+                       $paramSettings = [
+                               self::PARAM_DFLT => $paramSettings,
+                       ];
+               }
+
+               $default = isset( $paramSettings[self::PARAM_DFLT] )
+                       ? $paramSettings[self::PARAM_DFLT]
+                       : null;
+               $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
+                       ? $paramSettings[self::PARAM_ISMULTI]
+                       : false;
+               $type = isset( $paramSettings[self::PARAM_TYPE] )
+                       ? $paramSettings[self::PARAM_TYPE]
+                       : null;
+               $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
+                       ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
+                       : false;
+               $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
+                       ? $paramSettings[self::PARAM_DEPRECATED]
+                       : false;
+               $required = isset( $paramSettings[self::PARAM_REQUIRED] )
+                       ? $paramSettings[self::PARAM_REQUIRED]
+                       : false;
+               $allowAll = isset( $paramSettings[self::PARAM_ALL] )
+                       ? $paramSettings[self::PARAM_ALL]
+                       : false;
+
+               // When type is not given, and no choices, the type is the same as $default
+               if ( !isset( $type ) ) {
+                       if ( isset( $default ) ) {
+                               $type = gettype( $default );
+                       } else {
+                               $type = 'NULL'; // allow everything
                        }
                }
 
@@ -994,10 +1054,8 @@ abstract class ApiBase extends ContextSource {
                                // accidentally uploaded as a field fails spectacularly)
                                $value = $this->getMain()->getRequest()->unsetVal( $encParamName );
                                if ( $value !== null ) {
-                                       $this->dieUsage(
-                                               "File upload param $encParamName is not a file upload; " .
-                                                       'be sure to use multipart/form-data for your POST and include ' .
-                                                       'a filename in the Content-Disposition header.',
+                                       $this->dieWithError(
+                                               [ 'apierror-badupload', $encParamName ],
                                                "badupload_{$encParamName}"
                                        );
                                }
@@ -1007,6 +1065,11 @@ abstract class ApiBase extends ContextSource {
 
                        if ( isset( $value ) && $type == 'namespace' ) {
                                $type = MWNamespace::getValidNamespaces();
+                               if ( isset( $paramSettings[self::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $paramSettings[self::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $type = array_merge( $type, $paramSettings[self::PARAM_EXTRA_NAMESPACES] );
+                               }
                                // By default, namespace parameters allow ALL_DEFAULT_STRING to be used to specify
                                // all namespaces.
                                $allowAll = true;
@@ -1032,10 +1095,7 @@ abstract class ApiBase extends ContextSource {
                                        // done by WebRequest for $_GET. Let's call that a feature.
                                        $value = join( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) );
                                } else {
-                                       $this->dieUsage(
-                                               "U+001F multi-value separation may only be used for multi-valued parameters.",
-                                               'badvalue_notmultivalue'
-                                       );
+                                       $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' );
                                }
                        }
 
@@ -1072,7 +1132,7 @@ abstract class ApiBase extends ContextSource {
                                        case 'text':
                                        case 'password':
                                                if ( $required && $value === '' ) {
-                                                       $this->dieUsageMsg( [ 'missingparam', $paramName ] );
+                                                       $this->dieWithError( [ 'apierror-missingparam', $paramName ] );
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
@@ -1175,8 +1235,6 @@ abstract class ApiBase extends ContextSource {
 
                        // Set a warning if a deprecated parameter has been passed
                        if ( $deprecated && $value !== false ) {
-                               $this->setWarning( "The $encParamName parameter has been deprecated." );
-
                                $feature = $encParamName;
                                $m = $this;
                                while ( !$m->isMain() ) {
@@ -1186,10 +1244,10 @@ abstract class ApiBase extends ContextSource {
                                        $feature = "{$param}={$name}&{$feature}";
                                        $m = $p;
                                }
-                               $this->logFeatureUsage( $feature );
+                               $this->addDeprecation( [ 'apiwarn-deprecation-parameter', $encParamName ], $feature );
                        }
                } elseif ( $required ) {
-                       $this->dieUsageMsg( [ 'missingparam', $paramName ] );
+                       $this->dieWithError( [ 'apierror-missingparam', $paramName ] );
                }
 
                return $value;
@@ -1204,11 +1262,7 @@ abstract class ApiBase extends ContextSource {
         */
        protected function handleParamNormalization( $paramName, $value, $rawValue ) {
                $encParamName = $this->encodeParamName( $paramName );
-               $this->setWarning(
-                       "The value passed for '$encParamName' contains invalid or non-normalized data. "
-                       . 'Textual data should be valid, NFC-normalized Unicode without '
-                       . 'C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).'
-               );
+               $this->addWarning( [ 'apiwarn-badutf8', $encParamName ] );
        }
 
        /**
@@ -1265,9 +1319,10 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( self::truncateArray( $valuesList, $sizeLimit ) ) {
-                       $this->logFeatureUsage( "too-many-$valueName-for-{$this->getModulePath()}" );
-                       $this->setWarning( "Too many values supplied for parameter '$valueName': " .
-                               "the limit is $sizeLimit" );
+                       $this->addDeprecation(
+                               [ 'apiwarn-toomanyvalues', $valueName, $sizeLimit ],
+                               "too-many-$valueName-for-{$this->getModulePath()}"
+                       );
                }
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
@@ -1276,26 +1331,38 @@ abstract class ApiBase extends ContextSource {
                                return $value;
                        }
 
-                       $possibleValues = is_array( $allowedValues )
-                               ? "of '" . implode( "', '", $allowedValues ) . "'"
-                               : '';
-                       $this->dieUsage(
-                               "Only one $possibleValues is allowed for parameter '$valueName'",
-                               "multival_$valueName"
-                       );
+                       if ( is_array( $allowedValues ) ) {
+                               $values = array_map( function ( $v ) {
+                                       return '<kbd>' . wfEscapeWikiText( $v ) . '</kbd>';
+                               }, $allowedValues );
+                               $this->dieWithError( [
+                                       'apierror-multival-only-one-of',
+                                       $valueName,
+                                       Message::listParam( $values ),
+                                       count( $values ),
+                               ], "multival_$valueName" );
+                       } else {
+                               $this->dieWithError( [
+                                       'apierror-multival-only-one',
+                                       $valueName,
+                               ], "multival_$valueName" );
+                       }
                }
 
                if ( is_array( $allowedValues ) ) {
                        // Check for unknown values
-                       $unknown = array_diff( $valuesList, $allowedValues );
+                       $unknown = array_map( 'wfEscapeWikiText', array_diff( $valuesList, $allowedValues ) );
                        if ( count( $unknown ) ) {
                                if ( $allowMultiple ) {
-                                       $s = count( $unknown ) > 1 ? 's' : '';
-                                       $vals = implode( ', ', $unknown );
-                                       $this->setWarning( "Unrecognized value$s for parameter '$valueName': $vals" );
+                                       $this->addWarning( [
+                                               'apiwarn-unrecognizedvalues',
+                                               $valueName,
+                                               Message::listParam( $unknown, 'comma' ),
+                                               count( $unknown ),
+                                       ] );
                                } else {
-                                       $this->dieUsage(
-                                               "Unrecognized value for parameter '$valueName': {$valuesList[0]}",
+                                       $this->dieWithError(
+                                               [ 'apierror-unrecognizedvalue', $valueName, wfEscapeWikiText( $valuesList[0] ) ],
                                                "unknown_$valueName"
                                        );
                                }
@@ -1321,7 +1388,12 @@ abstract class ApiBase extends ContextSource {
                $enforceLimits = false
        ) {
                if ( !is_null( $min ) && $value < $min ) {
-                       $msg = $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)";
+                       $msg = ApiMessage::create(
+                               [ 'apierror-integeroutofrange-belowminimum',
+                                       $this->encodeParamName( $paramName ), $min, $value ],
+                               'integeroutofrange',
+                               [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                       );
                        $this->warnOrDie( $msg, $enforceLimits );
                        $value = $min;
                }
@@ -1337,13 +1409,22 @@ abstract class ApiBase extends ContextSource {
                if ( !is_null( $max ) && $value > $max ) {
                        if ( !is_null( $botMax ) && $this->getMain()->canApiHighLimits() ) {
                                if ( $value > $botMax ) {
-                                       $msg = $this->encodeParamName( $paramName ) .
-                                               " may not be over $botMax (set to $value) for bots or sysops";
+                                       $msg = ApiMessage::create(
+                                               [ 'apierror-integeroutofrange-abovebotmax',
+                                                       $this->encodeParamName( $paramName ), $botMax, $value ],
+                                               'integeroutofrange',
+                                               [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                                       );
                                        $this->warnOrDie( $msg, $enforceLimits );
                                        $value = $botMax;
                                }
                        } else {
-                               $msg = $this->encodeParamName( $paramName ) . " may not be over $max (set to $value) for users";
+                               $msg = ApiMessage::create(
+                                       [ 'apierror-integeroutofrange-abovemax',
+                                               $this->encodeParamName( $paramName ), $max, $value ],
+                                       'integeroutofrange',
+                                       [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
+                               );
                                $this->warnOrDie( $msg, $enforceLimits );
                                $value = $max;
                        }
@@ -1361,11 +1442,9 @@ abstract class ApiBase extends ContextSource {
                // (wfTimestamp() also accepts various non-strings and the string of 14
                // ASCII NUL bytes, but those can't get here)
                if ( !$value ) {
-                       $this->logFeatureUsage( 'unclear-"now"-timestamp' );
-                       $this->setWarning(
-                               "Passing '$value' for timestamp parameter $encParamName has been deprecated." .
-                                       ' If for some reason you need to explicitly specify the current time without' .
-                                       ' calculating it client-side, use "now".'
+                       $this->addDeprecation(
+                               [ 'apiwarn-unclearnowtimestamp', $encParamName, wfEscapeWikiText( $value ) ],
+                               'unclear-"now"-timestamp'
                        );
                        return wfTimestamp( TS_MW );
                }
@@ -1377,8 +1456,8 @@ abstract class ApiBase extends ContextSource {
 
                $unixTimestamp = wfTimestamp( TS_UNIX, $value );
                if ( $unixTimestamp === false ) {
-                       $this->dieUsage(
-                               "Invalid value '$value' for timestamp parameter $encParamName",
+                       $this->dieWithError(
+                               [ 'apierror-badtimestamp', $encParamName, wfEscapeWikiText( $value ) ],
                                "badtimestamp_{$encParamName}"
                        );
                }
@@ -1433,8 +1512,8 @@ abstract class ApiBase extends ContextSource {
        private function validateUser( $value, $encParamName ) {
                $title = Title::makeTitleSafe( NS_USER, $value );
                if ( $title === null || $title->hasFragment() ) {
-                       $this->dieUsage(
-                               "Invalid value '$value' for user parameter $encParamName",
+                       $this->dieWithError(
+                               [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $value ) ],
                                "baduser_{$encParamName}"
                        );
                }
@@ -1490,22 +1569,19 @@ abstract class ApiBase extends ContextSource {
                if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
                        $user = User::newFromName( $params['owner'], false );
                        if ( !( $user && $user->getId() ) ) {
-                               $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
+                               $this->dieWithError(
+                                       [ 'nosuchusershort', wfEscapeWikiText( $params['owner'] ) ], 'bad_wlowner'
+                               );
                        }
                        $token = $user->getOption( 'watchlisttoken' );
                        if ( $token == '' || !hash_equals( $token, $params['token'] ) ) {
-                               $this->dieUsage(
-                                       'Incorrect watchlist token provided -- please set a correct token in Special:Preferences',
-                                       'bad_wltoken'
-                               );
+                               $this->dieWithError( 'apierror-bad-watchlist-token', 'bad_wltoken' );
                        }
                } else {
                        if ( !$this->getUser()->isLoggedIn() ) {
-                               $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
-                       }
-                       if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
-                               $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+                               $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                        }
+                       $this->checkUserRightsAny( 'viewmywatchlist' );
                        $user = $this->getUser();
                }
 
@@ -1561,6 +1637,45 @@ abstract class ApiBase extends ContextSource {
                return $msg;
        }
 
+       /**
+        * Turn an array of message keys or key+param arrays into a Status
+        * @since 1.29
+        * @param array $errors
+        * @param User|null $user
+        * @return Status
+        */
+       public function errorArrayToStatus( array $errors, User $user = null ) {
+               if ( $user === null ) {
+                       $user = $this->getUser();
+               }
+
+               $status = Status::newGood();
+               foreach ( $errors as $error ) {
+                       if ( is_array( $error ) && $error[0] === 'blockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-blocked',
+                                       'blocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } elseif ( is_array( $error ) && $error[0] === 'autoblockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-autoblocked',
+                                       'autoblocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } elseif ( is_array( $error ) && $error[0] === 'systemblockedtext' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-systemblocked',
+                                       'blocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       } else {
+                               call_user_func_array( [ $status, 'fatal' ], (array)$error );
+                       }
+               }
+               return $status;
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -1569,745 +1684,241 @@ abstract class ApiBase extends ContextSource {
         */
 
        /**
-        * Set warning section for this module. Users should monitor this
-        * section to notice any changes in API. Multiple calls to this
-        * function will result in the warning messages being separated by
-        * newlines
-        * @param string $warning Warning message
+        * Add a warning for this module.
+        *
+        * Users should monitor this section to notice any changes in API. Multiple
+        * calls to this function will result in multiple warning messages.
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addWarning()
+        * @param string|null $code See ApiErrorFormatter::addWarning()
+        * @param array|null $data See ApiErrorFormatter::addWarning()
         */
-       public function setWarning( $warning ) {
-               $msg = new ApiRawMessage( $warning, 'warning' );
-               $this->getErrorFormatter()->addWarning( $this->getModuleName(), $msg );
+       public function addWarning( $msg, $code = null, $data = null ) {
+               $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg, $code, $data );
        }
 
        /**
-        * Adds a warning to the output, else dies
+        * Add a deprecation warning for this module.
         *
-        * @param string $msg Message to show as a warning, or error message if dying
-        * @param bool $enforceLimits Whether this is an enforce (die)
+        * A combination of $this->addWarning() and $this->logFeatureUsage()
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addWarning()
+        * @param string|null $feature See ApiBase::logFeatureUsage()
+        * @param array|null $data See ApiErrorFormatter::addWarning()
         */
-       private function warnOrDie( $msg, $enforceLimits = false ) {
-               if ( $enforceLimits ) {
-                       $this->dieUsage( $msg, 'integeroutofrange' );
+       public function addDeprecation( $msg, $feature, $data = [] ) {
+               $data = (array)$data;
+               if ( $feature !== null ) {
+                       $data['feature'] = $feature;
+                       $this->logFeatureUsage( $feature );
                }
+               $this->addWarning( $msg, 'deprecation', $data );
+       }
 
-               $this->setWarning( $msg );
+       /**
+        * Add an error for this module without aborting
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @note If you want to abort processing, use self::dieWithError() instead.
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addError()
+        * @param string|null $code See ApiErrorFormatter::addError()
+        * @param array|null $data See ApiErrorFormatter::addError()
+        */
+       public function addError( $msg, $code = null, $data = null ) {
+               $this->getErrorFormatter()->addError( $this->getModulePath(), $msg, $code, $data );
        }
 
        /**
-        * Throw a UsageException, which will (if uncaught) call the main module's
-        * error handler and die with an error message.
+        * Add warnings and/or errors from a Status
         *
-        * @param string $description One-line human-readable description of the
-        *   error condition, e.g., "The API requires a valid action parameter"
-        * @param string $errorCode Brief, arbitrary, stable string to allow easy
-        *   automated identification of the error, e.g., 'unknown_action'
-        * @param int $httpRespCode HTTP response code
-        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
-        * @throws UsageException always
+        * @note If you want to abort processing, use self::dieStatus() instead.
+        * @since 1.29
+        * @param StatusValue $status
+        * @param string[] $types 'warning' and/or 'error'
         */
-       public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
-               throw new UsageException(
-                       $description,
-                       $this->encodeParamName( $errorCode ),
-                       $httpRespCode,
-                       $extradata
+       public function addMessagesFromStatus( StatusValue $status, $types = [ 'warning', 'error' ] ) {
+               $this->getErrorFormatter()->addMessagesFromStatus( $this->getModulePath(), $status, $types );
+       }
+
+       /**
+        * Abort execution with an error
+        *
+        * If $msg is not an ApiMessage, the message code will be derived from the
+        * message key by stripping any "apiwarn-" or "apierror-" prefix.
+        *
+        * @since 1.29
+        * @param string|array|Message $msg See ApiErrorFormatter::addError()
+        * @param string|null $code See ApiErrorFormatter::addError()
+        * @param array|null $data See ApiErrorFormatter::addError()
+        * @param int|null $httpCode HTTP error code to use
+        * @throws ApiUsageException always
+        */
+       public function dieWithError( $msg, $code = null, $data = null, $httpCode = null ) {
+               throw ApiUsageException::newWithMessage( $this, $msg, $code, $data, $httpCode );
+       }
+
+       /**
+        * Abort execution with an error derived from an exception
+        *
+        * @since 1.29
+        * @param Exception|Throwable $exception See ApiErrorFormatter::getMessageFromException()
+        * @param array $options See ApiErrorFormatter::getMessageFromException()
+        * @throws ApiUsageException always
+        */
+       public function dieWithException( $exception, array $options = [] ) {
+               $this->dieWithError(
+                       $this->getErrorFormatter()->getMessageFromException( $exception, $options )
                );
        }
 
        /**
-        * Throw a UsageException, which will (if uncaught) call the main module's
+        * Adds a warning to the output, else dies
+        *
+        * @param ApiMessage $msg Message to show as a warning, or error message if dying
+        * @param bool $enforceLimits Whether this is an enforce (die)
+        */
+       private function warnOrDie( ApiMessage $msg, $enforceLimits = false ) {
+               if ( $enforceLimits ) {
+                       $this->dieWithError( $msg );
+               } else {
+                       $this->addWarning( $msg );
+               }
+       }
+
+       /**
+        * Throw an ApiUsageException, which will (if uncaught) call the main module's
         * error handler and die with an error message including block info.
         *
         * @since 1.27
-        * @param Block $block The block used to generate the UsageException
-        * @throws UsageException always
+        * @param Block $block The block used to generate the ApiUsageException
+        * @throws ApiUsageException always
         */
        public function dieBlocked( Block $block ) {
                // Die using the appropriate message depending on block type
                if ( $block->getType() == Block::TYPE_AUTO ) {
-                       $this->dieUsage(
-                               'Your IP address has been blocked automatically, because it was used by a blocked user',
+                       $this->dieWithError(
+                               'apierror-autoblocked',
                                'autoblocked',
-                               0,
                                [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
                        );
                } else {
-                       $this->dieUsage(
-                               'You have been blocked from editing',
+                       $this->dieWithError(
+                               'apierror-blocked',
                                'blocked',
-                               0,
                                [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
                        );
                }
        }
 
        /**
-        * Get error (as code, string) from a Status object.
+        * Throw an ApiUsageException based on the Status object.
         *
-        * @since 1.23
-        * @param Status $status
-        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
-        * @return array Array of code and error string
-        * @throws MWException
+        * @since 1.22
+        * @since 1.29 Accepts a StatusValue
+        * @param StatusValue $status
+        * @throws ApiUsageException always
         */
-       public function getErrorFromStatus( $status, &$extraData = null ) {
+       public function dieStatus( StatusValue $status ) {
                if ( $status->isGood() ) {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
 
-               $errors = $status->getErrorsByType( 'error' );
-               if ( !$errors ) {
-                       // No errors? Assume the warnings should be treated as errors
-                       $errors = $status->getErrorsByType( 'warning' );
-               }
-               if ( !$errors ) {
-                       // Still no errors? Punt
-                       $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
-               }
-
-               // Cannot use dieUsageMsg() because extensions might return custom
-               // error messages.
-               if ( $errors[0]['message'] instanceof Message ) {
-                       $msg = $errors[0]['message'];
-                       if ( $msg instanceof IApiMessage ) {
-                               $extraData = $msg->getApiData();
-                               $code = $msg->getApiCode();
-                       } else {
-                               $code = $msg->getKey();
-                       }
-               } else {
-                       $code = $errors[0]['message'];
-                       $msg = wfMessage( $code, $errors[0]['params'] );
-               }
-               if ( isset( ApiBase::$messageMap[$code] ) ) {
-                       // Translate message to code, for backwards compatibility
-                       $code = ApiBase::$messageMap[$code]['code'];
-               }
-
-               return [ $code, $msg->inLanguage( 'en' )->useDatabase( false )->plain() ];
+               throw new ApiUsageException( $this, $status );
        }
 
-       /**
-        * Throw a UsageException based on the errors in the Status object.
-        *
-        * @since 1.22
-        * @param Status $status
-        * @throws UsageException always
-        */
-       public function dieStatus( $status ) {
-               $extraData = null;
-               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
-               $this->dieUsage( $msg, $code, 0, $extraData );
-       }
-
-       // @codingStandardsIgnoreStart Allow long lines. Cannot split these.
-       /**
-        * Array that maps message keys to error messages. $1 and friends are replaced.
-        */
-       public static $messageMap = [
-               // This one MUST be present, or dieUsageMsg() will recurse infinitely
-               'unknownerror' => [ 'code' => 'unknownerror', 'info' => "Unknown error: \"\$1\"" ],
-               'unknownerror-nocode' => [ 'code' => 'unknownerror', 'info' => 'Unknown error' ],
-
-               // Messages from Title::getUserPermissionsErrors()
-               'ns-specialprotected' => [
-                       'code' => 'unsupportednamespace',
-                       'info' => "Pages in the Special namespace can't be edited"
-               ],
-               'protectedinterface' => [
-                       'code' => 'protectednamespace-interface',
-                       'info' => "You're not allowed to edit interface messages"
-               ],
-               'namespaceprotected' => [
-                       'code' => 'protectednamespace',
-                       'info' => "You're not allowed to edit pages in the \"\$1\" namespace"
-               ],
-               'customcssprotected' => [
-                       'code' => 'customcssprotected',
-                       'info' => "You're not allowed to edit custom CSS pages"
-               ],
-               'customjsprotected' => [
-                       'code' => 'customjsprotected',
-                       'info' => "You're not allowed to edit custom JavaScript pages"
-               ],
-               'cascadeprotected' => [
-                       'code' => 'cascadeprotected',
-                       'info' => "The page you're trying to edit is protected because it's included in a cascade-protected page"
-               ],
-               'protectedpagetext' => [
-                       'code' => 'protectedpage',
-                       'info' => "The \"\$1\" right is required to edit this page"
-               ],
-               'protect-cantedit' => [
-                       'code' => 'cantedit',
-                       'info' => "You can't protect this page because you can't edit it"
-               ],
-               'deleteprotected' => [
-                       'code' => 'cantedit',
-                       'info' => "You can't delete this page because it has been protected"
-               ],
-               'badaccess-group0' => [
-                       'code' => 'permissiondenied',
-                       'info' => 'Permission denied'
-               ], // Generic permission denied message
-               'badaccess-groups' => [
-                       'code' => 'permissiondenied',
-                       'info' => 'Permission denied'
-               ],
-               'titleprotected' => [
-                       'code' => 'protectedtitle',
-                       'info' => 'This title has been protected from creation'
-               ],
-               'nocreate-loggedin' => [
-                       'code' => 'cantcreate',
-                       'info' => "You don't have permission to create new pages"
-               ],
-               'nocreatetext' => [
-                       'code' => 'cantcreate-anon',
-                       'info' => "Anonymous users can't create new pages"
-               ],
-               'movenologintext' => [
-                       'code' => 'cantmove-anon',
-                       'info' => "Anonymous users can't move pages"
-               ],
-               'movenotallowed' => [
-                       'code' => 'cantmove',
-                       'info' => "You don't have permission to move pages"
-               ],
-               'confirmedittext' => [
-                       'code' => 'confirmemail',
-                       'info' => 'You must confirm your email address before you can edit'
-               ],
-               'blockedtext' => [
-                       'code' => 'blocked',
-                       'info' => 'You have been blocked from editing'
-               ],
-               'autoblockedtext' => [
-                       'code' => 'autoblocked',
-                       'info' => 'Your IP address has been blocked automatically, because it was used by a blocked user'
-               ],
-
-               // Miscellaneous interface messages
-               'actionthrottledtext' => [
-                       'code' => 'ratelimited',
-                       'info' => "You've exceeded your rate limit. Please wait some time and try again"
-               ],
-               'alreadyrolled' => [
-                       'code' => 'alreadyrolled',
-                       'info' => 'The page you tried to rollback was already rolled back'
-               ],
-               'cantrollback' => [
-                       'code' => 'onlyauthor',
-                       'info' => 'The page you tried to rollback only has one author'
-               ],
-               'readonlytext' => [
-                       'code' => 'readonly',
-                       'info' => 'The wiki is currently in read-only mode'
-               ],
-               'sessionfailure' => [
-                       'code' => 'badtoken',
-                       'info' => 'Invalid token' ],
-               'cannotdelete' => [
-                       'code' => 'cantdelete',
-                       'info' => "Couldn't delete \"\$1\". Maybe it was deleted already by someone else"
-               ],
-               'notanarticle' => [
-                       'code' => 'missingtitle',
-                       'info' => "The page you requested doesn't exist"
-               ],
-               'selfmove' => [ 'code' => 'selfmove', 'info' => "Can't move a page to itself"
-               ],
-               'immobile_namespace' => [
-                       'code' => 'immobilenamespace',
-                       'info' => 'You tried to move pages from or to a namespace that is protected from moving'
-               ],
-               'articleexists' => [
-                       'code' => 'articleexists',
-                       'info' => 'The destination article already exists and is not a redirect to the source article'
-               ],
-               'protectedpage' => [
-                       'code' => 'protectedpage',
-                       'info' => "You don't have permission to perform this move"
-               ],
-               'hookaborted' => [
-                       'code' => 'hookaborted',
-                       'info' => 'The modification you tried to make was aborted by an extension hook'
-               ],
-               'cantmove-titleprotected' => [
-                       'code' => 'protectedtitle',
-                       'info' => 'The destination article has been protected from creation'
-               ],
-               'imagenocrossnamespace' => [
-                       'code' => 'nonfilenamespace',
-                       'info' => "Can't move a file to a non-file namespace"
-               ],
-               'imagetypemismatch' => [
-                       'code' => 'filetypemismatch',
-                       'info' => "The new file extension doesn't match its type"
-               ],
-               // 'badarticleerror' => shouldn't happen
-               // 'badtitletext' => shouldn't happen
-               'ip_range_invalid' => [ 'code' => 'invalidrange', 'info' => 'Invalid IP range' ],
-               'range_block_disabled' => [
-                       'code' => 'rangedisabled',
-                       'info' => 'Blocking IP ranges has been disabled'
-               ],
-               'nosuchusershort' => [
-                       'code' => 'nosuchuser',
-                       'info' => "The user you specified doesn't exist"
-               ],
-               'badipaddress' => [ 'code' => 'invalidip', 'info' => 'Invalid IP address specified' ],
-               'ipb_expiry_invalid' => [ 'code' => 'invalidexpiry', 'info' => 'Invalid expiry time' ],
-               'ipb_already_blocked' => [
-                       'code' => 'alreadyblocked',
-                       'info' => 'The user you tried to block was already blocked'
-               ],
-               'ipb_blocked_as_range' => [
-                       'code' => 'blockedasrange',
-                       'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP individually, but you can unblock the range as a whole."
-               ],
-               'ipb_cant_unblock' => [
-                       'code' => 'cantunblock',
-                       'info' => 'The block you specified was not found. It may have been unblocked already'
-               ],
-               'mailnologin' => [
-                       'code' => 'cantsend',
-                       'info' => 'You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email'
-               ],
-               'ipbblocked' => [
-                       'code' => 'ipbblocked',
-                       'info' => 'You cannot block or unblock users while you are yourself blocked'
-               ],
-               'ipbnounblockself' => [
-                       'code' => 'ipbnounblockself',
-                       'info' => 'You are not allowed to unblock yourself'
-               ],
-               'usermaildisabled' => [
-                       'code' => 'usermaildisabled',
-                       'info' => 'User email has been disabled'
-               ],
-               'blockedemailuser' => [
-                       'code' => 'blockedfrommail',
-                       'info' => 'You have been blocked from sending email'
-               ],
-               'notarget' => [
-                       'code' => 'notarget',
-                       'info' => 'You have not specified a valid target for this action'
-               ],
-               'noemail' => [
-                       'code' => 'noemail',
-                       'info' => 'The user has not specified a valid email address, or has chosen not to receive email from other users'
-               ],
-               'rcpatroldisabled' => [
-                       'code' => 'patroldisabled',
-                       'info' => 'Patrolling is disabled on this wiki'
-               ],
-               'markedaspatrollederror-noautopatrol' => [
-                       'code' => 'noautopatrol',
-                       'info' => "You don't have permission to patrol your own changes"
-               ],
-               'delete-toobig' => [
-                       'code' => 'bigdelete',
-                       'info' => "You can't delete this page because it has more than \$1 revisions"
-               ],
-               'movenotallowedfile' => [
-                       'code' => 'cantmovefile',
-                       'info' => "You don't have permission to move files"
-               ],
-               'userrights-no-interwiki' => [
-                       'code' => 'nointerwikiuserrights',
-                       'info' => "You don't have permission to change user rights on other wikis"
-               ],
-               'userrights-nodatabase' => [
-                       'code' => 'nosuchdatabase',
-                       'info' => "Database \"\$1\" does not exist or is not local"
-               ],
-               'nouserspecified' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'noname' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'summaryrequired' => [ 'code' => 'summaryrequired', 'info' => 'Summary required' ],
-               'import-rootpage-invalid' => [
-                       'code' => 'import-rootpage-invalid',
-                       'info' => 'Root page is an invalid title'
-               ],
-               'import-rootpage-nosubpage' => [
-                       'code' => 'import-rootpage-nosubpage',
-                       'info' => 'Namespace "$1" of the root page does not allow subpages'
-               ],
-
-               // API-specific messages
-               'readrequired' => [
-                       'code' => 'readapidenied',
-                       'info' => 'You need read permission to use this module'
-               ],
-               'writedisabled' => [
-                       'code' => 'noapiwrite',
-                       'info' => "Editing of this wiki through the API is disabled. Make sure the \$wgEnableWriteAPI=true; statement is included in the wiki's LocalSettings.php file"
-               ],
-               'writerequired' => [
-                       'code' => 'writeapidenied',
-                       'info' => "You're not allowed to edit this wiki through the API"
-               ],
-               'missingparam' => [ 'code' => 'no$1', 'info' => "The \$1 parameter must be set" ],
-               'invalidtitle' => [ 'code' => 'invalidtitle', 'info' => "Bad title \"\$1\"" ],
-               'nosuchpageid' => [ 'code' => 'nosuchpageid', 'info' => "There is no page with ID \$1" ],
-               'nosuchrevid' => [ 'code' => 'nosuchrevid', 'info' => "There is no revision with ID \$1" ],
-               'nosuchuser' => [ 'code' => 'nosuchuser', 'info' => "User \"\$1\" doesn't exist" ],
-               'invaliduser' => [ 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ],
-               'invalidexpiry' => [ 'code' => 'invalidexpiry', 'info' => "Invalid expiry time \"\$1\"" ],
-               'pastexpiry' => [ 'code' => 'pastexpiry', 'info' => "Expiry time \"\$1\" is in the past" ],
-               'create-titleexists' => [
-                       'code' => 'create-titleexists',
-                       'info' => "Existing titles can't be protected with 'create'"
-               ],
-               'missingtitle-createonly' => [
-                       'code' => 'missingtitle-createonly',
-                       'info' => "Missing titles can only be protected with 'create'"
-               ],
-               'cantblock' => [ 'code' => 'cantblock',
-                       'info' => "You don't have permission to block users"
-               ],
-               'canthide' => [
-                       'code' => 'canthide',
-                       'info' => "You don't have permission to hide user names from the block log"
-               ],
-               'cantblock-email' => [
-                       'code' => 'cantblock-email',
-                       'info' => "You don't have permission to block users from sending email through the wiki"
-               ],
-               'unblock-notarget' => [
-                       'code' => 'notarget',
-                       'info' => 'Either the id or the user parameter must be set'
-               ],
-               'unblock-idanduser' => [
-                       'code' => 'idanduser',
-                       'info' => "The id and user parameters can't be used together"
-               ],
-               'cantunblock' => [
-                       'code' => 'permissiondenied',
-                       'info' => "You don't have permission to unblock users"
-               ],
-               'cannotundelete' => [
-                       'code' => 'cantundelete',
-                       'info' => "Couldn't undelete: the requested revisions may not exist, or may have been undeleted already"
-               ],
-               'permdenied-undelete' => [
-                       'code' => 'permissiondenied',
-                       'info' => "You don't have permission to restore deleted revisions"
-               ],
-               'createonly-exists' => [
-                       'code' => 'articleexists',
-                       'info' => 'The article you tried to create has been created already'
-               ],
-               'nocreate-missing' => [
-                       'code' => 'missingtitle',
-                       'info' => "The article you tried to edit doesn't exist"
-               ],
-               'cantchangecontentmodel' => [
-                       'code' => 'cantchangecontentmodel',
-                       'info' => "You don't have permission to change the content model of a page"
-               ],
-               'nosuchrcid' => [
-                       'code' => 'nosuchrcid',
-                       'info' => "There is no change with rcid \"\$1\""
-               ],
-               'nosuchlogid' => [
-                       'code' => 'nosuchlogid',
-                       'info' => "There is no log entry with ID \"\$1\""
-               ],
-               'protect-invalidaction' => [
-                       'code' => 'protect-invalidaction',
-                       'info' => "Invalid protection type \"\$1\""
-               ],
-               'protect-invalidlevel' => [
-                       'code' => 'protect-invalidlevel',
-                       'info' => "Invalid protection level \"\$1\""
-               ],
-               'toofewexpiries' => [
-                       'code' => 'toofewexpiries',
-                       'info' => "\$1 expiry timestamps were provided where \$2 were needed"
-               ],
-               'cantimport' => [
-                       'code' => 'cantimport',
-                       'info' => "You don't have permission to import pages"
-               ],
-               'cantimport-upload' => [
-                       'code' => 'cantimport-upload',
-                       'info' => "You don't have permission to import uploaded pages"
-               ],
-               'importnofile' => [ 'code' => 'nofile', 'info' => "You didn't upload a file" ],
-               'importuploaderrorsize' => [
-                       'code' => 'filetoobig',
-                       'info' => 'The file you uploaded is bigger than the maximum upload size'
-               ],
-               'importuploaderrorpartial' => [
-                       'code' => 'partialupload',
-                       'info' => 'The file was only partially uploaded'
-               ],
-               'importuploaderrortemp' => [
-                       'code' => 'notempdir',
-                       'info' => 'The temporary upload directory is missing'
-               ],
-               'importcantopen' => [
-                       'code' => 'cantopenfile',
-                       'info' => "Couldn't open the uploaded file"
-               ],
-               'import-noarticle' => [
-                       'code' => 'badinterwiki',
-                       'info' => 'Invalid interwiki title specified'
-               ],
-               'importbadinterwiki' => [
-                       'code' => 'badinterwiki',
-                       'info' => 'Invalid interwiki title specified'
-               ],
-               'import-unknownerror' => [
-                       'code' => 'import-unknownerror',
-                       'info' => "Unknown error on import: \"\$1\""
-               ],
-               'cantoverwrite-sharedfile' => [
-                       'code' => 'cantoverwrite-sharedfile',
-                       'info' => 'The target file exists on a shared repository and you do not have permission to override it'
-               ],
-               'sharedfile-exists' => [
-                       'code' => 'fileexists-sharedrepo-perm',
-                       'info' => 'The target file exists on a shared repository. Use the ignorewarnings parameter to override it.'
-               ],
-               'mustbeposted' => [
-                       'code' => 'mustbeposted',
-                       'info' => "The \$1 module requires a POST request"
-               ],
-               'show' => [
-                       'code' => 'show',
-                       'info' => 'Incorrect parameter - mutually exclusive values may not be supplied'
-               ],
-               'specialpage-cantexecute' => [
-                       'code' => 'specialpage-cantexecute',
-                       'info' => "You don't have permission to view the results of this special page"
-               ],
-               'invalidoldimage' => [
-                       'code' => 'invalidoldimage',
-                       'info' => 'The oldimage parameter has invalid format'
-               ],
-               'nodeleteablefile' => [
-                       'code' => 'nodeleteablefile',
-                       'info' => 'No such old version of the file'
-               ],
-               'fileexists-forbidden' => [
-                       'code' => 'fileexists-forbidden',
-                       'info' => 'A file with name "$1" already exists, and cannot be overwritten.'
-               ],
-               'fileexists-shared-forbidden' => [
-                       'code' => 'fileexists-shared-forbidden',
-                       'info' => 'A file with name "$1" already exists in the shared file repository, and cannot be overwritten.'
-               ],
-               'filerevert-badversion' => [
-                       'code' => 'filerevert-badversion',
-                       'info' => 'There is no previous local version of this file with the provided timestamp.'
-               ],
-
-               // ApiEditPage messages
-               'noimageredirect-anon' => [
-                       'code' => 'noimageredirect-anon',
-                       'info' => "Anonymous users can't create image redirects"
-               ],
-               'noimageredirect-logged' => [
-                       'code' => 'noimageredirect',
-                       'info' => "You don't have permission to create image redirects"
-               ],
-               'spamdetected' => [
-                       'code' => 'spamdetected',
-                       'info' => "Your edit was refused because it contained a spam fragment: \"\$1\""
-               ],
-               'contenttoobig' => [
-                       'code' => 'contenttoobig',
-                       'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes"
-               ],
-               'noedit-anon' => [ 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ],
-               'noedit' => [ 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ],
-               'wasdeleted' => [
-                       'code' => 'pagedeleted',
-                       'info' => 'The page has been deleted since you fetched its timestamp'
-               ],
-               'blankpage' => [
-                       'code' => 'emptypage',
-                       'info' => 'Creating new, empty pages is not allowed'
-               ],
-               'editconflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
-               'hashcheckfailed' => [ 'code' => 'badmd5', 'info' => 'The supplied MD5 hash was incorrect' ],
-               'missingtext' => [
-                       'code' => 'notext',
-                       'info' => 'One of the text, appendtext, prependtext and undo parameters must be set'
-               ],
-               'emptynewsection' => [
-                       'code' => 'emptynewsection',
-                       'info' => 'Creating empty new sections is not possible.'
-               ],
-               'revwrongpage' => [
-                       'code' => 'revwrongpage',
-                       'info' => "r\$1 is not a revision of \"\$2\""
-               ],
-               'undo-failure' => [
-                       'code' => 'undofailure',
-                       'info' => 'Undo failed due to conflicting intermediate edits'
-               ],
-               'content-not-allowed-here' => [
-                       'code' => 'contentnotallowedhere',
-                       'info' => 'Content model "$1" is not allowed at title "$2"'
-               ],
-
-               // Messages from WikiPage::doEit(]
-               'edit-hook-aborted' => [
-                       'code' => 'edit-hook-aborted',
-                       'info' => 'Your edit was aborted by an ArticleSave hook'
-               ],
-               'edit-gone-missing' => [
-                       'code' => 'edit-gone-missing',
-                       'info' => "The page you tried to edit doesn't seem to exist anymore"
-               ],
-               'edit-conflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
-               'edit-already-exists' => [
-                       'code' => 'edit-already-exists',
-                       'info' => 'It seems the page you tried to create already exist'
-               ],
-
-               // uploadMsgs
-               'invalid-file-key' => [ 'code' => 'invalid-file-key', 'info' => 'Not a valid file key' ],
-               'nouploadmodule' => [ 'code' => 'nouploadmodule', 'info' => 'No upload module set' ],
-               'uploaddisabled' => [
-                       'code' => 'uploaddisabled',
-                       'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true'
-               ],
-               'copyuploaddisabled' => [
-                       'code' => 'copyuploaddisabled',
-                       'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.'
-               ],
-               'copyuploadbaddomain' => [
-                       'code' => 'copyuploadbaddomain',
-                       'info' => 'Uploads by URL are not allowed from this domain.'
-               ],
-               'copyuploadbadurl' => [
-                       'code' => 'copyuploadbadurl',
-                       'info' => 'Upload not allowed from this URL.'
-               ],
-
-               'filename-tooshort' => [
-                       'code' => 'filename-tooshort',
-                       'info' => 'The filename is too short'
-               ],
-               'filename-toolong' => [ 'code' => 'filename-toolong', 'info' => 'The filename is too long' ],
-               'illegal-filename' => [
-                       'code' => 'illegal-filename',
-                       'info' => 'The filename is not allowed'
-               ],
-               'filetype-missing' => [
-                       'code' => 'filetype-missing',
-                       'info' => 'The file is missing an extension'
-               ],
-
-               'mustbeloggedin' => [ 'code' => 'mustbeloggedin', 'info' => 'You must be logged in to $1.' ]
-       ];
-       // @codingStandardsIgnoreEnd
-
        /**
         * Helper function for readonly errors
         *
-        * @throws UsageException always
+        * @throws ApiUsageException always
         */
        public function dieReadOnly() {
-               $parsed = $this->parseMsg( [ 'readonlytext' ] );
-               $this->dieUsage( $parsed['info'], $parsed['code'], /* http error */ 0,
-                       [ 'readonlyreason' => wfReadOnlyReason() ] );
+               $this->dieWithError(
+                       'apierror-readonly',
+                       'readonly',
+                       [ 'readonlyreason' => wfReadOnlyReason() ]
+               );
        }
 
        /**
-        * Output the error message related to a certain array
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws UsageException always
+        * Helper function for permission-denied errors
+        * @since 1.29
+        * @param string|string[] $rights
+        * @param User|null $user
+        * @throws ApiUsageException if the user doesn't have any of the rights.
+        *  The error message is based on $rights[0].
         */
-       public function dieUsageMsg( $error ) {
-               # most of the time we send a 1 element, so we might as well send it as
-               # a string and make this an array here.
-               if ( is_string( $error ) ) {
-                       $error = [ $error ];
+       public function checkUserRightsAny( $rights, $user = null ) {
+               if ( !$user ) {
+                       $user = $this->getUser();
+               }
+               $rights = (array)$rights;
+               if ( !call_user_func_array( [ $user, 'isAllowedAny' ], $rights ) ) {
+                       $this->dieWithError( [ 'apierror-permissiondenied', $this->msg( "action-{$rights[0]}" ) ] );
                }
-               $parsed = $this->parseMsg( $error );
-               $extraData = isset( $parsed['data'] ) ? $parsed['data'] : null;
-               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $extraData );
        }
 
        /**
-        * Will only set a warning instead of failing if the global $wgDebugAPI
-        * is set to true. Otherwise behaves exactly as dieUsageMsg().
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws UsageException
-        * @since 1.21
+        * Helper function for permission-denied errors
+        * @since 1.29
+        * @param Title $title
+        * @param string|string[] $actions
+        * @param User|null $user
+        * @throws ApiUsageException if the user doesn't have all of the rights.
         */
-       public function dieUsageMsgOrDebug( $error ) {
-               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
-                       $this->dieUsageMsg( $error );
+       public function checkTitleUserPermissions( Title $title, $actions, $user = null ) {
+               if ( !$user ) {
+                       $user = $this->getUser();
                }
 
-               if ( is_string( $error ) ) {
-                       $error = [ $error ];
+               $errors = [];
+               foreach ( (array)$actions as $action ) {
+                       $errors = array_merge( $errors, $title->getUserPermissionsErrors( $action, $user ) );
+               }
+               if ( $errors ) {
+                       $this->dieStatus( $this->errorArrayToStatus( $errors, $user ) );
                }
-               $parsed = $this->parseMsg( $error );
-               $this->setWarning( '$wgDebugAPI: ' . $parsed['code'] . ' - ' . $parsed['info'] );
        }
 
        /**
-        * Die with the $prefix.'badcontinue' error. This call is common enough to
-        * make it into the base method.
-        * @param bool $condition Will only die if this value is true
-        * @throws UsageException
-        * @since 1.21
+        * Will only set a warning instead of failing if the global $wgDebugAPI
+        * is set to true. Otherwise behaves exactly as self::dieWithError().
+        *
+        * @since 1.29
+        * @param string|array|Message $msg
+        * @param string|null $code
+        * @param array|null $data
+        * @param int|null $httpCode
+        * @throws ApiUsageException
         */
-       protected function dieContinueUsageIf( $condition ) {
-               if ( $condition ) {
-                       $this->dieUsage(
-                               'Invalid continue param. You should pass the original value returned by the previous query',
-                               'badcontinue' );
+       public function dieWithErrorOrDebug( $msg, $code = null, $data = null, $httpCode = null ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
+                       $this->dieWithError( $msg, $code, $data, $httpCode );
+               } else {
+                       $this->addWarning( $msg, $code, $data );
                }
        }
 
        /**
-        * Return the error message related to a certain array
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @return [ 'code' => code, 'info' => info ]
+        * Die with the 'badcontinue' error.
+        *
+        * This call is common enough to make it into the base method.
+        *
+        * @param bool $condition Will only die if this value is true
+        * @throws ApiUsageException
+        * @since 1.21
         */
-       public function parseMsg( $error ) {
-               // Check whether someone passed the whole array, instead of one element as
-               // documented. This breaks if it's actually an array of fallback keys, but
-               // that's long-standing misbehavior introduced in r87627 to incorrectly
-               // fix T30797.
-               if ( is_array( $error ) ) {
-                       $first = reset( $error );
-                       if ( is_array( $first ) ) {
-                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
-                               $error = $first;
-                       }
-               }
-
-               $msg = Message::newFromSpecifier( $error );
-
-               if ( $msg instanceof IApiMessage ) {
-                       return [
-                               'code' => $msg->getApiCode(),
-                               'info' => $msg->inLanguage( 'en' )->useDatabase( false )->text(),
-                               'data' => $msg->getApiData()
-                       ];
-               }
-
-               $key = $msg->getKey();
-               if ( isset( self::$messageMap[$key] ) ) {
-                       $params = $msg->getParams();
-                       return [
-                               'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $params ),
-                               'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $params )
-                       ];
+       protected function dieContinueUsageIf( $condition ) {
+               if ( $condition ) {
+                       $this->dieWithError( 'apierror-badcontinue' );
                }
-
-               // If the key isn't present, throw an "unknown error"
-               return $this->parseMsg( [ 'unknownerror', $key ] );
        }
 
        /**
@@ -2323,6 +1934,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Write logging information for API features to a debug log, for usage
         * analysis.
+        * @note Consider using $this->addDeprecation() instead to both warn and log.
         * @param string $feature Feature being used.
         */
        public function logFeatureUsage( $feature ) {
@@ -2360,7 +1972,10 @@ abstract class ApiBase extends ContextSource {
         */
        public function getFinalDescription() {
                $desc = $this->getDescription();
-               Hooks::run( 'APIGetDescription', [ &$this, &$desc ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetDescription', [ &$apiModule, &$desc ] );
                $desc = self::escapeWikiText( $desc );
                if ( is_array( $desc ) ) {
                        $desc = implode( "\n", $desc );
@@ -2408,7 +2023,9 @@ abstract class ApiBase extends ContextSource {
                        ] + ( isset( $params['token'] ) ? $params['token'] : [] );
                }
 
-               Hooks::run( 'APIGetAllowedParams', [ &$this, &$params, $flags ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetAllowedParams', [ &$apiModule, &$params, $flags ] );
 
                return $params;
        }
@@ -2426,7 +2043,10 @@ abstract class ApiBase extends ContextSource {
                $path = $this->getModulePath();
 
                $desc = $this->getParamDescription();
-               Hooks::run( 'APIGetParamDescription', [ &$this, &$desc ] );
+
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $apiModule = $this;
+               Hooks::run( 'APIGetParamDescription', [ &$apiModule, &$desc ] );
 
                if ( !$desc ) {
                        $desc = [];
@@ -2673,7 +2293,7 @@ abstract class ApiBase extends ContextSource {
         * "apihelp-{$this->getModulePath()}-description".
         *
         * @deprecated since 1.25
-        * @return Message|string|array
+        * @return Message|string|array|false
         */
        protected function getDescription() {
                return false;
@@ -2790,6 +2410,301 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
+       /**
+        * @deprecated since 1.29, use ApiBase::addWarning() instead
+        * @param string $warning Warning message
+        */
+       public function setWarning( $warning ) {
+               $msg = new ApiRawMessage( $warning, 'warning' );
+               $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg );
+       }
+
+       /**
+        * Throw an ApiUsageException, which will (if uncaught) call the main module's
+        * error handler and die with an error message.
+        *
+        * @deprecated since 1.29, use self::dieWithError() instead
+        * @param string $description One-line human-readable description of the
+        *   error condition, e.g., "The API requires a valid action parameter"
+        * @param string $errorCode Brief, arbitrary, stable string to allow easy
+        *   automated identification of the error, e.g., 'unknown_action'
+        * @param int $httpRespCode HTTP response code
+        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
+        * @throws ApiUsageException always
+        */
+       public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
+               $this->dieWithError(
+                       new RawMessage( '$1', [ $description ] ),
+                       $errorCode,
+                       $extradata,
+                       $httpRespCode
+               );
+       }
+
+       /**
+        * Get error (as code, string) from a Status object.
+        *
+        * @since 1.23
+        * @deprecated since 1.29, use ApiErrorFormatter::arrayFromStatus instead
+        * @param Status $status
+        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
+        * @return array Array of code and error string
+        * @throws MWException
+        */
+       public function getErrorFromStatus( $status, &$extraData = null ) {
+               if ( $status->isGood() ) {
+                       throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
+               }
+
+               $errors = $status->getErrorsByType( 'error' );
+               if ( !$errors ) {
+                       // No errors? Assume the warnings should be treated as errors
+                       $errors = $status->getErrorsByType( 'warning' );
+               }
+               if ( !$errors ) {
+                       // Still no errors? Punt
+                       $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
+               }
+
+               if ( $errors[0]['message'] instanceof MessageSpecifier ) {
+                       $msg = $errors[0]['message'];
+               } else {
+                       $msg = new Message( $errors[0]['message'], $errors[0]['params'] );
+               }
+               if ( !$msg instanceof IApiMessage ) {
+                       $key = $msg->getKey();
+                       $params = $msg->getParams();
+                       array_unshift( $params, isset( self::$messageMap[$key] ) ? self::$messageMap[$key] : $key );
+                       $msg = ApiMessage::create( $params );
+               }
+
+               return [
+                       $msg->getApiCode(),
+                       ApiErrorFormatter::stripMarkup( $msg->inLanguage( 'en' )->useDatabase( false )->text() )
+               ];
+       }
+
+       /**
+        * @deprecated since 1.29. Prior to 1.29, this was a public mapping from
+        *  arbitrary strings (often message keys used elsewhere in MediaWiki) to
+        *  API codes and message texts, and a few interfaces required poking
+        *  something in here. Now we're repurposing it to map those same strings
+        *  to i18n messages, and declaring that any interface that requires poking
+        *  at this is broken and needs replacing ASAP.
+        */
+       private static $messageMap = [
+               'unknownerror' => 'apierror-unknownerror',
+               'unknownerror-nocode' => 'apierror-unknownerror-nocode',
+               'ns-specialprotected' => 'ns-specialprotected',
+               'protectedinterface' => 'protectedinterface',
+               'namespaceprotected' => 'namespaceprotected',
+               'customcssprotected' => 'customcssprotected',
+               'customjsprotected' => 'customjsprotected',
+               'cascadeprotected' => 'cascadeprotected',
+               'protectedpagetext' => 'protectedpagetext',
+               'protect-cantedit' => 'protect-cantedit',
+               'deleteprotected' => 'deleteprotected',
+               'badaccess-group0' => 'badaccess-group0',
+               'badaccess-groups' => 'badaccess-groups',
+               'titleprotected' => 'titleprotected',
+               'nocreate-loggedin' => 'nocreate-loggedin',
+               'nocreatetext' => 'nocreatetext',
+               'movenologintext' => 'movenologintext',
+               'movenotallowed' => 'movenotallowed',
+               'confirmedittext' => 'confirmedittext',
+               'blockedtext' => 'apierror-blocked',
+               'autoblockedtext' => 'apierror-autoblocked',
+               'systemblockedtext' => 'apierror-systemblocked',
+               'actionthrottledtext' => 'apierror-ratelimited',
+               'alreadyrolled' => 'alreadyrolled',
+               'cantrollback' => 'cantrollback',
+               'readonlytext' => 'readonlytext',
+               'sessionfailure' => 'sessionfailure',
+               'cannotdelete' => 'cannotdelete',
+               'notanarticle' => 'apierror-missingtitle',
+               'selfmove' => 'selfmove',
+               'immobile_namespace' => 'apierror-immobilenamespace',
+               'articleexists' => 'articleexists',
+               'hookaborted' => 'hookaborted',
+               'cantmove-titleprotected' => 'cantmove-titleprotected',
+               'imagenocrossnamespace' => 'imagenocrossnamespace',
+               'imagetypemismatch' => 'imagetypemismatch',
+               'ip_range_invalid' => 'ip_range_invalid',
+               'range_block_disabled' => 'range_block_disabled',
+               'nosuchusershort' => 'nosuchusershort',
+               'badipaddress' => 'badipaddress',
+               'ipb_expiry_invalid' => 'ipb_expiry_invalid',
+               'ipb_already_blocked' => 'ipb_already_blocked',
+               'ipb_blocked_as_range' => 'ipb_blocked_as_range',
+               'ipb_cant_unblock' => 'ipb_cant_unblock',
+               'mailnologin' => 'apierror-cantsend',
+               'ipbblocked' => 'ipbblocked',
+               'ipbnounblockself' => 'ipbnounblockself',
+               'usermaildisabled' => 'usermaildisabled',
+               'blockedemailuser' => 'apierror-blockedfrommail',
+               'notarget' => 'apierror-notarget',
+               'noemail' => 'noemail',
+               'rcpatroldisabled' => 'rcpatroldisabled',
+               'markedaspatrollederror-noautopatrol' => 'markedaspatrollederror-noautopatrol',
+               'delete-toobig' => 'delete-toobig',
+               'movenotallowedfile' => 'movenotallowedfile',
+               'userrights-no-interwiki' => 'userrights-no-interwiki',
+               'userrights-nodatabase' => 'userrights-nodatabase',
+               'nouserspecified' => 'nouserspecified',
+               'noname' => 'noname',
+               'summaryrequired' => 'apierror-summaryrequired',
+               'import-rootpage-invalid' => 'import-rootpage-invalid',
+               'import-rootpage-nosubpage' => 'import-rootpage-nosubpage',
+               'readrequired' => 'apierror-readapidenied',
+               'writedisabled' => 'apierror-noapiwrite',
+               'writerequired' => 'apierror-writeapidenied',
+               'missingparam' => 'apierror-missingparam',
+               'invalidtitle' => 'apierror-invalidtitle',
+               'nosuchpageid' => 'apierror-nosuchpageid',
+               'nosuchrevid' => 'apierror-nosuchrevid',
+               'nosuchuser' => 'nosuchusershort',
+               'invaliduser' => 'apierror-invaliduser',
+               'invalidexpiry' => 'apierror-invalidexpiry',
+               'pastexpiry' => 'apierror-pastexpiry',
+               'create-titleexists' => 'apierror-create-titleexists',
+               'missingtitle-createonly' => 'apierror-missingtitle-createonly',
+               'cantblock' => 'apierror-cantblock',
+               'canthide' => 'apierror-canthide',
+               'cantblock-email' => 'apierror-cantblock-email',
+               'cantunblock' => 'apierror-permissiondenied-generic',
+               'cannotundelete' => 'cannotundelete',
+               'permdenied-undelete' => 'apierror-permissiondenied-generic',
+               'createonly-exists' => 'apierror-articleexists',
+               'nocreate-missing' => 'apierror-missingtitle',
+               'cantchangecontentmodel' => 'apierror-cantchangecontentmodel',
+               'nosuchrcid' => 'apierror-nosuchrcid',
+               'nosuchlogid' => 'apierror-nosuchlogid',
+               'protect-invalidaction' => 'apierror-protect-invalidaction',
+               'protect-invalidlevel' => 'apierror-protect-invalidlevel',
+               'toofewexpiries' => 'apierror-toofewexpiries',
+               'cantimport' => 'apierror-cantimport',
+               'cantimport-upload' => 'apierror-cantimport-upload',
+               'importnofile' => 'importnofile',
+               'importuploaderrorsize' => 'importuploaderrorsize',
+               'importuploaderrorpartial' => 'importuploaderrorpartial',
+               'importuploaderrortemp' => 'importuploaderrortemp',
+               'importcantopen' => 'importcantopen',
+               'import-noarticle' => 'import-noarticle',
+               'importbadinterwiki' => 'importbadinterwiki',
+               'import-unknownerror' => 'apierror-import-unknownerror',
+               'cantoverwrite-sharedfile' => 'apierror-cantoverwrite-sharedfile',
+               'sharedfile-exists' => 'apierror-fileexists-sharedrepo-perm',
+               'mustbeposted' => 'apierror-mustbeposted',
+               'show' => 'apierror-show',
+               'specialpage-cantexecute' => 'apierror-specialpage-cantexecute',
+               'invalidoldimage' => 'apierror-invalidoldimage',
+               'nodeleteablefile' => 'apierror-nodeleteablefile',
+               'fileexists-forbidden' => 'fileexists-forbidden',
+               'fileexists-shared-forbidden' => 'fileexists-shared-forbidden',
+               'filerevert-badversion' => 'filerevert-badversion',
+               'noimageredirect-anon' => 'apierror-noimageredirect-anon',
+               'noimageredirect-logged' => 'apierror-noimageredirect',
+               'spamdetected' => 'apierror-spamdetected',
+               'contenttoobig' => 'apierror-contenttoobig',
+               'noedit-anon' => 'apierror-noedit-anon',
+               'noedit' => 'apierror-noedit',
+               'wasdeleted' => 'apierror-pagedeleted',
+               'blankpage' => 'apierror-emptypage',
+               'editconflict' => 'editconflict',
+               'hashcheckfailed' => 'apierror-badmd5',
+               'missingtext' => 'apierror-notext',
+               'emptynewsection' => 'apierror-emptynewsection',
+               'revwrongpage' => 'apierror-revwrongpage',
+               'undo-failure' => 'undo-failure',
+               'content-not-allowed-here' => 'content-not-allowed-here',
+               'edit-hook-aborted' => 'edit-hook-aborted',
+               'edit-gone-missing' => 'edit-gone-missing',
+               'edit-conflict' => 'edit-conflict',
+               'edit-already-exists' => 'edit-already-exists',
+               'invalid-file-key' => 'apierror-invalid-file-key',
+               'nouploadmodule' => 'apierror-nouploadmodule',
+               'uploaddisabled' => 'uploaddisabled',
+               'copyuploaddisabled' => 'copyuploaddisabled',
+               'copyuploadbaddomain' => 'apierror-copyuploadbaddomain',
+               'copyuploadbadurl' => 'apierror-copyuploadbadurl',
+               'filename-tooshort' => 'filename-tooshort',
+               'filename-toolong' => 'filename-toolong',
+               'illegal-filename' => 'illegal-filename',
+               'filetype-missing' => 'filetype-missing',
+               'mustbeloggedin' => 'apierror-mustbeloggedin',
+       ];
+
+       /**
+        * @deprecated do not use
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @return ApiMessage
+        */
+       private function parseMsgInternal( $error ) {
+               $msg = Message::newFromSpecifier( $error );
+               if ( !$msg instanceof IApiMessage ) {
+                       $key = $msg->getKey();
+                       if ( isset( self::$messageMap[$key] ) ) {
+                               $params = $msg->getParams();
+                               array_unshift( $params, self::$messageMap[$key] );
+                       } else {
+                               $params = [ 'apierror-unknownerror', wfEscapeWikiText( $key ) ];
+                       }
+                       $msg = ApiMessage::create( $params );
+               }
+               return $msg;
+       }
+
+       /**
+        * Return the error message related to a certain array
+        * @deprecated since 1.29
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @return [ 'code' => code, 'info' => info ]
+        */
+       public function parseMsg( $error ) {
+               // Check whether someone passed the whole array, instead of one element as
+               // documented. This breaks if it's actually an array of fallback keys, but
+               // that's long-standing misbehavior introduced in r87627 to incorrectly
+               // fix T30797.
+               if ( is_array( $error ) ) {
+                       $first = reset( $error );
+                       if ( is_array( $first ) ) {
+                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
+                               $error = $first;
+                       }
+               }
+
+               $msg = $this->parseMsgInternal( $error );
+               return [
+                       'code' => $msg->getApiCode(),
+                       'info' => ApiErrorFormatter::stripMarkup(
+                               $msg->inLanguage( 'en' )->useDatabase( false )->text()
+                       ),
+                       'data' => $msg->getApiData()
+               ];
+       }
+
+       /**
+        * Output the error message related to a certain array
+        * @deprecated since 1.29, use ApiBase::dieWithError() instead
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @throws ApiUsageException always
+        */
+       public function dieUsageMsg( $error ) {
+               $this->dieWithError( $this->parseMsgInternal( $error ) );
+       }
+
+       /**
+        * Will only set a warning instead of failing if the global $wgDebugAPI
+        * is set to true. Otherwise behaves exactly as dieUsageMsg().
+        * @deprecated since 1.29, use ApiBase::dieWithErrorOrDebug() instead
+        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
+        * @throws ApiUsageException
+        * @since 1.21
+        */
+       public function dieUsageMsgOrDebug( $error ) {
+               $this->dieWithErrorOrDebug( $this->parseMsgInternal( $error ) );
+       }
+
        /**@}*/
 }
 
index e4c9d0a..58e3d1c 100644 (file)
@@ -39,43 +39,57 @@ class ApiBlock extends ApiBase {
         * of success. If it fails, the result will specify the nature of the error.
         */
        public function execute() {
-               global $wgContLang;
+               $this->checkUserRightsAny( 'block' );
 
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( !$user->isAllowed( 'block' ) ) {
-                       $this->dieUsageMsg( 'cantblock' );
-               }
+               $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
                # bug 15810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
-                               $msg = $this->parseMsg( $status );
-                               $this->dieUsage(
-                                       $msg['info'],
-                                       $msg['code'],
-                                       0,
+                               $this->dieWithError(
+                                       $status,
+                                       null,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
                        }
                }
 
-               $target = User::newFromName( $params['user'] );
-               // Bug 38633 - if the target is a user (not an IP address), but it
-               // doesn't exist or is unusable, error.
-               if ( $target instanceof User &&
-                       ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
-               ) {
-                       $this->dieUsageMsg( [ 'nosuchuser', $params['user'] ] );
+               if ( $params['userid'] !== null ) {
+                       $username = User::whoIs( $params['userid'] );
+
+                       if ( $username === false ) {
+                               $this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
+                       } else {
+                               $params['user'] = $username;
+                       }
+               } else {
+                       $target = User::newFromName( $params['user'] );
+
+                       // Bug 38633 - if the target is a user (not an IP address), but it
+                       // doesn't exist or is unusable, error.
+                       if ( $target instanceof User &&
+                               ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
+                       ) {
+                               $this->dieWithError( [ 'nosuchusershort', $params['user'] ], 'nosuchuser' );
+                       }
+               }
+
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                if ( $params['hidename'] && !$user->isAllowed( 'hideuser' ) ) {
-                       $this->dieUsageMsg( 'canthide' );
+                       $this->dieWithError( 'apierror-canthide' );
                }
                if ( $params['noemail'] && !SpecialBlock::canBlockEmail( $user ) ) {
-                       $this->dieUsageMsg( 'cantblock-email' );
+                       $this->dieWithError( 'apierror-cantblock-email' );
                }
 
                $data = [
@@ -96,12 +110,12 @@ class ApiBlock extends ApiBase {
                        'Reblock' => $params['reblock'],
                        'Watch' => $params['watchuser'],
                        'Confirm' => true,
+                       'Tags' => $params['tags'],
                ];
 
                $retval = SpecialBlock::processForm( $data, $this->getContext() );
                if ( $retval !== true ) {
-                       // We don't care about multiple errors, just report one of them
-                       $this->dieUsageMsg( $retval );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval ) );
                }
 
                list( $target, /*...*/ ) = SpecialBlock::getTargetAndType( $params['user'] );
@@ -110,7 +124,7 @@ class ApiBlock extends ApiBase {
 
                $block = Block::newFromTarget( $target, null, true );
                if ( $block instanceof Block ) {
-                       $res['expiry'] = $wgContLang->formatExpiry( $block->mExpiry, TS_ISO_8601, 'infinite' );
+                       $res['expiry'] = ApiResult::formatExpiry( $block->mExpiry, 'infinite' );
                        $res['id'] = $block->getId();
                } else {
                        # should be unreachable
@@ -142,7 +156,9 @@ class ApiBlock extends ApiBase {
                return [
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user',
-                               ApiBase::PARAM_REQUIRED => true
+                       ],
+                       'userid' => [
+                               ApiBase::PARAM_TYPE => 'integer',
                        ],
                        'expiry' => 'never',
                        'reason' => '',
@@ -154,6 +170,10 @@ class ApiBlock extends ApiBase {
                        'allowusertalk' => false,
                        'reblock' => false,
                        'watchuser' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 5a0edfc..4139019 100644 (file)
@@ -137,8 +137,11 @@ class ApiCSPReport extends ApiBase {
                }
                $status = FormatJson::parse( $postBody, FormatJson::FORCE_ASSOC );
                if ( !$status->isGood() ) {
-                       list( $code, ) = $this->getErrorFromStatus( $status );
-                       $this->error( $code, __METHOD__ );
+                       $msg = $status->getErrors()[0]['message'];
+                       if ( $msg instanceof Message ) {
+                               $msg = $msg->getKey();
+                       }
+                       $this->error( $msg, __METHOD__ );
                }
 
                $report = $status->getValue();
@@ -176,7 +179,7 @@ class ApiCSPReport extends ApiBase {
         *
         * @param $code String error code
         * @param $method String method that made error
-        * @throws UsageException Always
+        * @throws ApiUsageException Always
         */
        private function error( $code, $method ) {
                $this->log->info( 'Error reading CSP report: ' . $code, [
@@ -184,7 +187,9 @@ class ApiCSPReport extends ApiBase {
                        'user-agent' => $this->getRequest()->getHeader( 'user-agent' )
                ] );
                // 500 so it shows up in browser's developer console.
-               $this->dieUsage( "Error processing CSP report: $code", 'cspreport-' . $code, 500 );
+               $this->dieWithError(
+                       [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 500
+               );
        }
 
        public function getAllowedParams() {
index aea2819..c25920e 100644 (file)
@@ -35,7 +35,7 @@ class ApiChangeAuthenticationData extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to change authentication data', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-changeauthenticationdata', 'notloggedin' );
                }
 
                $helper = new ApiAuthManagerHelper( $this );
@@ -50,7 +50,7 @@ class ApiChangeAuthenticationData extends ApiBase {
                        $this->getConfig()->get( 'ChangeCredentialsBlacklist' )
                );
                if ( count( $reqs ) !== 1 ) {
-                       $this->dieUsage( 'Failed to create change request', 'badrequest' );
+                       $this->dieWithError( 'apierror-changeauth-norequest', 'badrequest' );
                }
                $req = reset( $reqs );
 
index dd88b5f..3cc7a8a 100644 (file)
@@ -43,9 +43,7 @@ class ApiCheckToken extends ApiBase {
                );
 
                if ( substr( $token, -strlen( urldecode( Token::SUFFIX ) ) ) === urldecode( Token::SUFFIX ) ) {
-                       $this->setWarning(
-                               "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL."
-                       );
+                       $this->addWarning( 'apiwarn-checktoken-percentencoding' );
                }
 
                if ( $tokenObj->match( $token, $maxage ) ) {
index 99242a8..a5474b5 100644 (file)
 class ApiClearHasMsg extends ApiBase {
        public function execute() {
                $user = $this->getUser();
-               if ( $this->getRequest()->wasPosted() ) {
-                       $user->setNewtalk( false );
-               } else {
-                       DeferredUpdates::addCallableUpdate( function () use ( $user ) {
-                               $user->setNewtalk( false );
-                       } );
-               }
+               $user->setNewtalk( false );
                $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
        }
 
index cbb1524..3f5bc0c 100644 (file)
@@ -57,8 +57,8 @@ class ApiClientLogin extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 7eb0bf3..d6867eb 100644 (file)
@@ -34,8 +34,7 @@ class ApiComparePages extends ApiBase {
                $revision = Revision::newFromId( $rev1 );
 
                if ( !$revision ) {
-                       $this->dieUsage( 'The diff cannot be retrieved, ' .
-                               'one revision does not exist or you do not have permission to view it.', 'baddiff' );
+                       $this->dieWithError( 'apierror-baddiff' );
                }
 
                $contentHandler = $revision->getContentHandler();
@@ -65,11 +64,7 @@ class ApiComparePages extends ApiBase {
                $difftext = $de->getDiffBody();
 
                if ( $difftext === false ) {
-                       $this->dieUsage(
-                               'The diff cannot be retrieved. Maybe one or both revisions do ' .
-                                       'not exist or you do not have permission to view them.',
-                               'baddiff'
-                       );
+                       $this->dieWithError( 'apierror-baddiff' );
                }
 
                ApiResult::setContentValue( $vals, 'body', $difftext );
@@ -89,22 +84,19 @@ class ApiComparePages extends ApiBase {
                } elseif ( $titleText ) {
                        $title = Title::newFromText( $titleText );
                        if ( !$title || $title->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $titleText ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titleText ) ] );
                        }
 
                        return $title->getLatestRevID();
                } elseif ( $titleId ) {
                        $title = Title::newFromID( $titleId );
                        if ( !$title ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $titleId ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $titleId ] );
                        }
 
                        return $title->getLatestRevID();
                }
-               $this->dieUsage(
-                       'A title, a page ID, or a revision number is needed for both the from and the to parameters',
-                       'inputneeded'
-               );
+               $this->dieWithError( 'apierror-compare-inputneeded', 'inputneeded' );
        }
 
        public function getAllowedParams() {
index 19e2453..7da8ed9 100644 (file)
@@ -40,7 +40,7 @@ class ApiContinuationManager {
         * @param ApiBase $module Module starting the continuation
         * @param ApiBase[] $allModules Contains ApiBase instances that will be executed
         * @param array $generatedModules Names of modules that depend on the generator
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function __construct(
                ApiBase $module, array $allModules = [], array $generatedModules = []
@@ -57,10 +57,7 @@ class ApiContinuationManager {
                if ( $continue !== '' ) {
                        $continue = explode( '||', $continue );
                        if ( count( $continue ) !== 2 ) {
-                               throw new UsageException(
-                                       'Invalid continue param. You should pass the original value returned by the previous query',
-                                       'badcontinue'
-                               );
+                               throw ApiUsageException::newWithMessage( $module->getMain(), 'apierror-badcontinue' );
                        }
                        $this->generatorDone = ( $continue[0] === '-' );
                        $skip = explode( '|', $continue[1] );
index 993c23e..50c24ae 100644 (file)
@@ -45,7 +45,7 @@ class ApiDelete extends ApiBase {
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
                if ( !$pageObj->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                $titleObj = $pageObj->getTitle();
@@ -53,10 +53,7 @@ class ApiDelete extends ApiBase {
                $user = $this->getUser();
 
                // Check that the user is allowed to carry out the deletion
-               $errors = $titleObj->getUserPermissionsErrors( 'delete', $user );
-               if ( count( $errors ) ) {
-                       $this->dieUsageMsg( $errors[0] );
-               }
+               $this->checkTitleUserPermissions( $titleObj, 'delete' );
 
                // If change tagging was requested, check that the user is allowed to tag,
                // and the tags are valid
@@ -80,9 +77,6 @@ class ApiDelete extends ApiBase {
                        $status = self::delete( $pageObj, $user, $reason, $params['tags'] );
                }
 
-               if ( is_array( $status ) ) {
-                       $this->dieUsageMsg( $status[0] );
-               }
                if ( !$status->isGood() ) {
                        $this->dieStatus( $status );
                }
@@ -112,7 +106,7 @@ class ApiDelete extends ApiBase {
         * @param User $user User doing the action
         * @param string|null $reason Reason for the deletion. Autogenerated if null
         * @param array $tags Tags to tag the deletion with
-        * @return Status|array
+        * @return Status
         */
        protected static function delete( Page $page, User $user, &$reason = null, $tags = [] ) {
                $title = $page->getTitle();
@@ -124,7 +118,7 @@ class ApiDelete extends ApiBase {
                        $hasHistory = false;
                        $reason = $page->getAutoDeleteReason( $hasHistory );
                        if ( $reason === false ) {
-                               return [ [ 'cannotdelete', $title->getPrefixedText() ] ];
+                               return Status::newFatal( 'cannotdelete', $title->getPrefixedText() );
                        }
                }
 
@@ -141,7 +135,7 @@ class ApiDelete extends ApiBase {
         * @param string $reason Reason for the deletion. Autogenerated if null.
         * @param bool $suppress Whether to mark all deleted versions as restricted
         * @param array $tags Tags to tag the deletion with
-        * @return Status|array
+        * @return Status
         */
        protected static function deleteFile( Page $page, User $user, $oldimage,
                &$reason = null, $suppress = false, $tags = []
@@ -155,11 +149,11 @@ class ApiDelete extends ApiBase {
 
                if ( $oldimage ) {
                        if ( !FileDeleteForm::isValidOldSpec( $oldimage ) ) {
-                               return [ [ 'invalidoldimage' ] ];
+                               return Status::newFatal( 'invalidoldimage' );
                        }
                        $oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $oldimage );
                        if ( !$oldfile->exists() || !$oldfile->isLocal() || $oldfile->getRedirected() ) {
-                               return [ [ 'nodeleteablefile' ] ];
+                               return Status::newFatal( 'nodeleteablefile' );
                        }
                }
 
index fc97522..41bf9b6 100644 (file)
@@ -37,7 +37,7 @@
 class ApiDisabled extends ApiBase {
 
        public function execute() {
-               $this->dieUsage( "The \"{$this->getModuleName()}\" module has been disabled.", 'moduledisabled' );
+               $this->dieWithError( [ 'apierror-moduledisabled', $this->getModuleName() ] );
        }
 
        public function isReadMode() {
index d6de834..b45be31 100644 (file)
@@ -40,12 +40,7 @@ class ApiEditPage extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( is_null( $params['text'] ) && is_null( $params['appendtext'] ) &&
-                       is_null( $params['prependtext'] ) &&
-                       $params['undo'] == 0
-               ) {
-                       $this->dieUsageMsg( 'missingtext' );
-               }
+               $this->requireAtLeastOneParameter( $params, 'text', 'appendtext', 'prependtext', 'undo' );
 
                $pageObj = $this->getTitleOrPageId( $params );
                $titleObj = $pageObj->getTitle();
@@ -55,9 +50,7 @@ class ApiEditPage extends ApiBase {
                        if ( $params['prependtext'] === null && $params['appendtext'] === null
                                && $params['section'] !== 'new'
                        ) {
-                               $this->dieUsage( 'You have attempted to edit using the "redirect"-following'
-                                       . ' mode, which must be used in conjuction with section=new, prependtext'
-                                       . ', or appendtext.', 'redirect-appendonly' );
+                               $this->dieWithError( 'apierror-redirect-appendonly' );
                        }
                        if ( $titleObj->isRedirect() ) {
                                $oldTitle = $titleObj;
@@ -105,10 +98,7 @@ class ApiEditPage extends ApiBase {
                if ( $params['undo'] > 0 ) {
                        // allow undo via api
                } elseif ( $contentHandler->supportsDirectApiEditing() === false ) {
-                       $this->dieUsage(
-                               "Direct editing via API is not supported for content model $model used by $name",
-                               'no-direct-editing'
-                       );
+                       $this->dieWithError( [ 'apierror-no-direct-editing', $model, $name ] );
                }
 
                if ( !isset( $params['contentformat'] ) || $params['contentformat'] == '' ) {
@@ -118,49 +108,21 @@ class ApiEditPage extends ApiBase {
                }
 
                if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
-
-                       $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
-                               " $model used by $name", 'badformat' );
+                       $this->dieWithError( [ 'apierror-badformat', $contentFormat, $model, $name ] );
                }
 
                if ( $params['createonly'] && $titleObj->exists() ) {
-                       $this->dieUsageMsg( 'createonly-exists' );
+                       $this->dieWithError( 'apierror-articleexists' );
                }
                if ( $params['nocreate'] && !$titleObj->exists() ) {
-                       $this->dieUsageMsg( 'nocreate-missing' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                // Now let's check whether we're even allowed to do this
-               $errors = $titleObj->getUserPermissionsErrors( 'edit', $user );
-               if ( !$titleObj->exists() ) {
-                       $errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $user ) );
-               }
-               if ( count( $errors ) ) {
-                       if ( is_array( $errors[0] ) ) {
-                               switch ( $errors[0][0] ) {
-                                       case 'blockedtext':
-                                               $this->dieUsage(
-                                                       'You have been blocked from editing',
-                                                       'blocked',
-                                                       0,
-                                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                                               );
-                                               break;
-                                       case 'autoblockedtext':
-                                               $this->dieUsage(
-                                                       'Your IP address has been blocked automatically, because it was used by a blocked user',
-                                                       'autoblocked',
-                                                       0,
-                                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                                               );
-                                               break;
-                                       default:
-                                               $this->dieUsageMsg( $errors[0] );
-                               }
-                       } else {
-                               $this->dieUsageMsg( $errors[0] );
-                       }
-               }
+               $this->checkTitleUserPermissions(
+                       $titleObj,
+                       $titleObj->exists() ? 'edit' : [ 'edit', 'create' ]
+               );
 
                $toMD5 = $params['text'];
                if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) ) {
@@ -178,8 +140,9 @@ class ApiEditPage extends ApiBase {
                                        try {
                                                $content = ContentHandler::makeContent( $text, $this->getTitle() );
                                        } catch ( MWContentSerializationException $ex ) {
-                                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
-
+                                               $this->dieWithException( $ex, [
+                                                       'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' )
+                                               ] );
                                                return;
                                        }
                                } else {
@@ -191,17 +154,14 @@ class ApiEditPage extends ApiBase {
                        // @todo Add support for appending/prepending to the Content interface
 
                        if ( !( $content instanceof TextContent ) ) {
-                               $mode = $contentHandler->getModelID();
-                               $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
+                               $modelName = $contentHandler->getModelID();
+                               $this->dieWithError( [ 'apierror-appendnotsupported', $modelName ] );
                        }
 
                        if ( !is_null( $params['section'] ) ) {
                                if ( !$contentHandler->supportsSections() ) {
                                        $modelName = $contentHandler->getModelID();
-                                       $this->dieUsage(
-                                               "Sections are not supported for this content model: $modelName.",
-                                               'sectionsnotsupported'
-                                       );
+                                       $this->dieWithError( [ 'apierror-sectionsnotsupported', $modelName ] );
                                }
 
                                if ( $params['section'] == 'new' ) {
@@ -213,7 +173,7 @@ class ApiEditPage extends ApiBase {
                                        $content = $content->getSection( $section );
 
                                        if ( !$content ) {
-                                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                                               $this->dieWithError( [ 'apierror-nosuchsection', wfEscapeWikiText( $section ) ] );
                                        }
                                }
                        }
@@ -238,22 +198,22 @@ class ApiEditPage extends ApiBase {
                        }
                        $undoRev = Revision::newFromId( $params['undo'] );
                        if ( is_null( $undoRev ) || $undoRev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['undo'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['undo'] ] );
                        }
 
                        if ( $params['undoafter'] == 0 ) {
                                $undoafterRev = $undoRev->getPrevious();
                        }
                        if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['undoafter'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['undoafter'] ] );
                        }
 
                        if ( $undoRev->getPage() != $pageObj->getId() ) {
-                               $this->dieUsageMsg( [ 'revwrongpage', $undoRev->getId(),
+                               $this->dieWithError( [ 'apierror-revwrongpage', $undoRev->getId(),
                                        $titleObj->getPrefixedText() ] );
                        }
                        if ( $undoafterRev->getPage() != $pageObj->getId() ) {
-                               $this->dieUsageMsg( [ 'revwrongpage', $undoafterRev->getId(),
+                               $this->dieWithError( [ 'apierror-revwrongpage', $undoafterRev->getId(),
                                        $titleObj->getPrefixedText() ] );
                        }
 
@@ -264,7 +224,7 @@ class ApiEditPage extends ApiBase {
                        );
 
                        if ( !$newContent ) {
-                               $this->dieUsageMsg( 'undo-failure' );
+                               $this->dieWithError( 'undo-failure', 'undofailure' );
                        }
                        if ( empty( $params['contentmodel'] )
                                && empty( $params['contentformat'] )
@@ -293,7 +253,7 @@ class ApiEditPage extends ApiBase {
 
                // See if the MD5 hash checks out
                if ( !is_null( $params['md5'] ) && md5( $toMD5 ) !== $params['md5'] ) {
-                       $this->dieUsageMsg( 'hashcheckfailed' );
+                       $this->dieWithError( 'apierror-badmd5' );
                }
 
                // EditPage wants to parse its stuff from a WebRequest
@@ -347,14 +307,13 @@ class ApiEditPage extends ApiBase {
                if ( !is_null( $params['section'] ) ) {
                        $section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $section ) ) {
-                               $this->dieUsage( "The section parameter must be a valid section id or 'new'",
-                                       'invalidsection' );
+                               $this->dieWithError( 'apierror-invalidsection' );
                        }
                        $content = $pageObj->getContent();
                        if ( $section !== '0' && $section != 'new'
                                && ( !$content || !$content->getSection( $section ) )
                        ) {
-                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                               $this->dieWithError( [ 'apierror-nosuchsection', $section ] );
                        }
                        $requestArray['wpSection'] = $params['section'];
                } else {
@@ -423,7 +382,7 @@ class ApiEditPage extends ApiBase {
                                return;
                        }
 
-                       $this->dieUsageMsg( 'hookaborted' );
+                       $this->dieWithError( 'hookaborted' );
                }
 
                // Do the actual save
@@ -445,67 +404,22 @@ class ApiEditPage extends ApiBase {
                                        $r['result'] = 'Failure';
                                        $apiResult->addValue( null, $this->getModuleName(), $r );
                                        return;
-                               } else {
-                                       $this->dieUsageMsg( 'hookaborted' );
                                }
-
-                       case EditPage::AS_PARSE_ERROR:
-                               $this->dieUsage( $status->getMessage(), 'parseerror' );
-
-                       case EditPage::AS_IMAGE_REDIRECT_ANON:
-                               $this->dieUsageMsg( 'noimageredirect-anon' );
-
-                       case EditPage::AS_IMAGE_REDIRECT_LOGGED:
-                               $this->dieUsageMsg( 'noimageredirect-logged' );
-
-                       case EditPage::AS_SPAM_ERROR:
-                               $this->dieUsageMsg( [ 'spamdetected', $result['spam'] ] );
+                               if ( !$status->getErrors() ) {
+                                       $status->fatal( 'hookaborted' );
+                               }
+                               $this->dieStatus( $status );
 
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
-                               $this->dieUsage(
-                                       'You have been blocked from editing',
+                               $this->dieWithError(
+                                       'apierror-blocked',
                                        'blocked',
-                                       0,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
 
-                       case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
-                       case EditPage::AS_CONTENT_TOO_BIG:
-                               $this->dieUsageMsg( [ 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ] );
-
-                       case EditPage::AS_READ_ONLY_PAGE_ANON:
-                               $this->dieUsageMsg( 'noedit-anon' );
-
-                       case EditPage::AS_READ_ONLY_PAGE_LOGGED:
-                               $this->dieUsageMsg( 'noedit' );
-
                        case EditPage::AS_READ_ONLY_PAGE:
                                $this->dieReadOnly();
 
-                       case EditPage::AS_RATE_LIMITED:
-                               $this->dieUsageMsg( 'actionthrottledtext' );
-
-                       case EditPage::AS_ARTICLE_WAS_DELETED:
-                               $this->dieUsageMsg( 'wasdeleted' );
-
-                       case EditPage::AS_NO_CREATE_PERMISSION:
-                               $this->dieUsageMsg( 'nocreate-loggedin' );
-
-                       case EditPage::AS_NO_CHANGE_CONTENT_MODEL:
-                               $this->dieUsageMsg( 'cantchangecontentmodel' );
-
-                       case EditPage::AS_BLANK_ARTICLE:
-                               $this->dieUsageMsg( 'blankpage' );
-
-                       case EditPage::AS_CONFLICT_DETECTED:
-                               $this->dieUsageMsg( 'editconflict' );
-
-                       case EditPage::AS_TEXTBOX_EMPTY:
-                               $this->dieUsageMsg( 'emptynewsection' );
-
-                       case EditPage::AS_CHANGE_TAG_ERROR:
-                               $this->dieStatus( $status );
-
                        case EditPage::AS_SUCCESS_NEW_ARTICLE:
                                $r['new'] = true;
                                // fall-through
@@ -526,15 +440,66 @@ class ApiEditPage extends ApiBase {
                                }
                                break;
 
-                       case EditPage::AS_SUMMARY_NEEDED:
-                               // Shouldn't happen since we set wpIgnoreBlankSummary, but just in case
-                               $this->dieUsageMsg( 'summaryrequired' );
-
-                       case EditPage::AS_END:
                        default:
-                               // $status came from WikiPage::doEditContent()
-                               $errors = $status->getErrorsArray();
-                               $this->dieUsageMsg( $errors[0] ); // TODO: Add new errors to message map
+                               if ( !$status->getErrors() ) {
+                                       // EditPage sometimes only sets the status code without setting
+                                       // any actual error messages. Supply defaults for those cases.
+                                       switch ( $status->value ) {
+                                               // Currently needed
+                                               case EditPage::AS_IMAGE_REDIRECT_ANON:
+                                                       $status->fatal( 'apierror-noimageredirect-anon' );
+                                                       break;
+                                               case EditPage::AS_IMAGE_REDIRECT_LOGGED:
+                                                       $status->fatal( 'apierror-noimageredirect-logged' );
+                                                       break;
+                                               case EditPage::AS_CONTENT_TOO_BIG:
+                                               case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
+                                                       $status->fatal( 'apierror-contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) );
+                                                       break;
+                                               case EditPage::AS_READ_ONLY_PAGE_ANON:
+                                                       $status->fatal( 'apierror-noedit-anon' );
+                                                       break;
+                                               case EditPage::AS_NO_CHANGE_CONTENT_MODEL:
+                                                       $status->fatal( 'apierror-cantchangecontentmodel' );
+                                                       break;
+                                               case EditPage::AS_ARTICLE_WAS_DELETED:
+                                                       $status->fatal( 'apierror-pagedeleted' );
+                                                       break;
+                                               case EditPage::AS_CONFLICT_DETECTED:
+                                                       $status->fatal( 'editconflict' );
+                                                       break;
+
+                                               // Currently shouldn't be needed, but here in case
+                                               // hooks use them without setting appropriate
+                                               // errors on the status.
+                                               case EditPage::AS_SPAM_ERROR:
+                                                       $status->fatal( 'apierror-spamdetected', $result['spam'] );
+                                                       break;
+                                               case EditPage::AS_READ_ONLY_PAGE_LOGGED:
+                                                       $status->fatal( 'apierror-noedit' );
+                                                       break;
+                                               case EditPage::AS_RATE_LIMITED:
+                                                       $status->fatal( 'apierror-ratelimited' );
+                                                       break;
+                                               case EditPage::AS_NO_CREATE_PERMISSION:
+                                                       $status->fatal( 'nocreate-loggedin' );
+                                                       break;
+                                               case EditPage::AS_BLANK_ARTICLE:
+                                                       $status->fatal( 'apierror-emptypage' );
+                                                       break;
+                                               case EditPage::AS_TEXTBOX_EMPTY:
+                                                       $status->fatal( 'apierror-emptynewsection' );
+                                                       break;
+                                               case EditPage::AS_SUMMARY_NEEDED:
+                                                       $status->fatal( 'apierror-summaryrequired' );
+                                                       break;
+                                               default:
+                                                       wfWarn( __METHOD__ . ": Unknown EditPage code {$status->value} with no message" );
+                                                       $status->fatal( 'apierror-unknownerror-editpage', $status->value );
+                                                       break;
+                                       }
+                               }
+                               $this->dieStatus( $status );
                                break;
                }
                $apiResult->addValue( null, $this->getModuleName(), $r );
index 192378e..8aff6f8 100644 (file)
@@ -36,7 +36,16 @@ class ApiEmailUser extends ApiBase {
                // Validate target
                $targetUser = SpecialEmailUser::getTarget( $params['target'] );
                if ( !( $targetUser instanceof User ) ) {
-                       $this->dieUsageMsg( [ $targetUser ] );
+                       switch ( $targetUser ) {
+                               case 'notarget':
+                                       $this->dieWithError( 'apierror-notarget' );
+                               case 'noemail':
+                                       $this->dieWithError( [ 'noemail', $params['target'] ] );
+                               case 'nowikiemail':
+                                       $this->dieWithError( 'nowikiemailtext', 'nowikiemail' );
+                               default:
+                                       $this->dieWithError( [ 'apierror-unknownerror', $targetUser ] );
+                       }
                }
 
                // Check permissions and errors
@@ -46,7 +55,7 @@ class ApiEmailUser extends ApiBase {
                        $this->getConfig()
                );
                if ( $error ) {
-                       $this->dieUsageMsg( [ $error ] );
+                       $this->dieWithError( $error );
                }
 
                $data = [
@@ -56,25 +65,16 @@ class ApiEmailUser extends ApiBase {
                        'CCMe' => $params['ccme'],
                ];
                $retval = SpecialEmailUser::submit( $data, $this->getContext() );
-
-               if ( $retval instanceof Status ) {
-                       // SpecialEmailUser sometimes returns a status
-                       // sometimes it doesn't.
-                       if ( $retval->isGood() ) {
-                               $retval = true;
-                       } else {
-                               $retval = $retval->getErrorsArray();
-                       }
+               if ( !$retval instanceof Status ) {
+                       // This is probably the reason
+                       $retval = Status::newFatal( 'hookaborted' );
                }
 
-               if ( $retval === true ) {
-                       $result = [ 'result' => 'Success' ];
-               } else {
-                       $result = [
-                               'result' => 'Failure',
-                               'message' => $retval
-                       ];
-               }
+               $result = array_filter( [
+                       'result' => $retval->isGood() ? 'Success' : $retval->isOk() ? 'Warnings' : 'Failure',
+                       'warnings' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'warning' ),
+                       'errors' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'error' ),
+               ] );
 
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
        }
index 6d9184f..c52b731 100644 (file)
@@ -43,7 +43,9 @@ class ApiErrorFormatter {
         * @param ApiResult $result Into which data will be added
         * @param Language $lang Used for i18n
         * @param string $format
-        *  - text: Error message as wikitext
+        *  - plaintext: Error message as something vaguely like plaintext
+        *    (it's basically wikitext with HTML tags stripped and entities decoded)
+        *  - wikitext: Error message as wikitext
         *  - html: Error message as HTML
         *  - raw: Raw message key and parameters, no human-readable text
         *  - none: Code and data only, no human-readable text
@@ -56,6 +58,15 @@ class ApiErrorFormatter {
                $this->format = $format;
        }
 
+       /**
+        * Fetch the Language for this formatter
+        * @since 1.29
+        * @return Language
+        */
+       public function getLanguage() {
+               return $this->lang;
+       }
+
        /**
         * Fetch a dummy title to set on Messages
         * @return Title
@@ -69,53 +80,49 @@ class ApiErrorFormatter {
 
        /**
         * Add a warning to the result
-        * @param string $moduleName
-        * @param MessageSpecifier|array|string $msg i18n message for the warning
-        * @param string $code Machine-readable code for the warning. Defaults as
-        *   for IApiMessage::getApiCode().
-        * @param array $data Machine-readable data for the warning, if any.
-        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        * @param string|null $modulePath
+        * @param Message|array|string $msg Warning message. See ApiMessage::create().
+        * @param string|null $code See ApiMessage::create().
+        * @param array|null $data See ApiMessage::create().
         */
-       public function addWarning( $moduleName, $msg, $code = null, $data = null ) {
+       public function addWarning( $modulePath, $msg, $code = null, $data = null ) {
                $msg = ApiMessage::create( $msg, $code, $data )
                        ->inLanguage( $this->lang )
                        ->title( $this->getDummyTitle() )
                        ->useDatabase( $this->useDB );
-               $this->addWarningOrError( 'warning', $moduleName, $msg );
+               $this->addWarningOrError( 'warning', $modulePath, $msg );
        }
 
        /**
         * Add an error to the result
-        * @param string $moduleName
-        * @param MessageSpecifier|array|string $msg i18n message for the error
-        * @param string $code Machine-readable code for the warning. Defaults as
-        *   for IApiMessage::getApiCode().
-        * @param array $data Machine-readable data for the warning, if any.
-        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        * @param string|null $modulePath
+        * @param Message|array|string $msg Warning message. See ApiMessage::create().
+        * @param string|null $code See ApiMessage::create().
+        * @param array|null $data See ApiMessage::create().
         */
-       public function addError( $moduleName, $msg, $code = null, $data = null ) {
+       public function addError( $modulePath, $msg, $code = null, $data = null ) {
                $msg = ApiMessage::create( $msg, $code, $data )
                        ->inLanguage( $this->lang )
                        ->title( $this->getDummyTitle() )
                        ->useDatabase( $this->useDB );
-               $this->addWarningOrError( 'error', $moduleName, $msg );
+               $this->addWarningOrError( 'error', $modulePath, $msg );
        }
 
        /**
-        * Add warnings and errors from a Status object to the result
-        * @param string $moduleName
-        * @param Status $status
+        * Add warnings and errors from a StatusValue object to the result
+        * @param string|null $modulePath
+        * @param StatusValue $status
         * @param string[] $types 'warning' and/or 'error'
         */
        public function addMessagesFromStatus(
-               $moduleName, Status $status, $types = [ 'warning', 'error' ]
+               $modulePath, StatusValue $status, $types = [ 'warning', 'error' ]
        ) {
-               if ( $status->isGood() || !$status->errors ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return;
                }
 
                $types = (array)$types;
-               foreach ( $status->errors as $error ) {
+               foreach ( $status->getErrors() as $error ) {
                        if ( !in_array( $error['type'], $types, true ) ) {
                                continue;
                        }
@@ -127,40 +134,98 @@ class ApiErrorFormatter {
                                $tag = 'warning';
                        }
 
-                       if ( is_array( $error ) && isset( $error['message'] ) ) {
-                               // Normal case
-                               if ( $error['message'] instanceof Message ) {
-                                       $msg = ApiMessage::create( $error['message'], null, [] );
-                               } else {
-                                       $args = isset( $error['params'] ) ? $error['params'] : [];
-                                       array_unshift( $args, $error['message'] );
-                                       $error += [ 'params' => [] ];
-                                       $msg = ApiMessage::create( $args, null, [] );
+                       $msg = ApiMessage::create( $error )
+                               ->inLanguage( $this->lang )
+                               ->title( $this->getDummyTitle() )
+                               ->useDatabase( $this->useDB );
+                       $this->addWarningOrError( $tag, $modulePath, $msg );
+               }
+       }
+
+       /**
+        * Get an ApiMessage from an exception
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options
+        *  - wrap: (string|array|MessageSpecifier) Used to wrap the exception's
+        *    message if it's not an ILocalizedException. The exception's message
+        *    will be added as the final parameter.
+        *  - code: (string) Default code
+        *  - data: (array) Default extra data
+        * @return IApiMessage
+        */
+       public function getMessageFromException( $exception, array $options = [] ) {
+               $options += [ 'code' => null, 'data' => [] ];
+
+               if ( $exception instanceof ILocalizedException ) {
+                       $msg = $exception->getMessageObject();
+                       $params = [];
+               } else {
+                       // Extract code and data from the exception, if applicable
+                       if ( $exception instanceof UsageException ) {
+                               $data = $exception->getMessageArray();
+                               if ( !$options['code'] ) {
+                                       $options['code'] = $data['code'];
                                }
-                       } elseif ( is_array( $error ) ) {
-                               // Weird case handled by Message::getErrorMessage
-                               $msg = ApiMessage::create( $error, null, [] );
-                       } else {
-                               // Another weird case handled by Message::getErrorMessage
-                               $msg = ApiMessage::create( $error, null, [] );
+                               unset( $data['code'], $data['info'] );
+                               $options['data'] = array_merge( $data, $options['data'] );
                        }
 
-                       $msg->inLanguage( $this->lang )
-                               ->title( $this->getDummyTitle() )
-                               ->useDatabase( $this->useDB );
-                       $this->addWarningOrError( $tag, $moduleName, $msg );
+                       if ( isset( $options['wrap'] ) ) {
+                               $msg = $options['wrap'];
+                       } else {
+                               $msg = new RawMessage( '$1' );
+                               if ( !isset( $options['code'] ) ) {
+                                       $options['code'] = 'internal_api_error_' . get_class( $exception );
+                               }
+                       }
+                       $params = [ wfEscapeWikiText( $exception->getMessage() ) ];
                }
+               return ApiMessage::create( $msg, $options['code'], $options['data'] )
+                       ->params( $params )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
        }
 
        /**
-        * Format messages from a Status as an array
-        * @param Status $status
+        * Format an exception as an array
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options See self::getMessageFromException(), plus
+        *  - format: (string) Format override
+        * @return array
+        */
+       public function formatException( $exception, array $options = [] ) {
+               return $this->formatMessage(
+                       $this->getMessageFromException( $exception, $options ),
+                       isset( $options['format'] ) ? $options['format'] : null
+               );
+       }
+
+       /**
+        * Format a message as an array
+        * @param Message|array|string $msg Message. See ApiMessage::create().
+        * @param string|null $format
+        * @return array
+        */
+       public function formatMessage( $msg, $format = null ) {
+               $msg = ApiMessage::create( $msg )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
+               return $this->formatMessageInternal( $msg, $format ?: $this->format );
+       }
+
+       /**
+        * Format messages from a StatusValue as an array
+        * @param StatusValue $status
         * @param string $type 'warning' or 'error'
         * @param string|null $format
         * @return array
         */
-       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
-               if ( $status->isGood() || !$status->errors ) {
+       public function arrayFromStatus( StatusValue $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return [];
                }
 
@@ -168,24 +233,69 @@ class ApiErrorFormatter {
                $formatter = new ApiErrorFormatter(
                        $result, $this->lang, $format ?: $this->format, $this->useDB
                );
-               $formatter->addMessagesFromStatus( 'dummy', $status, [ $type ] );
+               $formatter->addMessagesFromStatus( null, $status, [ $type ] );
                switch ( $type ) {
                        case 'error':
-                               return (array)$result->getResultData( [ 'errors', 'dummy' ] );
+                               return (array)$result->getResultData( [ 'errors' ] );
                        case 'warning':
-                               return (array)$result->getResultData( [ 'warnings', 'dummy' ] );
+                               return (array)$result->getResultData( [ 'warnings' ] );
                }
        }
 
        /**
-        * Actually add the warning or error to the result
-        * @param string $tag 'warning' or 'error'
-        * @param string $moduleName
+        * Turn wikitext into something resembling plaintext
+        * @since 1.29
+        * @param string $text
+        * @return string
+        */
+       public static function stripMarkup( $text ) {
+               // Turn semantic quoting tags to quotes
+               $ret = preg_replace( '!</?(var|kbd|samp|code)>!', '"', $text );
+
+               // Strip tags and decode.
+               $ret = html_entity_decode( strip_tags( $ret ), ENT_QUOTES | ENT_HTML5 );
+
+               return $ret;
+       }
+
+       /**
+        * Format a Message object for raw format
+        * @param MessageSpecifier $msg
+        * @return array
+        */
+       private function formatRawMessage( MessageSpecifier $msg ) {
+               $ret = [
+                       'key' => $msg->getKey(),
+                       'params' => $msg->getParams(),
+               ];
+               ApiResult::setIndexedTagName( $ret['params'], 'param' );
+
+               // Transform Messages as parameters in the style of Message::fooParam().
+               foreach ( $ret['params'] as $i => $param ) {
+                       if ( $param instanceof MessageSpecifier ) {
+                               $ret['params'][$i] = [ 'message' => $this->formatRawMessage( $param ) ];
+                       }
+               }
+               return $ret;
+       }
+
+       /**
+        * Format a message as an array
+        * @since 1.29
         * @param ApiMessage|ApiRawMessage $msg
+        * @param string|null $format
+        * @return array
         */
-       protected function addWarningOrError( $tag, $moduleName, $msg ) {
+       protected function formatMessageInternal( $msg, $format ) {
                $value = [ 'code' => $msg->getApiCode() ];
-               switch ( $this->format ) {
+               switch ( $format ) {
+                       case 'plaintext':
+                               $value += [
+                                       'text' => self::stripMarkup( $msg->text() ),
+                                       ApiResult::META_CONTENT => 'text',
+                               ];
+                               break;
+
                        case 'wikitext':
                                $value += [
                                        'text' => $msg->text(),
@@ -201,19 +311,34 @@ class ApiErrorFormatter {
                                break;
 
                        case 'raw':
-                               $value += [
-                                       'key' => $msg->getKey(),
-                                       'params' => $msg->getParams(),
-                               ];
-                               ApiResult::setIndexedTagName( $value['params'], 'param' );
+                               $value += $this->formatRawMessage( $msg );
                                break;
 
                        case 'none':
                                break;
                }
-               $value += $msg->getApiData();
+               $data = $msg->getApiData();
+               if ( $data ) {
+                       $value['data'] = $msg->getApiData() + [
+                               ApiResult::META_TYPE => 'assoc',
+                       ];
+               }
+               return $value;
+       }
+
+       /**
+        * Actually add the warning or error to the result
+        * @param string $tag 'warning' or 'error'
+        * @param string|null $modulePath
+        * @param ApiMessage|ApiRawMessage $msg
+        */
+       protected function addWarningOrError( $tag, $modulePath, $msg ) {
+               $value = $this->formatMessageInternal( $msg, $this->format );
+               if ( $modulePath !== null ) {
+                       $value += [ 'module' => $modulePath ];
+               }
 
-               $path = [ $tag . 's', $moduleName ];
+               $path = [ $tag . 's' ];
                $existing = $this->result->getResultData( $path );
                if ( $existing === null || !in_array( $value, $existing ) ) {
                        $flags = ApiResult::NO_SIZE_CHECK;
@@ -243,19 +368,19 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
                parent::__construct( $result, Language::factory( 'en' ), 'none', false );
        }
 
-       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
-               if ( $status->isGood() || !$status->errors ) {
+       public function arrayFromStatus( StatusValue $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->getErrors() ) {
                        return [];
                }
 
                $result = [];
                foreach ( $status->getErrorsByType( $type ) as $error ) {
-                       if ( $error['message'] instanceof Message ) {
-                               $error = [
-                                       'message' => $error['message']->getKey(),
-                                       'params' => $error['message']->getParams(),
-                               ] + $error;
-                       }
+                       $msg = ApiMessage::create( $error );
+                       $error = [
+                               'message' => $msg->getKey(),
+                               'params' => $msg->getParams(),
+                               'code' => $msg->getApiCode(),
+                       ] + $error;
                        ApiResult::setIndexedTagName( $error['params'], 'param' );
                        $result[] = $error;
                }
@@ -264,24 +389,50 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
                return $result;
        }
 
-       protected function addWarningOrError( $tag, $moduleName, $msg ) {
-               $value = $msg->plain();
+       protected function formatMessageInternal( $msg, $format ) {
+               return [
+                       'code' => $msg->getApiCode(),
+                       'info' => $msg->text(),
+               ] + $msg->getApiData();
+       }
+
+       /**
+        * Format an exception as an array
+        * @since 1.29
+        * @param Exception|Throwable $exception
+        * @param array $options See parent::formatException(), plus
+        *  - bc: (bool) Return only the string, not an array
+        * @return array|string
+        */
+       public function formatException( $exception, array $options = [] ) {
+               $ret = parent::formatException( $exception, $options );
+               return empty( $options['bc'] ) ? $ret : $ret['info'];
+       }
+
+       protected function addWarningOrError( $tag, $modulePath, $msg ) {
+               $value = self::stripMarkup( $msg->text() );
 
                if ( $tag === 'error' ) {
                        // In BC mode, only one error
-                       $code = $msg->getApiCode();
-                       if ( isset( ApiBase::$messageMap[$code] ) ) {
-                               // Backwards compatibility
-                               $code = ApiBase::$messageMap[$code]['code'];
+                       $existingError = $this->result->getResultData( [ 'error' ] );
+                       if ( !is_array( $existingError ) ||
+                               !isset( $existingError['code'] ) || !isset( $existingError['info'] )
+                       ) {
+                               $value = [
+                                       'code' => $msg->getApiCode(),
+                                       'info' => $value,
+                               ] + $msg->getApiData();
+                               $this->result->addValue( null, 'error', $value,
+                                       ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
                        }
-
-                       $value = [
-                               'code' => $code,
-                               'info' => $value,
-                       ] + $msg->getApiData();
-                       $this->result->addValue( null, 'error', $value,
-                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
                } else {
+                       if ( $modulePath === null ) {
+                               $moduleName = 'unknown';
+                       } else {
+                               $i = strrpos( $modulePath, '+' );
+                               $moduleName = $i === false ? $modulePath : substr( $modulePath, $i + 1 );
+                       }
+
                        // Don't add duplicate warnings
                        $tag .= 's';
                        $path = [ $tag, $moduleName ];
index 10fb182..6f7cf65 100644 (file)
@@ -42,11 +42,9 @@ class ApiExpandTemplates extends ApiBase {
                $this->requireMaxOneParameter( $params, 'prop', 'generatexml' );
 
                if ( $params['prop'] === null ) {
-                       $this->logFeatureUsage( 'action=expandtemplates&!prop' );
-                       $this->setWarning( 'Because no values have been specified for the prop parameter, a ' .
-                               'legacy format has been used for the output. This format is deprecated, and in ' .
-                               'the future, a default value will be set for the prop parameter, causing the new' .
-                               'format to always be used.' );
+                       $this->addDeprecation(
+                               'apiwarn-deprecation-expandtemplates-prop', 'action=expandtemplates&!prop'
+                       );
                        $prop = [];
                } else {
                        $prop = array_flip( $params['prop'] );
@@ -57,13 +55,13 @@ class ApiExpandTemplates extends ApiBase {
                if ( $revid !== null ) {
                        $rev = Revision::newFromId( $revid );
                        if ( !$rev ) {
-                               $this->dieUsage( "There is no revision ID $revid", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $revid ] );
                        }
                        $title_obj = $rev->getTitle();
                } else {
                        $title_obj = Title::newFromText( $params['title'] );
                        if ( !$title_obj || $title_obj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                }
 
@@ -161,9 +159,7 @@ class ApiExpandTemplates extends ApiBase {
                                }
                                if ( isset( $prop['modules'] ) &&
                                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
-                                       $this->setWarning( "Property 'modules' was set but not 'jsconfigvars' " .
-                                               "or 'encodedjsconfigvars'. Configuration variables are necessary " .
-                                               'for proper module usage.' );
+                                       $this->addWarning( 'apiwarn-moduleswithoutvars' );
                                }
                        }
                }
index c7dc303..97720c6 100644 (file)
@@ -43,16 +43,16 @@ class ApiFeedContributions extends ApiBase {
 
                $config = $this->getConfig();
                if ( !$config->get( 'Feed' ) ) {
-                       $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                       $this->dieWithError( 'feed-unavailable' );
                }
 
                $feedClasses = $config->get( 'FeedClasses' );
                if ( !isset( $feedClasses[$params['feedformat']] ) ) {
-                       $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                       $this->dieWithError( 'feed-invalid' );
                }
 
                if ( $params['showsizediff'] && $this->getConfig()->get( 'MiserMode' ) ) {
-                       $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
+                       $this->dieWithError( 'apierror-sizediffdisabled' );
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
index 813ac01..e0e50ed 100644 (file)
@@ -47,12 +47,12 @@ class ApiFeedRecentChanges extends ApiBase {
                $this->params = $this->extractRequestParams();
 
                if ( !$config->get( 'Feed' ) ) {
-                       $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                       $this->dieWithError( 'feed-unavailable' );
                }
 
                $feedClasses = $config->get( 'FeedClasses' );
                if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
-                       $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                       $this->dieWithError( 'feed-invalid' );
                }
 
                $this->getMain()->setCacheMode( 'public' );
@@ -98,7 +98,7 @@ class ApiFeedRecentChanges extends ApiBase {
                if ( $specialClass === 'SpecialRecentchangeslinked' ) {
                        $title = Title::newFromText( $this->params['target'] );
                        if ( !$title ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $this->params['target'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['target'] ) ] );
                        }
 
                        $feed = new ChangesFeed( $feedFormat, false );
index af5b1af..7f349bc 100644 (file)
@@ -52,15 +52,16 @@ class ApiFeedWatchlist extends ApiBase {
        public function execute() {
                $config = $this->getConfig();
                $feedClasses = $config->get( 'FeedClasses' );
+               $params = [];
                try {
                        $params = $this->extractRequestParams();
 
                        if ( !$config->get( 'Feed' ) ) {
-                               $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
+                               $this->dieWithError( 'feed-unavailable' );
                        }
 
                        if ( !isset( $feedClasses[$params['feedformat']] ) ) {
-                               $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
+                               $this->dieWithError( 'feed-invalid' );
                        }
 
                        // limit to the number of hours going from now back
@@ -151,15 +152,26 @@ class ApiFeedWatchlist extends ApiBase {
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
                        $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
-                       if ( $e instanceof UsageException ) {
-                               $errorCode = $e->getCodeString();
+                       if ( $e instanceof ApiUsageException ) {
+                               foreach ( $e->getStatusValue()->getErrors() as $error ) {
+                                       $msg = ApiMessage::create( $error )
+                                               ->inLanguage( $this->getLanguage() );
+                                       $errorTitle = $this->msg( 'api-feed-error-title', $msg->getApiCode() );
+                                       $errorText = $msg->text();
+                                       $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
+                               }
                        } else {
-                               // Something is seriously wrong
-                               $errorCode = 'internal_api_error';
+                               if ( $e instanceof UsageException ) {
+                                       $errorCode = $e->getCodeString();
+                               } else {
+                                       // Something is seriously wrong
+                                       $errorCode = 'internal_api_error';
+                               }
+                               $errorTitle = $this->msg( 'api-feed-error-title', $msg->getApiCode() );
+                               $errorText = $e->getMessage();
+                               $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
                        }
 
-                       $errorText = $e->getMessage();
-                       $feedItems[] = new FeedItem( "Error ($errorCode)", $errorText, '', '', '' );
                        ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems );
                }
        }
index 97464d6..736898e 100644 (file)
@@ -45,7 +45,7 @@ class ApiFileRevert extends ApiBase {
                $this->validateParameters();
 
                // Check whether we're allowed to revert this file
-               $this->checkPermissions( $this->getUser() );
+               $this->checkTitleUserPermissions( $this->file->getTitle(), [ 'edit', 'upload' ] );
 
                $sourceUrl = $this->file->getArchiveVirtualUrl( $this->archiveName );
                $status = $this->file->upload(
@@ -70,23 +70,6 @@ class ApiFileRevert extends ApiBase {
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
        }
 
-       /**
-        * Checks that the user has permissions to perform this revert.
-        * Dies with usage message on inadequate permissions.
-        * @param User $user The user to check.
-        */
-       protected function checkPermissions( $user ) {
-               $title = $this->file->getTitle();
-               $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit', $user ),
-                       $title->getUserPermissionsErrors( 'upload', $user )
-               );
-
-               if ( $permissionErrors ) {
-                       $this->dieUsageMsg( $permissionErrors[0] );
-               }
-       }
-
        /**
         * Validate the user parameters and set $this->archiveName and $this->file.
         * Throws an error if validation fails
@@ -95,21 +78,23 @@ class ApiFileRevert extends ApiBase {
                // Validate the input title
                $title = Title::makeTitleSafe( NS_FILE, $this->params['filename'] );
                if ( is_null( $title ) ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $this->params['filename'] ] );
+                       $this->dieWithError(
+                               [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['filename'] ) ]
+                       );
                }
                $localRepo = RepoGroup::singleton()->getLocalRepo();
 
                // Check if the file really exists
                $this->file = $localRepo->newFile( $title );
                if ( !$this->file->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                // Check if the archivename is valid for this file
                $this->archiveName = $this->params['archivename'];
                $oldFile = $localRepo->newFromArchiveName( $title, $this->archiveName );
                if ( !$oldFile->exists() ) {
-                       $this->dieUsageMsg( 'filerevert-badversion' );
+                       $this->dieWithError( 'filerevert-badversion' );
                }
        }
 
index 2e917e1..8ebfe48 100644 (file)
@@ -84,8 +84,8 @@ class ApiFormatJson extends ApiFormatBase {
                                        break;
 
                                default:
-                                       $this->dieUsage( __METHOD__ .
-                                               ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                                       // Should have been caught during parameter validation
+                                       $this->dieDebug( __METHOD__, 'Unknown value for \'formatversion\'' );
                        }
                }
                $data = $this->getResult()->getResultData( null, $transform );
index fc25f47..a744f57 100644 (file)
@@ -55,7 +55,8 @@ class ApiFormatPhp extends ApiFormatBase {
                                break;
 
                        default:
-                               $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                               // Should have been caught during parameter validation
+                               $this->dieDebug( __METHOD__, 'Unknown value for \'formatversion\'' );
                }
                $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
@@ -67,11 +68,7 @@ class ApiFormatPhp extends ApiFormatBase {
                        in_array( 'wfOutputHandler', ob_list_handlers(), true ) &&
                        preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $text )
                ) {
-                       $this->dieUsage(
-                               'This response cannot be represented using format=php. ' .
-                               'See https://phabricator.wikimedia.org/T68776',
-                               'internalerror'
-                       );
+                       $this->dieWithError( 'apierror-formatphp', 'internalerror' );
                }
 
                $this->printText( $text );
index 9da040c..228b47e 100644 (file)
@@ -49,7 +49,7 @@ class ApiFormatRaw extends ApiFormatBase {
        public function getMimeType() {
                $data = $this->getResult()->getResultData();
 
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        return $this->errorFallback->getMimeType();
                }
 
@@ -62,7 +62,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function initPrinter( $unused = false ) {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->initPrinter( $unused );
                        if ( $this->mFailWithHTTPError ) {
                                $this->getMain()->getRequest()->response()->statusHeader( 400 );
@@ -74,7 +74,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function closePrinter() {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->closePrinter();
                } else {
                        parent::closePrinter();
@@ -83,7 +83,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        public function execute() {
                $data = $this->getResult()->getResultData();
-               if ( isset( $data['error'] ) ) {
+               if ( isset( $data['error'] ) || isset( $data['errors'] ) ) {
                        $this->errorFallback->execute();
                        return;
                }
index a45dbeb..e4dfda0 100644 (file)
@@ -269,17 +269,17 @@ class ApiFormatXml extends ApiFormatBase {
        protected function addXslt() {
                $nt = Title::newFromText( $this->mXslt );
                if ( is_null( $nt ) || !$nt->exists() ) {
-                       $this->setWarning( 'Invalid or non-existent stylesheet specified' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheet' );
 
                        return;
                }
                if ( $nt->getNamespace() != NS_MEDIAWIKI ) {
-                       $this->setWarning( 'Stylesheet should be in the MediaWiki namespace.' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheetns' );
 
                        return;
                }
                if ( substr( $nt->getText(), -4 ) !== '.xsl' ) {
-                       $this->setWarning( 'Stylesheet should have .xsl extension.' );
+                       $this->addWarning( 'apiwarn-invalidxmlstylesheetext' );
 
                        return;
                }
index 2a6c938..e347a9f 100644 (file)
@@ -90,7 +90,6 @@ class ApiHelp extends ApiBase {
         * @param IContextSource $context
         * @param ApiBase[]|ApiBase $modules
         * @param array $options Formatting options (described above)
-        * @return string
         */
        public static function getHelp( IContextSource $context, $modules, array $options ) {
                global $wgContLang;
@@ -548,6 +547,12 @@ class ApiHelp extends ApiBase {
 
                                                                case 'namespace':
                                                                        $namespaces = MWNamespace::getValidNamespaces();
+                                                                       if ( isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                                                               is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                                                                       ) {
+                                                                               $namespaces = array_merge( $namespaces, $settings[ApiBase::PARAM_EXTRA_NAMESPACES] );
+                                                                       }
+                                                                       sort( $namespaces );
                                                                        $count = count( $namespaces );
                                                                        $info[] = $context->msg( 'api-help-param-list' )
                                                                                ->params( $multi ? 2 : 1 )
index 37cb80a..71bda6d 100644 (file)
@@ -42,6 +42,14 @@ class ApiImageRotate extends ApiBase {
                        'invalidTitles', 'special', 'missingIds', 'missingRevIds', 'interwikiTitles',
                ] );
 
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $this->getUser() );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                foreach ( $pageSet->getTitles() as $title ) {
                        $r = [];
                        $r['id'] = $title->getArticleID();
@@ -56,23 +64,29 @@ class ApiImageRotate extends ApiBase {
                        $file = wfFindFile( $title, [ 'latest' => true ] );
                        if ( !$file ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'File does not exist';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filedoesnotexist' )
+                               );
                                $result[] = $r;
                                continue;
                        }
                        $handler = $file->getHandler();
                        if ( !$handler || !$handler->canRotate() ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'File type cannot be rotated';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filetypecannotberotated' )
+                               );
                                $result[] = $r;
                                continue;
                        }
 
                        // Check whether we're allowed to rotate this file
-                       $permError = $this->checkPermissions( $this->getUser(), $file->getTitle() );
-                       if ( $permError !== null ) {
+                       $permError = $this->checkTitleUserPermissions( $file->getTitle(), [ 'edit', 'upload' ] );
+                       if ( $permError ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = $permError;
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       $this->errorArrayToStatus( $permError )
+                               );
                                $result[] = $r;
                                continue;
                        }
@@ -80,7 +94,9 @@ class ApiImageRotate extends ApiBase {
                        $srcPath = $file->getLocalRefPath();
                        if ( $srcPath === false ) {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = 'Cannot get local file path';
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( 'apierror-filenopath' )
+                               );
                                $result[] = $r;
                                continue;
                        }
@@ -96,17 +112,27 @@ class ApiImageRotate extends ApiBase {
                                $comment = wfMessage(
                                        'rotate-comment'
                                )->numParams( $rotation )->inContentLanguage()->text();
-                               $status = $file->upload( $dstPath,
-                                       $comment, $comment, 0, false, false, $this->getUser() );
+                               $status = $file->upload(
+                                       $dstPath,
+                                       $comment,
+                                       $comment,
+                                       0,
+                                       false,
+                                       false,
+                                       $this->getUser(),
+                                       $params['tags'] ?: []
+                               );
                                if ( $status->isGood() ) {
                                        $r['result'] = 'Success';
                                } else {
                                        $r['result'] = 'Failure';
-                                       $r['errormessage'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                       $r['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                                }
                        } else {
                                $r['result'] = 'Failure';
-                               $r['errormessage'] = $err->toText();
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus(
+                                       Status::newFatal( ApiMessage::create( $err->getMsg() ) )
+                               );
                        }
                        $result[] = $r;
                }
@@ -130,28 +156,6 @@ class ApiImageRotate extends ApiBase {
                return $this->mPageSet;
        }
 
-       /**
-        * Checks that the user has permissions to perform rotations.
-        * @param User $user The user to check
-        * @param Title $title
-        * @return string|null Permission error message, or null if there is no error
-        */
-       protected function checkPermissions( $user, $title ) {
-               $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit', $user ),
-                       $title->getUserPermissionsErrors( 'upload', $user )
-               );
-
-               if ( $permissionErrors ) {
-                       // Just return the first error
-                       $msg = $this->parseMsg( $permissionErrors[0] );
-
-                       return $msg['info'];
-               }
-
-               return null;
-       }
-
        public function mustBePosted() {
                return true;
        }
@@ -169,6 +173,10 @@ class ApiImageRotate extends ApiBase {
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
index 10106ff..bf5e4ce 100644 (file)
@@ -42,10 +42,10 @@ class ApiImport extends ApiBase {
                $isUpload = false;
                if ( isset( $params['interwikisource'] ) ) {
                        if ( !$user->isAllowed( 'import' ) ) {
-                               $this->dieUsageMsg( 'cantimport' );
+                               $this->dieWithError( 'apierror-cantimport' );
                        }
                        if ( !isset( $params['interwikipage'] ) ) {
-                               $this->dieUsageMsg( [ 'missingparam', 'interwikipage' ] );
+                               $this->dieWithError( [ 'apierror-missingparam', 'interwikipage' ] );
                        }
                        $source = ImportStreamSource::newFromInterwiki(
                                $params['interwikisource'],
@@ -56,7 +56,7 @@ class ApiImport extends ApiBase {
                } else {
                        $isUpload = true;
                        if ( !$user->isAllowed( 'importupload' ) ) {
-                               $this->dieUsageMsg( 'cantimport-upload' );
+                               $this->dieWithError( 'apierror-cantimport-upload' );
                        }
                        $source = ImportStreamSource::newFromUpload( 'xml' );
                }
@@ -64,6 +64,14 @@ class ApiImport extends ApiBase {
                        $this->dieStatus( $source );
                }
 
+               // Check if user can add the log entry tags which were requested
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                $importer = new WikiImporter( $source->value, $this->getConfig() );
                if ( isset( $params['namespace'] ) ) {
                        $importer->setTargetNamespace( $params['namespace'] );
@@ -79,11 +87,14 @@ class ApiImport extends ApiBase {
                        $params['interwikisource'],
                        $params['summary']
                );
+               if ( $params['tags'] ) {
+                       $reporter->setChangeTags( $params['tags'] );
+               }
 
                try {
                        $importer->doImport();
                } catch ( Exception $e ) {
-                       $this->dieUsageMsg( [ 'import-unknownerror', $e->getMessage() ] );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-import-unknownerror' ] );
                }
 
                $resultData = $reporter->getData();
@@ -140,6 +151,10 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'namespace'
                        ],
                        'rootpage' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 1017607..9a21e76 100644 (file)
@@ -49,7 +49,7 @@ class ApiLinkAccount extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to link accounts', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-linkaccounts', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -60,8 +60,8 @@ class ApiLinkAccount extends ApiBase {
                        $bits = wfParseUrl( $params['returnurl'] );
                        if ( !$bits || $bits['scheme'] === '' ) {
                                $encParamName = $this->encodeParamName( 'returnurl' );
-                               $this->dieUsage(
-                                       "Invalid value '{$params['returnurl']}' for url parameter $encParamName",
+                               $this->dieWithError(
+                                       [ 'apierror-badurl', $encParamName, wfEscapeWikiText( $params['returnurl'] ) ],
                                        "badurl_{$encParamName}"
                                );
                        }
index 6ac261d..6cf1fad 100644 (file)
@@ -72,10 +72,11 @@ class ApiLogin extends ApiBase {
 
                try {
                        $this->requirePostedParameters( [ 'password', 'token' ] );
-               } catch ( UsageException $ex ) {
+               } catch ( ApiUsageException $ex ) {
                        // Make this a warning for now, upgrade to an error in 1.29.
-                       $this->setWarning( $ex->getMessage() );
-                       $this->logFeatureUsage( 'login-params-in-query-string' );
+                       foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                               $this->addDeprecation( $error, 'login-params-in-query-string' );
+                       }
                }
 
                $params = $this->extractRequestParams();
@@ -146,15 +147,10 @@ class ApiLogin extends ApiBase {
                        switch ( $res->status ) {
                                case AuthenticationResponse::PASS:
                                        if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
-                                               $warn = 'Main-account login via action=login is deprecated and may stop working ' .
-                                                       'without warning.';
-                                               $warn .= ' To continue login with action=login, see [[Special:BotPasswords]].';
-                                               $warn .= ' To safely continue using main-account login, see action=clientlogin.';
+                                               $this->addDeprecation( 'apiwarn-deprecation-login-botpw', 'main-account-login' );
                                        } else {
-                                               $warn = 'Login via action=login is deprecated and may stop working without warning.';
-                                               $warn .= ' To safely log in, see action=clientlogin.';
+                                               $this->addDeprecation( 'apiwarn-deprecation-login-nobotpw', 'main-account-login' );
                                        }
-                                       $this->setWarning( $warn );
                                        $authRes = 'Success';
                                        $loginType = 'AuthManager';
                                        break;
@@ -194,16 +190,21 @@ class ApiLogin extends ApiBase {
 
                        case 'NeedToken':
                                $result['token'] = $token->toString();
-                               $this->setWarning( 'Fetching a token via action=login is deprecated. ' .
-                                  'Use action=query&meta=tokens&type=login instead.' );
-                               $this->logFeatureUsage( 'action=login&!lgtoken' );
+                               $this->addDeprecation( 'apiwarn-deprecation-login-token', 'action=login&!lgtoken' );
                                break;
 
                        case 'WrongToken':
                                break;
 
                        case 'Failed':
-                               $result['reason'] = $message->useDatabase( 'false' )->inLanguage( 'en' )->text();
+                               $errorFormatter = $this->getErrorFormatter();
+                               if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) {
+                                       $result['reason'] = ApiErrorFormatter::stripMarkup(
+                                               $message->useDatabase( false )->inLanguage( 'en' )->text()
+                                       );
+                               } else {
+                                       $result['reason'] = $errorFormatter->formatMessage( $message );
+                               }
                                break;
 
                        case 'Aborted':
index 6a26e2e..d5c28f1 100644 (file)
@@ -45,9 +45,11 @@ class ApiLogout extends ApiBase {
 
                // Make sure it's possible to log out
                if ( !$session->canSetUser() ) {
-                       $this->dieUsage(
-                               'Cannot log out when using ' .
-                                       $session->getProvider()->describe( Language::factory( 'en' ) ),
+                       $this->dieWithError(
+                               [
+                                       'cannotlogoutnow-text',
+                                       $session->getProvider()->describe( $this->getErrorFormatter()->getLanguage() )
+                               ],
                                'cannotlogout'
                        );
                }
index 38299b4..52f1d95 100644 (file)
@@ -46,6 +46,11 @@ class ApiMain extends ApiBase {
         */
        const API_DEFAULT_FORMAT = 'jsonfm';
 
+       /**
+        * When no uselang parameter is given, this language will be used
+        */
+       const API_DEFAULT_USELANG = 'user';
+
        /**
         * List of available modules: action name => module class
         */
@@ -74,6 +79,7 @@ class ApiMain extends ApiBase {
                'tokens' => 'ApiTokens',
                'checktoken' => 'ApiCheckToken',
                'cspreport' => 'ApiCSPReport',
+               'validatepassword' => 'ApiValidatePassword',
 
                // Write modules
                'purge' => 'ApiPurge',
@@ -100,6 +106,7 @@ class ApiMain extends ApiBase {
                'managetags' => 'ApiManageTags',
                'tag' => 'ApiTag',
                'mergehistory' => 'ApiMergeHistory',
+               'setpagelanguage' => 'ApiSetPageLanguage',
        ];
 
        /**
@@ -140,7 +147,7 @@ class ApiMain extends ApiBase {
         */
        private $mPrinter;
 
-       private $mModuleMgr, $mResult, $mErrorFormatter;
+       private $mModuleMgr, $mResult, $mErrorFormatter = null;
        /** @var ApiContinuationManager|null */
        private $mContinuationManager;
        private $mAction;
@@ -229,7 +236,11 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               $uselang = $this->getParameter( 'uselang' );
+               $this->mResult = new ApiResult( $this->getConfig()->get( 'APIMaxResultSize' ) );
+
+               // Setup uselang. This doesn't use $this->getParameter()
+               // because we're not ready to handle errors yet.
+               $uselang = $request->getVal( 'uselang', self::API_DEFAULT_USELANG );
                if ( $uselang === 'user' ) {
                        // Assume the parent context is going to return the user language
                        // for uselang=user (see T85635).
@@ -247,6 +258,29 @@ class ApiMain extends ApiBase {
                        }
                }
 
+               // Set up the error formatter. This doesn't use $this->getParameter()
+               // because we're not ready to handle errors yet.
+               $errorFormat = $request->getVal( 'errorformat', 'bc' );
+               $errorLangCode = $request->getVal( 'errorlang', 'uselang' );
+               $errorsUseDB = $request->getCheck( 'errorsuselocal' );
+               if ( in_array( $errorFormat, [ 'plaintext', 'wikitext', 'html', 'raw', 'none' ], true ) ) {
+                       if ( $errorLangCode === 'uselang' ) {
+                               $errorLang = $this->getLanguage();
+                       } elseif ( $errorLangCode === 'content' ) {
+                               global $wgContLang;
+                               $errorLang = $wgContLang;
+                       } else {
+                               $errorLangCode = RequestContext::sanitizeLangCode( $errorLangCode );
+                               $errorLang = Language::factory( $errorLangCode );
+                       }
+                       $this->mErrorFormatter = new ApiErrorFormatter(
+                               $this->mResult, $errorLang, $errorFormat, $errorsUseDB
+                       );
+               } else {
+                       $this->mErrorFormatter = new ApiErrorFormatter_BackCompat( $this->mResult );
+               }
+               $this->mResult->setErrorFormatter( $this->getErrorFormatter() );
+
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
                $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
@@ -255,9 +289,6 @@ class ApiMain extends ApiBase {
 
                Hooks::run( 'ApiMain::moduleManager', [ $this->mModuleMgr ] );
 
-               $this->mResult = new ApiResult( $this->getConfig()->get( 'APIMaxResultSize' ) );
-               $this->mErrorFormatter = new ApiErrorFormatter_BackCompat( $this->mResult );
-               $this->mResult->setErrorFormatter( $this->mErrorFormatter );
                $this->mContinuationManager = null;
                $this->mEnableWrite = $enableWrite;
 
@@ -464,7 +495,9 @@ class ApiMain extends ApiBase {
        public function createPrinterByName( $format ) {
                $printer = $this->mModuleMgr->getModule( $format, 'format' );
                if ( $printer === null ) {
-                       $this->dieUsage( "Unrecognized format: {$format}", 'unknown_format' );
+                       $this->dieWithError(
+                               [ 'apierror-unknownformat', wfEscapeWikiText( $format ) ], 'unknown_format'
+                       );
                }
 
                return $printer;
@@ -542,7 +575,7 @@ class ApiMain extends ApiBase {
         */
        protected function handleException( Exception $e ) {
                // Bug 63145: Rollback any open database transactions
-               if ( !( $e instanceof UsageException ) ) {
+               if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
                        try {
                                MWExceptionHandler::rollbackMasterChangesAndLog( $e );
@@ -557,7 +590,7 @@ class ApiMain extends ApiBase {
                Hooks::run( 'ApiMain::onException', [ $this, $e ] );
 
                // Log it
-               if ( !( $e instanceof UsageException ) ) {
+               if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        MWExceptionHandler::logException( $e );
                }
 
@@ -565,13 +598,13 @@ class ApiMain extends ApiBase {
                // If this fails, an unhandled exception should be thrown so that global error
                // handler will process and log it.
 
-               $errCode = $this->substituteResultWithError( $e );
+               $errCodes = $this->substituteResultWithError( $e );
 
                // Error results should not be cached
                $this->setCacheMode( 'private' );
 
                $response = $this->getRequest()->response();
-               $headerStr = 'MediaWiki-API-Error: ' . $errCode;
+               $headerStr = 'MediaWiki-API-Error: ' . join( ', ', $errCodes );
                $response->header( $headerStr );
 
                // Reset and print just the error message
@@ -580,14 +613,31 @@ class ApiMain extends ApiBase {
                // Printer may not be initialized if the extractRequestParams() fails for the main module
                $this->createErrorPrinter();
 
+               $failed = false;
                try {
                        $this->printResult( $e->getCode() );
+               } catch ( ApiUsageException $ex ) {
+                       // The error printer itself is failing. Try suppressing its request
+                       // parameters and redo.
+                       $failed = true;
+                       $this->addWarning( 'apiwarn-errorprinterfailed' );
+                       foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                               try {
+                                       $this->mPrinter->addWarning( $error );
+                               } catch ( Exception $ex2 ) {
+                                       // WTF?
+                                       $this->addWarning( $error );
+                               }
+                       }
                } catch ( UsageException $ex ) {
                        // The error printer itself is failing. Try suppressing its request
                        // parameters and redo.
-                       $this->setWarning(
-                               'Error printer failed (will retry without params): ' . $ex->getMessage()
+                       $failed = true;
+                       $this->addWarning(
+                               [ 'apiwarn-errorprinterfailed-ex', $ex->getMessage() ], 'errorprinterfailed'
                        );
+               }
+               if ( $failed ) {
                        $this->mPrinter = null;
                        $this->createErrorPrinter();
                        $this->mPrinter->forceDefaultParams();
@@ -958,99 +1008,147 @@ class ApiMain extends ApiBase {
        /**
         * Create an error message for the given exception.
         *
-        * If the exception is a UsageException then
-        * UsageException::getMessageArray() will be called to create the message.
+        * If an ApiUsageException, errors/warnings will be extracted from the
+        * embedded StatusValue.
+        *
+        * If a base UsageException, the getMessageArray() method will be used to
+        * extract the code and English message for a single error (no warnings).
+        *
+        * Any other exception will be returned with a generic code and wrapper
+        * text around the exception's (presumably English) message as a single
+        * error (no warnings).
         *
         * @param Exception $e
-        * @return array ['code' => 'some string', 'info' => 'some other string']
+        * @param string $type 'error' or 'warning'
+        * @return ApiMessage[]
         * @since 1.27
         */
-       protected function errorMessageFromException( $e ) {
-               if ( $e instanceof UsageException ) {
+       protected function errorMessagesFromException( $e, $type = 'error' ) {
+               $messages = [];
+               if ( $e instanceof ApiUsageException ) {
+                       foreach ( $e->getStatusValue()->getErrorsByType( $type ) as $error ) {
+                               $messages[] = ApiMessage::create( $error );
+                       }
+               } elseif ( $type !== 'error' ) {
+                       // None of the rest have any messages for non-error types
+               } elseif ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - generate error response
-                       $errMessage = $e->getMessageArray();
+                       $data = $e->getMessageArray();
+                       $code = $data['code'];
+                       $info = $data['info'];
+                       unset( $data['code'], $data['info'] );
+                       $messages[] = new ApiRawMessage( [ '$1', $info ], $code, $data );
                } else {
-                       $config = $this->getConfig();
                        // Something is seriously wrong
+                       $config = $this->getConfig();
+                       $code = 'internal_api_error_' . get_class( $e );
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
-                               $info = 'Database query error';
+                               $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ];
                        } else {
-                               $info = "Exception Caught: {$e->getMessage()}";
+                               $params = [
+                                       'apierror-exceptioncaught',
+                                       WebRequest::getRequestId(),
+                                       $e instanceof ILocalizedException
+                                               ? $e->getMessageObject()
+                                               : wfEscapeWikiText( $e->getMessage() )
+                               ];
                        }
-
-                       $errMessage = [
-                               'code' => 'internal_api_error_' . get_class( $e ),
-                               'info' => '[' . WebRequest::getRequestId() . '] ' . $info,
-                       ];
+                       $messages[] = ApiMessage::create( $params, $code );
                }
-               return $errMessage;
+               return $messages;
        }
 
        /**
         * Replace the result data with the information about an exception.
-        * Returns the error code
         * @param Exception $e
-        * @return string
+        * @return string[] Error codes
         */
        protected function substituteResultWithError( $e ) {
                $result = $this->getResult();
+               $formatter = $this->getErrorFormatter();
                $config = $this->getConfig();
+               $errorCodes = [];
 
-               $errMessage = $this->errorMessageFromException( $e );
-               if ( $e instanceof UsageException ) {
-                       // User entered incorrect parameters - generate error response
+               // Remember existing warnings and errors across the reset
+               $errors = $result->getResultData( [ 'errors' ] );
+               $warnings = $result->getResultData( [ 'warnings' ] );
+               $result->reset();
+               if ( $warnings !== null ) {
+                       $result->addValue( null, 'warnings', $warnings, ApiResult::NO_SIZE_CHECK );
+               }
+               if ( $errors !== null ) {
+                       $result->addValue( null, 'errors', $errors, ApiResult::NO_SIZE_CHECK );
+
+                       // Collect the copied error codes for the return value
+                       foreach ( $errors as $error ) {
+                               if ( isset( $error['code'] ) ) {
+                                       $errorCodes[$error['code']] = true;
+                               }
+                       }
+               }
+
+               // Add errors from the exception
+               $modulePath = $e instanceof ApiUsageException ? $e->getModulePath() : null;
+               foreach ( $this->errorMessagesFromException( $e, 'error' ) as $msg ) {
+                       $errorCodes[$msg->getApiCode()] = true;
+                       $formatter->addError( $modulePath, $msg );
+               }
+               foreach ( $this->errorMessagesFromException( $e, 'warning' ) as $msg ) {
+                       $formatter->addWarning( $modulePath, $msg );
+               }
+
+               // Add additional data. Path depends on whether we're in BC mode or not.
+               // Data depends on the type of exception.
+               if ( $formatter instanceof ApiErrorFormatter_BackCompat ) {
+                       $path = [ 'error' ];
+               } else {
+                       $path = null;
+               }
+               if ( $e instanceof ApiUsageException || $e instanceof UsageException ) {
                        $link = wfExpandUrl( wfScript( 'api' ) );
-                       ApiResult::setContentValue( $errMessage, 'docref', "See $link for API usage" );
+                       $result->addContentValue(
+                               $path,
+                               'docref',
+                               $this->msg( 'api-usage-docref', $link )->inLanguage( $formatter->getLanguage() )->text()
+                       );
                } else {
-                       // Something is seriously wrong
                        if ( $config->get( 'ShowExceptionDetails' ) ) {
-                               ApiResult::setContentValue(
-                                       $errMessage,
+                               $result->addContentValue(
+                                       $path,
                                        'trace',
-                                       MWExceptionHandler::getRedactedTraceAsString( $e )
+                                       $this->msg( 'api-exception-trace',
+                                               get_class( $e ),
+                                               $e->getFile(),
+                                               $e->getLine(),
+                                               MWExceptionHandler::getRedactedTraceAsString( $e )
+                                       )->inLanguage( $formatter->getLanguage() )->text()
                                );
                        }
                }
 
-               // Remember all the warnings to re-add them later
-               $warnings = $result->getResultData( [ 'warnings' ] );
+               // Add the id and such
+               $this->addRequestedFields( [ 'servedby' ] );
 
-               $result->reset();
-               // Re-add the id
-               $requestid = $this->getParameter( 'requestid' );
-               if ( !is_null( $requestid ) ) {
-                       $result->addValue( null, 'requestid', $requestid, ApiResult::NO_SIZE_CHECK );
-               }
-               if ( $config->get( 'ShowHostnames' ) ) {
-                       // servedby is especially useful when debugging errors
-                       $result->addValue( null, 'servedby', wfHostname(), ApiResult::NO_SIZE_CHECK );
-               }
-               if ( $warnings !== null ) {
-                       $result->addValue( null, 'warnings', $warnings, ApiResult::NO_SIZE_CHECK );
-               }
-
-               $result->addValue( null, 'error', $errMessage, ApiResult::NO_SIZE_CHECK );
-
-               return $errMessage['code'];
+               return array_keys( $errorCodes );
        }
 
        /**
-        * Set up for the execution.
-        * @return array
+        * Add requested fields to the result
+        * @param string[] $force Which fields to force even if not requested. Accepted values are:
+        *  - servedby
         */
-       protected function setupExecuteAction() {
-               // First add the id to the top element
+       protected function addRequestedFields( $force = [] ) {
                $result = $this->getResult();
+
                $requestid = $this->getParameter( 'requestid' );
-               if ( !is_null( $requestid ) ) {
-                       $result->addValue( null, 'requestid', $requestid );
+               if ( $requestid !== null ) {
+                       $result->addValue( null, 'requestid', $requestid, ApiResult::NO_SIZE_CHECK );
                }
 
-               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                       $servedby = $this->getParameter( 'servedby' );
-                       if ( $servedby ) {
-                               $result->addValue( null, 'servedby', wfHostname() );
-                       }
+               if ( $this->getConfig()->get( 'ShowHostnames' ) && (
+                       in_array( 'servedby', $force, true ) || $this->getParameter( 'servedby' )
+               ) ) {
+                       $result->addValue( null, 'servedby', wfHostname(), ApiResult::NO_SIZE_CHECK );
                }
 
                if ( $this->getParameter( 'curtimestamp' ) ) {
@@ -1058,13 +1156,23 @@ class ApiMain extends ApiBase {
                                ApiResult::NO_SIZE_CHECK );
                }
 
-               $params = $this->extractRequestParams();
+               if ( $this->getParameter( 'responselanginfo' ) ) {
+                       $result->addValue( null, 'uselang', $this->getLanguage()->getCode(),
+                               ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'errorlang', $this->getErrorFormatter()->getLanguage()->getCode(),
+                               ApiResult::NO_SIZE_CHECK );
+               }
+       }
 
-               $this->mAction = $params['action'];
+       /**
+        * Set up for the execution.
+        * @return array
+        */
+       protected function setupExecuteAction() {
+               $this->addRequestedFields();
 
-               if ( !is_string( $this->mAction ) ) {
-                       $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
-               }
+               $params = $this->extractRequestParams();
+               $this->mAction = $params['action'];
 
                return $params;
        }
@@ -1073,13 +1181,15 @@ class ApiMain extends ApiBase {
         * Set up the module for response
         * @return ApiBase The module that will handle this action
         * @throws MWException
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        protected function setupModule() {
                // Instantiate the module requested by the user
                $module = $this->mModuleMgr->getModule( $this->mAction, 'action' );
                if ( $module === null ) {
-                       $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
+                       $this->dieWithError(
+                               [ 'apierror-unknownaction', wfEscapeWikiText( $this->mAction ) ], 'unknown_action'
+                       );
                }
                $moduleParams = $module->extractRequestParams();
 
@@ -1098,13 +1208,13 @@ class ApiMain extends ApiBase {
                        }
 
                        if ( !isset( $moduleParams['token'] ) ) {
-                               $this->dieUsageMsg( [ 'missingparam', 'token' ] );
+                               $module->dieWithError( [ 'apierror-missingparam', 'token' ] );
                        }
 
                        $module->requirePostedParameters( [ 'token' ] );
 
                        if ( !$module->validateToken( $moduleParams['token'], $moduleParams ) ) {
-                               $this->dieUsageMsg( 'sessionfailure' );
+                               $module->dieWithError( 'apierror-badtoken' );
                        }
                }
 
@@ -1128,10 +1238,10 @@ class ApiMain extends ApiBase {
                                $response->header( 'X-Database-Lag: ' . intval( $lag ) );
 
                                if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                                       $this->dieUsage( "Waiting for $host: $lag seconds lagged", 'maxlag' );
+                                       $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
                                }
 
-                               $this->dieUsage( "Waiting for a database server: $lag seconds lagged", 'maxlag' );
+                               $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
                        }
                }
 
@@ -1262,19 +1372,16 @@ class ApiMain extends ApiBase {
                if ( $module->isReadMode() && !User::isEveryoneAllowed( 'read' ) &&
                        !$user->isAllowed( 'read' )
                ) {
-                       $this->dieUsageMsg( 'readrequired' );
+                       $this->dieWithError( 'apierror-readapidenied' );
                }
 
                if ( $module->isWriteMode() ) {
                        if ( !$this->mEnableWrite ) {
-                               $this->dieUsageMsg( 'writedisabled' );
+                               $this->dieWithError( 'apierror-noapiwrite' );
                        } elseif ( !$user->isAllowed( 'writeapi' ) ) {
-                               $this->dieUsageMsg( 'writerequired' );
+                               $this->dieWithError( 'apierror-writeapidenied' );
                        } elseif ( $this->getRequest()->getHeader( 'Promise-Non-Write-API-Action' ) ) {
-                               $this->dieUsage(
-                                       'Promise-Non-Write-API-Action HTTP header cannot be sent to write API modules',
-                                       'promised-nonwrite-api'
-                               );
+                               $this->dieWithError( 'apierror-promised-nonwrite-api' );
                        }
 
                        $this->checkReadOnly( $module );
@@ -1283,7 +1390,7 @@ class ApiMain extends ApiBase {
                // Allow extensions to stop execution for arbitrary reasons.
                $message = false;
                if ( !Hooks::run( 'ApiCheckCanExecute', [ $module, $user, &$message ] ) ) {
-                       $this->dieUsageMsg( $message );
+                       $this->dieWithError( $message );
                }
        }
 
@@ -1329,12 +1436,9 @@ class ApiMain extends ApiBase {
                                "Api request failed as read only because the following DBs are lagged: $laggedServers"
                        );
 
-                       $parsed = $this->parseMsg( [ 'readonlytext' ] );
-                       $this->dieUsage(
-                               $parsed['info'],
-                               $parsed['code'],
-                               /* http error */
-                               0,
+                       $this->dieWithError(
+                               'readonly_lag',
+                               'readonly',
                                [ 'readonlyreason' => "Waiting for $numLagged lagged database(s)" ]
                        );
                }
@@ -1350,12 +1454,12 @@ class ApiMain extends ApiBase {
                        switch ( $params['assert'] ) {
                                case 'user':
                                        if ( $user->isAnon() ) {
-                                               $this->dieUsage( 'Assertion that the user is logged in failed', 'assertuserfailed' );
+                                               $this->dieWithError( 'apierror-assertuserfailed' );
                                        }
                                        break;
                                case 'bot':
                                        if ( !$user->isAllowed( 'bot' ) ) {
-                                               $this->dieUsage( 'Assertion that the user has the bot right failed', 'assertbotfailed' );
+                                               $this->dieWithError( 'apierror-assertbotfailed' );
                                        }
                                        break;
                        }
@@ -1363,9 +1467,8 @@ class ApiMain extends ApiBase {
                if ( isset( $params['assertuser'] ) ) {
                        $assertUser = User::newFromName( $params['assertuser'], false );
                        if ( !$assertUser || !$this->getUser()->equals( $assertUser ) ) {
-                               $this->dieUsage(
-                                       'Assertion that the user is "' . $params['assertuser'] . '" failed',
-                                       'assertnameduserfailed'
+                               $this->dieWithError(
+                                       [ 'apierror-assertnameduserfailed', wfEscapeWikiText( $params['assertuser'] ) ]
                                );
                        }
                }
@@ -1381,7 +1484,7 @@ class ApiMain extends ApiBase {
                if ( !$request->wasPosted() && $module->mustBePosted() ) {
                        // Module requires POST. GET request might still be allowed
                        // if $wgDebugApi is true, otherwise fail.
-                       $this->dieUsageMsgOrDebug( [ 'mustbeposted', $this->mAction ] );
+                       $this->dieWithErrorOrDebug( [ 'apierror-mustbeposted', $this->mAction ] );
                }
 
                // See if custom printer is used
@@ -1396,8 +1499,7 @@ class ApiMain extends ApiBase {
                        ( $this->getUser()->isLoggedIn() &&
                                $this->getUser()->requiresHTTPS() )
                ) ) {
-                       $this->logFeatureUsage( 'https-expected' );
-                       $this->setWarning( 'HTTP used when HTTPS was expected' );
+                       $this->addDeprecation( 'apiwarn-deprecation-httpsexpected', 'https-expected' );
                }
        }
 
@@ -1481,7 +1583,9 @@ class ApiMain extends ApiBase {
                ];
 
                if ( $e ) {
-                       $logCtx['errorCodes'][] = $this->errorMessageFromException( $e )['code'];
+                       foreach ( $this->errorMessagesFromException( $e ) as $msg ) {
+                               $logCtx['errorCodes'][] = $msg->getApiCode();
+                       }
                }
 
                // Construct space separated message for 'api' log channel
@@ -1560,9 +1664,7 @@ class ApiMain extends ApiBase {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
                                // See bug 10262 for why we don't just implode( '|', ... ) the
                                // array.
-                               $this->setWarning(
-                                       "Parameter '$name' uses unsupported PHP array syntax"
-                               );
+                               $this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
                        }
                        $ret = $default;
                }
@@ -1602,8 +1704,7 @@ class ApiMain extends ApiBase {
 
                if ( !$this->mInternalMode ) {
                        // Printer has not yet executed; don't warn that its parameters are unused
-                       $printerParams = array_map(
-                               [ $this->mPrinter, 'encodeParamName' ],
+                       $printerParams = $this->mPrinter->encodeParamName(
                                array_keys( $this->mPrinter->getFinalParams() ?: [] )
                        );
                        $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
@@ -1612,8 +1713,11 @@ class ApiMain extends ApiBase {
                }
 
                if ( count( $unusedParams ) ) {
-                       $s = count( $unusedParams ) > 1 ? 's' : '';
-                       $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
+                       $this->addWarning( [
+                               'apierror-unrecognizedparams',
+                               Message::listParam( array_map( 'wfEscapeWikiText', $unusedParams ), 'comma' ),
+                               count( $unusedParams )
+                       ] );
                }
        }
 
@@ -1624,7 +1728,7 @@ class ApiMain extends ApiBase {
         */
        protected function printResult( $httpCode = 0 ) {
                if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
-                       $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
+                       $this->addWarning( 'apiwarn-wgDebugAPI' );
                }
 
                $printer = $this->mPrinter;
@@ -1678,9 +1782,20 @@ class ApiMain extends ApiBase {
                        'requestid' => null,
                        'servedby' => false,
                        'curtimestamp' => false,
+                       'responselanginfo' => false,
                        'origin' => null,
                        'uselang' => [
-                               ApiBase::PARAM_DFLT => 'user',
+                               ApiBase::PARAM_DFLT => self::API_DEFAULT_USELANG,
+                       ],
+                       'errorformat' => [
+                               ApiBase::PARAM_TYPE => [ 'plaintext', 'wikitext', 'html', 'raw', 'none', 'bc' ],
+                               ApiBase::PARAM_DFLT => 'bc',
+                       ],
+                       'errorlang' => [
+                               ApiBase::PARAM_DFLT => 'uselang',
+                       ],
+                       'errorsuselocal' => [
+                               ApiBase::PARAM_DFLT => false,
                        ],
                ];
        }
@@ -1732,7 +1847,7 @@ class ApiMain extends ApiBase {
                        $help['permissions'] .= Html::rawElement( 'dd', null,
                                $this->msg( 'api-help-permissions-granted-to' )
                                        ->numParams( count( $groups ) )
-                                       ->params( $this->getLanguage()->commaList( $groups ) )
+                                       ->params( Message::listParam( $groups ) )
                                        ->parse()
                        );
                }
@@ -1831,70 +1946,6 @@ class ApiMain extends ApiBase {
        }
 }
 
-/**
- * This exception will be thrown when dieUsage is called to stop module execution.
- *
- * @ingroup API
- */
-class UsageException extends MWException {
-
-       private $mCodestr;
-
-       /**
-        * @var null|array
-        */
-       private $mExtraData;
-
-       /**
-        * @param string $message
-        * @param string $codestr
-        * @param int $code
-        * @param array|null $extradata
-        */
-       public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
-               parent::__construct( $message, $code );
-               $this->mCodestr = $codestr;
-               $this->mExtraData = $extradata;
-
-               // This should never happen, so throw an exception about it that will
-               // hopefully get logged with a backtrace (T138585)
-               if ( !is_string( $codestr ) || $codestr === '' ) {
-                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
-                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
-                       );
-               }
-       }
-
-       /**
-        * @return string
-        */
-       public function getCodeString() {
-               return $this->mCodestr;
-       }
-
-       /**
-        * @return array
-        */
-       public function getMessageArray() {
-               $result = [
-                       'code' => $this->mCodestr,
-                       'info' => $this->getMessage()
-               ];
-               if ( is_array( $this->mExtraData ) ) {
-                       $result = array_merge( $result, $this->mExtraData );
-               }
-
-               return $result;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return "{$this->getCodeString()}: {$this->getMessage()}";
-       }
-}
-
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 617db22..3c08093 100644 (file)
@@ -27,22 +27,34 @@ class ApiManageTags extends ApiBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
+               $user = $this->getUser();
 
                // make sure the user is allowed
                if ( $params['operation'] !== 'delete'
                        && !$this->getUser()->isAllowed( 'managechangetags' )
                ) {
-                       $this->dieUsage( "You don't have permission to manage change tags",
-                               'permissiondenied' );
+                       $this->dieWithError( 'tags-manage-no-permission', 'permissiondenied' );
                } elseif ( !$this->getUser()->isAllowed( 'deletechangetags' ) ) {
-                       $this->dieUsage( "You don't have permission to delete change tags",
-                               'permissiondenied' );
+                       $this->dieWithError( 'tags-delete-no-permission', 'permissiondenied' );
+               }
+
+               // Check if user can add the log entry tags which were requested
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                $result = $this->getResult();
                $funcName = "{$params['operation']}TagWithChecks";
-               $status = ChangeTags::$funcName( $params['tag'], $params['reason'],
-                       $this->getUser(), $params['ignorewarnings'] );
+               $status = ChangeTags::$funcName(
+                       $params['tag'],
+                       $params['reason'],
+                       $user,
+                       $params['ignorewarnings'],
+                       $params['tags'] ?: []
+               );
 
                if ( !$status->isOK() ) {
                        $this->dieStatus( $status );
@@ -59,6 +71,7 @@ class ApiManageTags extends ApiBase {
                if ( $ret['success'] ) {
                        $ret['logid'] = $status->value;
                }
+
                $result->addValue( null, $this->getModuleName(), $ret );
        }
 
@@ -87,6 +100,10 @@ class ApiManageTags extends ApiBase {
                                ApiBase::PARAM_TYPE => 'boolean',
                                ApiBase::PARAM_DFLT => false,
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 276f1c0..357698e 100644 (file)
@@ -42,24 +42,24 @@ class ApiMergeHistory extends ApiBase {
                if ( isset( $params['from'] ) ) {
                        $fromTitle = Title::newFromText( $params['from'] );
                        if ( !$fromTitle || $fromTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['from'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['from'] ) ] );
                        }
                } elseif ( isset( $params['fromid'] ) ) {
                        $fromTitle = Title::newFromID( $params['fromid'] );
                        if ( !$fromTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['fromid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['fromid'] ] );
                        }
                }
 
                if ( isset( $params['to'] ) ) {
                        $toTitle = Title::newFromText( $params['to'] );
                        if ( !$toTitle || $toTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['to'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['to'] ) ] );
                        }
                } elseif ( isset( $params['toid'] ) ) {
                        $toTitle = Title::newFromID( $params['toid'] );
                        if ( !$toTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['toid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['toid'] ] );
                        }
                }
 
index ae66778..9e42d5f 100644 (file)
@@ -36,9 +36,10 @@ interface IApiMessage extends MessageSpecifier {
        /**
         * Returns a machine-readable code for use by the API
         *
-        * The message key is often sufficient, but sometimes there are multiple
-        * messages used for what is really the same underlying condition (e.g.
-        * badaccess-groups and badaccess-group0)
+        * If no code was specifically set, the message key is used as the code
+        * after removing "apiwarn-" or "apierror-" prefixes and applying
+        * backwards-compatibility mappings.
+        *
         * @return string
         */
        public function getApiCode();
@@ -51,7 +52,7 @@ interface IApiMessage extends MessageSpecifier {
 
        /**
         * Sets the machine-readable code for use by the API
-        * @param string|null $code If null, the message key should be returned by self::getApiCode()
+        * @param string|null $code If null, uses the default (see self::getApiCode())
         * @param array|null $data If non-null, passed to self::setApiData()
         */
        public function setApiCode( $code, array $data = null );
@@ -69,14 +70,96 @@ interface IApiMessage extends MessageSpecifier {
  * @ingroup API
  */
 trait ApiMessageTrait {
+
+       /**
+        * Compatibility code mappings for various MW messages.
+        * @todo Ideally anything relying on this should be changed to use ApiMessage.
+        */
+       protected static $messageMap = [
+               'actionthrottledtext' => 'ratelimited',
+               'autoblockedtext' => 'autoblocked',
+               'badaccess-group0' => 'permissiondenied',
+               'badaccess-groups' => 'permissiondenied',
+               'badipaddress' => 'invalidip',
+               'blankpage' => 'emptypage',
+               'blockedtext' => 'blocked',
+               'cannotdelete' => 'cantdelete',
+               'cannotundelete' => 'cantundelete',
+               'cantmove-titleprotected' => 'protectedtitle',
+               'cantrollback' => 'onlyauthor',
+               'confirmedittext' => 'confirmemail',
+               'content-not-allowed-here' => 'contentnotallowedhere',
+               'deleteprotected' => 'cantedit',
+               'delete-toobig' => 'bigdelete',
+               'edit-conflict' => 'editconflict',
+               'imagenocrossnamespace' => 'nonfilenamespace',
+               'imagetypemismatch' => 'filetypemismatch',
+               'importbadinterwiki' => 'badinterwiki',
+               'importcantopen' => 'cantopenfile',
+               'import-noarticle' => 'badinterwiki',
+               'importnofile' => 'nofile',
+               'importuploaderrorpartial' => 'partialupload',
+               'importuploaderrorsize' => 'filetoobig',
+               'importuploaderrortemp' => 'notempdir',
+               'ipb_already_blocked' => 'alreadyblocked',
+               'ipb_blocked_as_range' => 'blockedasrange',
+               'ipb_cant_unblock' => 'cantunblock',
+               'ipb_expiry_invalid' => 'invalidexpiry',
+               'ip_range_invalid' => 'invalidrange',
+               'mailnologin' => 'cantsend',
+               'markedaspatrollederror-noautopatrol' => 'noautopatrol',
+               'movenologintext' => 'cantmove-anon',
+               'movenotallowed' => 'cantmove',
+               'movenotallowedfile' => 'cantmovefile',
+               'namespaceprotected' => 'protectednamespace',
+               'nocreate-loggedin' => 'cantcreate',
+               'nocreatetext' => 'cantcreate-anon',
+               'noname' => 'invaliduser',
+               'nosuchusershort' => 'nosuchuser',
+               'notanarticle' => 'missingtitle',
+               'nouserspecified' => 'invaliduser',
+               'ns-specialprotected' => 'unsupportednamespace',
+               'protect-cantedit' => 'cantedit',
+               'protectedinterface' => 'protectednamespace-interface',
+               'protectedpagetext' => 'protectedpage',
+               'range_block_disabled' => 'rangedisabled',
+               'rcpatroldisabled' => 'patroldisabled',
+               'readonlytext' => 'readonly',
+               'sessionfailure' => 'badtoken',
+               'systemblockedtext' => 'blocked',
+               'titleprotected' => 'protectedtitle',
+               'undo-failure' => 'undofailure',
+               'userrights-nodatabase' => 'nosuchdatabase',
+               'userrights-no-interwiki' => 'nointerwikiuserrights',
+       ];
+
        protected $apiCode = null;
        protected $apiData = [];
 
        public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+               if ( $this->apiCode === null ) {
+                       $key = $this->getKey();
+                       if ( isset( self::$messageMap[$key] ) ) {
+                               $this->apiCode = self::$messageMap[$key];
+                       } elseif ( $key === 'apierror-missingparam' ) {
+                               /// @todo: Kill this case along with ApiBase::$messageMap
+                               $this->apiCode = 'no' . $this->getParams()[0];
+                       } elseif ( substr( $key, 0, 8 ) === 'apiwarn-' ) {
+                               $this->apiCode = substr( $key, 8 );
+                       } elseif ( substr( $key, 0, 9 ) === 'apierror-' ) {
+                               $this->apiCode = substr( $key, 9 );
+                       } else {
+                               $this->apiCode = $key;
+                       }
+               }
+               return $this->apiCode;
        }
 
        public function setApiCode( $code, array $data = null ) {
+               if ( $code !== null && !( is_string( $code ) && $code !== '' ) ) {
+                       throw new InvalidArgumentException( "Invalid code \"$code\"" );
+               }
+
                $this->apiCode = $code;
                if ( $data !== null ) {
                        $this->setApiData( $data );
@@ -124,9 +207,25 @@ class ApiMessage extends Message implements IApiMessage {
         * @param Message|RawMessage|array|string $msg
         * @param string|null $code
         * @param array|null $data
-        * @return ApiMessage
+        * @return IApiMessage
         */
        public static function create( $msg, $code = null, array $data = null ) {
+               if ( is_array( $msg ) ) {
+                       // From StatusValue
+                       if ( isset( $msg['message'] ) ) {
+                               if ( isset( $msg['params'] ) ) {
+                                       $msg = array_merge( [ $msg['message'] ], $msg['params'] );
+                               } else {
+                                       $msg = [ $msg['message'] ];
+                               }
+                       }
+
+                       // Weirdness that comes in sometimes, including the above
+                       if ( $msg[0] instanceof MessageSpecifier ) {
+                               $msg = $msg[0];
+                       }
+               }
+
                if ( $msg instanceof IApiMessage ) {
                        return $msg;
                } elseif ( $msg instanceof RawMessage ) {
@@ -143,7 +242,6 @@ class ApiMessage extends Message implements IApiMessage {
         *  - string: passed to Message::__construct
         * @param string|null $code
         * @param array|null $data
-        * @return ApiMessage
         */
        public function __construct( $msg, $code = null, array $data = null ) {
                if ( $msg instanceof Message ) {
@@ -158,8 +256,7 @@ class ApiMessage extends Message implements IApiMessage {
                } else {
                        parent::__construct( $msg );
                }
-               $this->apiCode = $code;
-               $this->apiData = (array)$data;
+               $this->setApiCode( $code, $data );
        }
 }
 
@@ -192,7 +289,6 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
                } else {
                        parent::__construct( $msg );
                }
-               $this->apiCode = $code;
-               $this->apiData = (array)$data;
+               $this->setApiCode( $code, $data );
        }
 }
index 29e67b0..ab7199f 100644 (file)
@@ -41,45 +41,54 @@ class ApiMove extends ApiBase {
                if ( isset( $params['from'] ) ) {
                        $fromTitle = Title::newFromText( $params['from'] );
                        if ( !$fromTitle || $fromTitle->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['from'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['from'] ) ] );
                        }
                } elseif ( isset( $params['fromid'] ) ) {
                        $fromTitle = Title::newFromID( $params['fromid'] );
                        if ( !$fromTitle ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['fromid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['fromid'] ] );
                        }
                }
 
                if ( !$fromTitle->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
                $fromTalk = $fromTitle->getTalkPage();
 
                $toTitle = Title::newFromText( $params['to'] );
                if ( !$toTitle || $toTitle->isExternal() ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $params['to'] ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['to'] ) ] );
                }
-               $toTalk = $toTitle->getTalkPage();
+               $toTalk = $toTitle->canTalk() ? $toTitle->getTalkPage() : null;
 
                if ( $toTitle->getNamespace() == NS_FILE
                        && !RepoGroup::singleton()->getLocalRepo()->findFile( $toTitle )
                        && wfFindFile( $toTitle )
                ) {
                        if ( !$params['ignorewarnings'] && $user->isAllowed( 'reupload-shared' ) ) {
-                               $this->dieUsageMsg( 'sharedfile-exists' );
+                               $this->dieWithError( 'apierror-fileexists-sharedrepo-perm' );
                        } elseif ( !$user->isAllowed( 'reupload-shared' ) ) {
-                               $this->dieUsageMsg( 'cantoverwrite-sharedfile' );
+                               $this->dieWithError( 'apierror-cantoverwrite-sharedfile' );
                        }
                }
 
                // Rate limit
                if ( $user->pingLimiter( 'move' ) ) {
-                       $this->dieUsageMsg( 'actionthrottledtext' );
+                       $this->dieWithError( 'apierror-ratelimited' );
+               }
+
+               // Check if the user is allowed to add the specified changetags
+               if ( $params['tags'] ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                // Move the page
                $toTitleExists = $toTitle->exists();
-               $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'] );
+               $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'],
+                       $params['tags'] ?: [] );
                if ( !$status->isOK() ) {
                        $this->dieStatus( $status );
                }
@@ -100,18 +109,22 @@ class ApiMove extends ApiBase {
                $r['moveoverredirect'] = $toTitleExists;
 
                // Move the talk page
-               if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
+               if ( $params['movetalk'] && $toTalk && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
                        $toTalkExists = $toTalk->exists();
-                       $status = $this->movePage( $fromTalk, $toTalk, $params['reason'], !$params['noredirect'] );
+                       $status = $this->movePage(
+                               $fromTalk,
+                               $toTalk,
+                               $params['reason'],
+                               !$params['noredirect'],
+                               $params['tags'] ?: []
+                       );
                        if ( $status->isOK() ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
                                $r['talkmoveoverredirect'] = $toTalkExists;
                        } else {
-                               // We're not gonna dieUsage() on failure, since we already changed something
-                               $error = $this->getErrorFromStatus( $status );
-                               $r['talkmove-error-code'] = $error[0];
-                               $r['talkmove-error-info'] = $error[1];
+                               // We're not going to dieWithError() on failure, since we already changed something
+                               $r['talkmove-errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        }
                }
 
@@ -119,13 +132,23 @@ class ApiMove extends ApiBase {
 
                // Move subpages
                if ( $params['movesubpages'] ) {
-                       $r['subpages'] = $this->moveSubpages( $fromTitle, $toTitle,
-                               $params['reason'], $params['noredirect'] );
+                       $r['subpages'] = $this->moveSubpages(
+                               $fromTitle,
+                               $toTitle,
+                               $params['reason'],
+                               $params['noredirect'],
+                               $params['tags'] ?: []
+                       );
                        ApiResult::setIndexedTagName( $r['subpages'], 'subpage' );
 
                        if ( $params['movetalk'] ) {
-                               $r['subpages-talk'] = $this->moveSubpages( $fromTalk, $toTalk,
-                                       $params['reason'], $params['noredirect'] );
+                               $r['subpages-talk'] = $this->moveSubpages(
+                                       $fromTalk,
+                                       $toTalk,
+                                       $params['reason'],
+                                       $params['noredirect'],
+                                       $params['tags'] ?: []
+                               );
                                ApiResult::setIndexedTagName( $r['subpages-talk'], 'subpage' );
                        }
                }
@@ -151,26 +174,28 @@ class ApiMove extends ApiBase {
         * @param Title $to
         * @param string $reason
         * @param bool $createRedirect
+        * @param array $changeTags Applied to the entry in the move log and redirect page revision
         * @return Status
         */
-       protected function movePage( Title $from, Title $to, $reason, $createRedirect ) {
+       protected function movePage( Title $from, Title $to, $reason, $createRedirect, $changeTags ) {
                $mp = new MovePage( $from, $to );
                $valid = $mp->isValidMove();
                if ( !$valid->isOK() ) {
                        return $valid;
                }
 
-               $permStatus = $mp->checkPermissions( $this->getUser(), $reason );
+               $user = $this->getUser();
+               $permStatus = $mp->checkPermissions( $user, $reason );
                if ( !$permStatus->isOK() ) {
                        return $permStatus;
                }
 
                // Check suppressredirect permission
-               if ( !$this->getUser()->isAllowed( 'suppressredirect' ) ) {
+               if ( !$user->isAllowed( 'suppressredirect' ) ) {
                        $createRedirect = true;
                }
 
-               return $mp->move( $this->getUser(), $reason, $createRedirect );
+               return $mp->move( $user, $reason, $createRedirect, $changeTags );
        }
 
        /**
@@ -178,13 +203,16 @@ class ApiMove extends ApiBase {
         * @param Title $toTitle
         * @param string $reason
         * @param bool $noredirect
+        * @param array $changeTags Applied to the entry in the move log and redirect page revisions
         * @return array
         */
-       public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect ) {
+       public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect, $changeTags = [] ) {
                $retval = [];
-               $success = $fromTitle->moveSubpages( $toTitle, true, $reason, !$noredirect );
+
+               $success = $fromTitle->moveSubpages( $toTitle, true, $reason, !$noredirect, $changeTags );
                if ( isset( $success[0] ) ) {
-                       return [ 'error' => $this->parseMsg( $success ) ];
+                       $status = $this->errorArrayToStatus( $success );
+                       return [ 'errors' => $this->getErrorFormatter()->arrayFromStatus( $status ) ];
                }
 
                // At least some pages could be moved
@@ -192,7 +220,8 @@ class ApiMove extends ApiBase {
                foreach ( $success as $oldTitle => $newTitle ) {
                        $r = [ 'from' => $oldTitle ];
                        if ( is_array( $newTitle ) ) {
-                               $r['error'] = $this->parseMsg( reset( $newTitle ) );
+                               $status = $this->errorArrayToStatus( $newTitle );
+                               $r['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        } else {
                                // Success
                                $r['to'] = $newTitle;
@@ -242,7 +271,11 @@ class ApiMove extends ApiBase {
                                        'nochange'
                                ],
                        ],
-                       'ignorewarnings' => false
+                       'ignorewarnings' => false,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index ace776c..e6fe27c 100644 (file)
@@ -391,14 +391,14 @@ class ApiOpenSearchFormatJson extends ApiFormatJson {
        }
 
        public function execute() {
-               if ( !$this->getResult()->getResultData( 'error' ) ) {
-                       $result = $this->getResult();
-
+               $result = $this->getResult();
+               if ( !$result->getResultData( 'error' ) && !$result->getResultData( 'errors' ) ) {
                        // Ignore warnings or treat as errors, as requested
                        $warnings = $result->removeValue( 'warnings', null );
                        if ( $this->warningsAsError && $warnings ) {
-                               $this->dieUsage(
-                                       'Warnings cannot be represented in OpenSearch JSON format', 'warnings', 0,
+                               $this->dieWithError(
+                                       'apierror-opensearch-json-warnings',
+                                       'warnings',
                                        [ 'warnings' => $warnings ]
                                );
                        }
index 8bfe447..466d186 100644 (file)
@@ -36,22 +36,26 @@ class ApiOptions extends ApiBase {
         */
        public function execute() {
                if ( $this->getUser()->isAnon() ) {
-                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
-               } elseif ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
-                       $this->dieUsage( "You don't have permission to edit your options", 'permissiondenied' );
+                       $this->dieWithError(
+                               [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
+                       );
                }
 
+               $this->checkUserRightsAny( 'editmyoptions' );
+
                $params = $this->extractRequestParams();
                $changed = false;
 
                if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'optionname' ] );
+                       $this->dieWithError( [ 'apierror-missingparam', 'optionname' ] );
                }
 
                // Load the user from the master to reduce CAS errors on double post (T95839)
                $user = $this->getUser()->getInstanceForUpdate();
                if ( !$user ) {
-                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+                       $this->dieWithError(
+                               [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
+                       );
                }
 
                if ( $params['reset'] ) {
@@ -71,7 +75,7 @@ class ApiOptions extends ApiBase {
                        $changes[$params['optionname']] = $newValue;
                }
                if ( !$changed && !count( $changes ) ) {
-                       $this->dieUsage( 'No changes were requested', 'nochanges' );
+                       $this->dieWithError( 'apierror-nochanges' );
                }
 
                $prefs = Preferences::getPreferences( $user, $this->getContext() );
@@ -98,26 +102,26 @@ class ApiOptions extends ApiBase {
                                case 'userjs':
                                        // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
                                        if ( strlen( $key ) > 255 ) {
-                                               $validation = 'key too long (no more than 255 bytes allowed)';
+                                               $validation = $this->msg( 'apiwarn-validationfailed-keytoolong', Message::numParam( 255 ) );
                                        } elseif ( preg_match( '/[^a-zA-Z0-9_-]/', $key ) !== 0 ) {
-                                               $validation = 'invalid key (only a-z, A-Z, 0-9, _, - allowed)';
+                                               $validation = $this->msg( 'apiwarn-validationfailed-badchars' );
                                        } else {
                                                $validation = true;
                                        }
                                        break;
                                case 'special':
-                                       $validation = 'cannot be set by this module';
+                                       $validation = $this->msg( 'apiwarn-validationfailed-cannotset' );
                                        break;
                                case 'unused':
                                default:
-                                       $validation = 'not a valid preference';
+                                       $validation = $this->msg( 'apiwarn-validationfailed-badpref' );
                                        break;
                        }
                        if ( $validation === true ) {
                                $user->setOption( $key, $value );
                                $changed = true;
                        } else {
-                               $this->setWarning( "Validation error for '$key': $validation" );
+                               $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikitext( $key ), $validation ] );
                        }
                }
 
index 853a805..d42e306 100644 (file)
@@ -155,10 +155,10 @@ class ApiPageSet extends ApiBase {
                        }
                        $generator = $dbSource->getModuleManager()->getModule( $generatorName, null, true );
                        if ( $generator === null ) {
-                               $this->dieUsage( 'Unknown generator=' . $generatorName, 'badgenerator' );
+                               $this->dieWithError( [ 'apierror-badgenerator-unknown', $generatorName ], 'badgenerator' );
                        }
                        if ( !$generator instanceof ApiQueryGeneratorBase ) {
-                               $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
+                               $this->dieWithError( [ 'apierror-badgenerator-notgenerator', $generatorName ], 'badgenerator' );
                        }
                        // Create a temporary pageset to store generator's output,
                        // add any additional fields generator may need, and execute pageset to populate titles/pageids
@@ -174,7 +174,10 @@ class ApiPageSet extends ApiBase {
                        // populate this pageset with the generator output
                        if ( !$isDryRun ) {
                                $generator->executeGenerator( $this );
-                               Hooks::run( 'APIQueryGeneratorAfterExecute', [ &$generator, &$this ] );
+
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $apiModule = $this;
+                               Hooks::run( 'APIQueryGeneratorAfterExecute', [ &$generator, &$apiModule ] );
                        } else {
                                // Prevent warnings from being reported on these parameters
                                $main = $this->getMain();
@@ -194,13 +197,27 @@ class ApiPageSet extends ApiBase {
                        }
                        if ( isset( $this->mParams['pageids'] ) ) {
                                if ( isset( $dataSource ) ) {
-                                       $this->dieUsage( "Cannot use 'pageids' at the same time as '$dataSource'", 'multisource' );
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-cannotusewith',
+                                                       $this->encodeParamName( 'pageids' ),
+                                                       $this->encodeParamName( $dataSource )
+                                               ],
+                                               'multisource'
+                                       );
                                }
                                $dataSource = 'pageids';
                        }
                        if ( isset( $this->mParams['revids'] ) ) {
                                if ( isset( $dataSource ) ) {
-                                       $this->dieUsage( "Cannot use 'revids' at the same time as '$dataSource'", 'multisource' );
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-cannotusewith',
+                                                       $this->encodeParamName( 'revids' ),
+                                                       $this->encodeParamName( $dataSource )
+                                               ],
+                                               'multisource'
+                                       );
                                }
                                $dataSource = 'revids';
                        }
@@ -216,9 +233,7 @@ class ApiPageSet extends ApiBase {
                                                break;
                                        case 'revids':
                                                if ( $this->mResolveRedirects ) {
-                                                       $this->setWarning( 'Redirect resolution cannot be used ' .
-                                                               'together with the revids= parameter. Any redirects ' .
-                                                               'the revids= point to have not been resolved.' );
+                                                       $this->addWarning( 'apiwarn-redirectsandrevids' );
                                                }
                                                $this->mResolveRedirects = false;
                                                $this->initFromRevIDs( $this->mParams['revids'] );
@@ -1139,7 +1154,7 @@ class ApiPageSet extends ApiBase {
                                        $this->mAllPages[0][$title] = $this->mFakePageId;
                                        $this->mInvalidTitles[$this->mFakePageId] = [
                                                'title' => $title,
-                                               'invalidreason' => $ex->getMessage(),
+                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
                                        ];
                                        $this->mFakePageId--;
                                        continue; // There's nothing else we can do
index ffc3fc2..67983e7 100644 (file)
@@ -66,14 +66,17 @@ class ApiParamInfo extends ApiBase {
                                if ( $submodules ) {
                                        try {
                                                $module = $this->getModuleFromPath( $path );
-                                       } catch ( UsageException $ex ) {
-                                               $this->setWarning( $ex->getMessage() );
+                                       } catch ( ApiUsageException $ex ) {
+                                               foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                                                       $this->addWarning( $error );
+                                               }
+                                               continue;
                                        }
                                        $submodules = $this->listAllSubmodules( $module, $recursive );
                                        if ( $submodules ) {
                                                $modules = array_merge( $modules, $submodules );
                                        } else {
-                                               $this->setWarning( "Module $path has no submodules" );
+                                               $this->addWarning( [ 'apierror-badmodule-nosubmodules', $path ], 'badmodule' );
                                        }
                                } else {
                                        $modules[] = $path;
@@ -108,8 +111,10 @@ class ApiParamInfo extends ApiBase {
                foreach ( $modules as $m ) {
                        try {
                                $module = $this->getModuleFromPath( $m );
-                       } catch ( UsageException $ex ) {
-                               $this->setWarning( $ex->getMessage() );
+                       } catch ( ApiUsageException $ex ) {
+                               foreach ( $ex->getStatusValue()->getErrors() as $error ) {
+                                       $this->addWarning( $error );
+                               }
                                continue;
                        }
                        $key = 'modules';
@@ -232,7 +237,7 @@ class ApiParamInfo extends ApiBase {
 
        /**
         * @param ApiBase $module
-        * @return ApiResult
+        * @return array
         */
        private function getModuleInfo( $module ) {
                $ret = [];
@@ -421,6 +426,15 @@ class ApiParamInfo extends ApiBase {
                                        ( is_array( $item['type'] ) || $item['type'] === 'namespace' ) ) {
                                        $item['allspecifier'] = $allSpecifier;
                                }
+
+                               if ( $item['type'] === 'namespace' &&
+                                       isset( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] ) &&
+                                       is_array( $settings[ApiBase::PARAM_EXTRA_NAMESPACES] )
+                               ) {
+                                       $item['extranamespaces'] = $settings[ApiBase::PARAM_EXTRA_NAMESPACES];
+                                       ApiResult::setArrayType( $item['extranamespaces'], 'array' );
+                                       ApiResult::setIndexedTagName( $item['extranamespaces'], 'ns' );
+                               }
                        }
                        if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
                                $item['max'] = $settings[ApiBase::PARAM_MAX];
index 0cad5de..287ffb7 100644 (file)
@@ -36,18 +36,18 @@ class ApiParse extends ApiBase {
        /** @var Content $pstContent */
        private $pstContent = null;
 
-       private function checkReadPermissions( Title $title ) {
-               if ( !$title->userCan( 'read', $this->getUser() ) ) {
-                       $this->dieUsage( "You don't have permission to view this page", 'permissiondenied' );
-               }
-       }
-
        public function execute() {
                // The data is hot but user-dependent, like page views, so we set vary cookies
                $this->getMain()->setCacheMode( 'anon-public-user-private' );
 
                // Get parameters
                $params = $this->extractRequestParams();
+
+               // No easy way to say that text & title are allowed together while the
+               // rest aren't, so just do it in two calls.
+               $this->requireMaxOneParameter( $params, 'page', 'pageid', 'oldid', 'text' );
+               $this->requireMaxOneParameter( $params, 'page', 'pageid', 'oldid', 'title' );
+
                $text = $params['text'];
                $title = $params['title'];
                if ( $title === null ) {
@@ -65,21 +65,12 @@ class ApiParse extends ApiBase {
                $model = $params['contentmodel'];
                $format = $params['contentformat'];
 
-               if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
-                       $this->dieUsage(
-                               'The page parameter cannot be used together with the text and title parameters',
-                               'params'
-                       );
-               }
-
                $prop = array_flip( $params['prop'] );
 
                if ( isset( $params['section'] ) ) {
                        $this->section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $this->section ) ) {
-                               $this->dieUsage(
-                                       'The section parameter must be a valid section id or "new"', 'invalidsection'
-                               );
+                               $this->dieWithError( 'apierror-invalidsection' );
                        }
                } else {
                        $this->section = false;
@@ -97,21 +88,20 @@ class ApiParse extends ApiBase {
 
                if ( !is_null( $oldid ) || !is_null( $pageid ) || !is_null( $page ) ) {
                        if ( $this->section === 'new' ) {
-                                       $this->dieUsage(
-                                               'section=new cannot be combined with oldid, pageid or page parameters. ' .
-                                               'Please use text', 'params'
-                                       );
+                               $this->dieWithError( 'apierror-invalidparammix-parse-new-section', 'invalidparammix' );
                        }
                        if ( !is_null( $oldid ) ) {
                                // Don't use the parser cache
                                $rev = Revision::newFromId( $oldid );
                                if ( !$rev ) {
-                                       $this->dieUsage( "There is no revision ID $oldid", 'missingrev' );
+                                       $this->dieWithError( [ 'apierror-nosuchrevid', $oldid ] );
                                }
 
-                               $this->checkReadPermissions( $rev->getTitle() );
+                               $this->checkTitleUserPermissions( $rev->getTitle(), 'read' );
                                if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->dieUsage( "You don't have permission to view deleted revisions", 'permissiondenied' );
+                                       $this->dieWithError(
+                                               [ 'apierror-permissiondenied', $this->msg( 'action-deletedtext' ) ]
+                                       );
                                }
 
                                $titleObj = $rev->getTitle();
@@ -131,7 +121,9 @@ class ApiParse extends ApiBase {
                                        $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
                                        if ( $this->section !== false ) {
-                                               $this->content = $this->getSectionContent( $this->content, 'r' . $rev->getId() );
+                                               $this->content = $this->getSectionContent(
+                                                       $this->content, $this->msg( 'revid', $rev->getId() )
+                                               );
                                        }
 
                                        // Should we save old revision parses to the parser cache?
@@ -167,10 +159,10 @@ class ApiParse extends ApiBase {
                                $pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' );
                                $titleObj = $pageObj->getTitle();
                                if ( !$titleObj || !$titleObj->exists() ) {
-                                       $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+                                       $this->dieWithError( 'apierror-missingtitle' );
                                }
 
-                               $this->checkReadPermissions( $titleObj );
+                               $this->checkTitleUserPermissions( $titleObj, 'read' );
                                $wgTitle = $titleObj;
 
                                if ( isset( $prop['revid'] ) ) {
@@ -201,7 +193,7 @@ class ApiParse extends ApiBase {
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
                        if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $title ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $title ) ] );
                        }
                        $wgTitle = $titleObj;
                        if ( $titleObj->canExist() ) {
@@ -217,10 +209,7 @@ class ApiParse extends ApiBase {
 
                        if ( !$textProvided ) {
                                if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
-                                       $this->setWarning(
-                                               "'title' used without 'text', and parsed page properties were requested " .
-                                               "(did you mean to use 'page' instead of 'title'?)"
-                                       );
+                                       $this->addWarning( 'apiwarn-parse-titlewithouttext' );
                                }
                                // Prevent warning from ContentHandler::makeContent()
                                $text = '';
@@ -230,13 +219,15 @@ class ApiParse extends ApiBase {
                        // API title, but default to wikitext to keep BC.
                        if ( $textProvided && !$titleProvided && is_null( $model ) ) {
                                $model = CONTENT_MODEL_WIKITEXT;
-                               $this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
+                               $this->addWarning( [ 'apiwarn-parse-nocontentmodel', $model ] );
                        }
 
                        try {
                                $this->content = ContentHandler::makeContent( $text, $titleObj, $model, $format );
                        } catch ( MWContentSerializationException $ex ) {
-                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
+                               $this->dieWithException( $ex, [
+                                       'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' )
+                               ] );
                        }
 
                        if ( $this->section !== false ) {
@@ -357,10 +348,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['headitems'] ) ) {
                        $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
-                       $this->logFeatureUsage( 'action=parse&prop=headitems' );
-                       $this->setWarning( 'headitems is deprecated since MediaWiki 1.28. '
-                               . 'Use prop=headhtml when creating new HTML documents, or '
-                               . 'prop=modules|jsconfigvars when updating a document client-side.' );
+                       $this->addDeprecation( 'apiwarn-deprecation-parse-headitems', 'action=parse&prop=headitems' );
                }
 
                if ( isset( $prop['headhtml'] ) ) {
@@ -397,9 +385,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['modules'] ) &&
                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
-                       $this->setWarning( 'Property "modules" was set but not "jsconfigvars" ' .
-                               'or "encodedjsconfigvars". Configuration variables are necessary ' .
-                               'for proper module usage.' );
+                       $this->addWarning( 'apiwarn-moduleswithoutvars' );
                }
 
                if ( isset( $prop['indicators'] ) ) {
@@ -435,7 +421,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
-                               $this->dieUsage( 'parsetree is only supported for wikitext content', 'notwikitext' );
+                               $this->dieWithError( 'apierror-parsetree-notwikitext', 'notwikitext' );
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
@@ -516,7 +502,7 @@ class ApiParse extends ApiBase {
                // getParserOutput will save to Parser cache if able
                $pout = $page->getParserOutput( $popts );
                if ( !$pout ) {
-                       $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
+                       $this->dieWithError( [ 'apierror-nosuchrevid', $page->getLatest() ] );
                }
                if ( $getWikitext ) {
                        $this->content = $page->getContent( Revision::RAW );
@@ -538,7 +524,9 @@ class ApiParse extends ApiBase {
                if ( $this->section !== false && $content !== null ) {
                        $content = $this->getSectionContent(
                                $content,
-                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText()
+                               !is_null( $pageId )
+                                       ? $this->msg( 'pageid', $pageId )
+                                       : $page->getTitle()->getPrefixedText()
                        );
                }
                return $content;
@@ -548,17 +536,17 @@ class ApiParse extends ApiBase {
         * Extract the requested section from the given Content
         *
         * @param Content $content
-        * @param string $what Identifies the content in error messages, e.g. page title.
+        * @param string|Message $what Identifies the content in error messages, e.g. page title.
         * @return Content|bool
         */
        private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
                $section = $content->getSection( $this->section );
                if ( $section === false ) {
-                       $this->dieUsage( "There is no section {$this->section} in $what", 'nosuchsection' );
+                       $this->dieWithError( [ 'apierror-nosuchsection-what', $this->section, $what ], 'nosuchsection' );
                }
                if ( $section === null ) {
-                       $this->dieUsage( "Sections are not supported by $what", 'nosuchsection' );
+                       $this->dieWithError( [ 'apierror-sectionsnotsupported-what', $what ], 'nosuchsection' );
                        $section = false;
                }
 
index 6252882..c33542f 100644 (file)
@@ -40,19 +40,16 @@ class ApiPatrol extends ApiBase {
                if ( isset( $params['rcid'] ) ) {
                        $rc = RecentChange::newFromId( $params['rcid'] );
                        if ( !$rc ) {
-                               $this->dieUsageMsg( [ 'nosuchrcid', $params['rcid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrcid', $params['rcid'] ] );
                        }
                } else {
                        $rev = Revision::newFromId( $params['revid'] );
                        if ( !$rev ) {
-                               $this->dieUsageMsg( [ 'nosuchrevid', $params['revid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['revid'] ] );
                        }
                        $rc = $rev->getRecentChange();
                        if ( !$rc ) {
-                               $this->dieUsage(
-                                       'The revision ' . $params['revid'] . " can't be patrolled as it's too old",
-                                       'notpatrollable'
-                               );
+                               $this->dieWithError( [ 'apierror-notpatrollable', $params['revid'] ] );
                        }
                }
 
@@ -70,7 +67,7 @@ class ApiPatrol extends ApiBase {
                $retval = $rc->doMarkPatrolled( $user, false, $tags );
 
                if ( $retval ) {
-                       $this->dieUsageMsg( reset( $retval ) );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) );
                }
 
                $result = [ 'rcid' => intval( $rc->getAttribute( 'rc_id' ) ) ];
index d289060..c74f890 100644 (file)
  */
 class ApiProtect extends ApiBase {
        public function execute() {
-               global $wgContLang;
-
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
                $titleObj = $pageObj->getTitle();
 
-               $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
-               if ( $errors ) {
-                       // We don't care about multiple errors, just report one of them
-                       $this->dieUsageMsg( reset( $errors ) );
-               }
+               $this->checkTitleUserPermissions( $titleObj, 'protect' );
 
                $user = $this->getUser();
                $tags = $params['tags'];
@@ -58,8 +52,8 @@ class ApiProtect extends ApiBase {
                        if ( count( $expiry ) == 1 ) {
                                $expiry = array_fill( 0, count( $params['protections'] ), $expiry[0] );
                        } else {
-                               $this->dieUsageMsg( [
-                                       'toofewexpiries',
+                               $this->dieWithError( [
+                                       'apierror-toofewexpiries',
                                        count( $expiry ),
                                        count( $params['protections'] )
                                ] );
@@ -76,17 +70,17 @@ class ApiProtect extends ApiBase {
                        $protections[$p[0]] = ( $p[1] == 'all' ? '' : $p[1] );
 
                        if ( $titleObj->exists() && $p[0] == 'create' ) {
-                               $this->dieUsageMsg( 'create-titleexists' );
+                               $this->dieWithError( 'apierror-create-titleexists' );
                        }
                        if ( !$titleObj->exists() && $p[0] != 'create' ) {
-                               $this->dieUsageMsg( 'missingtitle-createonly' );
+                               $this->dieWithError( 'apierror-missingtitle-createonly' );
                        }
 
                        if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
-                               $this->dieUsageMsg( [ 'protect-invalidaction', $p[0] ] );
+                               $this->dieWithError( [ 'apierror-protect-invalidaction', wfEscapeWikiText( $p[0] ) ] );
                        }
                        if ( !in_array( $p[1], $this->getConfig()->get( 'RestrictionLevels' ) ) && $p[1] != 'all' ) {
-                               $this->dieUsageMsg( [ 'protect-invalidlevel', $p[1] ] );
+                               $this->dieWithError( [ 'apierror-protect-invalidlevel', wfEscapeWikiText( $p[1] ) ] );
                        }
 
                        if ( wfIsInfinity( $expiry[$i] ) ) {
@@ -94,18 +88,18 @@ class ApiProtect extends ApiBase {
                        } else {
                                $exp = strtotime( $expiry[$i] );
                                if ( $exp < 0 || !$exp ) {
-                                       $this->dieUsageMsg( [ 'invalidexpiry', $expiry[$i] ] );
+                                       $this->dieWithError( [ 'apierror-invalidexpiry', wfEscapeWikiText( $expiry[$i] ) ] );
                                }
 
                                $exp = wfTimestamp( TS_MW, $exp );
                                if ( $exp < wfTimestampNow() ) {
-                                       $this->dieUsageMsg( [ 'pastexpiry', $expiry[$i] ] );
+                                       $this->dieWithError( [ 'apierror-pastexpiry', wfEscapeWikiText( $expiry[$i] ) ] );
                                }
                                $expiryarray[$p[0]] = $exp;
                        }
                        $resultProtections[] = [
                                $p[0] => $protections[$p[0]],
-                               'expiry' => $wgContLang->formatExpiry( $expiryarray[$p[0]], TS_ISO_8601, 'infinite' ),
+                               'expiry' => ApiResult::formatExpiry( $expiryarray[$p[0]], 'infinite' ),
                        ];
                }
 
index 8bbd88d..324d030 100644 (file)
@@ -39,8 +39,7 @@ class ApiPurge extends ApiBase {
        public function execute() {
                $main = $this->getMain();
                if ( !$main->isInternalMode() && !$main->getRequest()->wasPosted() ) {
-                       $this->logFeatureUsage( 'purge-via-GET' );
-                       $this->setWarning( 'Use of action=purge via GET is deprecated. Use POST instead.' );
+                       $this->addDeprecation( 'apiwarn-deprecation-purge-get', 'purge-via-GET' );
                }
 
                $params = $this->extractRequestParams();
@@ -69,8 +68,7 @@ class ApiPurge extends ApiBase {
                                $page->doPurge( $flags );
                                $r['purged'] = true;
                        } else {
-                               $error = $this->parseMsg( [ 'actionthrottledtext' ] );
-                               $this->setWarning( $error['info'] );
+                               $this->addWarning( 'apierror-ratelimited' );
                        }
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
@@ -114,8 +112,7 @@ class ApiPurge extends ApiBase {
                                                }
                                        }
                                } else {
-                                       $error = $this->parseMsg( [ 'actionthrottledtext' ] );
-                                       $this->setWarning( $error['info'] );
+                                       $this->addWarning( 'apierror-ratelimited' );
                                        $forceLinkUpdate = false;
                                }
                        }
index 16bd725..8196cfa 100644 (file)
@@ -310,7 +310,7 @@ class ApiQuery extends ApiBase {
                                        ApiBase::dieDebug( __METHOD__, 'Error instantiating module' );
                                }
                                if ( !$wasPosted && $instance->mustBePosted() ) {
-                                       $this->dieUsageMsgOrDebug( [ 'mustbeposted', $moduleName ] );
+                                       $this->dieWithErrorOrDebug( [ 'apierror-mustbeposted', $moduleName ] );
                                }
                                // Ignore duplicates. TODO 2.0: die()?
                                if ( !array_key_exists( $moduleName, $modules ) ) {
@@ -415,11 +415,7 @@ class ApiQuery extends ApiBase {
                }
 
                if ( !$fit ) {
-                       $this->dieUsage(
-                               'The value of $wgAPIMaxResultSize on this wiki is ' .
-                                       'too small to hold basic result information',
-                               'badconfig'
-                       );
+                       $this->dieWithError( 'apierror-badconfig-resulttoosmall', 'badconfig' );
                }
 
                if ( $this->mParams['export'] ) {
index 3073a95..b09b977 100644 (file)
@@ -41,15 +41,10 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
         * @return void
         */
        protected function run( ApiPageSet $resultPageSet = null ) {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
 
@@ -75,16 +70,20 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        foreach ( [ 'from', 'to', 'prefix', 'excludeuser' ] as $param ) {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
-                                       $this->dieUsage( "The '{$p}{$param}' parameter cannot be used with '{$p}user'",
-                                               'badparams' );
+                                       $this->dieWithError(
+                                               [ 'apierror-invalidparammix-cannotusewith', $p.$param, "{$p}user" ],
+                                               'invalidparammix'
+                                       );
                                }
                        }
                } else {
                        foreach ( [ 'start', 'end' ] as $param ) {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
-                                       $this->dieUsage( "The '{$p}{$param}' parameter may only be used with '{$p}user'",
-                                               'badparams' );
+                                       $this->dieWithError(
+                                               [ 'apierror-invalidparammix-mustusewith', $p.$param, "{$p}user" ],
+                                               'invalidparammix'
+                                       );
                                }
                        }
                }
@@ -100,7 +99,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                $optimizeGenerateTitles = true;
                        } else {
                                $p = $this->getModulePrefix();
-                               $this->setWarning( "For better performance when generating titles, set {$p}dir=newer" );
+                               $this->addWarning( [ 'apiwarn-alldeletedrevisions-performance', $p ], 'performance' );
                        }
                }
 
@@ -148,12 +147,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
 
                $miser_ns = null;
index 8734f38..e3e5ed6 100644 (file)
@@ -64,11 +64,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage(
-                               'Use "gaifilterredir=nonredirects" option instead of "redirects" ' .
-                                       'when using allimages as a generator',
-                               'params'
-                       );
+                       $this->dieWithError( 'apierror-allimages-redirect', 'invalidparammix' );
                }
 
                $this->run( $resultPageSet );
@@ -81,10 +77,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $repo = $this->mRepo;
                if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage(
-                               'Local file repository does not support querying all images',
-                               'unsupportedrepo'
-                       );
+                       $this->dieWithError( 'apierror-unsupportedrepo' );
                }
 
                $prefix = $this->getModulePrefix();
@@ -109,16 +102,24 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $disallowed = [ 'start', 'end', 'user' ];
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage(
-                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp",
-                                               'badparams'
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-mustusewith',
+                                                       "{$prefix}{$pname}",
+                                                       "{$prefix}sort=timestamp"
+                                               ],
+                                               'invalidparammix'
                                        );
                                }
                        }
                        if ( $params['filterbots'] != 'all' ) {
-                               $this->dieUsage(
-                                       "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp",
-                                       'badparams'
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-mustusewith',
+                                               "{$prefix}filterbots",
+                                               "{$prefix}sort=timestamp"
+                                       ],
+                                       'invalidparammix'
                                );
                        }
 
@@ -146,18 +147,21 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $disallowed = [ 'from', 'to', 'prefix' ];
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage(
-                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name",
-                                               'badparams'
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-invalidparammix-mustusewith',
+                                                       "{$prefix}{$pname}",
+                                                       "{$prefix}sort=name"
+                                               ],
+                                               'invalidparammix'
                                        );
                                }
                        }
                        if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) {
                                // Since filterbots checks if each user has the bot right, it
                                // doesn't make sense to use it with user
-                               $this->dieUsage(
-                                       "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together",
-                                       'badparams'
+                               $this->dieWithError(
+                                       [ 'apierror-invalidparammix-cannotusewith', "{$prefix}user", "{$prefix}filterbots" ]
                                );
                        }
 
@@ -214,13 +218,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                if ( isset( $params['sha1'] ) ) {
                        $sha1 = strtolower( $params['sha1'] );
                        if ( !$this->validateSha1Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                               $this->dieWithError( 'apierror-invalidsha1hash' );
                        }
                        $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                } elseif ( isset( $params['sha1base36'] ) ) {
                        $sha1 = strtolower( $params['sha1base36'] );
                        if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                               $this->dieWithError( 'apierror-invalidsha1base36hash' );
                        }
                }
                if ( $sha1 ) {
@@ -229,7 +233,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['mime'] ) ) {
                        if ( $this->getConfig()->get( 'MiserMode' ) ) {
-                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
+                               $this->dieWithError( 'apierror-mimesearchdisabled' );
                        }
 
                        $mimeConds = [];
index ac90605..3b24e37 100644 (file)
@@ -116,9 +116,13 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        $matches = array_intersect_key( $prop, $this->props + [ 'ids' => 1 ] );
                        if ( $matches ) {
                                $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "Cannot use {$p}prop=" . implode( '|', array_keys( $matches ) ) . " with {$p}unique",
-                                       'params'
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-cannotusewith',
+                                               "{$p}prop=" . implode( '|', array_keys( $matches ) ),
+                                               "{$p}unique"
+                                       ],
+                                       'invalidparammix'
                                );
                        }
                        $this->addOption( 'DISTINCT' );
@@ -259,7 +263,8 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        ],
                        'namespace' => [
                                ApiBase::PARAM_DFLT => $this->dfltNamespace,
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'limit' => [
                                ApiBase::PARAM_DFLT => 10,
index e0ba4ea..244effc 100644 (file)
@@ -41,7 +41,9 @@ class ApiQueryAllMessages extends ApiQueryBase {
                if ( is_null( $params['lang'] ) ) {
                        $langObj = $this->getLanguage();
                } elseif ( !Language::isValidCode( $params['lang'] ) ) {
-                       $this->dieUsage( 'Invalid language code for parameter lang', 'invalidlang' );
+                       $this->dieWithError(
+                               [ 'apierror-invalidlang', $this->encodeParamName( 'lang' ) ], 'invalidlang'
+                       );
                } else {
                        $langObj = Language::factory( $params['lang'] );
                }
@@ -50,7 +52,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        if ( !is_null( $params['title'] ) ) {
                                $title = Title::newFromText( $params['title'] );
                                if ( !$title || $title->isExternal() ) {
-                                       $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                                }
                        } else {
                                $title = Title::newFromText( 'API' );
index 6a0f124..7460bd5 100644 (file)
@@ -50,11 +50,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage(
-                               'Use "gapfilterredir=nonredirects" option instead of "redirects" ' .
-                                       'when using allpages as a generator',
-                               'params'
-                       );
+                       $this->dieWithError( 'apierror-allpages-generator-redirects', 'params' );
                }
 
                $this->run( $resultPageSet );
@@ -157,7 +153,9 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
                        $this->addOption( 'DISTINCT' );
                } elseif ( isset( $params['prlevel'] ) ) {
-                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
+                       $this->dieWithError(
+                               [ 'apierror-invalidparammix-mustusewith', 'prlevel', 'prtype' ], 'invalidparammix'
+                       );
                }
 
                if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
index b7ed9dd..2e2ac32 100644 (file)
@@ -110,9 +110,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        }
                }
 
-               if ( !is_null( $params['group'] ) && !is_null( $params['excludegroup'] ) ) {
-                       $this->dieUsage( 'group and excludegroup cannot be used together', 'group-excludegroup' );
-               }
+               $this->requireMaxOneParameter( $params, 'group', 'excludegroup' );
 
                if ( !is_null( $params['group'] ) && count( $params['group'] ) ) {
                        // Filter only users that belong to a given group. This might
index fb502e4..613589e 100644 (file)
@@ -344,12 +344,12 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
                }
 
-               $this->rootTitle = $this->getTitleOrPageId( $this->params )->getTitle();
+               $this->rootTitle = $this->getTitleFromTitleOrPageId( $this->params );
 
                // only image titles are allowed for the root in imageinfo mode
                if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
-                       $this->dieUsage(
-                               "The title for {$this->getModuleName()} query must be a file",
+                       $this->dieWithError(
+                               [ 'apierror-imageusage-badtitle', $this->getModuleName() ],
                                'bad_image_title'
                        );
                }
index 8e89c32..4ed7f52 100644 (file)
@@ -104,6 +104,13 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $titles = $pageSet->getGoodAndMissingTitles();
                $map = $pageSet->getGoodAndMissingTitlesByNamespace();
 
+               // Add in special pages, they can theoretically have backlinks too.
+               // (although currently they only do for prop=redirects)
+               foreach ( $pageSet->getSpecialTitles() as $id => $title ) {
+                       $titles[] = $title;
+                       $map[$title->getNamespace()][$title->getDBkey()] = $id;
+               }
+
                // Determine our fields to query on
                $p = $settings['prefix'];
                $hasNS = !isset( $settings['to_namespace'] );
@@ -220,8 +227,9 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $this->addFieldsIf( 'page_namespace', $miser_ns !== null );
 
                if ( $hasNS ) {
-                       $lb = new LinkBatch( $titles );
-                       $this->addWhere( $lb->constructSet( $p, $db ) );
+                       // Can't use LinkBatch because it throws away Special titles.
+                       // And we already have the needed data structure anyway.
+                       $this->addWhere( $db->makeWhereFrom2d( $map, $bl_namespace, $bl_title ) );
                } else {
                        $where = [];
                        foreach ( $titles as $t ) {
@@ -238,7 +246,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                        if ( isset( $show['fragment'] ) && isset( $show['!fragment'] ) ||
                                isset( $show['redirect'] ) && isset( $show['!redirect'] )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
                        $this->addWhereIf( "rd_fragment != $emptyString", isset( $show['fragment'] ) );
                        $this->addWhereIf(
index bba5375..281fb61 100644 (file)
@@ -421,7 +421,7 @@ abstract class ApiQueryBase extends ApiBase {
 
                        $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
                        if ( !$likeQuery ) {
-                               $this->dieUsage( 'Invalid query', 'bad_query' );
+                               $this->dieWithError( 'apierror-badquery' );
                        }
 
                        $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
@@ -547,7 +547,7 @@ abstract class ApiQueryBase extends ApiBase {
                $t = Title::makeTitleSafe( $namespace, $titlePart . 'x' );
                if ( !$t || $t->hasFragment() ) {
                        // Invalid title (e.g. bad chars) or contained a '#'.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
                if ( $namespace != $t->getNamespace() || $t->isExternal() ) {
                        // This can happen in two cases. First, if you call titlePartToKey with a title part
@@ -555,7 +555,7 @@ abstract class ApiQueryBase extends ApiBase {
                        // difficult to handle such a case. Such cases cannot exist and are therefore treated
                        // as invalid user input. The second case is when somebody specifies a title interwiki
                        // prefix.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
 
                return substr( $t->getDBkey(), 0, -1 );
@@ -573,7 +573,7 @@ abstract class ApiQueryBase extends ApiBase {
                $t = Title::newFromText( $titlePart . 'x', $defaultNamespace );
                if ( !$t || $t->hasFragment() || $t->isExternal() ) {
                        // Invalid title (e.g. bad chars) or contained a '#'.
-                       $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titlePart ) ] );
                }
 
                return [ $t->getNamespace(), substr( $t->getDBkey(), 0, -1 ) ];
@@ -584,7 +584,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Hash( $hash ) {
-               return preg_match( '/^[a-f0-9]{40}$/', $hash );
+               return (bool)preg_match( '/^[a-f0-9]{40}$/', $hash );
        }
 
        /**
@@ -592,7 +592,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Base36Hash( $hash ) {
-               return preg_match( '/^[a-z0-9]{31}$/', $hash );
+               return (bool)preg_match( '/^[a-z0-9]{31}$/', $hash );
        }
 
        /**
index 5d7c664..0040860 100644 (file)
@@ -36,8 +36,6 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function execute() {
-               global $wgContLang;
-
                $db = $this->getDB();
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'users', 'ip' );
@@ -114,16 +112,13 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $cidrLimit = $blockCIDRLimit['IPv6'];
                                $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
                        } else {
-                               $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
+                               $this->dieWithError( 'apierror-badip', 'param_ip' );
                        }
 
                        # Check range validity, if it's a CIDR
                        list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
                        if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
-                               $this->dieUsage(
-                                       "$type CIDR ranges broader than /$cidrLimit are not accepted",
-                                       'cidrtoobroad'
-                               );
+                               $this->dieWithError( [ 'apierror-cidrtoobroad', $type, $cidrLimit ] );
                        }
 
                        # Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
@@ -154,7 +149,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                || ( isset( $show['range'] ) && isset( $show['!range'] ) )
                                || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        $this->addWhereIf( 'ipb_user = 0', isset( $show['!account'] ) );
@@ -207,7 +202,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $block['timestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
                        }
                        if ( $fld_expiry ) {
-                               $block['expiry'] = $wgContLang->formatExpiry( $row->ipb_expiry, TS_ISO_8601 );
+                               $block['expiry'] = ApiResult::formatExpiry( $row->ipb_expiry );
                        }
                        if ( $fld_reason ) {
                                $block['reason'] = $row->ipb_reason;
@@ -237,13 +232,19 @@ class ApiQueryBlocks extends ApiQueryBase {
 
        protected function prepareUsername( $user ) {
                if ( !$user ) {
-                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+                       $encParamName = $this->encodeParamName( 'users' );
+                       $this->dieWithError( [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $user ) ],
+                               "baduser_{$encParamName}"
+                       );
                }
                $name = User::isIP( $user )
                        ? $user
                        : User::getCanonicalName( $user, 'valid' );
                if ( $name === false ) {
-                       $this->dieUsage( "User name {$user} is not valid", 'param_user' );
+                       $encParamName = $this->encodeParamName( 'users' );
+                       $this->dieWithError( [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $user ) ],
+                               "baduser_{$encParamName}"
+                       );
                }
                return $name;
        }
index 63d0f6d..f2498ca 100644 (file)
@@ -74,7 +74,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                        foreach ( $params['categories'] as $cat ) {
                                $title = Title::newFromText( $cat );
                                if ( !$title || $title->getNamespace() != NS_CATEGORY ) {
-                                       $this->setWarning( "\"$cat\" is not a category" );
+                                       $this->addWarning( [ 'apiwarn-invalidcategory', wfEscapeWikiText( $cat ) ] );
                                } else {
                                        $cats[] = $title->getDBkey();
                                }
@@ -96,7 +96,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                }
 
                if ( isset( $show['hidden'] ) && isset( $show['!hidden'] ) ) {
-                       $this->dieUsageMsg( 'show' );
+                       $this->dieWithError( 'apierror-show' );
                }
                if ( isset( $show['hidden'] ) || isset( $show['!hidden'] ) || isset( $prop['hidden'] ) ) {
                        $this->addOption( 'STRAIGHT_JOIN' );
index 4865ad5..3a8847c 100644 (file)
@@ -53,7 +53,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
         */
        private function validateHexSortkey( $hexSortkey ) {
                // A hex sortkey has an unbound number of 2 letter pairs
-               return preg_match( '/^(?:[a-fA-F0-9]{2})*$/D', $hexSortkey );
+               return (bool)preg_match( '/^(?:[a-fA-F0-9]{2})*$/D', $hexSortkey );
        }
 
        /**
@@ -65,7 +65,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                $categoryTitle = $this->getTitleOrPageId( $params )->getTitle();
                if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                       $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
+                       $this->dieWithError( 'apierror-invalidcategory' );
                }
 
                $prop = array_flip( $params['prop'] );
@@ -153,7 +153,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        $startsortkey = Collation::singleton()->getSortKey( $params['startsortkeyprefix'] );
                                } elseif ( $params['starthexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) {
-                                               $this->dieUsage( 'The starthexsortkey provided is not valid', 'bad_starthexsortkey' );
+                                               $encParamName = $this->encodeParamName( 'starthexsortkey' );
+                                               $this->dieWithError( [ 'apierror-badparameter', $encParamName ], "badvalue_$encParamName" );
                                        }
                                        $startsortkey = hex2bin( $params['starthexsortkey'] );
                                } else {
@@ -163,7 +164,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        $endsortkey = Collation::singleton()->getSortKey( $params['endsortkeyprefix'] );
                                } elseif ( $params['endhexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) {
-                                               $this->dieUsage( 'The endhexsortkey provided is not valid', 'bad_endhexsortkey' );
+                                               $encParamName = $this->encodeParamName( 'endhexsortkey' );
+                                               $this->dieWithError( [ 'apierror-badparameter', $encParamName ], "badvalue_$encParamName" );
                                        }
                                        $endsortkey = hex2bin( $params['endhexsortkey'] );
                                } else {
index cfd0653..d0b8214 100644 (file)
@@ -39,12 +39,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
        protected function run( ApiPageSet $resultPageSet = null ) {
                $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
                $pageSet = $this->getPageSet();
                $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
@@ -63,9 +58,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
 
                $db = $this->getDB();
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                $this->addTables( 'archive' );
                if ( $resultPageSet === null ) {
@@ -106,12 +99,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
 
                $dir = $params['dir'];
index d58efa1..6a259cd 100644 (file)
@@ -37,21 +37,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        }
 
        public function execute() {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted revision information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
-               $this->setWarning(
-                       'list=deletedrevs has been deprecated. Please use prop=deletedrevisions or ' .
-                       'list=alldeletedrevisions instead.'
-               );
-               $this->logFeatureUsage( 'action=query&list=deletedrevs' );
+               $this->addDeprecation( 'apiwarn-deprecation-deletedrevs', 'action=query&list=deletedrevs' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
                $prop = array_flip( $params['prop'] );
@@ -70,9 +61,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( isset( $prop['token'] ) ) {
                        $p = $this->getModulePrefix();
-                       $this->setWarning(
-                               "{$p}prop=token has been deprecated. Please use action=query&meta=tokens instead."
-                       );
                }
 
                // If we're in a mode that breaks the same-origin policy, no tokens can
@@ -105,19 +93,19 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        // Ignore namespace and unique due to inability to know whether they were purposely set
                        foreach ( [ 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ] as $p ) {
                                if ( !is_null( $params[$p] ) ) {
-                                       $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
+                                       $this->dieWithError( [ 'apierror-deletedrevs-param-not-1-2', $p ], 'badparams' );
                                }
                        }
                } else {
                        foreach ( [ 'start', 'end' ] as $p ) {
                                if ( !is_null( $params[$p] ) ) {
-                                       $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
+                                       $this->dieWithError( [ 'apierror-deletedrevs-param-not-3', $p ], 'badparams' );
                                }
                        }
                }
 
                if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
+                       $this->dieWithError( 'user and excludeuser cannot be used together', 'badparams' );
                }
 
                $this->addTables( 'archive' );
@@ -162,12 +150,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $this->addFields( [ 'ar_text', 'ar_flags', 'ar_text_id', 'old_text', 'old_flags' ] );
 
                        // This also means stricter restrictions
-                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
-                               $this->dieUsage(
-                                       'You don\'t have permission to view deleted revision content',
-                                       'permissiondenied'
-                               );
-                       }
+                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
                }
                // Check limits
                $userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
index e1c97e1..9476066 100644 (file)
@@ -37,7 +37,7 @@
 class ApiQueryDisabled extends ApiQueryBase {
 
        public function execute() {
-               $this->setWarning( "The \"{$this->getModuleName()}\" module has been disabled." );
+               $this->addWarning( [ 'apierror-moduledisabled', $this->getModuleName() ] );
        }
 
        public function getAllowedParams() {
index 03be491..116dbb3 100644 (file)
@@ -38,15 +38,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function execute() {
-               $user = $this->getUser();
                // Before doing anything at all, let's check permissions
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage(
-                               'You don\'t have permission to view deleted file information',
-                               'permissiondenied'
-                       );
-               }
+               $this->checkUserRightsAny( 'deletedhistory' );
 
+               $user = $this->getUser();
                $db = $this->getDB();
 
                $params = $this->extractRequestParams();
@@ -112,13 +107,13 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        if ( $sha1Set ) {
                                $sha1 = strtolower( $params['sha1'] );
                                if ( !$this->validateSha1Hash( $sha1 ) ) {
-                                       $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                                       $this->dieWithError( 'apierror-invalidsha1hash' );
                                }
                                $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                        } elseif ( $sha1base36Set ) {
                                $sha1 = strtolower( $params['sha1base36'] );
                                if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                                       $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                                       $this->dieWithError( 'apierror-invalidsha1base36hash' );
                                }
                        }
                        if ( $sha1 ) {
index 7568107..6e2fb67 100644 (file)
@@ -51,7 +51,14 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'prefix' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'prefix' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                if ( !is_null( $params['continue'] ) ) {
index 6d9c2ca..cfd990b 100644 (file)
@@ -45,7 +45,14 @@ class ApiQueryIWLinks extends ApiQueryBase {
                $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['prefix'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'prefix' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'prefix' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                // Handle deprecated param
index d1fcfa3..c9dae8d 100644 (file)
@@ -58,6 +58,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'revdelUser' => $this->getUser(),
                ];
 
+               if ( isset( $params['badfilecontexttitle'] ) ) {
+                       $badFileContextTitle = Title::newFromText( $params['badfilecontexttitle'] );
+                       if ( !$badFileContextTitle ) {
+                               $this->dieUsage( 'Invalid title in badfilecontexttitle parameter', 'invalid-title' );
+                       }
+               } else {
+                       $badFileContextTitle = false;
+               }
+
                $pageIds = $this->getPageSet()->getGoodAndMissingTitlesByNamespace();
                if ( !empty( $pageIds[NS_FILE] ) ) {
                        $titles = array_keys( $pageIds[NS_FILE] );
@@ -95,13 +104,16 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                        $result = $this->getResult();
                        foreach ( $titles as $title ) {
+                               $info = [];
                                $pageId = $pageIds[NS_FILE][$title];
                                $start = $title === $fromTitle ? $fromTimestamp : $params['start'];
 
                                if ( !isset( $images[$title] ) ) {
-                                       if ( isset( $prop['uploadwarning'] ) ) {
-                                               // Uploadwarning needs info about non-existing files
+                                       if ( isset( $prop['uploadwarning'] ) || isset( $prop['badfile'] ) ) {
+                                               // uploadwarning and badfile need info about non-existing files
                                                $images[$title] = wfLocalFile( $title );
+                                               // Doesn't exist, so set an empty image repository
+                                               $info['imagerepository'] = '';
                                        } else {
                                                $result->addValue(
                                                        [ 'query', 'pages', intval( $pageId ) ],
@@ -128,10 +140,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        break;
                                }
 
-                               $fit = $result->addValue(
-                                       [ 'query', 'pages', intval( $pageId ) ],
-                                       'imagerepository', $img->getRepoName()
-                               );
+                               if ( !isset( $info['imagerepository'] ) ) {
+                                       $info['imagerepository'] = $img->getRepoName();
+                               }
+                               if ( isset( $prop['badfile'] ) ) {
+                                       $info['badfile'] = (bool)wfIsBadImage( $title, $badFileContextTitle );
+                               }
+
+                               $fit = $result->addValue( [ 'query', 'pages' ], intval( $pageId ), $info );
                                if ( !$fit ) {
                                        if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                // The user is screwed. imageinfo can't be solely
@@ -280,8 +296,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                $h = $image->getHandler();
                if ( !$h ) {
-                       $this->setWarning( 'Could not create thumbnail because ' .
-                               $image->getName() . ' does not have an associated image handler' );
+                       $this->addWarning( [ 'apiwarn-nothumb-noimagehandler', wfEscapeWikiText( $image->getName() ) ] );
 
                        return $thumbParams;
                }
@@ -292,23 +307,24 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        // we could still render the image using width and height parameters,
                        // and this type of thing could happen between different versions of
                        // handlers.
-                       $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName()
-                               . '. Using only width and height' );
+                       $this->addWarning( [ 'apiwarn-badurlparam', $p, wfEscapeWikiText( $image->getName() ) ] );
                        $this->checkParameterNormalise( $image, $thumbParams );
                        return $thumbParams;
                }
 
                if ( isset( $paramList['width'] ) && isset( $thumbParams['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
-                               $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
-                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight "
-                                       . "({$thumbParams['width']})" );
+                               $this->addWarning(
+                                       [ 'apiwarn-urlparamwidth', $p, $paramList['width'], $thumbParams['width'] ]
+                               );
                        }
                }
 
                foreach ( $paramList as $name => $value ) {
                        if ( !$h->validateParam( $name, $value ) ) {
-                               $this->dieUsage( "Invalid value for {$p}urlparam ($name=$value)", 'urlparam' );
+                               $this->dieWithError(
+                                       [ 'apierror-invalidurlparam', $p, wfEscapeWikiText( $name ), wfEscapeWikiText( $value ) ]
+                               );
                        }
                }
 
@@ -337,8 +353,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                // in the actual normalised version, only if we can actually normalise them,
                // so we use the functions scope to throw away the normalisations.
                if ( !$h->normaliseParams( $image, $finalParams ) ) {
-                       $this->dieUsage( 'Could not normalise image parameters for ' .
-                               $image->getName(), 'urlparamnormal' );
+                       $this->dieWithError( [ 'apierror-urlparamnormal', wfEscapeWikiText( $image->getName() ) ] );
                }
        }
 
@@ -689,6 +704,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ApiBase::PARAM_DFLT => '',
                                ApiBase::PARAM_TYPE => 'string',
                        ],
+                       'badfilecontexttitle' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                       ],
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ],
@@ -734,6 +752,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                'archivename' => 'apihelp-query+imageinfo-paramvalue-prop-archivename',
                                'bitdepth' => 'apihelp-query+imageinfo-paramvalue-prop-bitdepth',
                                'uploadwarning' => 'apihelp-query+imageinfo-paramvalue-prop-uploadwarning',
+                               'badfile' => 'apihelp-query+imageinfo-paramvalue-prop-badfile',
                        ],
                        array_flip( $filter )
                );
index e04d8c8..ae6f5bf 100644 (file)
@@ -90,7 +90,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                        foreach ( $params['images'] as $img ) {
                                $title = Title::newFromText( $img );
                                if ( !$title || $title->getNamespace() != NS_FILE ) {
-                                       $this->setWarning( "\"$img\" is not a file" );
+                                       $this->addWarning( [ 'apiwarn-notfile', wfEscapeWikiText( $img ) ] );
                                } else {
                                        $images[] = $title->getDBkey();
                                }
index d287020..e789dd4 100644 (file)
@@ -427,7 +427,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        foreach ( $this->params['token'] as $t ) {
                                $val = call_user_func( $tokenFunctions[$t], $pageid, $title );
                                if ( $val === false ) {
-                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                } else {
                                        $pageInfo[$t . 'token'] = $val;
                                }
@@ -535,7 +535,6 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get information about protections and put it in $protections
         */
        private function getProtectionInfo() {
-               global $wgContLang;
                $this->protections = [];
                $db = $this->getDB();
 
@@ -554,7 +553,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $a = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 )
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry )
                                ];
                                if ( $row->pr_cascade ) {
                                        $a['cascade'] = true;
@@ -614,7 +613,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[$row->pt_namespace][$row->pt_title][] = [
                                        'type' => 'create',
                                        'level' => $row->pt_create_perm,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 )
+                                       'expiry' => ApiResult::formatExpiry( $row->pt_expiry )
                                ];
                        }
                }
@@ -652,7 +651,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[$row->tl_namespace][$row->tl_title][] = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 ),
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry ),
                                        'source' => $source->getPrefixedText()
                                ];
                        }
@@ -675,7 +674,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[NS_FILE][$row->il_to][] = [
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
-                                       'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 ),
+                                       'expiry' => ApiResult::formatExpiry( $row->pr_expiry ),
                                        'source' => $source->getPrefixedText()
                                ];
                        }
index a6153de..8d5b5f3 100644 (file)
@@ -51,7 +51,14 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                if ( isset( $params['title'] ) && !isset( $params['lang'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'lang' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'lang' )
+                               ],
+                               'nolang'
+                       );
                }
 
                if ( !is_null( $params['continue'] ) ) {
index 67f2c9e..55e3c85 100644 (file)
@@ -44,7 +44,14 @@ class ApiQueryLangLinks extends ApiQueryBase {
                $prop = array_flip( (array)$params['prop'] );
 
                if ( isset( $params['title'] ) && !isset( $params['lang'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'lang' ] );
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-mustusewith',
+                                       $this->encodeParamName( 'title' ),
+                                       $this->encodeParamName( 'lang' ),
+                               ],
+                               'invalidparammix'
+                       );
                }
 
                // Handle deprecated param
index 6e5239f..4556e29 100644 (file)
@@ -94,7 +94,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                        foreach ( $params[$this->titlesParam] as $t ) {
                                $title = Title::newFromText( $t );
                                if ( !$title ) {
-                                       $this->setWarning( "\"$t\" is not a valid title" );
+                                       $this->addWarning( [ 'apiwarn-invalidtitle', wfEscapeWikiText( $t ) ] );
                                } else {
                                        $lb->addObj( $title );
                                }
@@ -182,7 +182,8 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                return [
                        'namespace' => [
                                ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'limit' => [
                                ApiBase::PARAM_DFLT => 10,
index 122594d..4d84aad 100644 (file)
@@ -121,10 +121,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
 
                        if ( !$valid ) {
-                               $valueName = $this->encodeParamName( 'action' );
-                               $this->dieUsage(
-                                       "Unrecognized value for parameter '$valueName': {$logAction}",
-                                       "unknown_$valueName"
+                               $encParamName = $this->encodeParamName( 'action' );
+                               $this->dieWithError(
+                                       [ 'apierror-unrecognizedvalue', $encParamName, wfEscapeWikiText( $logAction ) ],
+                                       "unknown_$encParamName"
                                );
                        }
 
@@ -173,7 +173,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ( !is_null( $title ) ) {
                        $titleObj = Title::newFromText( $title );
                        if ( is_null( $titleObj ) ) {
-                               $this->dieUsage( "Bad title value '$title'", 'param_title' );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $title ) ] );
                        }
                        $this->addWhereFld( 'log_namespace', $titleObj->getNamespace() );
                        $this->addWhereFld( 'log_title', $titleObj->getDBkey() );
@@ -187,12 +187,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( !is_null( $prefix ) ) {
                        if ( $this->getConfig()->get( 'MiserMode' ) ) {
-                               $this->dieUsage( 'Prefix search disabled in Miser Mode', 'prefixsearchdisabled' );
+                               $this->dieWithError( 'apierror-prefixsearchdisabled' );
                        }
 
                        $title = Title::newFromText( $prefix );
                        if ( is_null( $title ) ) {
-                               $this->dieUsage( "Bad title value '$prefix'", 'param_prefix' );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $prefix ) ] );
                        }
                        $this->addWhereFld( 'log_namespace', $title->getNamespace() );
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
@@ -435,7 +435,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        ],
                        'title' => null,
                        'namespace' => [
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'prefix' => [],
                        'tag' => null,
index 0c70a8a..1324f2f 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
                $user = $this->getUser();
 
                if ( $user->isAnon() ) {
-                       $this->dieUsage( 'The upload stash is only available to logged-in users.', 'stashnotloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-uploadstash', 'stashnotloggedin' );
                }
 
                // Note: If user is logged in but cannot upload, they can still see
index e3c949b..62b2e42 100644 (file)
@@ -135,8 +135,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                }
 
                                if ( isset( $prop['expiry'] ) ) {
-                                       global $wgContLang;
-                                       $vals['expiry'] = $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 );
+                                       $vals['expiry'] = ApiResult::formatExpiry( $row->pt_expiry );
                                }
 
                                if ( isset( $prop['level'] ) ) {
index 9ba757c..908cdee 100644 (file)
@@ -62,7 +62,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                /** @var $qp QueryPage */
                $qp = new $this->qpMap[$params['page']]();
                if ( !$qp->userCanExecute( $this->getUser() ) ) {
-                       $this->dieUsageMsg( 'specialpage-cantexecute' );
+                       $this->dieWithError( 'apierror-specialpage-cantexecute' );
                }
 
                $r = [ 'name' => $params['page'] ];
index 8b11dc2..2c76e97 100644 (file)
@@ -195,7 +195,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                || ( isset( $show['patrolled'] ) && isset( $show['unpatrolled'] ) )
                                || ( isset( $show['!patrolled'] ) && isset( $show['unpatrolled'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        // Check permissions
@@ -204,10 +204,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                || isset( $show['unpatrolled'] )
                        ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage(
-                                               'You need patrol or patrolmarks permission to request the patrolled flag',
-                                               'permissiondenied'
-                                       );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                                }
                        }
 
@@ -239,9 +236,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        );
                }
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                if ( !is_null( $params['user'] ) ) {
                        $this->addWhereFld( 'rc_user_text', $params['user'] );
@@ -274,10 +269,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->initProperties( $prop );
 
                        if ( $this->fld_patrolled && !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage(
-                                       'You need patrol or patrolmarks permission to request the patrolled flag',
-                                       'permissiondenied'
-                               );
+                               $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                        }
 
                        /* Add fields to our query if they are specified as a needed parameter. */
@@ -571,7 +563,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                $val = call_user_func( $tokenFunctions[$t], $row->rc_cur_id,
                                        $title, RecentChange::newFromRow( $row ) );
                                if ( $val === false ) {
-                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                } else {
                                        $vals[$t . 'token'] = $val;
                                }
@@ -625,7 +617,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        ],
                        'namespace' => [
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => 'namespace'
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_EXTRA_NAMESPACES => [ NS_MEDIA, NS_SPECIAL ],
                        ],
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user'
index 3259927..48f6046 100644 (file)
@@ -110,19 +110,14 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $revCount > 0 && $enumRevMode ) {
-                       $this->dieUsage(
-                               'The revids= parameter may not be used with the list options ' .
-                                       '(limit, startid, endid, dirNewer, start, end).',
-                               'revids'
+                       $this->dieWithError(
+                               [ 'apierror-revisions-nolist', $this->getModulePrefix() ], 'invalidparammix'
                        );
                }
 
                if ( $pageCount > 1 && $enumRevMode ) {
-                       $this->dieUsage(
-                               'titles, pageids or a generator was used to supply multiple pages, ' .
-                                       'but the limit, startid, endid, dirNewer, user, excludeuser, start ' .
-                                       'and end parameters may only be used on a single page.',
-                               'multpages'
+                       $this->dieWithError(
+                               [ 'apierror-revisions-singlepage', $this->getModulePrefix() ], 'invalidparammix'
                        );
                }
 
@@ -170,14 +165,19 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                if ( $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
+                       $status = Status::newGood();
                        /** @var $title Title */
                        foreach ( $pageSet->getGoodTitles() as $title ) {
                                if ( !$title->userCan( 'read', $user ) ) {
-                                       $this->dieUsage(
-                                               'The current user is not allowed to read ' . $title->getPrefixedText(),
-                                               'accessdenied' );
+                                       $status->fatal( ApiMessage::create(
+                                               [ 'apierror-cannotviewtitle', wfEscapeWikiText( $title->getPrefixedText() ) ],
+                                               'accessdenied'
+                                       ) );
                                }
                        }
+                       if ( !$status->isGood() ) {
+                               $this->dieStatus( $status );
+                       }
 
                        $this->addTables( 'text' );
                        $this->addJoinConds(
@@ -201,17 +201,9 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        //  page_timestamp or usertext_timestamp if we have an IP rvuser
 
                        // This is mostly to prevent parameter errors (and optimize SQL?)
-                       if ( $params['startid'] !== null && $params['start'] !== null ) {
-                               $this->dieUsage( 'start and startid cannot be used together', 'badparams' );
-                       }
-
-                       if ( $params['endid'] !== null && $params['end'] !== null ) {
-                               $this->dieUsage( 'end and endid cannot be used together', 'badparams' );
-                       }
-
-                       if ( $params['user'] !== null && $params['excludeuser'] !== null ) {
-                               $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
-                       }
+                       $this->requireMaxOneParameter( $params, 'startid', 'start' );
+                       $this->requireMaxOneParameter( $params, 'endid', 'end' );
+                       $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
 
                        if ( $params['continue'] !== null ) {
                                $cont = explode( '|', $params['continue'] );
@@ -344,7 +336,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                        foreach ( $this->token as $t ) {
                                                $val = call_user_func( $tokenFunctions[$t], $title->getArticleID(), $title, $revision );
                                                if ( $val === false ) {
-                                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                                } else {
                                                        $rev[$t . 'token'] = $val;
                                                }
index 266d699..696ec87 100644 (file)
@@ -70,10 +70,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                && $params['diffto'] != 'prev' && $params['diffto'] != 'next'
                        ) {
                                $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "{$p}diffto must be set to a non-negative number, \"prev\", \"next\" or \"cur\"",
-                                       'diffto'
-                               );
+                               $this->dieWithError( [ 'apierror-baddiffto', $p ], 'diffto' );
                        }
                        // Check whether the revision exists and is readable,
                        // DifferenceEngine returns a rather ambiguous empty
@@ -81,10 +78,10 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        if ( $params['diffto'] != 0 ) {
                                $difftoRev = Revision::newFromId( $params['diffto'] );
                                if ( !$difftoRev ) {
-                                       $this->dieUsageMsg( [ 'nosuchrevid', $params['diffto'] ] );
+                                       $this->dieWithError( [ 'apierror-nosuchrevid', $params['diffto'] ] );
                                }
                                if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getId()}: content is hidden" );
+                                       $this->addWarning( [ 'apiwarn-difftohidden', $difftoRev->getId() ] );
                                        $params['diffto'] = null;
                                }
                        }
@@ -262,8 +259,12 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        if ( $content && $this->section !== false ) {
                                $content = $content->getSection( $this->section, false );
                                if ( !$content ) {
-                                       $this->dieUsage(
-                                               "There is no section {$this->section} in r" . $revision->getId(),
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-nosuchsection-what',
+                                                       wfEscapeWikiText( $this->section ),
+                                                       $this->msg( 'revid', $revision->getId() )
+                                               ],
                                                'nosuchsection'
                                        );
                                }
@@ -294,9 +295,14 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $vals['parsetree'] = $xml;
                                } else {
                                        $vals['badcontentformatforparsetree'] = true;
-                                       $this->setWarning( 'Conversion to XML is supported for wikitext only, ' .
-                                               $title->getPrefixedDBkey() .
-                                               ' uses content model ' . $content->getModel() );
+                                       $this->addWarning(
+                                               [
+                                                       'apierror-parsetree-notwikitext-title',
+                                                       wfEscapeWikiText( $title->getPrefixedText() ),
+                                                       $content->getModel()
+                                               ],
+                                               'parsetree-notwikitext'
+                                       );
                                }
                        }
                }
@@ -315,9 +321,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                ParserOptions::newFromContext( $this->getContext() )
                                        );
                                } else {
-                                       $this->setWarning( 'Template expansion is supported for wikitext only, ' .
-                                               $title->getPrefixedDBkey() .
-                                               ' uses content model ' . $content->getModel() );
+                                       $this->addWarning( [
+                                               'apierror-templateexpansion-notwikitext',
+                                               wfEscapeWikiText( $title->getPrefixedText() ),
+                                               $content->getModel()
+                                       ] );
                                        $vals['badcontentformat'] = true;
                                        $text = false;
                                }
@@ -336,9 +344,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                $model = $content->getModel();
 
                                if ( !$content->isSupportedFormat( $format ) ) {
-                                       $name = $title->getPrefixedDBkey();
-                                       $this->setWarning( "The requested format {$this->contentFormat} is not " .
-                                               "supported for content model $model used by $name" );
+                                       $name = wfEscapeWikiText( $title->getPrefixedText() );
+                                       $this->addWarning( [ 'apierror-badformat', $this->contentFormat, $model, $name ] );
                                        $vals['badcontentformat'] = true;
                                        $text = false;
                                } else {
@@ -370,9 +377,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        if ( $this->contentFormat
                                                && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat )
                                        ) {
-                                               $name = $title->getPrefixedDBkey();
-                                               $this->setWarning( "The requested format {$this->contentFormat} is not " .
-                                                       "supported for content model $model used by $name" );
+                                               $name = wfEscapeWikiText( $title->getPrefixedText() );
+                                               $this->addWarning( [ 'apierror-badformat', $this->contentFormat, $model, $name ] );
                                                $vals['diff']['badcontentformat'] = true;
                                                $engine = null;
                                        } else {
index 9962d5e..05b693d 100644 (file)
@@ -64,12 +64,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 
                // Deprecated parameters
                if ( isset( $prop['hasrelated'] ) ) {
-                       $this->logFeatureUsage( 'action=search&srprop=hasrelated' );
-                       $this->setWarning( 'srprop=hasrelated has been deprecated' );
+                       $this->addDeprecation(
+                               [ 'apiwarn-deprecation-parameter', 'srprop=hasrelated' ], 'action=search&srprop=hasrelated'
+                       );
                }
                if ( isset( $prop['score'] ) ) {
-                       $this->logFeatureUsage( 'action=search&srprop=score' );
-                       $this->setWarning( 'srprop=score has been deprecated' );
+                       $this->addDeprecation(
+                               [ 'apiwarn-deprecation-parameter', 'srprop=score' ], 'action=search&srprop=score'
+                       );
                }
 
                // Create search engine instance and set options
@@ -122,10 +124,10 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                        $status
                                );
                        } else {
-                               $this->dieUsage( $status->getWikiText( false, false, 'en' ), 'search-error' );
+                               $this->dieStatus( $status );
                        }
                } elseif ( is_null( $matches ) ) {
-                       $this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
+                       $this->dieWithError( [ 'apierror-searchdisabled', $what ], "search-{$what}-disabled" );
                }
 
                if ( $resultPageSet === null ) {
@@ -173,119 +175,44 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                continue;
                        }
 
-                       $title = $result->getTitle();
                        if ( $resultPageSet === null ) {
-                               $vals = [];
-                               ApiQueryBase::addTitleInfo( $vals, $title );
-
-                               if ( isset( $prop['snippet'] ) ) {
-                                       $vals['snippet'] = $result->getTextSnippet( $terms );
-                               }
-                               if ( isset( $prop['size'] ) ) {
-                                       $vals['size'] = $result->getByteSize();
-                               }
-                               if ( isset( $prop['wordcount'] ) ) {
-                                       $vals['wordcount'] = $result->getWordCount();
-                               }
-                               if ( isset( $prop['timestamp'] ) ) {
-                                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
-                               }
-                               if ( isset( $prop['titlesnippet'] ) ) {
-                                       $vals['titlesnippet'] = $result->getTitleSnippet();
-                               }
-                               if ( isset( $prop['categorysnippet'] ) ) {
-                                       $vals['categorysnippet'] = $result->getCategorySnippet();
-                               }
-                               if ( !is_null( $result->getRedirectTitle() ) ) {
-                                       if ( isset( $prop['redirecttitle'] ) ) {
-                                               $vals['redirecttitle'] = $result->getRedirectTitle()->getPrefixedText();
-                                       }
-                                       if ( isset( $prop['redirectsnippet'] ) ) {
-                                               $vals['redirectsnippet'] = $result->getRedirectSnippet();
+                               $vals = $this->getSearchResultData( $result, $prop, $terms );
+                               if ( $vals ) {
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue( [ 'query', $this->getModuleName() ], null, $vals );
+                                       if ( !$fit ) {
+                                               $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 );
+                                               break;
                                        }
                                }
-                               if ( !is_null( $result->getSectionTitle() ) ) {
-                                       if ( isset( $prop['sectiontitle'] ) ) {
-                                               $vals['sectiontitle'] = $result->getSectionTitle()->getFragment();
-                                       }
-                                       if ( isset( $prop['sectionsnippet'] ) ) {
-                                               $vals['sectionsnippet'] = $result->getSectionSnippet();
-                                       }
-                               }
-                               if ( isset( $prop['isfilematch'] ) ) {
-                                       $vals['isfilematch'] = $result->isFileMatch();
-                               }
-
-                               // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue( [ 'query', $this->getModuleName() ],
-                                       null, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 );
-                                       break;
-                               }
                        } else {
-                               $titles[] = $title;
+                               $titles[] = $result->getTitle();
                        }
 
                        $result = $matches->next();
                }
 
-               $hasInterwikiResults = false;
-               $totalhits = null;
-               if ( $interwiki && $resultPageSet === null && $matches->hasInterwikiResults() ) {
-                       foreach ( $matches->getInterwikiResults() as $interwikiMatches ) {
-                               $hasInterwikiResults = true;
-
-                               // Include number of results if requested
-                               if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
-                                       $totalhits += $interwikiMatches->getTotalHits();
-                               }
-
-                               $result = $interwikiMatches->next();
-                               while ( $result ) {
-                                       $title = $result->getTitle();
-
-                                       if ( $resultPageSet === null ) {
-                                               $vals = [
-                                                       'namespace' => $result->getInterwikiNamespaceText(),
-                                                       'title' => $title->getText(),
-                                                       'url' => $title->getFullURL(),
-                                               ];
-
-                                               // Add item to results and see whether it fits
-                                               $fit = $apiResult->addValue(
-                                                       [ 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix() ],
-                                                       null,
-                                                       $vals
-                                               );
-
-                                               if ( !$fit ) {
-                                                       // We hit the limit. We can't really provide any meaningful
-                                                       // pagination info so just bail out
-                                                       break;
-                                               }
-                                       } else {
-                                               $titles[] = $title;
-                                       }
+               // Here we assume interwiki results do not count with
+               // regular search results. We may want to reconsider this
+               // if we ever return a lot of interwiki results or want pagination
+               // for them.
+               // Interwiki results inside main result set
+               $canAddInterwiki = (bool)$params['enablerewrites'] && ( $resultPageSet === null );
+               if ( $canAddInterwiki ) {
+                       $this->addInterwikiResults( $matches, $apiResult, $prop, $terms, 'additional',
+                               SearchResultSet::INLINE_RESULTS );
+               }
 
-                                       $result = $interwikiMatches->next();
-                               }
-                       }
-                       if ( $totalhits !== null ) {
-                               $apiResult->addValue( [ 'query', 'interwikisearchinfo' ],
-                                       'totalhits', $totalhits );
-                       }
+               // Interwiki results outside main result set
+               if ( $interwiki && $resultPageSet === null ) {
+                       $this->addInterwikiResults( $matches, $apiResult, $prop, $terms, 'interwiki',
+                               SearchResultSet::SECONDARY_RESULTS );
                }
 
                if ( $resultPageSet === null ) {
                        $apiResult->addIndexedTagName( [
                                'query', $this->getModuleName()
                        ], 'p' );
-                       if ( $hasInterwikiResults ) {
-                               $apiResult->addIndexedTagName( [
-                                       'query', 'interwiki' . $this->getModuleName()
-                               ], 'p' );
-                       }
                } else {
                        $resultPageSet->setRedirectMergePolicy( function ( $current, $new ) {
                                if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
@@ -301,6 +228,119 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
        }
 
+       /**
+        * Assemble search result data.
+        * @param SearchResult $result Search result
+        * @param array        $prop Props to extract (as keys)
+        * @param array        $terms Terms list
+        * @return array|null Result data or null if result is broken in some way.
+        */
+       private function getSearchResultData( SearchResult $result, $prop, $terms ) {
+               // Silently skip broken and missing titles
+               if ( $result->isBrokenTitle() || $result->isMissingRevision() ) {
+                       return null;
+               }
+
+               $vals = [];
+
+               $title = $result->getTitle();
+               ApiQueryBase::addTitleInfo( $vals, $title );
+
+               if ( isset( $prop['size'] ) ) {
+                       $vals['size'] = $result->getByteSize();
+               }
+               if ( isset( $prop['wordcount'] ) ) {
+                       $vals['wordcount'] = $result->getWordCount();
+               }
+               if ( isset( $prop['snippet'] ) ) {
+                       $vals['snippet'] = $result->getTextSnippet( $terms );
+               }
+               if ( isset( $prop['timestamp'] ) ) {
+                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $result->getTimestamp() );
+               }
+               if ( isset( $prop['titlesnippet'] ) ) {
+                       $vals['titlesnippet'] = $result->getTitleSnippet();
+               }
+               if ( isset( $prop['categorysnippet'] ) ) {
+                       $vals['categorysnippet'] = $result->getCategorySnippet();
+               }
+               if ( !is_null( $result->getRedirectTitle() ) ) {
+                       if ( isset( $prop['redirecttitle'] ) ) {
+                               $vals['redirecttitle'] = $result->getRedirectTitle()->getPrefixedText();
+                       }
+                       if ( isset( $prop['redirectsnippet'] ) ) {
+                               $vals['redirectsnippet'] = $result->getRedirectSnippet();
+                       }
+               }
+               if ( !is_null( $result->getSectionTitle() ) ) {
+                       if ( isset( $prop['sectiontitle'] ) ) {
+                               $vals['sectiontitle'] = $result->getSectionTitle()->getFragment();
+                       }
+                       if ( isset( $prop['sectionsnippet'] ) ) {
+                               $vals['sectionsnippet'] = $result->getSectionSnippet();
+                       }
+               }
+               if ( isset( $prop['isfilematch'] ) ) {
+                       $vals['isfilematch'] = $result->isFileMatch();
+               }
+               return $vals;
+       }
+
+       /**
+        * Add interwiki results as a section in query results.
+        * @param SearchResultSet $matches
+        * @param ApiResult       $apiResult
+        * @param array           $prop Props to extract (as keys)
+        * @param array           $terms Terms list
+        * @param string          $section Section name where results would go
+        * @param int             $type Interwiki result type
+        * @return int|null Number of total hits in the data or null if none was produced
+        */
+       private function addInterwikiResults(
+               SearchResultSet $matches, ApiResult $apiResult, $prop,
+               $terms, $section, $type
+       ) {
+               $totalhits = null;
+               if ( $matches->hasInterwikiResults( $type ) ) {
+                       foreach ( $matches->getInterwikiResults( $type ) as $interwikiMatches ) {
+                               // Include number of results if requested
+                               $totalhits += $interwikiMatches->getTotalHits();
+
+                               $result = $interwikiMatches->next();
+                               while ( $result ) {
+                                       $title = $result->getTitle();
+                                       $vals = $this->getSearchResultData( $result, $prop, $terms );
+
+                                       $vals['namespace'] = $result->getInterwikiNamespaceText();
+                                       $vals['title'] = $title->getText();
+                                       $vals['url'] = $title->getFullURL();
+
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue( [
+                                                       'query',
+                                                       $section . $this->getModuleName(),
+                                                       $result->getInterwikiPrefix()
+                                               ], null, $vals );
+
+                                       if ( !$fit ) {
+                                               // We hit the limit. We can't really provide any meaningful
+                                               // pagination info so just bail out
+                                               break;
+                                       }
+
+                                       $result = $interwikiMatches->next();
+                               }
+                       }
+                       if ( $totalhits !== null ) {
+                               $apiResult->addValue( [ 'query', $section . 'searchinfo' ], 'totalhits', $totalhits );
+                               $apiResult->addIndexedTagName( [
+                                       'query', $section . $this->getModuleName()
+                               ], 'p' );
+                       }
+               }
+               return $totalhits;
+       }
+
        public function getCacheMode( $params ) {
                return 'public';
        }
index 19e0c93..5093608 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A query action to return meta information about the wiki site.
@@ -388,7 +389,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
                $langNames = Language::fetchLanguageNames( $langCode );
 
-               $getPrefixes = Interwiki::getAllPrefixes( $local );
+               $getPrefixes = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes( $local );
                $extraLangPrefixes = $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' );
                $localInterwikis = $this->getConfig()->get( 'LocalInterwikis' );
                $data = [];
@@ -447,10 +448,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $showHostnames = $this->getConfig()->get( 'ShowHostnames' );
                if ( $includeAll ) {
                        if ( !$showHostnames ) {
-                               $this->dieUsage(
-                                       'Cannot view all servers info unless $wgShowHostnames is true',
-                                       'includeAllDenied'
-                               );
+                               $this->dieWithError( 'apierror-siteinfo-includealldenied', 'includeAllDenied' );
                        }
 
                        $lags = $lb->getLagTimes();
index b039a1e..abb827f 100644 (file)
@@ -33,7 +33,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'You must be logged-in to have an upload stash', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-uploadstash', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -45,9 +45,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
                $result = $this->getResult();
 
-               if ( !$params['filekey'] && !$params['sessionkey'] ) {
-                       $this->dieUsage( 'One of filekey or sessionkey must be supplied', 'nofilekey' );
-               }
+               $this->requireAtLeastOneParameter( $params, 'filekey', 'sessionkey' );
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
                if ( !$params['filekey'] && $params['sessionkey'] ) {
@@ -66,9 +64,9 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                        }
                // @todo Update exception handling here to understand current getFile exceptions
                } catch ( UploadStashFileNotFoundException $e ) {
-                       $this->dieUsage( 'File not found: ' . $e->getMessage(), 'invalidsessiondata' );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-stashedfilenotfound' ] );
                } catch ( UploadStashBadPathException $e ) {
-                       $this->dieUsage( 'Bad path: ' . $e->getMessage(), 'invalidsessiondata' );
+                       $this->dieWithException( $e, [ 'wrap' => 'apierror-stashpathinvalid' ] );
                }
        }
 
index de5a377..5b700db 100644 (file)
@@ -40,7 +40,7 @@ class ApiQueryTokens extends ApiQueryBase {
                ];
 
                if ( $this->lacksSameOriginSecurity() ) {
-                       $this->setWarning( 'Tokens may not be obtained when the same-origin policy is not applied' );
+                       $this->addWarning( [ 'apiwarn-tokens-origin' ] );
                        return;
                }
 
index b85bec4..31a9238 100644 (file)
@@ -65,24 +65,48 @@ class ApiQueryContributions extends ApiQueryBase {
                // TODO: if the query is going only against the revision table, should this be done?
                $this->selectNamedDB( 'contributions', DB_REPLICA, 'contributions' );
 
+               $this->requireOnlyOneParameter( $this->params, 'userprefix', 'userids', 'user' );
+
                $this->idMode = false;
                if ( isset( $this->params['userprefix'] ) ) {
                        $this->prefixMode = true;
                        $this->multiUserMode = true;
                        $this->userprefix = $this->params['userprefix'];
+               } elseif ( isset( $this->params['userids'] ) ) {
+                       $this->userids = [];
+
+                       if ( !count( $this->params['userids'] ) ) {
+                               $encParamName = $this->encodeParamName( 'userids' );
+                               $this->dieWithError( [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName" );
+                       }
+
+                       foreach ( $this->params['userids'] as $uid ) {
+                               if ( $uid <= 0 ) {
+                                       $this->dieWithError( [ 'apierror-invaliduserid', $uid ], 'invaliduserid' );
+                               }
+
+                               $this->userids[] = $uid;
+                       }
+
+                       $this->prefixMode = false;
+                       $this->multiUserMode = ( count( $this->params['userids'] ) > 1 );
+                       $this->idMode = true;
                } else {
                        $anyIPs = false;
                        $this->userids = [];
                        $this->usernames = [];
-                       if ( !is_array( $this->params['user'] ) ) {
-                               $this->params['user'] = [ $this->params['user'] ];
-                       }
                        if ( !count( $this->params['user'] ) ) {
-                               $this->dieUsage( 'User parameter may not be empty.', 'param_user' );
+                               $encParamName = $this->encodeParamName( 'user' );
+                               $this->dieWithError(
+                                       [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName"
+                               );
                        }
                        foreach ( $this->params['user'] as $u ) {
-                               if ( is_null( $u ) || $u === '' ) {
-                                       $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+                               if ( $u === '' ) {
+                                       $encParamName = $this->encodeParamName( 'user' );
+                                       $this->dieWithError(
+                                               [ 'apierror-paramempty', $encParamName ], "paramempty_$encParamName"
+                                       );
                                }
 
                                if ( User::isIP( $u ) ) {
@@ -91,7 +115,10 @@ class ApiQueryContributions extends ApiQueryBase {
                                } else {
                                        $name = User::getCanonicalName( $u, 'valid' );
                                        if ( $name === false ) {
-                                               $this->dieUsage( "User name {$u} is not valid", 'param_user' );
+                                               $encParamName = $this->encodeParamName( 'user' );
+                                               $this->dieWithError(
+                                                       [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $u ) ], "baduser_$encParamName"
+                                               );
                                        }
                                        $this->usernames[] = $name;
                                }
@@ -254,7 +281,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                || ( isset( $show['top'] ) && isset( $show['!top'] ) )
                                || ( isset( $show['new'] ) && isset( $show['!new'] ) )
                        ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        $this->addWhereIf( 'rev_minor_edit = 0', isset( $show['!minor'] ) );
@@ -285,10 +312,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        $this->fld_patrolled
                ) {
                        if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage(
-                                       'You need the patrol right to request the patrolled flag',
-                                       'permissiondenied'
-                               );
+                               $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                        }
 
                        // Use a redundant join condition on both
@@ -489,6 +513,10 @@ class ApiQueryContributions extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => 'user',
                                ApiBase::PARAM_ISMULTI => true
                        ],
+                       'userids' => [
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true
+                       ],
                        'userprefix' => null,
                        'dir' => [
                                ApiBase::PARAM_DFLT => 'older',
index d3cd0c4..7bc00cb 100644 (file)
@@ -64,18 +64,19 @@ class ApiQueryUserInfo extends ApiQueryBase {
         *  - blockreason - reason provided for the block
         *  - blockedtimestamp - timestamp for when the block was placed/modified
         *  - blockexpiry - expiry time of the block
+        *  - systemblocktype - system block type, if any
         */
        public static function getBlockInfo( Block $block ) {
-               global $wgContLang;
                $vals = [];
                $vals['blockid'] = $block->getId();
                $vals['blockedby'] = $block->getByName();
                $vals['blockedbyid'] = $block->getBy();
                $vals['blockreason'] = $block->mReason;
                $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
-               $vals['blockexpiry'] = $wgContLang->formatExpiry(
-                       $block->getExpiry(), TS_ISO_8601, 'infinite'
-               );
+               $vals['blockexpiry'] = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
+               if ( $block->getSystemBlockType() !== null ) {
+                       $vals['systemblocktype'] = $block->getSystemBlockType();
+               }
                return $vals;
        }
 
@@ -170,8 +171,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                if ( isset( $this->prop['preferencestoken'] ) ) {
                        $p = $this->getModulePrefix();
-                       $this->setWarning(
-                               "{$p}prop=preferencestoken has been deprecated. Please use action=query&meta=tokens instead."
+                       $this->addDeprecation(
+                               [
+                                       'apiwarn-deprecation-withreplacement',
+                                       "{$p}prop=preferencestoken",
+                                       'action=query&meta=tokens',
+                               ],
+                               "meta=userinfo&{$p}prop=preferencestoken"
                        );
                }
                if ( isset( $this->prop['preferencestoken'] ) &&
index 9b45b91..2d620a4 100644 (file)
@@ -98,14 +98,18 @@ class ApiQueryUsers extends ApiQueryBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
+               $this->requireMaxOneParameter( $params, 'userids', 'users' );
 
                if ( !is_null( $params['prop'] ) ) {
                        $this->prop = array_flip( $params['prop'] );
                } else {
                        $this->prop = [];
                }
+               $useNames = !is_null( $params['users'] );
 
                $users = (array)$params['users'];
+               $userids = (array)$params['userids'];
+
                $goodNames = $done = [];
                $result = $this->getResult();
                // Canonicalize user names
@@ -127,12 +131,22 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
                }
 
+               if ( $useNames ) {
+                       $parameters = &$goodNames;
+               } else {
+                       $parameters = &$userids;
+               }
+
                $result = $this->getResult();
 
-               if ( count( $goodNames ) ) {
+               if ( count( $parameters ) ) {
                        $this->addTables( 'user' );
                        $this->addFields( User::selectFields() );
-                       $this->addWhereFld( 'user_name', $goodNames );
+                       if ( $useNames ) {
+                               $this->addWhereFld( 'user_name', $goodNames );
+                       } else {
+                               $this->addWhereFld( 'user_id', $userids );
+                       }
 
                        $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
 
@@ -145,7 +159,12 @@ class ApiQueryUsers extends ApiQueryBase {
                                $userGroups = [];
 
                                $this->addTables( 'user' );
-                               $this->addWhereFld( 'user_name', $goodNames );
+                               if ( $useNames ) {
+                                       $this->addWhereFld( 'user_name', $goodNames );
+                               } else {
+                                       $this->addWhereFld( 'user_id', $userids );
+                               }
+
                                $this->addTables( 'user_groups' );
                                $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] );
                                $this->addFields( [ 'user_name', 'ug_group' ] );
@@ -157,6 +176,7 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
 
                        foreach ( $res as $row ) {
+
                                // create user object and pass along $userGroups if set
                                // that reduces the number of database queries needed in User dramatically
                                if ( !isset( $userGroups ) ) {
@@ -167,44 +187,47 @@ class ApiQueryUsers extends ApiQueryBase {
                                        }
                                        $user = User::newFromRow( $row, [ 'user_groups' => $userGroups[$row->user_name] ] );
                                }
-                               $name = $user->getName();
-
-                               $data[$name]['userid'] = $user->getId();
-                               $data[$name]['name'] = $name;
+                               if ( $useNames ) {
+                                       $key = $user->getName();
+                               } else {
+                                       $key = $user->getId();
+                               }
+                               $data[$key]['userid'] = $user->getId();
+                               $data[$key]['name'] = $user->getName();
 
                                if ( isset( $this->prop['editcount'] ) ) {
-                                       $data[$name]['editcount'] = $user->getEditCount();
+                                       $data[$key]['editcount'] = $user->getEditCount();
                                }
 
                                if ( isset( $this->prop['registration'] ) ) {
-                                       $data[$name]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
+                                       $data[$key]['registration'] = wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
                                }
 
                                if ( isset( $this->prop['groups'] ) ) {
-                                       $data[$name]['groups'] = $user->getEffectiveGroups();
+                                       $data[$key]['groups'] = $user->getEffectiveGroups();
                                }
 
                                if ( isset( $this->prop['implicitgroups'] ) ) {
-                                       $data[$name]['implicitgroups'] = $user->getAutomaticGroups();
+                                       $data[$key]['implicitgroups'] = $user->getAutomaticGroups();
                                }
 
                                if ( isset( $this->prop['rights'] ) ) {
-                                       $data[$name]['rights'] = $user->getRights();
+                                       $data[$key]['rights'] = $user->getRights();
                                }
                                if ( $row->ipb_deleted ) {
-                                       $data[$name]['hidden'] = true;
+                                       $data[$key]['hidden'] = true;
                                }
                                if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
-                                       $data[$name]['blockid'] = (int)$row->ipb_id;
-                                       $data[$name]['blockedby'] = $row->ipb_by_text;
-                                       $data[$name]['blockedbyid'] = (int)$row->ipb_by;
-                                       $data[$name]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
-                                       $data[$name]['blockreason'] = $row->ipb_reason;
-                                       $data[$name]['blockexpiry'] = $row->ipb_expiry;
+                                       $data[$key]['blockid'] = (int)$row->ipb_id;
+                                       $data[$key]['blockedby'] = $row->ipb_by_text;
+                                       $data[$key]['blockedbyid'] = (int)$row->ipb_by;
+                                       $data[$key]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
+                                       $data[$key]['blockreason'] = $row->ipb_reason;
+                                       $data[$key]['blockexpiry'] = $row->ipb_expiry;
                                }
 
                                if ( isset( $this->prop['emailable'] ) ) {
-                                       $data[$name]['emailable'] = $user->canReceiveEmail();
+                                       $data[$key]['emailable'] = $user->canReceiveEmail();
                                }
 
                                if ( isset( $this->prop['gender'] ) ) {
@@ -212,11 +235,11 @@ class ApiQueryUsers extends ApiQueryBase {
                                        if ( strval( $gender ) === '' ) {
                                                $gender = 'unknown';
                                        }
-                                       $data[$name]['gender'] = $gender;
+                                       $data[$key]['gender'] = $gender;
                                }
 
                                if ( isset( $this->prop['centralids'] ) ) {
-                                       $data[$name] += ApiQueryUserInfo::getCentralUserInfo(
+                                       $data[$key] += ApiQueryUserInfo::getCentralUserInfo(
                                                $this->getConfig(), $user, $params['attachedwiki']
                                        );
                                }
@@ -226,9 +249,9 @@ class ApiQueryUsers extends ApiQueryBase {
                                        foreach ( $params['token'] as $t ) {
                                                $val = call_user_func( $tokenFunctions[$t], $user );
                                                if ( $val === false ) {
-                                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
                                                } else {
-                                                       $data[$name][$t . 'token'] = $val;
+                                                       $data[$key][$t . 'token'] = $val;
                                                }
                                        }
                                }
@@ -237,38 +260,44 @@ class ApiQueryUsers extends ApiQueryBase {
 
                $context = $this->getContext();
                // Second pass: add result data to $retval
-               foreach ( $goodNames as $u ) {
+               foreach ( $parameters as $u ) {
                        if ( !isset( $data[$u] ) ) {
-                               $data[$u] = [ 'name' => $u ];
-                               $urPage = new UserrightsPage;
-                               $urPage->setContext( $context );
-                               $iwUser = $urPage->fetchUser( $u );
-
-                               if ( $iwUser instanceof UserRightsProxy ) {
-                                       $data[$u]['interwiki'] = true;
-
-                                       if ( !is_null( $params['token'] ) ) {
-                                               $tokenFunctions = $this->getTokenFunctions();
-
-                                               foreach ( $params['token'] as $t ) {
-                                                       $val = call_user_func( $tokenFunctions[$t], $iwUser );
-                                                       if ( $val === false ) {
-                                                               $this->setWarning( "Action '$t' is not allowed for the current user" );
-                                                       } else {
-                                                               $data[$u][$t . 'token'] = $val;
+                               if ( $useNames ) {
+                                       $data[$u] = [ 'name' => $u ];
+                                       $urPage = new UserrightsPage;
+                                       $urPage->setContext( $context );
+
+                                       $iwUser = $urPage->fetchUser( $u );
+
+                                       if ( $iwUser instanceof UserRightsProxy ) {
+                                               $data[$u]['interwiki'] = true;
+
+                                               if ( !is_null( $params['token'] ) ) {
+                                                       $tokenFunctions = $this->getTokenFunctions();
+
+                                                       foreach ( $params['token'] as $t ) {
+                                                               $val = call_user_func( $tokenFunctions[$t], $iwUser );
+                                                               if ( $val === false ) {
+                                                                       $this->addWarning( [ 'apiwarn-tokennotallowed', $t ] );
+                                                               } else {
+                                                                       $data[$u][$t . 'token'] = $val;
+                                                               }
                                                        }
                                                }
-                                       }
-                               } else {
-                                       $data[$u]['missing'] = true;
-                                       if ( isset( $this->prop['cancreate'] ) ) {
-                                               $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
-                                               $data[$u]['cancreate'] = $status->isGood();
-                                               if ( !$status->isGood() ) {
-                                                       $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                       } else {
+                                               $data[$u]['missing'] = true;
+                                               if ( isset( $this->prop['cancreate'] ) ) {
+                                                       $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
+                                                       $data[$u]['cancreate'] = $status->isGood();
+                                                       if ( !$status->isGood() ) {
+                                                               $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                                       }
                                                }
                                        }
+                               } else {
+                                       $data[$u] = [ 'userid' => $u, 'missing' => true ];
                                }
+
                        } else {
                                if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) {
                                        ApiResult::setArrayType( $data[$u]['groups'], 'array' );
@@ -287,8 +316,13 @@ class ApiQueryUsers extends ApiQueryBase {
                        $fit = $result->addValue( [ 'query', $this->getModuleName() ],
                                null, $data[$u] );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'users',
-                                       implode( '|', array_diff( $users, $done ) ) );
+                               if ( $useNames ) {
+                                       $this->setContinueEnumParameter( 'users',
+                                               implode( '|', array_diff( $users, $done ) ) );
+                               } else {
+                                       $this->setContinueEnumParameter( 'userids',
+                                               implode( '|', array_diff( $userids, $done ) ) );
+                               }
                                break;
                        }
                        $done[] = $u;
@@ -330,6 +364,10 @@ class ApiQueryUsers extends ApiQueryBase {
                        'users' => [
                                ApiBase::PARAM_ISMULTI => true
                        ],
+                       'userids' => [
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
                        'token' => [
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
index 42ea55d..3f59751 100644 (file)
@@ -82,7 +82,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        if ( $this->fld_patrol ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage( 'patrol property is not available', 'patrol' );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'patrol' );
                                }
                        }
                }
@@ -134,7 +134,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        /* Check for conflicting parameters. */
                        if ( $this->showParamsConflicting( $show ) ) {
-                               $this->dieUsageMsg( 'show' );
+                               $this->dieWithError( 'apierror-show' );
                        }
 
                        // Check permissions.
@@ -142,10 +142,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                || isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] )
                        ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage(
-                                               'You need the patrol right to request the patrolled flag',
-                                               'permissiondenied'
-                                       );
+                                       $this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
                                }
                        }
 
@@ -154,15 +151,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['type'] ) ) {
                        try {
-                               $options['rcTypes'] = RecentChange::parseToRCType( $params['type'] );
+                               $rcTypes = RecentChange::parseToRCType( $params['type'] );
+                               if ( $rcTypes ) {
+                                       $options['rcTypes'] = $rcTypes;
+                               }
                        } catch ( Exception $e ) {
                                ApiBase::dieDebug( __METHOD__, $e->getMessage() );
                        }
                }
 
-               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
-                       $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
-               }
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
                if ( !is_null( $params['user'] ) ) {
                        $options['onlyByUser'] = $params['user'];
                }
index 806861e..a1078a5 100644 (file)
@@ -60,7 +60,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] )
                        && isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] )
                ) {
-                       $this->dieUsageMsg( 'show' );
+                       $this->dieWithError( 'apierror-show' );
                }
 
                $options = [];
index d72c8a4..359d045 100644 (file)
@@ -45,7 +45,7 @@ class ApiRemoveAuthenticationData extends ApiBase {
 
        public function execute() {
                if ( !$this->getUser()->isLoggedIn() ) {
-                       $this->dieUsage( 'Must be logged in to remove authentication data', 'notloggedin' );
+                       $this->dieWithError( 'apierror-mustbeloggedin-removeauth', 'notloggedin' );
                }
 
                $params = $this->extractRequestParams();
@@ -67,7 +67,7 @@ class ApiRemoveAuthenticationData extends ApiBase {
                        }
                );
                if ( count( $reqs ) !== 1 ) {
-                       $this->dieUsage( 'Failed to create change request', 'badrequest' );
+                       $this->dieWithError( 'apierror-changeauth-norequest', 'badrequest' );
                }
                $req = reset( $reqs );
 
index 2d7f5df..b5fa8ed 100644 (file)
@@ -52,7 +52,7 @@ class ApiResetPassword extends ApiBase {
 
        public function execute() {
                if ( !$this->hasAnyRoutes() ) {
-                       $this->dieUsage( 'No password reset routes are available.', 'moduledisabled' );
+                       $this->dieWithError( 'apihelp-resetpassword-description-noroutes', 'moduledisabled' );
                }
 
                $params = $this->extractRequestParams() + [
index 6e27fc8..e27cf7d 100644 (file)
@@ -413,11 +413,9 @@ class ApiResult implements ApiSerializable {
 
                        $newsize = $this->size + self::size( $value );
                        if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
-                               /// @todo Add i18n message when replacing calls to ->setWarning()
-                               $msg = new ApiRawMessage( 'This result was truncated because it would otherwise ' .
-                                       'be larger than the limit of $1 bytes', 'truncatedresult' );
-                               $msg->numParams( $this->maxSize );
-                               $this->errorFormatter->addWarning( 'result', $msg );
+                               $this->errorFormatter->addWarning(
+                                       'result', [ 'apiwarn-truncatedresult', Message::numParam( $this->maxSize ) ]
+                               );
                                return false;
                        }
                        $this->size = $newsize;
@@ -1198,6 +1196,29 @@ class ApiResult implements ApiSerializable {
                }
        }
 
+       /**
+        * Format an expiry timestamp for API output
+        * @since 1.29
+        * @param string $expiry Expiry timestamp, likely from the database
+        * @param string $infinity Use this string for infinite expiry
+        *  (only use this to maintain backward compatibility with existing output)
+        * @return string Formatted expiry
+        */
+       public static function formatExpiry( $expiry, $infinity = 'infinity' ) {
+               static $dbInfinity;
+               if ( $dbInfinity === null ) {
+                       $dbInfinity = wfGetDB( DB_REPLICA )->getInfinity();
+               }
+
+               if ( $expiry === '' || $expiry === null || $expiry === false ||
+                       wfIsInfinity( $expiry ) || $expiry === $dbInfinity
+               ) {
+                       return $infinity;
+               } else {
+                       return wfTimestamp( TS_ISO_8601, $expiry );
+               }
+       }
+
        /**@}*/
 
 }
index ed9fba2..4896e7e 100644 (file)
@@ -36,24 +36,30 @@ class ApiRevisionDelete extends ApiBase {
 
                $params = $this->extractRequestParams();
                $user = $this->getUser();
-               if ( !$user->isAllowed( RevisionDeleter::getRestriction( $params['type'] ) ) ) {
-                       $this->dieUsageMsg( 'badaccess-group0' );
-               }
+               $this->checkUserRightsAny( RevisionDeleter::getRestriction( $params['type'] ) );
 
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
                if ( !$params['ids'] ) {
-                       $this->dieUsage( "At least one value is required for 'ids'", 'badparams' );
+                       $this->dieWithError( [ 'apierror-paramempty', 'ids' ], 'paramempty_ids' );
+               }
+
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
                }
 
                $hide = $params['hide'] ?: [];
                $show = $params['show'] ?: [];
                if ( array_intersect( $hide, $show ) ) {
-                       $this->dieUsage( "Mutually exclusive values for 'hide' and 'show'", 'badparams' );
+                       $this->dieWithError( 'apierror-revdel-mutuallyexclusive', 'badparams' );
                } elseif ( !$hide && !$show ) {
-                       $this->dieUsage( "At least one value is required for 'hide' or 'show'", 'badparams' );
+                       $this->dieWithError( 'apierror-revdel-paramneeded', 'badparams' );
                }
                $bits = [
                        'content' => RevisionDeleter::getRevdelConstant( $params['type'] ),
@@ -72,9 +78,7 @@ class ApiRevisionDelete extends ApiBase {
                }
 
                if ( $params['suppress'] === 'yes' ) {
-                       if ( !$user->isAllowed( 'suppressrevision' ) ) {
-                               $this->dieUsageMsg( 'badaccess-group0' );
-                       }
+                       $this->checkUserRightsAny( 'suppressrevision' );
                        $bitfield[Revision::DELETED_RESTRICTED] = 1;
                } elseif ( $params['suppress'] === 'no' ) {
                        $bitfield[Revision::DELETED_RESTRICTED] = 0;
@@ -88,15 +92,18 @@ class ApiRevisionDelete extends ApiBase {
                }
                $targetObj = RevisionDeleter::suggestTarget( $params['type'], $targetObj, $params['ids'] );
                if ( $targetObj === null ) {
-                       $this->dieUsage( 'A target title is required for this RevDel type', 'needtarget' );
+                       $this->dieWithError( [ 'apierror-revdel-needtarget' ], 'needtarget' );
                }
 
                $list = RevisionDeleter::createList(
                        $params['type'], $this->getContext(), $targetObj, $params['ids']
                );
-               $status = $list->setVisibility(
-                       [ 'value' => $bitfield, 'comment' => $params['reason'], 'perItemStatus' => true ]
-               );
+               $status = $list->setVisibility( [
+                       'value' => $bitfield,
+                       'comment' => $params['reason'],
+                       'perItemStatus' => true,
+                       'tags' => $params['tags']
+               ] );
 
                $result = $this->getResult();
                $data = $this->extractStatusInfo( $status );
@@ -124,49 +131,19 @@ class ApiRevisionDelete extends ApiBase {
                $ret = [
                        'status' => $status->isOK() ? 'Success' : 'Fail',
                ];
-               $errors = $this->formatStatusMessages( $status->getErrorsByType( 'error' ) );
+
+               $errors = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
                if ( $errors ) {
-                       ApiResult::setIndexedTagName( $errors, 'e' );
                        $ret['errors'] = $errors;
                }
-               $warnings = $this->formatStatusMessages( $status->getErrorsByType( 'warning' ) );
+               $warnings = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
                if ( $warnings ) {
-                       ApiResult::setIndexedTagName( $warnings, 'w' );
                        $ret['warnings'] = $warnings;
                }
 
                return $ret;
        }
 
-       private function formatStatusMessages( $messages ) {
-               if ( !$messages ) {
-                       return [];
-               }
-               $ret = [];
-               foreach ( $messages as $m ) {
-                       if ( $m['message'] instanceof Message ) {
-                               $msg = $m['message'];
-                               $message = [ 'message' => $msg->getKey() ];
-                               if ( $msg->getParams() ) {
-                                       $message['params'] = $msg->getParams();
-                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
-                               }
-                       } else {
-                               $message = [ 'message' => $m['message'] ];
-                               $msg = wfMessage( $m['message'] );
-                               if ( isset( $m['params'] ) ) {
-                                       $message['params'] = $m['params'];
-                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
-                                       $msg->params( $m['params'] );
-                               }
-                       }
-                       $message['rendered'] = $msg->useDatabase( false )->inLanguage( 'en' )->plain();
-                       $ret[] = $message;
-               }
-
-               return $ret;
-       }
-
        public function mustBePosted() {
                return true;
        }
@@ -199,6 +176,10 @@ class ApiRevisionDelete extends ApiBase {
                                ApiBase::PARAM_DFLT => 'nochange',
                        ],
                        'reason' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index b9911da..9584f09 100644 (file)
@@ -69,24 +69,8 @@ class ApiRollback extends ApiBase {
                        $params['tags']
                );
 
-               // We don't care about multiple errors, just report one of them
                if ( $retval ) {
-                       if ( isset( $retval[0][0] ) &&
-                               ( $retval[0][0] == 'alreadyrolled' || $retval[0][0] == 'cantrollback' )
-                       ) {
-                               $error = $retval[0];
-                               $userMessage = $this->msg( $error[0], array_slice( $error, 1 ) );
-                               // dieUsageMsg() doesn't support $extraData
-                               $errorCode = $error[0];
-                               $errorInfo = isset( ApiBase::$messageMap[$errorCode] ) ?
-                                       ApiBase::$messageMap[$errorCode]['info'] :
-                                       $errorCode;
-                               $this->dieUsage( $errorInfo, $errorCode, 0, [
-                                       'messageHtml' => $userMessage->parseAsBlock()
-                               ] );
-                       }
-
-                       $this->dieUsageMsg( reset( $retval ) );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) );
                }
 
                $watch = 'preferences';
@@ -108,17 +92,6 @@ class ApiRollback extends ApiBase {
                        'last_revid' => intval( $details['target']->getID() )
                ];
 
-               $oldUser = $details['current']->getUserText( Revision::FOR_THIS_USER );
-               $lastUser = $details['target']->getUserText( Revision::FOR_THIS_USER );
-               $diffUrl = $titleObj->getFullURL( [
-                       'diff' => $info['revid'],
-                       'oldid' => $info['old_revid'],
-                       'diffonly' => '1'
-               ] );
-               $info['messageHtml'] = $this->msg( 'rollback-success-notify' )
-                       ->params( $oldUser, $lastUser, $diffUrl )
-                       ->parseAsBlock();
-
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
@@ -181,7 +154,7 @@ class ApiRollback extends ApiBase {
                        ? $params['user']
                        : User::getCanonicalName( $params['user'] );
                if ( !$this->mUser ) {
-                       $this->dieUsageMsg( [ 'invaliduser', $params['user'] ] );
+                       $this->dieWithError( [ 'apierror-invaliduser', wfEscapeWikiText( $params['user'] ) ] );
                }
 
                return $this->mUser;
@@ -202,17 +175,17 @@ class ApiRollback extends ApiBase {
                if ( isset( $params['title'] ) ) {
                        $this->mTitleObj = Title::newFromText( $params['title'] );
                        if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                        }
                } elseif ( isset( $params['pageid'] ) ) {
                        $this->mTitleObj = Title::newFromID( $params['pageid'] );
                        if ( !$this->mTitleObj ) {
-                               $this->dieUsageMsg( [ 'nosuchpageid', $params['pageid'] ] );
+                               $this->dieWithError( [ 'apierror-nosuchpageid', $params['pageid'] ] );
                        }
                }
 
                if ( !$this->mTitleObj->exists() ) {
-                       $this->dieUsageMsg( 'notanarticle' );
+                       $this->dieWithError( 'apierror-missingtitle' );
                }
 
                return $this->mTitleObj;
index 3412f38..5769ff6 100644 (file)
@@ -38,11 +38,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $user = $this->getUser();
 
                if ( $user->isAnon() ) {
-                       $this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
-               }
-               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+                       $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                }
+               $this->checkUserRightsAny( 'editmywatchlist' );
 
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
@@ -52,8 +50,12 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                $pageSet = $this->getPageSet();
                if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
-                       $this->dieUsage(
-                               "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'",
+                       $this->dieWithError(
+                               [
+                                       'apierror-invalidparammix-cannotusewith',
+                                       $this->encodeParamName( 'entirewatchlist' ),
+                                       $pageSet->encodeParamName( $pageSet->getDataSource() )
+                               ],
                                'multisource'
                        );
                }
@@ -71,7 +73,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                if ( isset( $params['torevid'] ) ) {
                        if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
-                               $this->dieUsage( 'torevid may only be used with a single page', 'multpages' );
+                               $this->dieWithError( [ 'apierror-multpages', $this->encodeParamName( 'torevid' ) ] );
                        }
                        $title = reset( $pageSet->getGoodTitles() );
                        if ( $title ) {
@@ -85,7 +87,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        }
                } elseif ( isset( $params['newerthanrevid'] ) ) {
                        if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
-                               $this->dieUsage( 'newerthanrevid may only be used with a single page', 'multpages' );
+                               $this->dieWithError( [ 'apierror-multpages', $this->encodeParamName( 'newerthanrevid' ) ] );
                        }
                        $title = reset( $pageSet->getGoodTitles() );
                        if ( $title ) {
diff --git a/includes/api/ApiSetPageLanguage.php b/includes/api/ApiSetPageLanguage.php
new file mode 100755 (executable)
index 0000000..3ff99f1
--- /dev/null
@@ -0,0 +1,149 @@
+<?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
+ * 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
+ */
+
+/**
+ * API module that facilitates changing the language of a page.
+ * The API equivalent of SpecialPageLanguage.
+ * Requires API write mode to be enabled.
+ *
+ * @ingroup API
+ */
+class ApiSetPageLanguage extends ApiBase {
+       // Check if change language feature is enabled
+       protected function getDescriptionMessage() {
+               if ( !$this->getConfig()->get( 'PageLanguageUseDB' ) ) {
+                       return 'apihelp-setpagelanguage-description-disabled';
+               }
+               return parent::getDescriptionMessage();
+       }
+
+       /**
+        * Extracts the title and language from the request parameters and invokes
+        * the static SpecialPageLanguage::changePageLanguage() function with these as arguments.
+        * If the language change succeeds, the title, old language, and new language
+        * of the article changed, as well as the performer of the language change
+        * are added to the result object.
+        */
+       public function execute() {
+               // Check if change language feature is enabled
+               if ( !$this->getConfig()->get( 'PageLanguageUseDB' ) ) {
+                       $this->dieWithError( 'apierror-pagelang-disabled' );
+               }
+
+               // Check if the user has permissions
+               $this->checkUserRightsAny( 'pagelang' );
+
+               $this->useTransactionalTimeLimit();
+
+               $params = $this->extractRequestParams();
+
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               if ( !$pageObj->exists() ) {
+                       $this->dieWithError( 'apierror-missingtitle' );
+               }
+
+               $titleObj = $pageObj->getTitle();
+               $user = $this->getUser();
+
+               // Check that the user is allowed to edit the page
+               $this->checkTitleUserPermissions( $titleObj, 'edit' );
+
+               // If change tagging was requested, check that the user is allowed to tag,
+               // and the tags are valid
+               if ( count( $params['tags'] ) ) {
+                       $tagStatus = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$tagStatus->isOK() ) {
+                               $this->dieStatus( $tagStatus );
+                       }
+               }
+
+               $status = SpecialPageLanguage::changePageLanguage(
+                       $this,
+                       $titleObj,
+                       $params['lang'],
+                       $params['reason'] === null ? '' : $params['reason'],
+                       $params['tags'] ?: []
+               );
+
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
+               }
+
+               $r = [
+                       'title' => $titleObj->getPrefixedText(),
+                       'oldlanguage' => $status->value->oldLanguage,
+                       'newlanguage' => $status->value->newLanguage,
+                       'logid' => $status->value->logId
+               ];
+               $this->getResult()->addValue( null, $this->getModuleName(), $r );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'title' => null,
+                       'pageid' => [
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
+                       'lang' => [
+                               ApiBase::PARAM_TYPE => array_merge(
+                                       [ 'default' ],
+                                       array_keys( Language::fetchLanguageNames( null, 'mwfile' ) )
+                               ),
+                               ApiBase::PARAM_REQUIRED => true,
+                       ],
+                       'reason' => null,
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
+               ];
+       }
+
+       public function needsToken() {
+               return 'csrf';
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=setpagelanguage&title=Main%20Page&lang=eu&token=123ABC'
+                               => 'apihelp-setpagelanguage-example-language',
+                       'action=setpagelanguage&pageid=123&lang=default&token=123ABC'
+                               => 'apihelp-setpagelanguage-example-default',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:SetPageLanguage';
+       }
+}
index 92cbe90..37ee3e7 100644 (file)
@@ -51,7 +51,7 @@ class ApiStashEdit extends ApiBase {
                $params = $this->extractRequestParams();
 
                if ( $user->isBot() ) { // sanity
-                       $this->dieUsage( 'This interface is not supported for bots', 'botsnotsupported' );
+                       $this->dieWithError( 'apierror-botsnotsupported' );
                }
 
                $cache = ObjectCache::getLocalClusterInstance();
@@ -61,9 +61,14 @@ class ApiStashEdit extends ApiBase {
                if ( !ContentHandler::getForModelID( $params['contentmodel'] )
                        ->isSupportedFormat( $params['contentformat'] )
                ) {
-                       $this->dieUsage( 'Unsupported content model/format', 'badmodelformat' );
+                       $this->dieWithError(
+                               [ 'apierror-badformat-generic', $params['contentformat'], $params['contentmodel'] ],
+                               'badmodelformat'
+                       );
                }
 
+               $this->requireAtLeastOneParameter( $params, 'stashedtexthash', 'text' );
+
                $text = null;
                $textHash = null;
                if ( strlen( $params['stashedtexthash'] ) ) {
@@ -72,15 +77,18 @@ class ApiStashEdit extends ApiBase {
                        $textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
                        $text = $cache->get( $textKey );
                        if ( !is_string( $text ) ) {
-                               $this->dieUsage( 'No stashed text found with the given hash', 'missingtext' );
+                               $this->dieWithError( 'apierror-stashedit-missingtext', 'missingtext' );
                        }
                } elseif ( $params['text'] !== null ) {
                        // Trim and fix newlines so the key SHA1's match (see WebRequest::getText())
                        $text = rtrim( str_replace( "\r\n", "\n", $params['text'] ) );
                        $textHash = sha1( $text );
                } else {
-                       $this->dieUsage(
-                               'The text or stashedtexthash parameter must be given', 'missingtextparam' );
+                       $this->dieWithError( [
+                               'apierror-missingparam-at-least-one-of',
+                               Message::listParam( [ '<var>stashedtexthash</var>', '<var>text</var>' ] ),
+                               2,
+                       ], 'missingparam' );
                }
 
                $textContent = ContentHandler::makeContent(
@@ -91,11 +99,11 @@ class ApiStashEdit extends ApiBase {
                        // Page exists: get the merged content with the proposed change
                        $baseRev = Revision::newFromPageId( $page->getId(), $params['baserevid'] );
                        if ( !$baseRev ) {
-                               $this->dieUsage( "No revision ID {$params['baserevid']}", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-nosuchrevid', $params['baserevid'] ] );
                        }
                        $currentRev = $page->getRevision();
                        if ( !$currentRev ) {
-                               $this->dieUsage( "No current revision of page ID {$page->getId()}", 'missingrev' );
+                               $this->dieWithError( [ 'apierror-missingrev-pageid', $page->getId() ], 'missingrev' );
                        }
                        // Merge in the new version of the section to get the proposed version
                        $editContent = $page->replaceSectionAtRev(
@@ -105,7 +113,7 @@ class ApiStashEdit extends ApiBase {
                                $baseRev->getId()
                        );
                        if ( !$editContent ) {
-                               $this->dieUsage( 'Could not merge updated section.', 'replacefailed' );
+                               $this->dieWithError( 'apierror-sectionreplacefailed', 'replacefailed' );
                        }
                        if ( $currentRev->getId() == $baseRev->getId() ) {
                                // Base revision was still the latest; nothing to merge
@@ -115,7 +123,7 @@ class ApiStashEdit extends ApiBase {
                                $baseContent = $baseRev->getContent();
                                $currentContent = $currentRev->getContent();
                                if ( !$baseContent || !$currentContent ) {
-                                       $this->dieUsage( "Missing content for page ID {$page->getId()}", 'missingrev' );
+                                       $this->dieWithError( [ 'apierror-missingcontent-pageid', $page->getId() ], 'missingrev' );
                                }
                                $handler = ContentHandler::getForModelID( $baseContent->getModel() );
                                $content = $handler->merge3( $baseContent, $editContent, $currentContent );
@@ -160,7 +168,7 @@ class ApiStashEdit extends ApiBase {
         * @param Content $content Edit content
         * @param User $user
         * @param string $summary Edit summary
-        * @return integer ApiStashEdit::ERROR_* constant
+        * @return string ApiStashEdit::ERROR_* constant
         * @since 1.25
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user, $summary ) {
index f88c2db..7470ff3 100644 (file)
@@ -30,15 +30,20 @@ class ApiTag extends ApiBase {
                $user = $this->getUser();
 
                // make sure the user is allowed
-               if ( !$user->isAllowed( 'changetags' ) ) {
-                       $this->dieUsage( "You don't have permission to add or remove change tags from individual edits",
-                               'permissiondenied' );
-               }
+               $this->checkUserRightsAny( 'changetags' );
 
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
+               // Check if user can add tags
+               if ( count( $params['tags'] ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$ableToTag->isOk() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                // validate and process each revid, rcid and logid
                $this->requireAtLeastOneParameter( $params, 'revid', 'rcid', 'logid' );
                $ret = [];
@@ -88,7 +93,8 @@ class ApiTag extends ApiBase {
 
                if ( !$valid ) {
                        $idResult['status'] = 'error';
-                       $idResult += $this->parseMsg( [ "nosuch$type", $id ] );
+                       // Messages: apierror-nosuchrcid apierror-nosuchrevid apierror-nosuchlogid
+                       $idResult += $this->getErrorFormatter()->formatMessage( [ "apierror-nosuch$type", $id ] );
                        return $idResult;
                }
 
@@ -111,13 +117,17 @@ class ApiTag extends ApiBase {
                } else {
                        $idResult['status'] = 'success';
                        if ( is_null( $status->value->logId ) ) {
-                               $idResult['noop'] = '';
+                               $idResult['noop'] = true;
                        } else {
                                $idResult['actionlogid'] = $status->value->logId;
                                $idResult['added'] = $status->value->addedTags;
                                ApiResult::setIndexedTagName( $idResult['added'], 't' );
                                $idResult['removed'] = $status->value->removedTags;
                                ApiResult::setIndexedTagName( $idResult['removed'], 't' );
+
+                               if ( $params['tags'] ) {
+                                       ChangeTags::addTags( $params['tags'], null, null, $status->value->logId );
+                               }
                        }
                }
                return $idResult;
@@ -156,6 +166,10 @@ class ApiTag extends ApiBase {
                        'reason' => [
                                ApiBase::PARAM_DFLT => '',
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
                ];
        }
 
index 4940394..fc2951a 100644 (file)
 class ApiTokens extends ApiBase {
 
        public function execute() {
-               $this->setWarning(
-                       'action=tokens has been deprecated. Please use action=query&meta=tokens instead.'
+               $this->addDeprecation(
+                       [ 'apiwarn-deprecation-withreplacement', 'action=tokens', 'action=query&meta=tokens' ],
+                       'action=tokens'
                );
-               $this->logFeatureUsage( 'action=tokens' );
 
                $params = $this->extractRequestParams();
                $res = [
@@ -46,7 +46,7 @@ class ApiTokens extends ApiBase {
                        $val = call_user_func( $types[$type], null, null );
 
                        if ( $val === false ) {
-                               $this->setWarning( "Action '$type' is not allowed for the current user" );
+                               $this->addWarning( [ 'apiwarn-tokennotallowed', $type ] );
                        } else {
                                $res[$type . 'token'] = $val;
                        }
index ace41a4..3eeb7a4 100644 (file)
@@ -39,25 +39,18 @@ class ApiUnblock extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               if ( is_null( $params['id'] ) && is_null( $params['user'] ) ) {
-                       $this->dieUsageMsg( 'unblock-notarget' );
-               }
-               if ( !is_null( $params['id'] ) && !is_null( $params['user'] ) ) {
-                       $this->dieUsageMsg( 'unblock-idanduser' );
-               }
+               $this->requireOnlyOneParameter( $params, 'id', 'user', 'userid' );
 
                if ( !$user->isAllowed( 'block' ) ) {
-                       $this->dieUsageMsg( 'cantunblock' );
+                       $this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
                }
                # bug 15810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
-                               $msg = $this->parseMsg( $status );
-                               $this->dieUsage(
-                                       $msg['info'],
-                                       $msg['code'],
-                                       0,
+                               $this->dieWithError(
+                                       $status,
+                                       null,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                );
                        }
@@ -71,6 +64,16 @@ class ApiUnblock extends ApiBase {
                        }
                }
 
+               if ( $params['userid'] !== null ) {
+                       $username = User::whoIs( $params['userid'] );
+
+                       if ( $username === false ) {
+                               $this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
+                       } else {
+                               $params['user'] = $username;
+                       }
+               }
+
                $data = [
                        'Target' => is_null( $params['id'] ) ? $params['user'] : "#{$params['id']}",
                        'Reason' => $params['reason'],
@@ -79,7 +82,7 @@ class ApiUnblock extends ApiBase {
                $block = Block::newFromTarget( $data['Target'] );
                $retval = SpecialUnblock::processUnblock( $data, $this->getContext() );
                if ( $retval !== true ) {
-                       $this->dieUsageMsg( $retval[0] );
+                       $this->dieStatus( $this->errorArrayToStatus( $retval ) );
                }
 
                $res['id'] = $block->getId();
@@ -104,6 +107,9 @@ class ApiUnblock extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ],
                        'user' => null,
+                       'userid' => [
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ],
                        'reason' => '',
                        'tags' => [
                                ApiBase::PARAM_TYPE => 'tags',
index e24f2ce..7fda1ea 100644 (file)
@@ -33,18 +33,16 @@ class ApiUndelete extends ApiBase {
                $this->useTransactionalTimeLimit();
 
                $params = $this->extractRequestParams();
-               $user = $this->getUser();
-               if ( !$user->isAllowed( 'undelete' ) ) {
-                       $this->dieUsageMsg( 'permdenied-undelete' );
-               }
+               $this->checkUserRightsAny( 'undelete' );
 
+               $user = $this->getUser();
                if ( $user->isBlocked() ) {
                        $this->dieBlocked( $user->getBlock() );
                }
 
                $titleObj = Title::newFromText( $params['title'] );
                if ( !$titleObj || $titleObj->isExternal() ) {
-                       $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                       $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                }
 
                // Check if user can add tags
@@ -76,7 +74,7 @@ class ApiUndelete extends ApiBase {
                        $params['tags']
                );
                if ( !is_array( $retval ) ) {
-                       $this->dieUsageMsg( 'cannotundelete' );
+                       $this->dieWithError( 'apierror-cantundelete' );
                }
 
                if ( $retval[1] ) {
index 7b44f40..6b38302 100644 (file)
@@ -36,7 +36,7 @@ class ApiUpload extends ApiBase {
        public function execute() {
                // Check whether upload is enabled
                if ( !UploadBase::isEnabled() ) {
-                       $this->dieUsageMsg( 'uploaddisabled' );
+                       $this->dieWithError( 'uploaddisabled' );
                }
 
                $user = $this->getUser();
@@ -61,11 +61,10 @@ class ApiUpload extends ApiBase {
                        if ( !$this->selectUploadModule() ) {
                                return; // not a true upload, but a status request or similar
                        } elseif ( !isset( $this->mUpload ) ) {
-                               $this->dieUsage( 'No upload module set', 'nomodule' );
+                               $this->dieDebug( __METHOD__, 'No upload module set' );
                        }
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       list( $msg, $code ) = $this->handleStashException( get_class( $e ), $e->getMessage() );
-                       $this->dieUsage( $msg, $code );
+                       $this->dieStatus( $this->handleStashException( $e ) );
                }
 
                // First check permission to upload
@@ -75,19 +74,17 @@ class ApiUpload extends ApiBase {
                /** @var $status Status */
                $status = $this->mUpload->fetchFile();
                if ( !$status->isGood() ) {
-                       $errors = $status->getErrorsArray();
-                       $error = array_shift( $errors[0] );
-                       $this->dieUsage( 'Error fetching file from remote source', $error, 0, $errors[0] );
+                       $this->dieStatus( $status );
                }
 
                // Check if the uploaded file is sane
                if ( $this->mParams['chunk'] ) {
                        $maxSize = UploadBase::getMaxUploadSize();
                        if ( $this->mParams['filesize'] > $maxSize ) {
-                               $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+                               $this->dieWithError( 'file-too-large' );
                        }
                        if ( !$this->mUpload->getTitle() ) {
-                               $this->dieUsage( 'Invalid file title supplied', 'internal-error' );
+                               $this->dieWithError( 'illegal-filename' );
                        }
                } elseif ( $this->mParams['async'] && $this->mParams['filekey'] ) {
                        // defer verification to background process
@@ -102,7 +99,7 @@ class ApiUpload extends ApiBase {
                if ( !$this->mParams['stash'] ) {
                        $permErrors = $this->mUpload->verifyTitlePermissions( $user );
                        if ( $permErrors !== true ) {
-                               $this->dieRecoverableError( $permErrors[0], 'filename' );
+                               $this->dieRecoverableError( $permErrors, 'filename' );
                        }
                }
 
@@ -110,8 +107,7 @@ class ApiUpload extends ApiBase {
                try {
                        $result = $this->getContextResult();
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       list( $msg, $code ) = $this->handleStashException( get_class( $e ), $e->getMessage() );
-                       $this->dieUsage( $msg, $code );
+                       $this->dieStatus( $this->handleStashException( $e ) );
                }
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
 
@@ -146,7 +142,7 @@ class ApiUpload extends ApiBase {
                // Check throttle after we've handled warnings
                if ( UploadBase::isThrottled( $this->getUser() )
                ) {
-                       $this->dieUsageMsg( 'actionthrottledtext' );
+                       $this->dieWithError( 'apierror-ratelimited' );
                }
 
                // This is the most common case -- a normal upload with no warnings
@@ -208,16 +204,12 @@ class ApiUpload extends ApiBase {
 
                // Sanity check sizing
                if ( $totalSoFar > $this->mParams['filesize'] ) {
-                       $this->dieUsage(
-                               'Offset plus current chunk is greater than claimed file size', 'invalid-chunk'
-                       );
+                       $this->dieWithError( 'apierror-invalid-chunk' );
                }
 
                // Enforce minimum chunk size
                if ( $totalSoFar != $this->mParams['filesize'] && $chunkSize < $minChunkSize ) {
-                       $this->dieUsage(
-                               "Minimum chunk size is $minChunkSize bytes for non-final chunks", 'chunk-too-small'
-                       );
+                       $this->dieWithError( [ 'apierror-chunk-too-small', Message::numParam( $minChunkSize ) ] );
                }
 
                if ( $this->mParams['offset'] == 0 ) {
@@ -229,11 +221,9 @@ class ApiUpload extends ApiBase {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
                        if ( !$progress ) {
                                // Probably can't get here, but check anyway just in case
-                               $this->dieUsage( 'No chunked upload session with this key', 'stashfailed' );
+                               $this->dieWithError( 'apierror-stashfailed-nosession', 'stashfailed' );
                        } elseif ( $progress['result'] !== 'Continue' || $progress['stage'] !== 'uploading' ) {
-                               $this->dieUsage(
-                                       'Chunked upload is already completed, check status for details', 'stashfailed'
-                               );
+                               $this->dieWithError( 'apierror-stashfailed-complete', 'stashfailed' );
                        }
 
                        $status = $this->mUpload->addChunk(
@@ -330,12 +320,14 @@ class ApiUpload extends ApiBase {
 
                        if ( $status->isGood() && !$status->getValue() ) {
                                // Not actually a 'good' status...
-                               $status->fatal( new ApiRawMessage( 'Invalid stashed file', 'stashfailed' ) );
+                               $status->fatal( new ApiMessage( 'apierror-stashinvalidfile', 'stashfailed' ) );
                        }
                } catch ( Exception $e ) {
                        $debugMessage = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
                        wfDebug( __METHOD__ . ' ' . $debugMessage . "\n" );
-                       $status = Status::newFatal( new ApiRawMessage( $e->getMessage(), 'stashfailed' ) );
+                       $status = Status::newFatal( $this->getErrorFormatter()->getMessageFromException(
+                               $e, [ 'wrap' => new ApiMessage( 'apierror-stashexception', 'stashfailed' ) ]
+                       ) );
                }
 
                if ( $status->isGood() ) {
@@ -352,16 +344,13 @@ class ApiUpload extends ApiBase {
                        list( $exceptionType, $message ) = $status->getMessage()->getParams();
                        $debugMessage = 'Stashing temporary file failed: ' . $exceptionType . ' ' . $message;
                        wfDebug( __METHOD__ . ' ' . $debugMessage . "\n" );
-                       list( $msg, $code ) = $this->handleStashException( $exceptionType, $message );
-                       $status = Status::newFatal( new ApiRawMessage( $msg, $code ) );
                }
 
                // Bad status
                if ( $failureMode !== 'optional' ) {
                        $this->dieStatus( $status );
                } else {
-                       list( $code, $msg ) = $this->getErrorFromStatus( $status );
-                       $data['stashfailed'] = $msg;
+                       $data['stasherrors'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                        return null;
                }
        }
@@ -370,25 +359,25 @@ class ApiUpload extends ApiBase {
         * Throw an error that the user can recover from by providing a better
         * value for $parameter
         *
-        * @param array|string|MessageSpecifier $error Error suitable for passing to dieUsageMsg()
-        * @param string $parameter Parameter that needs revising
-        * @param array $data Optional extra data to pass to the user
-        * @param string $code Error code to use if the error is unknown
-        * @throws UsageException
+        * @param array $errors Array of Message objects, message keys, key+param
+        *  arrays, or StatusValue::getErrors()-style arrays
+        * @param string|null $parameter Parameter that needs revising
+        * @throws ApiUsageException
         */
-       private function dieRecoverableError( $error, $parameter, $data = [], $code = 'unknownerror' ) {
+       private function dieRecoverableError( $errors, $parameter = null ) {
                $this->performStash( 'optional', $data );
-               $data['invalidparameter'] = $parameter;
 
-               $parsed = $this->parseMsg( $error );
-               if ( isset( $parsed['data'] ) ) {
-                       $data = array_merge( $data, $parsed['data'] );
-               }
-               if ( $parsed['code'] === 'unknownerror' ) {
-                       $parsed['code'] = $code;
+               if ( $parameter ) {
+                       $data['invalidparameter'] = $parameter;
                }
 
-               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data );
+               $sv = StatusValue::newGood();
+               foreach ( $errors as $error ) {
+                       $msg = ApiMessage::create( $error );
+                       $msg->setApiData( $msg->getApiData() + $data );
+                       $sv->fatal( $msg );
+               }
+               $this->dieStatus( $sv );
        }
 
        /**
@@ -398,20 +387,18 @@ class ApiUpload extends ApiBase {
         * @param Status $status
         * @param string $overrideCode Error code to use if there isn't one from IApiMessage
         * @param array|null $moreExtraData
-        * @throws UsageException
+        * @throws ApiUsageException
         */
        public function dieStatusWithCode( $status, $overrideCode, $moreExtraData = null ) {
-               $extraData = null;
-               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
-               $errors = $status->getErrorsByType( 'error' ) ?: $status->getErrorsByType( 'warning' );
-               if ( !( $errors[0]['message'] instanceof IApiMessage ) ) {
-                       $code = $overrideCode;
-               }
-               if ( $moreExtraData ) {
-                       $extraData = $extraData ?: [];
-                       $extraData += $moreExtraData;
+               $sv = StatusValue::newGood();
+               foreach ( $status->getErrors() as $error ) {
+                       $msg = ApiMessage::create( $error, $overrideCode );
+                       if ( $moreExtraData ) {
+                               $msg->setApiData( $msg->getApiData() + $moreExtraData );
+                       }
+                       $sv->fatal( $msg );
                }
-               $this->dieUsage( $msg, $code, 0, $extraData );
+               $this->dieStatus( $sv );
        }
 
        /**
@@ -434,7 +421,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['filekey'] && $this->mParams['checkstatus'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( !$progress ) {
-                               $this->dieUsage( 'No result in status data', 'missingresult' );
+                               $this->dieWithError( 'api-upload-missingresult', 'missingresult' );
                        } elseif ( !$progress['status']->isGood() ) {
                                $this->dieStatusWithCode( $progress['status'], 'stashfailed' );
                        }
@@ -466,7 +453,7 @@ class ApiUpload extends ApiBase {
 
                // The following modules all require the filename parameter to be set
                if ( is_null( $this->mParams['filename'] ) ) {
-                       $this->dieUsageMsg( [ 'missingparam', 'filename' ] );
+                       $this->dieWithError( [ 'apierror-missingparam', 'filename' ] );
                }
 
                if ( $this->mParams['chunk'] ) {
@@ -474,7 +461,7 @@ class ApiUpload extends ApiBase {
                        $this->mUpload = new UploadFromChunks( $this->getUser() );
                        if ( isset( $this->mParams['filekey'] ) ) {
                                if ( $this->mParams['offset'] === 0 ) {
-                                       $this->dieUsage( 'Cannot supply a filekey when offset is 0', 'badparams' );
+                                       $this->dieWithError( 'apierror-upload-filekeynotallowed', 'filekeynotallowed' );
                                }
 
                                // handle new chunk
@@ -485,7 +472,7 @@ class ApiUpload extends ApiBase {
                                );
                        } else {
                                if ( $this->mParams['offset'] !== 0 ) {
-                                       $this->dieUsage( 'Must supply a filekey when offset is non-zero', 'badparams' );
+                                       $this->dieWithError( 'apierror-upload-filekeyneeded', 'filekeyneeded' );
                                }
 
                                // handle first chunk
@@ -497,7 +484,7 @@ class ApiUpload extends ApiBase {
                } elseif ( isset( $this->mParams['filekey'] ) ) {
                        // Upload stashed in a previous request
                        if ( !UploadFromStash::isValidKey( $this->mParams['filekey'] ) ) {
-                               $this->dieUsageMsg( 'invalid-file-key' );
+                               $this->dieWithError( 'apierror-invalid-file-key' );
                        }
 
                        $this->mUpload = new UploadFromStash( $this->getUser() );
@@ -515,15 +502,15 @@ class ApiUpload extends ApiBase {
                } elseif ( isset( $this->mParams['url'] ) ) {
                        // Make sure upload by URL is enabled:
                        if ( !UploadFromUrl::isEnabled() ) {
-                               $this->dieUsageMsg( 'copyuploaddisabled' );
+                               $this->dieWithError( 'copyuploaddisabled' );
                        }
 
                        if ( !UploadFromUrl::isAllowedHost( $this->mParams['url'] ) ) {
-                               $this->dieUsageMsg( 'copyuploadbaddomain' );
+                               $this->dieWithError( 'apierror-copyuploadbaddomain' );
                        }
 
                        if ( !UploadFromUrl::isAllowedUrl( $this->mParams['url'] ) ) {
-                               $this->dieUsageMsg( 'copyuploadbadurl' );
+                               $this->dieWithError( 'apierror-copyuploadbadurl' );
                        }
 
                        $this->mUpload = new UploadFromUrl;
@@ -545,10 +532,10 @@ class ApiUpload extends ApiBase {
 
                if ( $permission !== true ) {
                        if ( !$user->isLoggedIn() ) {
-                               $this->dieUsageMsg( [ 'mustbeloggedin', 'upload' ] );
+                               $this->dieWithError( [ 'apierror-mustbeloggedin', $this->msg( 'action-upload' ) ] );
                        }
 
-                       $this->dieUsageMsg( 'badaccess-groups' );
+                       $this->dieStatus( User::newFatalPermissionDeniedStatus( $permission ) );
                }
 
                // Check blocks
@@ -579,32 +566,34 @@ class ApiUpload extends ApiBase {
         * @param array $verification
         */
        protected function checkVerification( array $verification ) {
-               // @todo Move them to ApiBase's message map
                switch ( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
-                               $this->dieRecoverableError( 'filename-tooshort', 'filename' );
+                               $this->dieRecoverableError( [ 'filename-tooshort' ], 'filename' );
                                break;
                        case UploadBase::ILLEGAL_FILENAME:
-                               $this->dieRecoverableError( 'illegal-filename', 'filename',
-                                       [ 'filename' => $verification['filtered'] ] );
+                               $this->dieRecoverableError(
+                                       [ ApiMessage::create(
+                                               'illegal-filename', null, [ 'filename' => $verification['filtered'] ]
+                                       ) ], 'filename'
+                               );
                                break;
                        case UploadBase::FILENAME_TOO_LONG:
-                               $this->dieRecoverableError( 'filename-toolong', 'filename' );
+                               $this->dieRecoverableError( [ 'filename-toolong' ], 'filename' );
                                break;
                        case UploadBase::FILETYPE_MISSING:
-                               $this->dieRecoverableError( 'filetype-missing', 'filename' );
+                               $this->dieRecoverableError( [ 'filetype-missing' ], 'filename' );
                                break;
                        case UploadBase::WINDOWS_NONASCII_FILENAME:
-                               $this->dieRecoverableError( 'windows-nonascii-filename', 'filename' );
+                               $this->dieRecoverableError( [ 'windows-nonascii-filename' ], 'filename' );
                                break;
 
                        // Unrecoverable errors
                        case UploadBase::EMPTY_FILE:
-                               $this->dieUsage( 'The file you submitted was empty', 'empty-file' );
+                               $this->dieWithError( 'empty-file' );
                                break;
                        case UploadBase::FILE_TOO_LARGE:
-                               $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+                               $this->dieWithError( 'file-too-large' );
                                break;
 
                        case UploadBase::FILETYPE_BADTYPE:
@@ -612,57 +601,48 @@ class ApiUpload extends ApiBase {
                                        'filetype' => $verification['finalExt'],
                                        'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
                                ];
+                               $extensions = array_unique( $this->getConfig()->get( 'FileExtensions' ) );
+                               $msg = [
+                                       'filetype-banned-type',
+                                       null, // filled in below
+                                       Message::listParam( $extensions, 'comma' ),
+                                       count( $extensions ),
+                                       null, // filled in below
+                               ];
                                ApiResult::setIndexedTagName( $extradata['allowed'], 'ext' );
 
-                               $msg = 'Filetype not permitted: ';
                                if ( isset( $verification['blacklistedExt'] ) ) {
-                                       $msg .= implode( ', ', $verification['blacklistedExt'] );
+                                       $msg[1] = Message::listParam( $verification['blacklistedExt'], 'comma' );
+                                       $msg[4] = count( $verification['blacklistedExt'] );
                                        $extradata['blacklisted'] = array_values( $verification['blacklistedExt'] );
                                        ApiResult::setIndexedTagName( $extradata['blacklisted'], 'ext' );
                                } else {
-                                       $msg .= $verification['finalExt'];
+                                       $msg[1] = $verification['finalExt'];
+                                       $msg[4] = 1;
                                }
-                               $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
+
+                               $this->dieWithError( $msg, 'filetype-banned', $extradata );
                                break;
+
                        case UploadBase::VERIFICATION_ERROR:
-                               $parsed = $this->parseMsg( $verification['details'] );
-                               $info = "This file did not pass file verification: {$parsed['info']}";
-                               if ( $verification['details'][0] instanceof IApiMessage ) {
-                                       $code = $parsed['code'];
-                               } else {
-                                       // For backwards-compatibility, all of the errors from UploadBase::verifyFile() are
-                                       // reported as 'verification-error', and the real error code is reported in 'details'.
-                                       $code = 'verification-error';
-                               }
-                               if ( $verification['details'][0] instanceof IApiMessage ) {
-                                       $msg = $verification['details'][0];
+                               $msg = ApiMessage::create( $verification['details'], 'verification-error' );
+                               if ( $verification['details'][0] instanceof MessageSpecifier ) {
                                        $details = array_merge( [ $msg->getKey() ], $msg->getParams() );
                                } else {
                                        $details = $verification['details'];
                                }
                                ApiResult::setIndexedTagName( $details, 'detail' );
-                               $data = [ 'details' => $details ];
-                               if ( isset( $parsed['data'] ) ) {
-                                       $data = array_merge( $data, $parsed['data'] );
-                               }
-
-                               $this->dieUsage( $info, $code, 0, $data );
+                               $msg->setApiData( $msg->getApiData() + [ 'details' => $details ] );
+                               $this->dieWithError( $msg );
                                break;
+
                        case UploadBase::HOOK_ABORTED:
-                               if ( is_array( $verification['error'] ) ) {
-                                       $params = $verification['error'];
-                               } elseif ( $verification['error'] !== '' ) {
-                                       $params = [ $verification['error'] ];
-                               } else {
-                                       $params = [ 'hookaborted' ];
-                               }
-                               $key = array_shift( $params );
-                               $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text();
-                               $this->dieUsage( $msg, 'hookaborted', 0, [ 'details' => $verification['error'] ] );
+                               $msg = $verification['error'] === '' ? 'hookaborted' : $verification['error'];
+                               $this->dieWithError( $msg, 'hookaborted', [ 'details' => $verification['error'] ] );
                                break;
                        default:
-                               $this->dieUsage( 'An unknown error occurred', 'unknown-error',
-                                       0, [ 'details' => [ 'code' => $verification['status'] ] ] );
+                               $this->dieWithError( 'apierror-unknownerror-nocode', 'unknown-error',
+                                       [ 'details' => [ 'code' => $verification['status'] ] ] );
                                break;
                }
        }
@@ -735,42 +715,41 @@ class ApiUpload extends ApiBase {
 
        /**
         * Handles a stash exception, giving a useful error to the user.
-        * @param string $exceptionType Class name of the exception we encountered.
-        * @param string $message Message of the exception we encountered.
-        * @return array Array of message and code, suitable for passing to dieUsage()
+        * @todo Internationalize the exceptions then get rid of this
+        * @param Exception $e
+        * @return StatusValue
         */
-       protected function handleStashException( $exceptionType, $message ) {
-               switch ( $exceptionType ) {
+       protected function handleStashException( $e ) {
+               switch ( get_class( $e ) ) {
                        case 'UploadStashFileNotFoundException':
-                               return [
-                                       'Could not find the file in the stash: ' . $message,
-                                       'stashedfilenotfound'
-                               ];
+                               $wrap = 'apierror-stashedfilenotfound';
+                               break;
                        case 'UploadStashBadPathException':
-                               return [
-                                       'File key of improper format or otherwise invalid: ' . $message,
-                                       'stashpathinvalid'
-                               ];
+                               $wrap = 'apierror-stashpathinvalid';
+                               break;
                        case 'UploadStashFileException':
-                               return [
-                                       'Could not store upload in the stash: ' . $message,
-                                       'stashfilestorage'
-                               ];
+                               $wrap = 'apierror-stashfilestorage';
+                               break;
                        case 'UploadStashZeroLengthFileException':
-                               return [
-                                       'File is of zero length, and could not be stored in the stash: ' .
-                                               $message,
-                                       'stashzerolength'
-                               ];
+                               $wrap = 'apierror-stashzerolength';
+                               break;
                        case 'UploadStashNotLoggedInException':
-                               return [ 'Not logged in: ' . $message, 'stashnotloggedin' ];
+                               return StatusValue::newFatal( ApiMessage::create(
+                                       [ 'apierror-mustbeloggedin', $this->msg( 'action-upload' ) ], 'stashnotloggedin'
+                               ) );
                        case 'UploadStashWrongOwnerException':
-                               return [ 'Wrong owner: ' . $message, 'stashwrongowner' ];
+                               $wrap = 'apierror-stashwrongowner';
+                               break;
                        case 'UploadStashNoSuchKeyException':
-                               return [ 'No such filekey: ' . $message, 'stashnosuchfilekey' ];
+                               $wrap = 'apierror-stashnosuchfilekey';
+                               break;
                        default:
-                               return [ $exceptionType . ': ' . $message, 'stasherror' ];
+                               $wrap = [ 'uploadstash-exception', get_class( $e ) ];
+                               break;
                }
+               return StatusValue::newFatal(
+                       $this->getErrorFormatter()->getMessageFromException( $e, [ 'wrap' => $wrap ] )
+               );
        }
 
        /**
@@ -821,7 +800,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['async'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( $progress && $progress['result'] === 'Poll' ) {
-                               $this->dieUsage( 'Upload from stash already in progress.', 'publishfailed' );
+                               $this->dieWithError( 'apierror-upload-inprogress', 'publishfailed' );
                        }
                        UploadBase::setSessionStatus(
                                $this->getUser(),
@@ -848,14 +827,7 @@ class ApiUpload extends ApiBase {
                                $this->mParams['text'], $watch, $this->getUser(), $this->mParams['tags'] );
 
                        if ( !$status->isGood() ) {
-                               // Is there really no better way to do this?
-                               $errors = $status->getErrorsByType( 'error' );
-                               $msg = array_merge( [ $errors[0]['message'] ], $errors[0]['params'] );
-                               $data = $status->getErrorsArray();
-                               ApiResult::setIndexedTagName( $data, 'error' );
-                               // For backwards-compatibility, we use the 'internal-error' fallback key and merge $data
-                               // into the root of the response (rather than something sane like [ 'details' => $data ]).
-                               $this->dieRecoverableError( $msg, null, $data, 'internal-error' );
+                               $this->dieRecoverableError( $status->getErrors() );
                        }
                        $result['result'] = 'Success';
                }
diff --git a/includes/api/ApiUsageException.php b/includes/api/ApiUsageException.php
new file mode 100644 (file)
index 0000000..9dc1f92
--- /dev/null
@@ -0,0 +1,224 @@
+<?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
+ * @defgroup API API
+ */
+
+/**
+ * This exception will be thrown when dieUsage is called to stop module execution.
+ *
+ * @ingroup API
+ * @deprecated since 1.29, use ApiUsageException instead
+ */
+class UsageException extends MWException {
+
+       private $mCodestr;
+
+       /**
+        * @var null|array
+        */
+       private $mExtraData;
+
+       /**
+        * @param string $message
+        * @param string $codestr
+        * @param int $code
+        * @param array|null $extradata
+        */
+       public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
+               parent::__construct( $message, $code );
+               $this->mCodestr = $codestr;
+               $this->mExtraData = $extradata;
+
+               // This should never happen, so throw an exception about it that will
+               // hopefully get logged with a backtrace (T138585)
+               if ( !is_string( $codestr ) || $codestr === '' ) {
+                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
+                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
+                       );
+               }
+       }
+
+       /**
+        * @return string
+        */
+       public function getCodeString() {
+               return $this->mCodestr;
+       }
+
+       /**
+        * @return array
+        */
+       public function getMessageArray() {
+               $result = [
+                       'code' => $this->mCodestr,
+                       'info' => $this->getMessage()
+               ];
+               if ( is_array( $this->mExtraData ) ) {
+                       $result = array_merge( $result, $this->mExtraData );
+               }
+
+               return $result;
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return "{$this->getCodeString()}: {$this->getMessage()}";
+       }
+}
+
+/**
+ * Exception used to abort API execution with an error
+ *
+ * If possible, use ApiBase::dieWithError() instead of throwing this directly.
+ *
+ * @ingroup API
+ * @note This currently extends UsageException for backwards compatibility, so
+ *  all the existing code that catches UsageException won't break when stuff
+ *  starts throwing ApiUsageException. Eventually UsageException will go away
+ *  and this will (probably) extend MWException directly.
+ */
+class ApiUsageException extends UsageException implements ILocalizedException {
+
+       protected $modulePath;
+       protected $status;
+
+       /**
+        * @param ApiBase|null $module API module responsible for the error, if known
+        * @param StatusValue $status Status holding errors
+        * @param int $httpCode HTTP error code to use
+        */
+       public function __construct(
+               ApiBase $module = null, StatusValue $status, $httpCode = 0
+       ) {
+               if ( $status->isOK() ) {
+                       throw new InvalidArgumentException( __METHOD__ . ' requires a fatal Status' );
+               }
+
+               $this->modulePath = $module ? $module->getModulePath() : null;
+               $this->status = $status;
+
+               // Bug T46111: Messages in the log files should be in English and not
+               // customized by the local wiki.
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               parent::__construct(
+                       ApiErrorFormatter::stripMarkup( $enMsg->text() ),
+                       $enMsg->getApiCode(),
+                       $httpCode,
+                       $enMsg->getApiData()
+               );
+       }
+
+       /**
+        * @param ApiBase|null $module API module responsible for the error, if known
+        * @param string|array|Message $msg See ApiMessage::create()
+        * @param string|null $code See ApiMessage::create()
+        * @param array|null $data See ApiMessage::create()
+        * @param int $httpCode HTTP error code to use
+        * @return static
+        */
+       public static function newWithMessage(
+               ApiBase $module = null, $msg, $code = null, $data = null, $httpCode = 0
+       ) {
+               return new static(
+                       $module,
+                       StatusValue::newFatal( ApiMessage::create( $msg, $code, $data ) ),
+                       $httpCode
+               );
+       }
+
+       /**
+        * @returns ApiMessage
+        */
+       private function getApiMessage() {
+               $errors = $this->status->getErrorsByType( 'error' );
+               if ( !$errors ) {
+                       $errors = $this->status->getErrors();
+               }
+               if ( !$errors ) {
+                       $msg = new ApiMessage( 'apierror-unknownerror-nocode', 'unknownerror' );
+               } else {
+                       $msg = ApiMessage::create( $errors[0] );
+               }
+               return $msg;
+       }
+
+       /**
+        * Fetch the responsible module name
+        * @return string|null
+        */
+       public function getModulePath() {
+               return $this->modulePath;
+       }
+
+       /**
+        * Fetch the error status
+        * @return StatusValue
+        */
+       public function getStatusValue() {
+               return $this->status;
+       }
+
+       /**
+        * @deprecated Do not use. This only exists here because UsageException is in
+        *  the inheritance chain for backwards compatibility.
+        * @inheritdoc
+        */
+       public function getCodeString() {
+               return $this->getApiMessage()->getApiCode();
+       }
+
+       /**
+        * @deprecated Do not use. This only exists here because UsageException is in
+        *  the inheritance chain for backwards compatibility.
+        * @inheritdoc
+        */
+       public function getMessageArray() {
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+
+               return [
+                       'code' => $enMsg->getApiCode(),
+                       'info' => ApiErrorFormatter::stripMarkup( $enMsg->text() ),
+               ] + $enMsg->getApiData();
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function getMessageObject() {
+               return $this->status->getMessage();
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $enMsg = clone $this->getApiMessage();
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               $text = ApiErrorFormatter::stripMarkup( $enMsg->text() );
+
+               return get_class( $this ) . ": {$enMsg->getApiCode()}: {$text} "
+                       . "in {$this->getFile()}:{$this->getLine()}\n"
+                       . "Stack trace:\n{$this->getTraceAsString()}";
+       }
+
+}
index 79c6866..4ef974c 100644 (file)
@@ -61,13 +61,23 @@ class ApiUserrights extends ApiBase {
 
                $user = $this->getUrUser( $params );
 
+               $tags = $params['tags'];
+
+               // Check if user can add tags
+               if ( !is_null( $tags ) ) {
+                       $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $tags, $pUser );
+                       if ( !$ableToTag->isOK() ) {
+                               $this->dieStatus( $ableToTag );
+                       }
+               }
+
                $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) = $form->doSaveUserGroups(
                        $user, (array)$params['add'],
-                       (array)$params['remove'], $params['reason']
+                       (array)$params['remove'], $params['reason'], $tags
                );
 
                $result = $this->getResult();
@@ -132,6 +142,10 @@ class ApiUserrights extends ApiBase {
                                // Standard definition automatically inserted
                                ApiBase::PARAM_HELP_MSG_APPEND => [ 'api-help-param-token-webui' ],
                        ],
+                       'tags' => [
+                               ApiBase::PARAM_TYPE => 'tags',
+                               ApiBase::PARAM_ISMULTI => true
+                       ],
                ];
        }
 
diff --git a/includes/api/ApiValidatePassword.php b/includes/api/ApiValidatePassword.php
new file mode 100644 (file)
index 0000000..6968523
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+use MediaWiki\Auth\AuthManager;
+
+/**
+ * @ingroup API
+ */
+class ApiValidatePassword extends ApiBase {
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               // For sanity
+               $this->requirePostedParameters( [ 'password' ] );
+
+               if ( $params['user'] !== null ) {
+                       $user = User::newFromName( $params['user'], 'creatable' );
+                       if ( !$user ) {
+                               $encParamName = $this->encodeParamName( 'user' );
+                               $this->dieWithError(
+                                       [ 'apierror-baduser', $encParamName, wfEscapeWikiText( $params['user'] ) ],
+                                       "baduser_{$encParamName}"
+                               );
+                       }
+
+                       if ( !$user->isAnon() || AuthManager::singleton()->userExists( $user->getName() ) ) {
+                               $this->dieWithError( 'userexists' );
+                       }
+
+                       $user->setEmail( (string)$params['email'] );
+                       $user->setRealName( (string)$params['realname'] );
+               } else {
+                       $user = $this->getUser();
+               }
+
+               $validity = $user->checkPasswordValidity( $params['password'] );
+               $r['validity'] = $validity->isGood() ? 'Good' : ( $validity->isOK() ? 'Change' : 'Invalid' );
+               $messages = array_merge(
+                       $this->getErrorFormatter()->arrayFromStatus( $validity, 'error' ),
+                       $this->getErrorFormatter()->arrayFromStatus( $validity, 'warning' )
+               );
+               if ( $messages ) {
+                       $r['validitymessages'] = $messages;
+               }
+
+               Hooks::run( 'ApiValidatePassword', [ $this, &$r ] );
+
+               $this->getResult()->addValue( null, $this->getModuleName(), $r );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return [
+                       'password' => [
+                               ApiBase::PARAM_TYPE => 'password',
+                               ApiBase::PARAM_REQUIRED => true
+                       ],
+                       'user' => [
+                               ApiBase::PARAM_TYPE => 'user',
+                       ],
+                       'email' => null,
+                       'realname' => null,
+               ];
+       }
+
+       protected function getExamplesMessages() {
+               return [
+                       'action=validatepassword&password=foobar'
+                               => 'apihelp-validatepassword-example-1',
+                       'action=validatepassword&password=querty&user=Example'
+                               => 'apihelp-validatepassword-example-2',
+               ];
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Validatepassword';
+       }
+}
index 3a7a082..37d319f 100644 (file)
@@ -35,12 +35,10 @@ class ApiWatch extends ApiBase {
        public function execute() {
                $user = $this->getUser();
                if ( !$user->isLoggedIn() ) {
-                       $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
+                       $this->dieWithError( 'watchlistanontext', 'notloggedin' );
                }
 
-               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
-               }
+               $this->checkUserRightsAny( 'editmywatchlist' );
 
                $params = $this->extractRequestParams();
 
@@ -62,7 +60,7 @@ class ApiWatch extends ApiBase {
 
                        foreach ( $pageSet->getMissingTitles() as $title ) {
                                $r = $this->watchTitle( $title, $user, $params );
-                               $r['missing'] = 1;
+                               $r['missing'] = true;
                                $res[] = $r;
                        }
 
@@ -78,16 +76,19 @@ class ApiWatch extends ApiBase {
                        } ) );
 
                        if ( $extraParams ) {
-                               $p = $this->getModulePrefix();
-                               $this->dieUsage(
-                                       "The parameter {$p}title can not be used with " . implode( ', ', $extraParams ),
+                               $this->dieWithError(
+                                       [
+                                               'apierror-invalidparammix-cannotusewith',
+                                               $this->encodeParamName( 'title' ),
+                                               $pageSet->encodeParamName( $extraParams[0] )
+                                       ],
                                        'invalidparammix'
                                );
                        }
 
                        $title = Title::newFromText( $params['title'] );
                        if ( !$title || !$title->isWatchable() ) {
-                               $this->dieUsageMsg( [ 'invalidtitle', $params['title'] ] );
+                               $this->dieWithError( [ 'invalidtitle', $params['title'] ] );
                        }
                        $res = $this->watchTitle( $title, $user, $params, true );
                }
@@ -109,26 +110,20 @@ class ApiWatch extends ApiBase {
                if ( $params['unwatch'] ) {
                        $status = UnwatchAction::doUnwatch( $title, $user );
                        $res['unwatched'] = $status->isOK();
-                       if ( $status->isOK() ) {
-                               $msgKey = $title->isTalkPage() ? 'removedwatchtext-talk' : 'removedwatchtext';
-                               $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
-                                       ->title( $title )->parseAsBlock();
-                       }
                } else {
                        $status = WatchAction::doWatch( $title, $user );
                        $res['watched'] = $status->isOK();
-                       if ( $status->isOK() ) {
-                               $msgKey = $title->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext';
-                               $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
-                                       ->title( $title )->parseAsBlock();
-                       }
                }
 
                if ( !$status->isOK() ) {
                        if ( $compatibilityMode ) {
                                $this->dieStatus( $status );
                        }
-                       $res['error'] = $this->getErrorFromStatus( $status );
+                       $res['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
+                       $res['warnings'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
+                       if ( !$res['warnings'] ) {
+                               unset( $res['warnings'] );
+                       }
                }
 
                return $res;
index 5072c66..86078d4 100644 (file)
                        "Fatz",
                        "Hiba Alshawi",
                        "Maroen1990",
-                       "محمد أحمد عبد الفتاح"
+                       "محمد أحمد عبد الفتاح",
+                       "ديفيد"
                ]
        },
        "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-main-param-format": "صيغة الخرج.",
+       "apihelp-main-param-assertuser": "التحقق من أن المستخدم الحالي هو المستخدم المسمى.",
+       "apihelp-main-param-requestid": "سيتم إدراج أي قيمة معينة هنا في الاستجابة. يمكن أن تُستخدَم لتمييز الطلبات.",
+       "apihelp-main-param-servedby": "تتضمن اسم المضيف الذي الخدم طلب في النتائج.",
+       "apihelp-main-param-curtimestamp": "تشمل الطابع الزمني الحالي في النتيجة.",
+       "apihelp-main-param-responselanginfo": "تشمل اللغات المستخدمة لأجل <var>uselang</var> and <var>errorlang</var> في النتيجة.",
+       "apihelp-main-param-errorsuselocal": "إذا ما أعطيت، النصوص الخطأ ستستخدم الرسائل المخصصة محليا من نطاق {{ns:MediaWiki}}.",
        "apihelp-block-description": "منع مستخدم.",
+       "apihelp-block-param-user": "اسم المستخدم، أو عنوان IP أو نطاق عنوان IP لمنعه. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1userid</var>",
+       "apihelp-block-param-userid": "معرف المستخدم لمنعه، لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1user</var>",
        "apihelp-block-param-reason": "السبب للمنع.",
+       "apihelp-block-param-anononly": "منع المستخدمين المجهولين فقط (أي تعطيل تعديلات المجهولين من  عنوان IP هذا).",
        "apihelp-block-param-nocreate": "امنع إنشاء الحسابات.",
+       "apihelp-block-param-autoblock": "منع آخر عنوان IP مستخدم تلقائيا، وأية عناوين IP لاحقة حاولت الدخول من خلاله.",
+       "apihelp-block-param-noemail": "منع المستخدم من إرسال البريد الإلكتروني من خلال الويكي. (يتطلب صلاحية <code>blockemail</code>).",
+       "apihelp-block-param-hidename": "إخفاء اسم المستخدم من سجل المنع. (يتطلب صلاحية <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "تسمح للمستخدم لتحرير صفحة النقاش الخاصة (يعتمد على <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-watchuser": "مشاهدة صفحة المستخدم ونقاش IP.",
+       "apihelp-block-example-ip-simple": "منع عنوان IP <kbd>192.0.2.5</kbd> لمدة ثلاثة أيام بسبب >المخالفة الأولى</kbd>.",
+       "apihelp-block-example-user-complex": "منع المستخدم <kbd>المخرب</kbd> لأجل غير مسمى بسبب <kbd>التخريب</kbd>، ومنع إنشاء حساب جديد وإرسال بريد إلكتروني.",
+       "apihelp-changeauthenticationdata-description": "تغيير بيانات المصادقة للمستخدم الحالي.",
+       "apihelp-changeauthenticationdata-example-password": "محاولة تغيير كلمة المرور للمستخدم الحالي إلى <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "تحقق من صحة رمز من <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "نوع من الرموز يجري اختبارها.",
        "apihelp-checktoken-param-token": "اختبار الرموز.",
        "apihelp-checktoken-param-maxtokenage": "أقصى عمر للرمز يسمح، في ثوان.",
+       "apihelp-checktoken-example-simple": "اختبار صلاحية رمز <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "مسح <code>hasmsg</code> العلم للمستخدم الحالي.",
+       "apihelp-clearhasmsg-example-1": "مسح <code>hasmsg</code> العلم للمستخدم الحالي.",
+       "apihelp-clientlogin-description": "تسجيل الدخول إلى ويكي باستخدام التدفق التفاعلي.",
+       "apihelp-clientlogin-example-login": "بدء عملية تسجيل الدخول إلى الويكي كمستخدم <kbd>Example</kbd> بكلمة المرور <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "واصلة تسجيل الدخول بعد استجابة <samp>UI</samp> لعاملي الصادقة، إمداد <var>OATHToken</var> ل<kbd>987654</kbd>.",
+       "apihelp-compare-description": "الحصول على الفرق بين صفحتين. يجب تمرير عنوان الصفحة أو رقم المراجعة أو معرف الصفحة لكل من \"من\" و\"إلى\".",
        "apihelp-compare-param-fromtitle": "العنوان الأول للمقارنة.",
        "apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
        "apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
        "apihelp-compare-param-totitle": "العنوان الثاني للمقارنة.",
        "apihelp-compare-param-toid": "رقم الصفحة الثاني للمقارنة.",
        "apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.",
+       "apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.",
        "apihelp-createaccount-description": "انشاء حساب مستخدم جديد",
+       "apihelp-createaccount-example-create": "بدء عملية إنشاء المستخدم <kbd>Example</kbd> بكلمة المرور <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "اسم المستخدم.",
+       "apihelp-createaccount-param-domain": "مجال للمصادقة الخارجية (اختياري).",
+       "apihelp-createaccount-param-token": "حصلت على رمز إنشاء حساب في الطلب الأول.",
        "apihelp-createaccount-param-email": "عنوان البريد الإلكتروني للمستخدم (اختياري).",
        "apihelp-createaccount-param-realname": "الاسم الحقيقي للمستخدم (اختياري).",
        "apihelp-createaccount-param-mailpassword": "اذا تم تعيين اي قيمة, سيتم ارسال كلمة سر عشوائية للمستخدم عن طريق الاميل.",
+       "apihelp-createaccount-param-reason": "السبب اختياري لإنشاء الحساب لوضعه في السجلات.",
+       "apihelp-createaccount-param-language": "رمز اللغة لتعيينه كافتراضي للمستخدم (اختياري، لغة المحتوى الافتراضية).",
+       "apihelp-createaccount-example-pass": "إنشاء المستخدم <kbd>testuser</kbd> بكلمة المرور <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "إنشاء مستخدم <kbd>testmailuser</kbd> وأرسل كلمة المرور بالبريد الإلكتروني بشكل عشوائي.",
+       "apihelp-cspreport-description": "مستخدمة من قبل المتصفحات للإبلاغ عن انتهاكات سياسة أمن المحتوى. لا ينبغي أبدا أن تستخدم هذه الوحدة، إلا عند استخدامها تلقائيا باستخدام متصفح ويب CSP متوافق.",
+       "apihelp-cspreport-param-reportonly": "علم على أنه تقرير عن سياسة الرصد، وليس فرض سياسة",
        "apihelp-delete-description": "حذف صفحة.",
+       "apihelp-delete-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-delete-param-pageid": "معرف الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-delete-param-reason": "سبب الحذف. إذا لم يُحدَّد، سوف تُستخدَم أحد الأسباب التي تنشأ تلقائيا.",
+       "apihelp-delete-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل الحذف.",
        "apihelp-delete-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-delete-param-unwatch": "إزالة الصفحة من قائمة المراقبة للمستخدم الحالي.",
+       "apihelp-delete-param-oldimage": "اسم الصورة القديمة لحذفها كما هو منصوص عليه [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "حذف <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "حذف <kbd>Main Page</kbd> بسبب <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "هذا الاصدار تم تعطيله.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-edit-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-edit-param-pageid": "معرف الصفحة لتحريرها. لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1pageid</var",
+       "apihelp-edit-param-section": "رقم القسم. <kbd>0</kbd> للقسم العلوي، <kbd>new</kbd> لقسم جديد.",
        "apihelp-edit-param-sectiontitle": "عنوان لقسم جديد.",
        "apihelp-edit-param-text": "محتوى الصفحة",
+       "apihelp-edit-param-summary": "ملخص التعديل. أيضا عنوان القسم عند عدم تعيين $1section=new and $1sectiontitle.",
+       "apihelp-edit-param-tags": "عدل الوسوم لتطبيق المراجعة.",
+       "apihelp-edit-param-minor": "تعديل طفيف",
        "apihelp-edit-param-notminor": "تعديل غير طفيف.",
-       "apihelp-edit-param-bot": "علم على هذا التعديل كبوت.",
+       "apihelp-edit-param-bot": "علم على هذا التعديل كتعديل بوت.",
+       "apihelp-edit-param-basetimestamp": "الطابع الزمني للمراجعة الأساسية، ويُستخدَم للكشف عن الحروب التحريرية، ويمكن الحصول عليها من خلال [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "الطابع الزمني عند بدء عملية التحرير، ويُستخدَم للكشف عن الحروب التحريرية، ويمكن الحصول عليها من خلال <var>[[Special:ApiHelp/main|curtimestamp]]</var> when beginning the edit process (e.g. when loading the page content to edit).",
+       "apihelp-edit-param-recreate": "تجاوز أية أخطاء حول الصفحة التي تم حذفها في هذه الأثناء.",
        "apihelp-edit-param-createonly": "لا تحرر الصفحة إذا كان موجودا بالفعل.",
+       "apihelp-edit-param-nocreate": "يحدث خطأ إذا كانت الصفحة غير موجودة.",
        "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
        "apihelp-edit-param-unwatch": "إزالة الصفحة من قائمة المراقبة للمستخدم الحالي.",
+       "apihelp-edit-param-prependtext": "إضافة هذا النص إلى بداية الصفحة. تجاوز $1text.",
+       "apihelp-edit-param-appendtext": "إضافة هذا النص إلى بداية الصفحة. تجاوز $1text.\n\nاستخدم $1section=جديد لحاق القسم الجديد، بدلا من هذا الوسيط.",
+       "apihelp-edit-param-undo": "التراجع عن هذه المراجعة. تجاوز $1text, $1prependtext و$1appendtext.",
+       "apihelp-edit-param-undoafter": "التراجع عن جميع المراجعات من $1undo لهذه. إذا لم يتم التغيير، تراجع عن تعديل واحد فقط.",
+       "apihelp-edit-param-redirect": "حل التحويلات تلقائيا.",
+       "apihelp-edit-param-contentmodel": "نموذج المحتوى للمحتوى الجديد.",
+       "apihelp-edit-param-token": "ينبغي دائما أن يُرسَل الرمز كوسيط أخير، أو على الأقل بعد الوسيط $1text.",
        "apihelp-edit-example-edit": "عدل صفحة.",
+       "apihelp-edit-example-prepend": "إضافة البادئة <kbd>_&#95;NOTOC_&#95;</kbd> إلى الصفحة.",
+       "apihelp-edit-example-undo": "التراجع عن التعديلات 13579 خلال 13585 بملخص تلقائي.",
        "apihelp-emailuser-description": "مراسلة المستخدم",
+       "apihelp-emailuser-param-target": "مستخدم لإرسال بريد إلكتروني له.",
+       "apihelp-emailuser-param-subject": "رأس الموضوع",
+       "apihelp-emailuser-param-text": "جسم البريد الإلكتروني",
+       "apihelp-emailuser-param-ccme": "إرسال نسخة من هذه الرسالة لي.",
+       "apihelp-emailuser-example-email": "أرسل بريدا إلكترونيا للمستخدم <kbd>WikiSysop</kbd> بالنص  <kbd>Content</kbd>.",
+       "apihelp-expandtemplates-description": "يوسع كافة القوالب ضمن نصوص الويكي.",
        "apihelp-expandtemplates-param-title": "عنوان الصفحة.",
+       "apihelp-expandtemplates-param-text": "نص ويكي للتحويل.",
+       "apihelp-expandtemplates-param-revid": "معرف المراجعة، ل<nowiki>{{REVISIONID}}</nowiki> والمتغيرات مماثلة.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "نص الويكي الموسع",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "خصائص الصفحة التي تحددها الكلمات السحرية الموسعة في نص الويكي.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "إذا كان الإخراج سريع التأثر، ينبغي عدم استخدامه في أي مكان آخر داخل الصفحة.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "شجرة تحليل XML للمدخلات.",
+       "apihelp-expandtemplates-param-includecomments": "إدراج أو عدم إدراج تعليقات HTML في الإخراج.",
+       "apihelp-expandtemplates-param-generatexml": "ولد شجرة تحليل XML (حل محلها $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "توسيع نص الويكي <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+       "apihelp-feedcontributions-description": "إرجاع تغذية مساهمات المستخدم.",
+       "apihelp-feedcontributions-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedcontributions-param-user": "أي المستخدمين سيتم الحصول على تبرعات لهم.",
+       "apihelp-feedcontributions-param-namespace": "أي نطاق ستتم تصفية المساهمات حسبه.",
+       "apihelp-feedcontributions-param-year": "من سنة (وأقدم).",
+       "apihelp-feedcontributions-param-month": "من شهر (وأقدم).",
+       "apihelp-feedcontributions-param-tagfilter": "تصفية المساهمات التي بها هذه الوسوم.",
+       "apihelp-feedcontributions-param-deletedonly": "اعرض المساهمات المحذوفة فقط.",
+       "apihelp-feedcontributions-param-toponly": "تظهر فقط التعديلات التي هي أحدث المراجعات.",
+       "apihelp-feedcontributions-param-newonly": "أظهر إنشاء الصفحات فقط",
+       "apihelp-feedcontributions-param-hideminor": "إخفاء التعديلات الطفيفة.",
+       "apihelp-feedcontributions-param-showsizediff": "عرض حجم الفرق بين النسخ.",
+       "apihelp-feedrecentchanges-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedrecentchanges-param-namespace": "نطاق لتقييد النتائج.",
+       "apihelp-feedrecentchanges-param-invert": "جميع النطاقات عدا المختار.",
+       "apihelp-feedrecentchanges-param-associated": "تشمل النطاق المرتبط (نقاش أو الرئيسي).",
+       "apihelp-feedrecentchanges-param-days": "أيام لتقييد النتائج.",
+       "apihelp-feedrecentchanges-param-limit": "الحد الأقصى للنتائج المُرجعة",
+       "apihelp-feedrecentchanges-param-from": "أظهر التغييرات منذ",
+       "apihelp-feedrecentchanges-param-hideminor": "إخفاء التعديلات الطفيفة.",
+       "apihelp-feedrecentchanges-param-hidebots": "إخفاء التغييرات التي أجرتها بوتات.",
+       "apihelp-feedrecentchanges-param-hideanons": "إخفاء التغييرات التي أجراها مستخدمون مجهولون.",
+       "apihelp-feedrecentchanges-param-hideliu": "إخفاء التغييرات التي أجراها مستخدمون مسجلون.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "إخفاء التغييرات المراجعة.",
+       "apihelp-feedrecentchanges-param-hidemyself": "إخفاء التغييرات التي قام بها المستخدم الحالي.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "إخفاء تغيير عضوية التصنيف.",
        "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
+       "apihelp-feedrecentchanges-param-target": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة فقط",
+       "apihelp-feedrecentchanges-param-showlinkedto": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "apihelp-feedrecentchanges-param-categories": "أظهر التغييرات في الصفحات في كل تصنيف من هذه التصنيفات فقط.",
+       "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.",
        "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة",
        "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.",
+       "apihelp-feedwatchlist-description": "إرجاع تغذية قائمة المراقبة.",
+       "apihelp-feedwatchlist-param-feedformat": "هيئة التلقيم.",
+       "apihelp-feedwatchlist-param-hours": "صفحات قائمة معدلة ضمن عدة ساعات من الآن.",
+       "apihelp-feedwatchlist-example-default": "عرض تغذية قائمة المراقبة.",
        "apihelp-feedwatchlist-example-all6hrs": "اظهر كل التغييرات في اخر 6 ساعات",
+       "apihelp-filerevert-description": "استرجع الملف لنسخة قديمة.",
+       "apihelp-filerevert-param-filename": "اسم الملف المستهدف، دون البادئة ملف:.",
        "apihelp-filerevert-param-comment": "تعليق الرفع.",
+       "apihelp-filerevert-example-revert": "استرجاع <kbd>Wiki.png</kbd> لنسحة <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "عرض مساعدة لوحدات محددة.",
+       "apihelp-help-param-modules": "وحدات لعرض مساعدة لها (قيم وسائط <var>action</var> و<var>format</var> أو<kbd>main</kbd>). يمكن تحديد الوحدات الفرعية ب <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "تشمل المساعدة للوحدات الفرعية من الوحدة المسماة.",
+       "apihelp-help-param-recursivesubmodules": "تشمل المساعدة للوحدات الفرعية بشكل متكرر.",
+       "apihelp-help-param-helpformat": "شكل مخرجات المساعدة.",
+       "apihelp-help-param-wrap": "التفاف المخرجات في بنية استجابة API القياسية.",
+       "apihelp-help-param-toc": "يتضمن جدول المحتويات في مخرجات HTML.",
+       "apihelp-help-example-main": "مساعدة للوحدة الرئيسية.",
+       "apihelp-help-example-submodules": "مساعدة ل<kbd>action=query</kbd> وجميع الوحدات الفرعية لها.",
        "apihelp-help-example-recursive": "كل المساعدة في صفحة واحدة.",
-       "apihelp-import-param-summary": "تعليق الاستيراد.",
+       "apihelp-help-example-help": "مساعدة لوحدة المساعدة نفسها.",
+       "apihelp-help-example-query": "مساعدة لوحدتي استعلام فرعيتين.",
+       "apihelp-imagerotate-description": "تدوير صورة واحدة أو أكثر.",
+       "apihelp-imagerotate-param-rotation": "درجة تدوير الصورة في اتجاه عقارب الساعة.",
+       "apihelp-imagerotate-example-simple": "تدوير <kbd>File:Example.png</kbd> بمقدار <kbd>90</kbd> درجة.",
+       "apihelp-imagerotate-example-generator": "تدوير جميع الصور في <kbd>Category:Flip</kbd> بمقدار <kbd>180</kbd> درجة.",
+       "apihelp-import-param-summary": "ملخص إدخال سجل الاستيراد.",
+       "apihelp-import-param-xml": "ملف XML مرفوع.",
+       "apihelp-import-param-interwikisource": "بالنسبة لواردات الإنترويكي: ويكي للاستيراد منه.",
+       "apihelp-import-param-interwikipage": "بالنسبة لواردات الإنترويكي: صفحة لاستيرادها.",
+       "apihelp-import-param-fullhistory": "بالنسبة لواردات الإنترويكي: استيراد التاريخ كاملا، وليست النسخة الحالية فقط.",
+       "apihelp-import-param-templates": "بالنسبة لواردات الإنترويكي: الإستيراد شمل كافة القوالب كذلك.",
+       "apihelp-import-param-namespace": "استيراد إلى هذا النطاق. لا يمكن أن يُستخدَم إلى جانب <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "استيراد كصفحة فرعية لهذه الصفحة. لا يمكن أن يُستخدَم إلى جانب <var>$1rootpage</var>.",
+       "apihelp-import-example-import": "استيراد [[meta:Help:ParserFunctions]] للنطاق 100 بالتاريخ الكامل.",
+       "apihelp-linkaccount-description": "ربط حساب من موفر طرف ثالث للمستخدم الحالي.",
+       "apihelp-linkaccount-example-link": "بدء عملية ربط حساب من <kbd>Example</kbd>.",
+       "apihelp-login-description": "سجل دخولك الآن واحصل على مصادقة الكوكيز، وينبغي استخدام هذا الإجراء فقط في تركيبة مع [[Special:BotPasswords|خاص:كلمات مرور البوت]]. تم إهمال استخدام لتسجيل الدخول للحساب الرئيسي وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "سجل دخولك الآن واحصل على مصادقة الكوكيز. هذا العمل مستنكر وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "اسم المستخدم.",
        "apihelp-login-param-password": "كلمة السر",
        "apihelp-login-param-domain": "النطاق (اختياري).",
+       "apihelp-login-param-token": "تم الحصول على رمز الدخول في الطلب الأول.",
+       "apihelp-login-example-gettoken": "استرداد رمز تسجيل الدخول.",
        "apihelp-login-example-login": "تسجيل الدخول",
+       "apihelp-logout-description": "تسجيل الخروج ومسح بيانات الجلسة.",
+       "apihelp-logout-example-logout": "تسجيل خروج المستخدم الحالي.",
+       "apihelp-managetags-description": "أداء المهام الإدارية المتعلقة بتغيير الوسوم.",
+       "apihelp-managetags-param-operation": "أي الإجراءات ستنفذ:\n؛ إنشاء: إنشاء وسم التغيير جديدة للاستخدام اليدوي.\n؛ حذف: إزالة وسم التغيير من قاعدة البيانات، بما في ذلك إزالة الوسم من كافة المراجعات، وإدخالات التغيير الأخيرة، وإدخالات السجل المستخدم.\n؛ تنشيط: تنشيط وسم التغيير، مما يسمح للمستخدمين بتطبيقه يدويا.\n; إلغاء: إلغاء تنشيط وسم التغيير، ومنع المستخدمين من تطبيقه يدويا.",
+       "apihelp-managetags-param-reason": "سبب اختياري لإنشاء، وحذف، وتفعيل أو تعطيل الوسم.",
+       "apihelp-managetags-param-ignorewarnings": "إذا كان سيتم تجاهل أي تحذيرات تصدر خلال العملية.",
+       "apihelp-managetags-example-create": "إنشاء وسم مسمى <kbd>spam</kbd> بسبب <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "حذف <kbd>vandlaism</kbd> وسم بسبب <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "تنشيط الوسم المسمى <kbd>spam</kbd> بسبب <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "تعطيل الوسم المسمى <kbd>spam</kbd> بسبب <kbd>No longer required</kbd>",
        "apihelp-mergehistory-description": "ادمج تاريخ الصفحة.",
+       "apihelp-mergehistory-param-from": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "معرف الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "معرف الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "الطابع الزمني للمراجعات التي سيتم نقلها من تاريخ صفحة المصدر إلى تاريخ صفحة الوجهة. إذا تم حذفها، سيتم دمج تاريخ الصفحة كاملا من صفحة المصدر إلى صفحة الوجهة.",
+       "apihelp-mergehistory-param-reason": "سبب دمج التاريخ.",
+       "apihelp-mergehistory-example-merge": "دمج تاريخ <kbd>Oldpage</kbd> كاملا إلى <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "دمج مراجعات الصفحة <kbd>Oldpage</kbd> dating up to <kbd>2015-12-31T04:37:41Z</kbd> إلى <kbd>Newpage</kbd>.",
        "apihelp-move-description": "نقل صفحة.",
+       "apihelp-move-param-from": "عنوان الصفحة للنقل. لا يمكن أن تُستخدَم بجانب <var>$1pageid</var",
+       "apihelp-move-param-fromid": "معرف الصفحة للنقل. لا يمكن أن تُستخدَم بجانب <var>$1pageid</var",
+       "apihelp-move-param-to": "عنوان لإعادة تسمية الصفحة له.",
        "apihelp-move-param-reason": "السبب لإعادة التسمية.",
+       "apihelp-move-param-movetalk": "إعادة تسمية صفحة النقاش، إن وُجِدت.",
+       "apihelp-move-param-movesubpages": "إعادة تسمية الصفحات الفرعية، إن وُجِدت.",
+       "apihelp-move-param-noredirect": "لا تنشئ تحويلة.",
+       "apihelp-move-param-watch": "إضافة الصفحة والتحويلة إلى قائمة مراقبة المستخدم الحالي.",
+       "apihelp-move-param-unwatch": "إزالة الصفحة والتحويلة إلى قائمة مراقبة المستخدم الحالي.",
        "apihelp-move-param-ignorewarnings": "تجاهل أي تحذيرات.",
+       "apihelp-move-example-move": "انقل <kbd>Badtitle</kbd> إلى <kbd>Goodtitle</kbd> دون ترك تحويلة.",
+       "apihelp-opensearch-description": "بحث الويكي باستخدام بروتوكول أوبن سيرش OpenSearch.",
        "apihelp-opensearch-param-search": "سطر البحث",
        "apihelp-opensearch-param-limit": "الحد الأقصى للنتائج المُرجعة",
        "apihelp-opensearch-param-namespace": "النطاقات للبحث.",
+       "apihelp-opensearch-param-suggest": "لا تفعل شيئا إذا كان <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> خاطئا.",
+       "apihelp-opensearch-param-format": "شكل الإخراج.",
+       "apihelp-opensearch-param-warningsaserror": "إذا تم رفع التحذيرات ب<kbd>format=json</kbd>, أعد أخطاء API بدلا من تجاهلها.",
+       "apihelp-opensearch-example-te": "العثور على صفحات تبدأ ب<kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "إعادة تعيين التفضيلات إلى إعدادات الموقع الإفتراضية.",
+       "apihelp-options-param-resetkinds": "قائمة أنواع الخيارات لإعادة ضبطها عندما يتم تعيين خيار <var>$1reset</var>.",
+       "apihelp-options-param-optionname": "اسم الخيار الذي ينبغي ضبطه إلى القيمة التي قدمها <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "قيمة للخيار المحدد من قبل <var>$1optionname</var>.",
+       "apihelp-options-example-reset": "إعادة تعيين كل التفضيلات.",
+       "apihelp-options-example-change": "غير تفضيلات <kbd>skin</kbd> و<kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "إعادة تعيين جميع تفضيلات، ثم تعيين <kbd>skin</kbd> و<kbd>nickname</kbd>.",
+       "apihelp-paraminfo-description": "الحصول على معلومات حول وحدات API.",
+       "apihelp-paraminfo-param-helpformat": "شكل سلاسل المساعدة.",
+       "apihelp-paraminfo-param-mainmodule": "الحصول على معلومات عن وحدة (المستوى الأعلى) الرئيسية أيضا. استخدم <kbd>$1modules=main</kbd> بدلا من ذلك.",
+       "apihelp-paraminfo-param-formatmodules": "قائمة بأسماء أشكال الوحدات (قيم الوسيط <var>format</var>). استخدم <var>$1modules</var> بدلا من ذلك.",
+       "apihelp-paraminfo-example-1": "عرض معلومات عن <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> و<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd> و<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> و<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-paraminfo-example-2": "أظهر المعلومات لجميع الوحدات الفرعية ل<kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
+       "apihelp-parse-param-title": "عنوان الصفحة التي ينتمي النص إليها.إذا تم حذفها، <var>$1contentmodel</var> يجب أن تكون محددة، و[[API]] سيتم استخدامه كعنوان.",
+       "apihelp-parse-param-text": "نص للتحليل. استخدم <var>$1title</var> أو <var>$1contentmodel</var> للتحكم في نموذج المحتوى.",
+       "apihelp-parse-param-summary": "ملخص للتحليل.",
+       "apihelp-parse-param-page": "تحليل محتوى هذه الصفحة. لا يمكن أن تُستخدَم بجانب <var>$1text</var> and <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "حلل محتوى هذه الصفحة. تجاوز <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "لو <var>$1page</var> أو <var>$1pageid</var> is تم تعيينها للتحويل، حلها.",
+       "apihelp-parse-param-oldid": "تحليل مضمون هذا التعديل. تجاوز <var>$1page</var> و<var>$1pageid</var>.",
+       "apihelp-parse-param-prop": "أي قطعة من المعلومات تريد الحصول عليها:",
+       "apihelp-parse-paramvalue-prop-langlinks": "يعطي وصلات اللغات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-categories": "يعطي التصنيفات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "يعطي إصدار HTML للتصنيفات.",
+       "apihelp-parse-paramvalue-prop-links": "يعطي الوصلات الداخلية في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-templates": "يعطي القوالب في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-images": "يعطي الصور في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-externallinks": "يعطي الوصلات الخارجية في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-sections": "يعطي الأقسام في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "يضيف العنوان في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Deprecated.</span> يعطي عناصر لوضعها في <code>&lt;head&gt;</code> الصفحة.",
+       "apihelp-parse-paramvalue-prop-headhtml": "يعطي تحليل <code>&lt;head&gt;</code> الصفحة.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة. للتطبيق; استخدم <code>mw.config.set()</code>.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.",
+       "apihelp-parse-paramvalue-prop-indicators": "يعطي HTML مؤشرات حالة الصفحة المستخدمة في الصفحة.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "يعطي وصلات اللغات في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-wikitext": "يعطي نصوص الويكي الأصلية التي تم تحليلها.",
+       "apihelp-parse-paramvalue-prop-properties": "يعطي الخصائص المختلفة المحددة في تحليل نصوص الويكي.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "يعطي تقرير الحد بطريقة منظمة. لا يعطي أية بيانات، عندما يتم تعيين <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "يعطي إصدار HTML لتقرير الحد. لا يعطي أية بيانات، عندما يتم تعيين<var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-parsetree": "شجرة تحليل XML لمحتويات المراجعة (يتطلب نموذج محتوى <code>$1</code>)",
+       "apihelp-parse-param-pst": "قم بتحويل قبل الحفظ على المدخلات قبل تحليل ذلك. صالح فقط عند استخدامه مع النص.",
+       "apihelp-parse-param-effectivelanglinks": "يشمل وصلات لغة المقدمة بواسطة ملحقات (للاستخدام مع <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-disablelimitreport": "تجاهل تقرير الحد (\"NewPP limit report\") من مخرجات المحلل.",
+       "apihelp-parse-param-disablepp": "استخدم <var>$1disablelimitreport</var> بدلا من ذلك.",
+       "apihelp-parse-param-disableeditsection": "تجاهل روابط تحرير الأقسام من مخرجات المحلل.",
+       "apihelp-parse-param-disabletidy": "لا تشغل تنظيف HTML (على سبيل المثال مرتبة) على مخرجات المحلل.",
+       "apihelp-parse-param-generatexml": "توليد شجرة تحليل XML (يتطلب نموذج المحتوى <code>$1</code>; حل محلها <kbd>$2prop=parsetree</kbd>).",
+       "apihelp-parse-param-preview": "تحليل في وضع المعاينة.",
+       "apihelp-parse-param-sectionpreview": "تحليل في وضع معاينة القسم (يمكن وضع المعاينة أيضا).",
+       "apihelp-parse-param-disabletoc": "تجاهل جدول المحتويات في المخرجات.",
+       "apihelp-parse-param-contentformat": "نموذج المحتوى المسلسل يُستخدَم للنص المدخل. صالح فقط عند استخدامه مع $1text.",
        "apihelp-parse-example-page": "تحليل صفحة.",
+       "apihelp-parse-example-text": "تحليل نصوص ويكي",
+       "apihelp-parse-example-texttitle": "تحليل نصوص ويكي، تحديد عنوان الصفحة.",
+       "apihelp-parse-example-summary": "تحليل الملخص.",
+       "apihelp-patrol-description": "مراجعة صفحة أو مراجعة.",
+       "apihelp-patrol-param-rcid": "معرف أحدث التغييرات للمراجعة",
+       "apihelp-patrol-param-revid": "معرف مراجعة للمراجعة",
+       "apihelp-patrol-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل المراجعة.",
        "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
        "apihelp-patrol-example-revid": "راجع مراجعة.",
        "apihelp-protect-description": "غير مستوى الحماية لصفحة.",
+       "apihelp-protect-param-title": "عنوان الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.",
+       "apihelp-protect-param-pageid": "معرف الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.",
+       "apihelp-protect-param-reason": "سبب (إزالة) الحماية.",
+       "apihelp-protect-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل الحماية.",
+       "apihelp-protect-param-watch": "إذا تم الضبط، أضف الصفحة (غير) المحمية لقائمة مراقبة المستخدم الحالي.",
        "apihelp-protect-example-protect": "حماية صفحة.",
+       "apihelp-protect-example-unprotect": "إلغاء حماية الصفحة من خلال وضع قيود ل<kbd>all</kbd> (أي يُسمَح أي شخص باتخاذ الإجراءات).",
+       "apihelp-protect-example-unprotect2": "إلغاء حماية الصفحة عن طريق عدم وضع أية قيود.",
+       "apihelp-purge-param-forcelinkupdate": "تحديث جداول الروابط.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "تحديث جدول الروابط، وتحديث جداول الروابط لأية صفحة تستخدم هذه الصفحة كقالب.",
+       "apihelp-purge-example-simple": "إفراغ كاش <kbd>Main Page</kbd> وصفحة <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "إفراغ كاش أول 10 صفحات في النطاق الرئيسي.",
+       "apihelp-query-description": "جلب البيانات من وعن ميدياويكي. يجب على جميع تعديلات البيانات أولا استخدام استعلام للحصول على رمز لمنع الاعتداء من المواقع الخبيثة.",
+       "apihelp-query-param-prop": "أي الخصائص تريد الحصول على صفحات استعلام عنها.",
+       "apihelp-query-param-list": "أي القوائم تريد الحصول عليها.",
+       "apihelp-query-param-meta": "أي البيانات الوصفية تريد الحصول عليها.",
+       "apihelp-query-param-export": "تصدير المراجعات الحالية لجميع الصفحات المعينة أو المولدة.",
+       "apihelp-query-param-exportnowrap": "إعادة تصدير XML دون التفاف عليه في نتيجة XML (نفس شكل [[Special:Export|خاص:تصدير]]). يمكن استخدامها فقط مع $1export.",
+       "apihelp-query-param-rawcontinue": "إرجاع <samp>query-continue</samp> بيانات خام للاستمرار.",
+       "apihelp-query-example-revisions": "جلب [[Special:ApiHelp/query+siteinfo|معلومات الموقع]] و[[Special:ApiHelp/query+revisions|مراجعات]] <kbd>Main Page</kbd>.",
+       "apihelp-query-example-allpages": "جلب مراجعات الصفحات التي تبدأ ب<kbd>API/</kbd>.",
+       "apihelp-query+allcategories-description": "تعداد جميع التصنيفات.",
+       "apihelp-query+allcategories-param-from": "التصنيف الذي يبدأ التعداد منه.",
+       "apihelp-query+allcategories-param-to": "التصنيف الذي يقف التعداد عنده.",
+       "apihelp-query+allcategories-param-prefix": "ابحث عن جميع التصنيفات التي تبدأ أسماؤها بهذه القيمة.",
+       "apihelp-query+allcategories-param-dir": "اتجاه الفرز.",
+       "apihelp-query+allcategories-param-limit": "كم عدد الفئات في الإرجاع.",
+       "apihelp-query+allcategories-param-prop": "أي الخصائص تريد الحصول عليها:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "أضف عدد الصفحات في هذا التصنيف.",
+       "apihelp-query+allcategories-example-generator": "استرداد المعلومات حول صفحة التصنيف نفسها للتصنيفات التي تبدأ ب<kbd>List</kbd>.",
+       "apihelp-query+alldeletedrevisions-description": "قائمة جميع المراجعات المحذوفة بواسطة المستخدم أو في نطاق.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "يمكن أن تُستخدَم فقط مع <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "لا يمكن أن تُستخدَم مع <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.",
+       "apihelp-query+alldeletedrevisions-param-from": "بدء الإدراج في القائمة من هذا العنوان.",
+       "apihelp-query+alldeletedrevisions-param-to": "وقف الإدراج في القائمة من هذا العنوان.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "ابحث عن جميع عناوين الصفحات التي تبدأ أسماؤها بهذه القيمة.",
+       "apihelp-query+alldeletedrevisions-param-tag": "مراجعات القائمة فقط تم وسمها بهذ الوسم.",
+       "apihelp-query+alldeletedrevisions-param-user": "أدرج المراجعات التي كتبها هذا المستخدم فقط.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "لا تدرج المراجعات التي كتبها هذا المستخدم.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "أدرج الصفحات  في هذا النطاق فقط.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.",
+       "apihelp-query+allfileusages-description": "قائمة جميع استخدامات الملفات، بما في ذلك غير الموجودة.",
+       "apihelp-query+allfileusages-param-from": "عنوان الملف لبدء التعداد منه.",
+       "apihelp-query+allfileusages-param-to": "عنوان الملف لوقف التعداد منه.",
+       "apihelp-query+allfileusages-param-prefix": "البحث عن كل عناوين الملفات التي تبدأ بهذه القيمة.",
+       "apihelp-query+allfileusages-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "تضيف معرفات استخدام الصفحات (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "تضيف عنوان الملف.",
+       "apihelp-query+allfileusages-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+allimages-description": "تعداد كافة الصور بشكل متتالي.",
+       "apihelp-query+allimages-param-sort": "خاصية للفرز وفقًا لها.",
+       "apihelp-query+allimages-param-from": "عنوان الصورة لبدء التعداد منه. يمكن استخدامها مع $1sort=name فقط.",
+       "apihelp-query+allimages-param-to": "عنوان الصورة لوقف التعداد منه. يمكن استخدامها مع $1sort=name فقط.",
+       "apihelp-query+allimages-param-start": "طابع زمني لبدء التعداد منه. يمكن استخدامه مع $1sort فقط.",
+       "apihelp-query+allimages-param-end": "طابع زمني لإنهاء التعداد منه. يمكن استخدامه مع $1sort فقط.",
+       "apihelp-query+allimages-param-prefix": "البحث عن كل عناوين الصور التي تبدأ بهذه القيمة. يمكن استخدامها مع $1sort فقط.",
+       "apihelp-query+allimages-param-sha1": "SHA1 تجزئة الصورة. تجاوز $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "SHA1 تجزئة الصورة في قاعدة 36 (تُستخدَم في ميدياويكي).",
+       "apihelp-query+allimages-param-filterbots": "كيفية تصفية الملفات التي تم تحميلها بواسطة بوتات. يمكن استخدامها مع $1sort=timestamp فقط. لا يمكن أن تُستخدَم بجانب $1user.",
+       "apihelp-query+allimages-param-mime": "عن أي أنواع MIME تبحث، على سبيل المثال <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-example-B": "أظهر قائمة الملفات التي تبدأ ب<kbd>B</kbd>.",
+       "apihelp-query+allimages-example-recent": "أظهر قائمة الملفات التي تم تحميلها مؤخرا، على غرار [[Special:NewFiles|خاص:ملفات جديدة]].",
+       "apihelp-query+allimages-example-mimetypes": "أظهر قائمة الملفات من نوع MIME <kbd>image/png</kbd> أو <kbd>image/gif</kbd>",
+       "apihelp-query+allimages-example-generator": "عرض معلومات حول 4 ملفات تبدأ بالحرف <kbd>T</kbd>.",
+       "apihelp-query+alllinks-description": "تعداد كافة الروابط التي تشير إلى نطاق معين.",
+       "apihelp-query+alllinks-param-from": "عنوان الرابط لبدء التعداد منه.",
+       "apihelp-query+alllinks-param-to": "عنوان الرابط لوقف التعداد منه.",
+       "apihelp-query+alllinks-param-prefix": "البحث عن كل العناوين المرتبطة التي تبدأ بهذه القيمة.",
+       "apihelp-query+alllinks-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "تضيف معرف الصفحة للصفحة المرتبطة (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "تضيف عنوان الرابط.",
+       "apihelp-query+alllinks-param-namespace": "نطاق للتعداد.",
+       "apihelp-query+alllinks-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+alllinks-example-generator": "يحصل على الصفحات التي تحتوي على وصلات.",
+       "apihelp-query+allmessages-param-prop": "أي الخصائص تريد الحصول عليها:",
+       "apihelp-query+allmessages-param-filter": "إرجاع الرسائل بالأسماء التي تحتوي على هذه السلسلة فقط.",
+       "apihelp-query+allmessages-param-lang": "إرجاع الرسائل بهذه اللغة.",
+       "apihelp-query+allmessages-param-from": "إرجاع الرسائل ابتداء من هذه الرسالة.",
+       "apihelp-query+allmessages-param-to": "إرجاع الرسائل التي تنتهي بهذه الرسالة.",
+       "apihelp-query+allmessages-param-prefix": "إرجاء الرسائل بهذه البادئة.",
+       "apihelp-query+allmessages-example-ipb": "عرض رسائل تبدأ ب<kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "عرض رسائل <kbd>august</kbd> and <kbd>mainpage</kbd> باللغة الألمانية.",
+       "apihelp-query+allpages-description": "تعداد كافة الصفحات بشكل متتالي في نطاق معين.",
+       "apihelp-query+allpages-param-to": "عنوان الصفحة لإيقاف التعداد منه.",
+       "apihelp-query+allpages-param-prefix": "البحث عن كل عناوين الصفحات التي تبدأ بهذه القيمة.",
+       "apihelp-query+allpages-param-namespace": "نطاق للتعداد.",
        "apihelp-query+allpages-param-filterredir": "أي الصفحات للعرض.",
+       "apihelp-query+allpages-param-limit": "كم عدد مجموع الصفحات للعودة.",
+       "apihelp-query+allpages-example-B": "عرض  قائمة من الصفحات التي تبدأ بالحرف <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "عرض معلومات حول 4 صفحات تبدأ بالحرف <kbd>T</kbd>.",
+       "apihelp-query+allredirects-param-from": "عنوان التحويلة لبدء التعداد منه.",
+       "apihelp-query+allredirects-param-to": "عنوان التحويلة لإيقاف التعداد منه.",
+       "apihelp-query+allredirects-param-prefix": "ابحث عن جميع عناوين الصفحات المستهدفة التي تبدأ بهذه القيمة.",
+       "apihelp-query+allredirects-param-prop": "أي قطعة من المعلومات تريد تضمينها:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "تضيف معرف الصفحة لصفحة التحويل (لا يمكن استخدامها مع $1unique).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "تضيف عنوان التحويلة.",
+       "apihelp-query+allredirects-param-namespace": "نطاق للتعداد.",
+       "apihelp-query+allredirects-param-limit": "كم عدد مجموع البنود للعودة.",
+       "apihelp-query+allredirects-example-generator": "يحصل على الصفحات التي تحتوي على تحويلات.",
        "apihelp-query+allrevisions-description": "اعرض كل المراجعات.",
+       "apihelp-query+allrevisions-param-start": "التصنيف الذي يبدأ التعداد منه.",
+       "apihelp-query+allrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.",
+       "apihelp-query+allrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.",
+       "apihelp-query+mystashedfiles-param-prop": "أي الخصائص تريد لجلب للملفات.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "جلب حجم الملف وأبعاد الصورة.",
        "apihelp-query+blocks-example-simple": "قائمة المنع.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
-       "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
+       "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها.",
+       "api-feed-error-title": "خطأ ($1)"
 }
index fccdc0f..89f9e39 100644 (file)
@@ -16,7 +16,7 @@
        "apihelp-main-param-servedby": "Incluyir el nome del host que sirvió la solicitú nes resultancies.",
        "apihelp-main-param-curtimestamp": "Incluyir la marca de tiempu actual na resultancia.",
        "apihelp-block-description": "Bloquiar a un usuariu.",
-       "apihelp-block-param-user": "El nome d'usuariu, dirección IP o intervalu d'IP que quies bloquiar.",
+       "apihelp-block-param-user": "Nome d'usuariu, dirección #IP o intervalu d'IP que quies bloquiar. Nun puede utilizase con <var>$1userid</var>",
        "apihelp-block-param-expiry": "Fecha de caducidá. Puede ser relativa (por casu, <kbd>5 meses</kbd> o <kbd>2 selmanes</kbd>) o absoluta (por casu, 2016-01-16T12:34:56Z). Si s'establez a <kbd>infinitu</kbd>, <kbd>indefiníu</kbd>, o <kbd>nunca</kbd>, el bloquéu nun caducará nunca.",
        "apihelp-block-param-reason": "Motivu del bloquéu.",
        "apihelp-block-param-anononly": "Bloquiar solo los usuarios anónimos (esto ye, desactivar ediciones anónimes dende esta dirección IP).",
index 3818ce9..6634645 100644 (file)
@@ -18,7 +18,7 @@
        "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будуць выстаўленыя загалоўкі <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне <kbd>*</kbd>. Гэта прывядзе да выстаўленьня загалоўку <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> будзе мець значэньне <code>false</code> і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.",
        "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў мовы, або трэба вызначыць <kbd>user</kbd>, каб ужываць налады мовы цяперашняга карыстальніка, або вызначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
        "apihelp-block-description": "Блякаваньне ўдзельніка.",
-       "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць.",
+       "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць. Ня можа быць ужыты разам з <var>$1userid</var>",
        "apihelp-block-param-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, <kbd>5 months</kbd> або <kbd>2 weeks</kbd>) ці абсалютным (напрыклад, <kbd>2014-09-18T12:34:56Z</kbd>). Калі выстаўлены на <kbd>infinite</kbd>, <kbd>indefinite</kbd> ці <kbd>never</kbd>, блякаваньне будзе бестэрміновым.",
        "apihelp-block-param-reason": "Прычына блякаваньня.",
        "apihelp-block-param-anononly": "Заблякаваць толькі ананімных удзельнікаў (напрыклад, забараніць ананімныя праўкі з гэтага IP-адрасу).",
index fde631c..fe93ebe 100644 (file)
@@ -21,5 +21,8 @@
        "apihelp-edit-param-contentmodel": "নতুন বিষয়বস্তুর, বিষয়বস্তু-মডেল।",
        "apihelp-edit-example-edit": "একটি পাতা সম্পাদনা করুন",
        "apihelp-edit-example-prepend": "একটি পৃষ্ঠার পূর্বে <kbd>_&#95;NOTOC_&#95;</kbd> লিখুন।",
-       "apihelp-login-example-login": "প্রবেশ"
+       "apihelp-login-example-login": "প্রবেশ",
+       "apihelp-setpagelanguage-param-reason": "পরিবর্তনের কারণ।",
+       "apierror-invaliduserid": "ব্যবহারকারী আইডি <var>$1</var> বৈধ নয়।",
+       "apierror-nosuchuserid": "$1 আইডি যুক্ত কোন ব্যবহারকারী নেই।"
 }
index 9ed9dcb..a8f4dd8 100644 (file)
@@ -1,19 +1,35 @@
 {
        "@metadata": {
                "authors": [
-                       "Y-M D"
+                       "Y-M D",
+                       "Fulup"
                ]
        },
        "apihelp-block-description": "Stankañ un implijer",
        "apihelp-block-param-reason": "Abeg evit stankañ.",
+       "apihelp-createaccount-description": "Krouiñ ur gont implijer nevez.",
        "apihelp-createaccount-param-name": "Anv implijer.",
        "apihelp-delete-description": "Diverkañ ur bajenn.",
+       "apihelp-edit-description": "Krouiñ pajennoù ha kemmañ anezho.",
+       "apihelp-edit-param-sectiontitle": "Titl ur rannbennad nevez.",
        "apihelp-edit-param-text": "Danvez ar bajenn.",
        "apihelp-edit-param-minor": "Kemmig dister.",
        "apihelp-edit-example-edit": "Kemmañ ur bajenn.",
+       "apihelp-emailuser-description": "Kas ur postel d'un implijer.",
+       "apihelp-emailuser-param-text": "Korf ar postel.",
        "apihelp-expandtemplates-param-title": "Titl ar bajenn.",
+       "apihelp-feedcontributions-param-year": "Adalek ar bloaz (ha koshoc'h)",
+       "apihelp-feedcontributions-param-month": "Adalek ar miz (ha koshoc'h).",
+       "apihelp-feedcontributions-param-hideminor": "Kuzhat ar c'hemmoù dister.",
+       "apihelp-feedrecentchanges-param-hideminor": "Kuzhat ar c'hemmoù dister.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Silañ dre dikedennoù.",
+       "apihelp-feedrecentchanges-example-simple": "Diskouez ar c'hemmoù diwezhañ.",
        "apihelp-login-param-name": "Anv implijer.",
        "apihelp-login-param-password": "Ger-tremen.",
+       "apihelp-login-param-domain": "Domani (diret).",
        "apihelp-login-example-login": "Kevreañ.",
-       "apihelp-protect-example-protect": "Gwareziñ ur bajenn."
+       "apihelp-move-description": "Dilec'hiañ ur bajenn.",
+       "apihelp-move-param-noredirect": "Chom hep krouiñ un adkas.",
+       "apihelp-protect-example-protect": "Gwareziñ ur bajenn.",
+       "apihelp-rollback-param-tags": "Tikedennoù da lakaat e talvoud war an distroioù."
 }
index 2396f69..ca1e85a 100644 (file)
@@ -26,7 +26,7 @@
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu).\n\nU autentizovaných požadavků hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, budou nastaveny hlavičky <code>Access-Control-Allow-Origin</code> a <code>Access-Control-Allow-Credentials</code>.\n\nU neautentizovaných požadavků uveďte hodnotu <kbd>*</kbd>. To způsobí nastavení hlavičky <code>Access-Control-Allow-Origin</code>, ale hlavička <code>Access-Control-Allow-Credentials</code> bude <code>false</code> a budou omezena všechna data specifická pro uživatele.",
        "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
        "apihelp-block-description": "Zablokovat uživatele.",
-       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
+       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat. Nelze použít dohromady s <var>$1userid</var>.",
        "apihelp-block-param-reason": "Důvod bloku.",
        "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.",
        "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.",
        "apihelp-stashedit-param-summary": "Změnit shrnutí.",
-       "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
+       "apihelp-unblock-param-user": "Uživatel, IP adresa nebo rozsah IP adres k odblokování. Nelze použít dohromady s <var>$1id</var> nebo <var>$1userid</var>.",
        "apihelp-watch-example-watch": "Sledovat stránku <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
        "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.",
        "api-help-permissions-granted-to": "Uděleno {{PLURAL:$1|skupině|skupinám}}: $2",
        "api-help-right-apihighlimits": "Používání vyšších limitů v API dotazech (pomalé dotazy: $1, rychlé dotazy: $2). Limity pro pomalé dotazy se vztahují i na vícehodnotové parametry.",
        "api-help-open-in-apisandbox": "<small>[otevřít v pískovišti]</small>",
+       "apierror-nosuchsection-what": "$2 neobsahuje sekci $1.",
+       "apierror-sectionsnotsupported-what": "$1 nepodporuje sekce.",
        "api-credits-header": "Zásluhy",
        "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://phabricator.wikimedia.org/."
 }
index f1ce435..596c35e 100644 (file)
        "apihelp-main-param-smaxage": "Den <code>s-maxage</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gepuffert.",
        "apihelp-main-param-maxage": "Den <code>max-age</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
        "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf <kbd>user</kbd> gesetzt, oder Bot ist, wenn auf <kbd>bot</kbd> gesetzt.",
+       "apihelp-main-param-assertuser": "Überprüft, ob der aktuelle Benutzer der benannte Benutzer ist.",
        "apihelp-main-param-requestid": "Der angegebene Wert wird mit in die Antwort aufgenommen und kann zur Unterscheidung von Anfragen verwendet werden.",
        "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
        "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
+       "apihelp-main-param-responselanginfo": "Bezieht die für <var>uselang</var> und <var>errorlang</var> verwendeten Sprachen im Ergebnis mit ein.",
        "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) muss dies als entstehende Domäne festgelegt werden. Dies muss in jeder Vorfluganfrage mit eingeschlossen werden und deshalb ein Teil der Anfragen-URI sein (nicht des POST-Körpers).\n\nFür authentifizierte Anfragen muss dies exakt einem der Ursprünge im Header <code>Origin</code> entsprechen, so dass es auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> festgelegt werden muss. Falls dieser Parameter nicht mit dem Header <code>Origin</code> übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter mit dem Header <code>Origin</code> übereinstimmt und der Ursprung weißgelistet ist, werden die Header <code>Access-Control-Allow-Origin</code> und <code>Access-Control-Allow-Credentials</code> festgelegt.\n\nGib für nicht authentifizierte Anfragen den Wert <kbd>*</kbd> an. Dies verursacht, dass der Header <code>Access-Control-Allow-Origin</code> festgelegt wird, aber <code>Access-Control-Allow-Credentials</code> wird <code>false</code> sein und alle benutzerspezifischen Daten werden beschränkt.",
        "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> gibt eine Liste der Sprachcodes zurück. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
+       "apihelp-main-param-errorsuselocal": "Falls angegeben, verwenden Fehlertexte lokalisierte Nachrichten aus dem {{ns:MediaWiki}}-Namensraum.",
        "apihelp-block-description": "Einen Benutzer sperren.",
-       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
+       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der gesperrt werden soll. Kann nicht zusammen mit <var>$1userid</var> verwendet werden.",
        "apihelp-block-param-expiry": "Sperrdauer. Kann relativ (z.&nbsp;B. <kbd>5 months</kbd> oder <kbd>2 weeks</kbd>) oder absolut (z.&nbsp;B. <kbd>2014-09-18T12:34:56Z</kbd>) sein. Wenn auf <kbd>infinite</kbd>, <kbd>indefinite</kbd> oder <kbd>never</kbd> gesetzt, ist die Sperre unbegrenzt.",
        "apihelp-block-param-reason": "Sperrbegründung.",
        "apihelp-block-param-anononly": "Nur anonyme Benutzer sperren (z.&nbsp;B. anonyme Bearbeitungen für diese IP deaktivieren).",
@@ -43,6 +46,7 @@
        "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
        "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
+       "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd> für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
        "apihelp-block-example-user-complex": "Benutzer <kbd>Vandal</kbd> unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
        "apihelp-checktoken-description": "Überprüft die Gültigkeit eines über <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> erhaltenen Tokens.",
        "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule",
        "apihelp-imagerotate-description": "Ein oder mehrere Bilder drehen.",
        "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
+       "apihelp-imagerotate-param-tags": "Auf den Eintrag im Datei-Logbuch anzuwendende Markierungen",
        "apihelp-imagerotate-example-simple": "<kbd>Datei:Beispiel.png</kbd> um <kbd>90</kbd> Grad drehen.",
        "apihelp-imagerotate-example-generator": "Alle Bilder in der <kbd>Kategorie:Flip</kbd> um <kbd>180</kbd> Grad drehen.",
        "apihelp-import-description": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
        "apihelp-import-param-templates": "Für Interwiki-Importe: importiere auch alle eingebundenen Vorlagen.",
        "apihelp-import-param-namespace": "In diesen Namensraum importieren. Kann nicht zusammen mit <var>$1rootpage</var> verwendet werden.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit <var>$1namespace</var> verwendet werden.",
+       "apihelp-import-param-tags": "Auf den Eintrag im Import-Logbuch und die Nullversion bei den importierten Seiten anzuwendende Änderungsmarkierungen.",
        "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
        "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-managetags-param-tag": "Schlagwort zum Erstellen, Löschen, Aktivieren oder Deaktivieren. Zum Erstellen darf das Schlagwort noch nicht vorhanden sein. Zur Löschung muss das Schlagwort vorhanden sein. Zur Aktivierung muss das Schlagwort vorhanden sein, darf aber nicht von einer Erweiterung in Gebrauch sein. Zur Deaktivierung muss das Schlagwort gegenwärtig aktiv und manuell definiert sein.",
        "apihelp-managetags-param-reason": "optionale Begründung für das Erstellen, Löschen, Aktivieren oder Deaktivieren der Markierung.",
        "apihelp-managetags-param-ignorewarnings": "Warnungen während des Vorgangs ignorieren.",
+       "apihelp-managetags-param-tags": "Auf den Eintrag im Markierungs-Verwaltungs-Logbuch anzuwendende Änderungsmarkierungen.",
        "apihelp-managetags-example-create": "Erstellt eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-managetags-example-delete": "Löscht die <kbd>vandlaism</kbd>-Markierung mit der Begründung <kbd>Misspelt</kbd>.",
        "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-move-param-unwatch": "Die Seite und die entstandene Weiterleitung von der Beobachtungsliste entfernen.",
        "apihelp-move-param-watchlist": "Die Seite in jedem Fall zur Beobachtungsliste hinzufügen oder davon entfernen, die Voreinstellungen dafür nutzen oder den Beobachtungsstatus nicht ändern.",
        "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.",
+       "apihelp-move-param-tags": "Auf den Eintrag im Verschiebungs-Logbuch und die Nullversion der Zielseite anzuwendende Änderungsmarkierungen.",
        "apihelp-move-example-move": "<kbd>Badtitle</kbd> nach <kbd>Goodtitle</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
        "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-query+allmessages-param-prop": "Zurückzugebende Eigenschaften.",
        "apihelp-query+allmessages-param-enableparser": "Setzen, um den Parser zu aktivieren. Dies wird den Wikitext der Nachricht vorverarbeiten (magische Worte ersetzen, Vorlagen berücksichtigen, usw.).",
        "apihelp-query+allmessages-param-nocontent": "Wenn gesetzt, füge nicht den Inhalt der Nachricht der Ausgabe hinzu.",
-       "apihelp-query+allmessages-param-includelocal": "Schließt auch lokale Nachrichten ein. Zum Beispiel Nachrichten die es nicht in der Software gibt, die es aber als MediaWiki: - Seite gibt. Dies listet alle MediaWiki: - Seiten auf. Daher werden auch diejenigen aufgelistet, die eigentlich keine Nachrichten sind, wie [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Schließt auch lokale Nachrichten ein, zum Beispiel Nachrichten, die nicht in der Software vorhanden sind, aber dafür im {{ns:MediaWiki}}-Namensraum.\nDies listet alle Seiten im {{ns:MediaWiki}}-Namensraum auf, auch solche, die nicht wirklich Nachrichten sind, wie [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Argumente die in der Nachricht ersetzt werden sollen.",
        "apihelp-query+allmessages-param-filter": "Gebe nur Nachrichten mit Namen, die diese Zeichenfolge enthalten, zurück.",
        "apihelp-query+allmessages-param-customised": "Gebe nur Nachrichten in diesem Anpassungszustand zurück.",
        "apihelp-query+allrevisions-param-generatetitles": "Wenn als Generator verwendet, werden eher Titel als Bearbeitungs-IDs erzeugt.",
        "apihelp-query+allrevisions-example-user": "Liste die letzten 50 Beiträge, sortiert nach Benutzer <kbd>Beispiel</kbd> auf.",
        "apihelp-query+allrevisions-example-ns-main": "Liste die ersten 50 Bearbeitungen im Hauptnamensraum auf.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "Ruft die Dateigröße und Bildabmessungen ab.",
        "apihelp-query+mystashedfiles-param-limit": "Wie viele Dateien zurückgegeben werden sollen.",
        "apihelp-query+alltransclusions-description": "Liste alle Transklusionen auf (eingebettete Seiten die &#123;&#123;x&#125;&#125; benutzen), einschließlich nicht vorhandener.",
        "apihelp-query+alltransclusions-param-from": "Der Titel der Transklusion bei dem die Auflistung beginnen soll.",
        "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Listet formatierte Metadaten kombiniert aus mehreren Quellen auf. Die Ergebnisse sind im HTML-Format.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Fügt den Dateinamen der Archivversion für die nicht-letzten Versionen hinzu.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Fügt die Bittiefe der Version hinzu.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ergänzt, ob die Datei auf der [[MediaWiki:Bad image list]] ist.",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Falls <kbd>$2prop=badfile</kbd> festgelegt ist, ist dies der verwendete Seitentitel beim Auswerten der [[MediaWiki:Bad image list]].",
        "apihelp-query+imageinfo-param-localonly": "Suche nur nach Dateien im lokalen Repositorium.",
        "apihelp-query+imageinfo-example-simple": "Rufe Informationen über die aktuelle Version von [[:File:Albert Einstein Head.jpg]] ab.",
        "apihelp-query+imageinfo-example-dated": "Rufe Informationen über Versionen von [[:File:Test.jpg]] von 2008 und später ab.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Gibt die Art und Weise an, in der der Seitentitel tatsächlich angezeigt wird.",
        "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
+       "apihelp-query+iwbacklinks-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+iwbacklinks-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ergänzt das Präfix des Interwikis.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+iwbacklinks-example-simple": "Ruft Seiten ab, die auf [[wikibooks:Test]] verlinken.",
        "apihelp-query+iwlinks-param-prop": "Zusätzlich zurückzugebende Eigenschaften jedes Interlanguage-Links:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+iwlinks-param-limit": "Wie viele Interwiki-Links zurückgegeben werden sollen.",
        "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.",
        "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.",
        "apihelp-query+usercontribs-param-end": "Der zurückzugebende End-Zeitstempel.",
-       "apihelp-query+usercontribs-param-user": "Die Benutzer, für die Beiträge abgerufen werden sollen.",
+       "apihelp-query+usercontribs-param-user": "Die Benutzer, für die Beiträge abgerufen werden sollen. Kann nicht zusammen mit <var>$1userids</var> oder <var>$1userprefix</var> verwendet werden.",
+       "apihelp-query+usercontribs-param-userprefix": "Ruft Beiträge für alle Benutzer ab, deren Namen mit diesem Wert beginnt. Kann nicht zusammen mit <var>$1user</var> oder <var>$1userids</var> verwendet werden.",
+       "apihelp-query+usercontribs-param-userids": "Die Benutzerkennungen, für die die Beiträge abgerufen werden sollen. Kann nicht zusammen mit <var>$1user</var> oder <var>$1userprefix</var> verwendet werden.",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Fügt die Seiten- und Versionskennung hinzu.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Fügt den Kommentar der Bearbeitung hinzu.",
        "apihelp-query+users-paramvalue-prop-rights": "Listet alle Rechte auf, die jeder Benutzer hat.",
        "apihelp-query+users-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des Benutzers.",
        "apihelp-query+users-param-users": "Eine Liste der Benutzer, für die Informationen abgerufen werden sollen.",
+       "apihelp-query+users-param-userids": "Eine Liste der Benutzerkennungen, für die die Informationen abgerufen werden sollen.",
        "apihelp-query+users-example-simple": "Gibt Informationen für den Benutzer <kbd>Example</kbd> zurück.",
        "apihelp-query+watchlist-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
        "apihelp-query+watchlist-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-revisiondelete-description": "Löscht und stellt Versionen wieder her.",
        "apihelp-revisiondelete-param-hide": "Was für jede Version versteckt werden soll.",
        "apihelp-revisiondelete-param-show": "Was für jede Version wieder eingeblendet werden soll.",
+       "apihelp-revisiondelete-param-tags": "Auf den Eintrag im Lösch-Logbuch anzuwendende Markierungen.",
        "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
        "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
+       "apihelp-setpagelanguage-description": "Ändert die Sprache einer Seite.",
+       "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, um diese Aktion zu verwenden.",
+       "apihelp-setpagelanguage-param-title": "Titel der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
+       "apihelp-setpagelanguage-param-pageid": "Kennung der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1title</var> verwendet werden.",
+       "apihelp-setpagelanguage-param-lang": "Code der Sprache, auf den die Seite geändert werden soll. Verwende <kbd>default</kbd>, um die Seite auf die Standardinhaltssprache des Wikis zurückzusetzen.",
+       "apihelp-setpagelanguage-param-reason": "Grund für die Änderung.",
+       "apihelp-setpagelanguage-param-tags": "Auf den Logbucheintrag anzuwendende Änderungsmarkierungen, die sich aus dieser Aktion ergeben.",
+       "apihelp-setpagelanguage-example-language": "Ändert die Sprache von <kbd>Hauptseite</kbd> auf Baskisch.",
+       "apihelp-setpagelanguage-example-default": "Ändert die Sprache der Seite mit der Kennung 123 auf die Standardinhaltssprache des Wikis.",
        "apihelp-stashedit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.",
        "apihelp-stashedit-param-text": "Seiteninhalt.",
        "apihelp-stashedit-param-stashedtexthash": "Stattdessen zu verwendende Prüfsumme des Seiteninhalts von einem vorherigen Speicher.",
        "apihelp-stashedit-param-contentmodel": "Inhaltsmodell des neuen Inhalts.",
        "apihelp-stashedit-param-summary": "Änderungszusammenfassung.",
        "apihelp-tag-param-reason": "Grund für die Änderung.",
+       "apihelp-tag-param-tags": "Auf den Logbucheintrag anzuwendende Markierungen, die als Ergebnis dieser Aktion erstellt wurden.",
        "apihelp-tokens-param-type": "Abzufragende Tokentypen.",
        "apihelp-tokens-example-edit": "Ruft einen Bearbeitungstoken ab (Standard).",
        "apihelp-tokens-example-emailmove": "Ruft einen E-Mail- und Verschiebungstoken ab.",
        "apihelp-unblock-description": "Einen Benutzer freigeben.",
-       "apihelp-unblock-param-id": "ID der Sperre zum Entsperren (über <kbd>list=blocks</kbd> erhalten). Darf nicht zusammen mit <var>$1user</var> verwendet werden.",
-       "apihelp-unblock-param-user": "Freizugebender Benutzername, IP-Adressbereich oder freizugebende IP-Adresse. Kann nicht zusammen mit <var>$1id</var> verwendet werden.",
+       "apihelp-unblock-param-id": "Kennung der Sperre zur Freigabe (abgerufen durch <kbd>list=blocks</kbd>). Kann nicht zusammen mit <var>$1user</var> oder <var>$1userid</var> verwendet werden.",
+       "apihelp-unblock-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der freigegeben werden soll. Kann nicht zusammen mit <var>$1id</var> oder <var>$1userid</var> verwendet werden.",
        "apihelp-unblock-param-reason": "Grund für die Freigabe.",
        "apihelp-unblock-param-tags": "Auf den Benutzersperr-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.",
        "apihelp-unblock-example-id": "Sperrkennung #<kbd>105</kbd> freigeben.",
        "apihelp-userrights-param-add": "Fügt den Benutzer zu diesen Gruppen hinzu.",
        "apihelp-userrights-param-remove": "Entfernt den Benutzer von diesen Gruppen.",
        "apihelp-userrights-param-reason": "Grund für die Änderung.",
+       "apihelp-userrights-param-tags": "Auf den Eintrag im Benutzerrechte-Logbuch anzuwendende Änderungsmarkierungen.",
+       "apihelp-validatepassword-description": "Validiert ein Passwort gegen die Passwortrichtlinien des Wikis.\n\nDie Validität wird als <samp>Good</samp> gemeldet, falls das Passwort akzeptabel ist, <samp>Change</samp>, falls das Passwort zur Anmeldung verwendet werden kann, jedoch geändert werden muss oder <samp>Invalid</samp>, falls das Passwort nicht verwendbar ist.",
+       "apihelp-validatepassword-param-password": "Zu validierendes Passwort.",
+       "apihelp-validatepassword-param-user": "Der beim Austesten der Benutzerkontenerstellung verwendete Benutzername. Der angegebene Benutzer darf nicht vorhanden sein.",
+       "apihelp-validatepassword-param-email": "Die beim Austesten der Benutzerkontenerstellung verwendete E-Mail-Adresse.",
+       "apihelp-validatepassword-param-realname": "Der beim Austesten der Benutzerkontenerstellung verwendete bürgerliche Name.",
+       "apihelp-validatepassword-example-1": "Validiert das Passwort <kbd>foobar</kbd> für den aktuellen Benutzer.",
+       "apihelp-validatepassword-example-2": "Validiert das Passwort <kbd>qwerty</kbd> zum Erstellen des Benutzers <kbd>Beispiel</kbd>.",
        "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> beobachten.",
        "apihelp-watch-example-unwatch": "Die Seite <kbd>Main Page</kbd> nicht beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
-       "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:mediawiki}}“ sein und mit <code>.xsl</code> enden.",
+       "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:MediaWiki}}“ sein und mit <code>.xsl</code> enden.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
        "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
        "api-help-open-in-apisandbox": "<small>[in Spielwiese öffnen]</small>",
        "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.",
+       "apierror-invaliduserid": "Die Benutzerkennung <var>$1</var> ist nicht gültig.",
+       "apierror-nosuchuserid": "Es gibt keinen Benutzer mit der Kennung $1.",
+       "apierror-pagelang-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.",
+       "apierror-stashinvalidfile": "Ungültige gespeicherte Datei.",
+       "apierror-stashnosuchfilekey": "Kein derartiger Dateischlüssel: $1.",
+       "apierror-stashwrongowner": "Falscher Besitzer: $1",
+       "apierror-systemblocked": "Du wurdest von MediaWiki automatisch gesperrt.",
+       "apierror-unknownerror-nocode": "Unbekannter Fehler.",
+       "apierror-unknownerror": "Unbekannter Fehler: „$1“.",
+       "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
+       "apiwarn-invalidtitle": "„$1“ ist kein gültiger Titel.",
+       "apiwarn-notfile": "„$1“ ist keine Datei.",
+       "api-feed-error-title": "Fehler ($1)",
+       "api-usage-docref": "Siehe $1 zur Verwendung der API.",
        "api-credits-header": "Danksagungen",
        "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://phabricator.wikimedia.org/ ein."
 }
index b5179bb..0c43bd7 100644 (file)
@@ -4,7 +4,9 @@
                        "Gorizon",
                        "Mirzali",
                        "Kumkumuk",
-                       "Asmen"
+                       "Asmen",
+                       "1917 Ekim Devrimi",
+                       "Gambollar"
                ]
        },
        "apihelp-main-param-action": "Performansa kamci aksiyon",
        "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Herabıyaye wikimetin",
        "apihelp-feedcontributions-param-feedformat": "Formata warikerdışi",
+       "apihelp-feedcontributions-param-year": "Ser ra (u rewên)",
+       "apihelp-feedcontributions-param-month": "Meng ra (u rewên)",
        "apihelp-feedcontributions-param-hideminor": "Vuryayışanê werdiyan bınımne",
-       "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bıasne.",
+       "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bımotné.",
        "apihelp-feedrecentchanges-param-hideminor": "Vurriyayışanê werdiyan bınımne.",
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
        "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
@@ -57,5 +61,6 @@
        "apihelp-parse-example-text": "Wikimetini analiz ke",
        "apihelp-parse-example-summary": "Xulasay analiz ke",
        "apihelp-query+alllinks-paramvalue-prop-title": "Sernamey rê link dek",
+       "apihelp-query+allmessages-param-lang": "Mesaja açarn ena zıwan.",
        "apihelp-query+blocks-example-simple": "Listey bloqeyan"
 }
index 28cd746..c1fefd6 100644 (file)
        "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
+       "apihelp-main-param-responselanginfo": "Include the languages used for <var>uselang</var> and <var>errorlang</var> in the result.",
        "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).\n\nFor authenticated requests, this must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, the <code>Access-Control-Allow-Origin</code> and <code>Access-Control-Allow-Credentials</code> headers will be set.\n\nFor non-authenticated requests, specify the value <kbd>*</kbd>. This will cause the <code>Access-Control-Allow-Origin</code> header to be set, but <code>Access-Control-Allow-Credentials</code> will be <code>false</code> and all user-specific data will be restricted.",
        "apihelp-main-param-uselang": "Language to use for message translations. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
+       "apihelp-main-param-errorformat": "Format to use for warning and error text output.\n; plaintext: Wikitext with HTML tags removed and entities replaced.\n; wikitext: Unparsed wikitext.\n; html: HTML.\n; raw: Message key and parameters.\n; none: No text output, only the error codes.\n; bc: Format used prior to MediaWiki 1.29. <var>errorlang</var> and <var>errorsuselocal</var> are ignored.",
+       "apihelp-main-param-errorlang": "Language to use for warnings and errors. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>content</kbd> to use this wiki's content language, or specify <kbd>uselang</kbd> to use the same value as the <var>uselang</var> parameter.",
+       "apihelp-main-param-errorsuselocal": "If given, error texts will use locally-customized messages from the {{ns:MediaWiki}} namespace.",
 
        "apihelp-block-description": "Block a user.",
-       "apihelp-block-param-user": "Username, IP address, or IP address range to block.",
+       "apihelp-block-param-user": "Username, IP address, or IP address range to block. Cannot be used together with <var>$1userid</var>",
+       "apihelp-block-param-userid": "User ID to block. Cannot be used together with <var>$1user</var>.",
        "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) or absolute (e.g. <kbd>2014-09-18T12:34:56Z</kbd>). If set to <kbd>infinite</kbd>, <kbd>indefinite</kbd>, or <kbd>never</kbd>, the block will never expire.",
        "apihelp-block-param-reason": "Reason for block.",
        "apihelp-block-param-anononly": "Block anonymous users only (i.e. disable anonymous edits for this IP address).",
@@ -32,6 +37,7 @@
        "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.",
        "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.",
+       "apihelp-block-param-tags": "Change tags to apply to the entry in the block log.",
        "apihelp-block-example-ip-simple": "Block IP address <kbd>192.0.2.5</kbd> for three days with reason <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Block user <kbd>Vandal</kbd> indefinitely with reason <kbd>Vandalism</kbd>, and prevent new account creation and email sending.",
 
 
        "apihelp-imagerotate-description": "Rotate one or more images.",
        "apihelp-imagerotate-param-rotation": "Degrees to rotate image clockwise.",
+       "apihelp-imagerotate-param-tags": "Tags to apply to the entry in the upload log.",
        "apihelp-imagerotate-example-simple": "Rotate <kbd>File:Example.png</kbd> by <kbd>90</kbd> degrees.",
        "apihelp-imagerotate-example-generator": "Rotate all images in <kbd>Category:Flip</kbd> by <kbd>180</kbd> degrees.",
 
        "apihelp-import-param-templates": "For interwiki imports: import all included templates as well.",
        "apihelp-import-param-namespace": "Import to this namespace. Cannot be used together with <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Import as subpage of this page. Cannot be used together with <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Change tags to apply to the entry in the import log and to the null revision on the imported pages.",
        "apihelp-import-example-import": "Import [[meta:Help:ParserFunctions]] to namespace 100 with full history.",
 
        "apihelp-linkaccount-description": "Link an account from a third-party provider to the current user.",
        "apihelp-managetags-param-tag": "Tag to create, delete, activate or deactivate. For tag creation, the tag must not exist. For tag deletion, the tag must exist. For tag activation, the tag must exist and not be in use by an extension. For tag deactivation, the tag must be currently active and manually defined.",
        "apihelp-managetags-param-reason": "An optional reason for creating, deleting, activating or deactivating the tag.",
        "apihelp-managetags-param-ignorewarnings": "Whether to ignore any warnings that are issued during the operation.",
+       "apihelp-managetags-param-tags": "Change tags to apply to the entry in the tag management log.",
        "apihelp-managetags-example-create": "Create a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Delete the <kbd>vandlaism</kbd> tag with the reason <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activate a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Remove the page and the redirect from the current user's watchlist.",
        "apihelp-move-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-move-param-ignorewarnings": "Ignore any warnings.",
+       "apihelp-move-param-tags": "Change tags to apply to the entry in the move log and to the null revision on the destination page.",
        "apihelp-move-example-move": "Move <kbd>Badtitle</kbd> to <kbd>Goodtitle</kbd> without leaving a redirect.",
 
        "apihelp-opensearch-description": "Search the wiki using the OpenSearch protocol.",
        "apihelp-query+allmessages-param-prop": "Which properties to get.",
        "apihelp-query+allmessages-param-enableparser": "Set to enable parser, will preprocess the wikitext of message (substitute magic words, handle templates, etc.).",
        "apihelp-query+allmessages-param-nocontent": "If set, do not include the content of the messages in the output.",
-       "apihelp-query+allmessages-param-includelocal": "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.\nThis lists all MediaWiki: pages, so it will also list those that aren't really messages such as [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Also include local messages, i.e. messages that don't exist in the software but do exist as in the {{ns:MediaWiki}} namespace.\nThis lists all {{ns:MediaWiki}}-namespace pages, so it will also list those that aren't really messages such as [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Arguments to be substituted into message.",
        "apihelp-query+allmessages-param-filter": "Return only messages with names that contain this string.",
        "apihelp-query+allmessages-param-customised": "Return only messages in this customisation state.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adds the filename of the archive version for non-latest versions.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adds the bit depth of the version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Adds whether the file is on the [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "How many file revisions to return per file.",
        "apihelp-query+imageinfo-param-start": "Timestamp to start listing from.",
        "apihelp-query+imageinfo-param-end": "Timestamp to stop listing at.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "If translations for extmetadata property are available, fetch all of them.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "If specified and non-empty, only these keys will be returned for $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "A handler specific parameter string. For example, PDFs might use <kbd>page15-100px</kbd>. <var>$1urlwidth</var> must be used and be consistent with <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "If <kbd>$2prop=badfile</kbd> is set, this is the page title used when evaluating the [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Look only for files in the local repository.",
        "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later.",
        "apihelp-query+usercontribs-param-limit": "The maximum number of contributions to return.",
        "apihelp-query+usercontribs-param-start": "The start timestamp to return from.",
        "apihelp-query+usercontribs-param-end": "The end timestamp to return to.",
-       "apihelp-query+usercontribs-param-user": "The users to retrieve contributions for.",
-       "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Overrides $1user.",
+       "apihelp-query+usercontribs-param-user": "The users to retrieve contributions for. Cannot be used with <var>$1userids</var> or <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Cannot be used with <var>$1user</var> or <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "The user IDs to retrieve contributions for. Cannot be used with <var>$1user</var> or <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Only list contributions in these namespaces.",
        "apihelp-query+usercontribs-param-prop": "Include additional pieces of information:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adds the page ID and revision ID.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indicates whether an account for valid but unregistered usernames can be created.",
        "apihelp-query+users-param-attachedwiki": "With <kbd>$1prop=centralids</kbd>, indicate whether the user is attached with the wiki identified by this ID.",
        "apihelp-query+users-param-users": "A list of users to obtain information for.",
+       "apihelp-query+users-param-userids": "A list of user IDs to obtain information for.",
        "apihelp-query+users-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+users-example-simple": "Return information for user <kbd>Example</kbd>.",
 
        "apihelp-revisiondelete-param-show": "What to unhide for each revision.",
        "apihelp-revisiondelete-param-suppress": "Whether to suppress data from administrators as well as others.",
        "apihelp-revisiondelete-param-reason": "Reason for the deletion or undeletion.",
+       "apihelp-revisiondelete-param-tags": "Tags to apply to the entry in the deletion log.",
        "apihelp-revisiondelete-example-revision": "Hide content for revision <kbd>12345</kbd> on the page <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Hide all data on log entry <kbd>67890</kbd> with the reason <kbd>BLP violation</kbd>.",
 
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for <kbd>Main page</kbd> so all edits since 1 January 2012 are unviewed.",
        "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
 
+       "apihelp-setpagelanguage-description": "Change the language of a page.",
+       "apihelp-setpagelanguage-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> to use this action.",
+       "apihelp-setpagelanguage-param-title": "Title of the page whose language you wish to change. Cannot be used together with <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Page ID of the page whose language you wish to change. Cannot be used together with <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Language code of the language to change the page to. Use <kbd>default</kbd> to reset the page to the wiki's default content language.",
+       "apihelp-setpagelanguage-param-reason": "Reason for the change.",
+       "apihelp-setpagelanguage-param-tags": "Change tags to apply to the log entry resulting from this action.",
+       "apihelp-setpagelanguage-example-language": "Change the language of <kbd>Main Page</kbd> to Basque.",
+       "apihelp-setpagelanguage-example-default": "Change the language of the page with ID 123 to the wiki's default content language.",
+
        "apihelp-stashedit-description": "Prepare an edit in shared cache.\n\nThis is intended to be used via AJAX from the edit form to improve the performance of the page save.",
        "apihelp-stashedit-param-title": "Title of the page being edited.",
        "apihelp-stashedit-param-section": "Section number. <kbd>0</kbd> for the top section, <kbd>new</kbd> for a new section.",
        "apihelp-tag-param-add": "Tags to add. Only manually defined tags can be added.",
        "apihelp-tag-param-remove": "Tags to remove. Only tags that are either manually defined or completely undefined can be removed.",
        "apihelp-tag-param-reason": "Reason for the change.",
+       "apihelp-tag-param-tags": "Tags to apply to the log entry that will be created as a result of this action.",
        "apihelp-tag-example-rev": "Add the <kbd>vandalism</kbd> tag to revision ID 123 without specifying a reason",
        "apihelp-tag-example-log": "Remove the <kbd>spam</kbd> tag from log entry ID 123 with the reason <kbd>Wrongly applied</kbd>",
 
        "apihelp-tokens-example-emailmove": "Retrieve an email token and a move token.",
 
        "apihelp-unblock-description": "Unblock a user.",
-       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID of the block to unblock (obtained through <kbd>list=blocks</kbd>). Cannot be used together with <var>$1user</var> or <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with <var>$1id</var> or <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "User ID to unblock. Cannot be used together with <var>$1id</var> or <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Reason for unblock.",
        "apihelp-unblock-param-tags": "Change tags to apply to the entry in the block log.",
        "apihelp-unblock-example-id": "Unblock block ID #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "Add the user to these groups.",
        "apihelp-userrights-param-remove": "Remove the user from these groups.",
        "apihelp-userrights-param-reason": "Reason for the change.",
+       "apihelp-userrights-param-tags": "Change tags to apply to the entry in the user rights log.",
        "apihelp-userrights-example-user": "Add user <kbd>FooBot</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Add the user with ID <kbd>123</kbd> to group <kbd>bot</kbd>, and remove from groups <kbd>sysop</kbd> and <kbd>bureaucrat</kbd>.",
 
+       "apihelp-validatepassword-description": "Validate a password against the wiki's password policies.\n\nValidity is reported as <samp>Good</samp> if the password is acceptable, <samp>Change</samp> if the password may be used for login but must be changed, or <samp>Invalid</samp> if the password is not usable.",
+       "apihelp-validatepassword-param-password": "Password to validate.",
+       "apihelp-validatepassword-param-user": "User name, for use when testing account creation. The named user must not exist.",
+       "apihelp-validatepassword-param-email": "Email address, for use when testing account creation.",
+       "apihelp-validatepassword-param-realname": "Real name, for use when testing account creation.",
+       "apihelp-validatepassword-example-1": "Validate the password <kbd>foobar</kbd> for the current user.",
+       "apihelp-validatepassword-example-2": "Validate the password <kbd>qwerty</kbd> for creating user <kbd>Example</kbd>.",
+
        "apihelp-watch-description": "Add or remove pages from the current user's watchlist.",
        "apihelp-watch-param-title": "The page to (un)watch. Use <var>$1titles</var> instead.",
        "apihelp-watch-param-unwatch": "If set the page will be unwatched rather than watched.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
        "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
-       "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:mediawiki}} namespace ending in <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:MediaWiki}} namespace ending in <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.",
        "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
 
        "api-help-authmanagerhelper-continue": "This request is a continuation after an earlier <samp>UI</samp> or <samp>REDIRECT</samp> response. Either this or <var>$1returnurl</var> is required.",
        "api-help-authmanagerhelper-additional-params": "This module accepts additional parameters depending on the available authentication requests. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$1</kbd> (or a previous response from this module, if applicable) to determine the requests available and the fields that they use.",
 
+       "apierror-allimages-redirect": "Use <kbd>gaifilterredir=nonredirects</kbd> instead of <var>redirects</var> when using <kbd>allimages</kbd> as a generator.",
+       "apierror-allpages-generator-redirects": "Use <kbd>gapfilterredir=nonredirects</kbd> instead of <var>redirects</var> when using <kbd>allpages</kbd> as a generator.",
+       "apierror-appendnotsupported": "Can't append to pages using content model $1.",
+       "apierror-articleexists": "The article you tried to create has been created already.",
+       "apierror-assertbotfailed": "Assertion that the user has the <code>bot</code> right failed.",
+       "apierror-assertnameduserfailed": "Assertion that the user is \"$1\" failed.",
+       "apierror-assertuserfailed": "Assertion that the user is logged in failed.",
+       "apierror-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
+       "apierror-badconfig-resulttoosmall": "The value of <code>$wgAPIMaxResultSize</code> on this wiki is too small to hold basic result information.",
+       "apierror-badcontinue": "Invalid continue param. You should pass the original value returned by the previous query.",
+       "apierror-baddiff": "The diff cannot be retrieved. One or both revisions do not exist or you do not have permission to view them.",
+       "apierror-baddiffto": "<var>$1diffto</var> must be set to a non-negative number, <kbd>prev</kbd>, <kbd>next</kbd> or <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "The requested format $1 is not supported for content model $2.",
+       "apierror-badformat": "The requested format $1 is not supported for content model $2 used by $3.",
+       "apierror-badgenerator-notgenerator": "Module <kbd>$1</kbd> cannot be used as a generator.",
+       "apierror-badgenerator-unknown": "Unknown <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP parameter is not valid.",
+       "apierror-badmd5": "The supplied MD5 hash was incorrect.",
+       "apierror-badmodule-badsubmodule": "The module <kbd>$1</kbd> does not have a submodule \"$2\".",
+       "apierror-badmodule-nosubmodules": "The module <kbd>$1</kbd> has no submodules.",
+       "apierror-badparameter": "Invalid value for parameter <var>$1</var>.",
+       "apierror-badquery": "Invalid query.",
+       "apierror-badtimestamp": "Invalid value \"$2\" for timestamp parameter <var>$1</var>.",
+       "apierror-badtoken": "Invalid CSRF token.",
+       "apierror-badupload": "File upload parameter <var>$1</var> is not a file upload; be sure to use <code>multipart/form-data</code> for your POST and include a filename in the <code>Content-Disposition</code> header.",
+       "apierror-badurl": "Invalid value \"$2\" for URL parameter <var>$1</var>.",
+       "apierror-baduser": "Invalid value \"$2\" for user parameter <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "U+001F multi-value separation may only be used for multi-valued parameters.",
+       "apierror-bad-watchlist-token": "Incorrect watchlist token provided. Please set a correct token in [[Special:Preferences]].",
+       "apierror-blockedfrommail": "You have been blocked from sending email.",
+       "apierror-blocked": "You have been blocked from editing.",
+       "apierror-botsnotsupported": "This interface is not supported for bots.",
+       "apierror-cannotreauthenticate": "This action is not available as your identity cannot be verified.",
+       "apierror-cannotviewtitle": "You are not allowed to view $1.",
+       "apierror-cantblock-email": "You don't have permission to block users from sending email through the wiki.",
+       "apierror-cantblock": "You don't have permission to block users.",
+       "apierror-cantchangecontentmodel": "You don't have permission to change the content model of a page.",
+       "apierror-canthide": "You don't have permission to hide user names from the block log.",
+       "apierror-cantimport-upload": "You don't have permission to import uploaded pages.",
+       "apierror-cantimport": "You don't have permission to import pages.",
+       "apierror-cantoverwrite-sharedfile": "The target file exists on a shared repository and you do not have permission to override it.",
+       "apierror-cantsend": "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email.",
+       "apierror-cantundelete": "Couldn't undelete: the requested revisions may not exist, or may have been undeleted already.",
+       "apierror-changeauth-norequest": "Failed to create change request.",
+       "apierror-chunk-too-small": "Minimum chunk size is $1 {{PLURAL:$1|byte|bytes}} for non-final chunks.",
+       "apierror-cidrtoobroad": "$1 CIDR ranges broader than /$2 are not accepted.",
+       "apierror-compare-inputneeded": "A title, a page ID, or a revision number is needed for both the <var>from</var> and the <var>to</var> parameters.",
+       "apierror-contentserializationexception": "Content serialization failed: $1",
+       "apierror-contenttoobig": "The content you supplied exceeds the article size limit of $1 {{PLURAL:$1|kilobyte|kilobytes}}.",
+       "apierror-copyuploadbaddomain": "Uploads by URL are not allowed from this domain.",
+       "apierror-copyuploadbadurl": "Upload not allowed from this URL.",
+       "apierror-create-titleexists": "Existing titles can't be protected with <kbd>create</kbd>.",
+       "apierror-csp-report": "Error processing CSP report: $1.",
+       "apierror-databaseerror": "[$1] Database query error.",
+       "apierror-deletedrevs-param-not-1-2": "The <var>$1</var> parameter cannot be used in modes 1 or 2.",
+       "apierror-deletedrevs-param-not-3": "The <var>$1</var> parameter cannot be used in mode 3.",
+       "apierror-emptynewsection": "Creating empty new sections is not possible.",
+       "apierror-emptypage": "Creating new, empty pages is not allowed.",
+       "apierror-exceptioncaught": "[$1] Exception caught: $2",
+       "apierror-filedoesnotexist": "File does not exist.",
+       "apierror-fileexists-sharedrepo-perm": "The target file exists on a shared repository. Use the <var>ignorewarnings</var> parameter to override it.",
+       "apierror-filenopath": "Cannot get local file path.",
+       "apierror-filetypecannotberotated": "File type cannot be rotated.",
+       "apierror-formatphp": "This response cannot be represented using <kbd>format=php</kbd>. See https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "The title for <kbd>$1</kbd> must be a file.",
+       "apierror-import-unknownerror": "Unknown error on import: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> may not be over $2 (set to $3) for bots or sysops.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> may not be over $2 (set to $3) for users.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> may not be less than $2 (set to $3).",
+       "apierror-invalidcategory": "The category name you entered is not valid.",
+       "apierror-invalid-chunk": "Offset plus current chunk is greater than claimed file size.",
+       "apierror-invalidexpiry": "Invalid expiry time \"$1\".",
+       "apierror-invalid-file-key": "Not a valid file key.",
+       "apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
+       "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+       "apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
+       "apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
+       "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
+       "apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
+       "apierror-invalidtitle": "Bad title \"$1\".",
+       "apierror-invalidurlparam": "Invalid value for <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Invalid username \"$1\".",
+       "apierror-invaliduserid": "User ID <var>$1</var> is not valid.",
+       "apierror-maxlag-generic": "Waiting for a database server: $1 {{PLURAL:$1|second|seconds}} lagged.",
+       "apierror-maxlag": "Waiting for $2: $1 {{PLURAL:$1|second|seconds}} lagged.",
+       "apierror-mimesearchdisabled": "MIME search is disabled in Miser Mode.",
+       "apierror-missingcontent-pageid": "Missing content for page ID $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|The parameter|At least one of the parameters}} $1 is required.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|The parameter|One of the parameters}} $1 is required.",
+       "apierror-missingparam": "The <var>$1</var> parameter must be set.",
+       "apierror-missingrev-pageid": "No current revision of page ID $1.",
+       "apierror-missingtitle-createonly": "Missing titles can only be protected with <kbd>create</kbd>.",
+       "apierror-missingtitle": "The page you specified doesn't exist.",
+       "apierror-missingtitle-byname": "The page $1 doesn't exist.",
+       "apierror-moduledisabled": "The <kbd>$1</kbd> module has been disabled.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Only|Only one of}} $2 is allowed for parameter <var>$1</var>.",
+       "apierror-multival-only-one": "Only one value is allowed for parameter <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> may only be used with a single page.",
+       "apierror-mustbeloggedin-changeauth": "You must be logged in to change authentication data.",
+       "apierror-mustbeloggedin-generic": "You must be logged in.",
+       "apierror-mustbeloggedin-linkaccounts": "You must be logged in to link accounts.",
+       "apierror-mustbeloggedin-removeauth": "You must be logged in to remove authentication data.",
+       "apierror-mustbeloggedin-uploadstash": "The upload stash is only available to logged-in users.",
+       "apierror-mustbeloggedin": "You must be logged in to $1.",
+       "apierror-mustbeposted": "The <kbd>$1</kbd> module requires a POST request.",
+       "apierror-mustpostparams": "The following {{PLURAL:$2|parameter was|parameters were}} found in the query string, but must be in the POST body: $1.",
+       "apierror-noapiwrite": "Editing of this wiki through the API is disabled. Make sure the <code>$wgEnableWriteAPI=true;</code> statement is included in the wiki's <code>LocalSettings.php</code> file.",
+       "apierror-nochanges": "No changes were requested.",
+       "apierror-nodeleteablefile": "No such old version of the file.",
+       "apierror-no-direct-editing": "Direct editing via API is not supported for content model $1 used by $2.",
+       "apierror-noedit-anon": "Anonymous users can't edit pages.",
+       "apierror-noedit": "You don't have permission to edit pages.",
+       "apierror-noimageredirect-anon": "Anonymous users can't create image redirects.",
+       "apierror-noimageredirect": "You don't have permission to create image redirects.",
+       "apierror-nosuchlogid": "There is no log entry with ID $1.",
+       "apierror-nosuchpageid": "There is no page with ID $1.",
+       "apierror-nosuchrcid": "There is no recent change with ID $1.",
+       "apierror-nosuchrevid": "There is no revision with ID $1.",
+       "apierror-nosuchsection": "There is no section $1.",
+       "apierror-nosuchsection-what": "There is no section $1 in $2.",
+       "apierror-nosuchuserid": "There is no user with ID $1.",
+       "apierror-notarget": "You have not specified a valid target for this action.",
+       "apierror-notpatrollable": "The revision r$1 can't be patrolled as it's too old.",
+       "apierror-nouploadmodule": "No upload module set.",
+       "apierror-opensearch-json-warnings": "Warnings cannot be represented in OpenSearch JSON format.",
+       "apierror-pagecannotexist": "Namespace doesn't allow actual pages.",
+       "apierror-pagedeleted": "The page has been deleted since you fetched its timestamp.",
+       "apierror-pagelang-disabled": "Changing the language of a page is not allowed on this wiki.",
+       "apierror-paramempty": "The parameter <var>$1</var> may not be empty.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> is only supported for wikitext content.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> is only supported for wikitext content. $1 uses content model $2.",
+       "apierror-pastexpiry": "Expiry time \"$1\" is in the past.",
+       "apierror-permissiondenied": "You don't have permission to $1.",
+       "apierror-permissiondenied-generic": "Permission denied.",
+       "apierror-permissiondenied-patrolflag": "You need the <code>patrol</code> or <code>patrolmarks</code> right to request the patrolled flag.",
+       "apierror-permissiondenied-unblock": "You don't have permission to unblock users.",
+       "apierror-prefixsearchdisabled": "Prefix search is disabled in Miser Mode.",
+       "apierror-promised-nonwrite-api": "The <code>Promise-Non-Write-API-Action</code> HTTP header cannot be sent to write-mode API modules.",
+       "apierror-protect-invalidaction": "Invalid protection type \"$1\".",
+       "apierror-protect-invalidlevel": "Invalid protection level \"$1\".",
+       "apierror-ratelimited": "You've exceeded your rate limit. Please wait some time and try again.",
+       "apierror-readapidenied": "You need read permission to use this module.",
+       "apierror-readonly": "The wiki is currently in read-only mode.",
+       "apierror-reauthenticate": "You have not authenticated recently in this session, please reauthenticate.",
+       "apierror-redirect-appendonly": "You have attempted to edit using the redirect-following mode, which must be used in conjuction with <kbd>section=new</kbd>, <var>prependtext</var>, or <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "The same field cannot be used in both <var>hide</var> and <var>show</var>.",
+       "apierror-revdel-needtarget": "A target title is required for this RevDel type.",
+       "apierror-revdel-paramneeded": "At least one value is required for <var>hide</var> and/or <var>show</var>.",
+       "apierror-revisions-norevids": "The <var>revids</var> parameter may not be used with the list options (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, and <var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>, <var>pageids</var> or a generator was used to supply multiple pages, but the <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, and <var>$1end</var> parameters may only be used on a single page.",
+       "apierror-revwrongpage": "r$1 is not a revision of $2.",
+       "apierror-searchdisabled": "<var>$1</var> search is disabled.",
+       "apierror-sectionreplacefailed": "Could not merge updated section.",
+       "apierror-sectionsnotsupported": "Sections are not supported for content model $1.",
+       "apierror-sectionsnotsupported-what": "Sections are not supported by $1.",
+       "apierror-show": "Incorrect parameter - mutually exclusive values may not be supplied.",
+       "apierror-siteinfo-includealldenied": "Cannot view all servers' info unless <var>$wgShowHostNames</var> is true.",
+       "apierror-sizediffdisabled": "Size difference is disabled in Miser Mode.",
+       "apierror-spamdetected": "Your edit was refused because it contained a spam fragment: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "You don't have permission to view the results of this special page.",
+       "apierror-stashedfilenotfound": "Could not find the file in the stash: $1.",
+       "apierror-stashedit-missingtext": "No stashed text found with the given hash.",
+       "apierror-stashexception": "$1",
+       "apierror-stashfailed-complete": "Chunked upload is already completed, check status for details.",
+       "apierror-stashfailed-nosession": "No chunked upload session with this key.",
+       "apierror-stashfilestorage": "Could not store upload in the stash: $1",
+       "apierror-stashinvalidfile": "Invalid stashed file.",
+       "apierror-stashnosuchfilekey": "No such filekey: $1.",
+       "apierror-stashpathinvalid": "File key of improper format or otherwise invalid: $1.",
+       "apierror-stashwrongowner": "Wrong owner: $1",
+       "apierror-stashzerolength": "File is of zero length, and could not be stored in the stash: $1.",
+       "apierror-systemblocked": "You have been blocked automatically by MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Template expansion is only supported for wikitext content. $1 uses content model $2.",
+       "apierror-toofewexpiries": "$1 expiry {{PLURAL:$1|timestamp was|timestamps were}} provided where $2 {{PLURAL:$2|was|were}} needed.",
+       "apierror-unknownaction": "The action specified, <kbd>$1</kbd>, is not recognized.",
+       "apierror-unknownerror-editpage": "Unknown EditPage error: $1.",
+       "apierror-unknownerror-nocode": "Unknown error.",
+       "apierror-unknownerror": "Unknown error: \"$1\".",
+       "apierror-unknownformat": "Unrecognized format \"$1\".",
+       "apierror-unrecognizedparams": "Unrecognized {{PLURAL:$2|parameter|parameters}}: $1.",
+       "apierror-unrecognizedvalue": "Unrecognized value for parameter <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Local file repository does not support querying all images.",
+       "apierror-upload-filekeyneeded": "Must supply a <var>filekey</var> when <var>offset</var> is non-zero.",
+       "apierror-upload-filekeynotallowed": "Cannot supply a <var>filekey</var> when <var>offset</var> is 0.",
+       "apierror-upload-inprogress": "Upload from stash already in progress.",
+       "apierror-upload-missingresult": "No result in status data.",
+       "apierror-urlparamnormal": "Could not normalize image parameters for $1.",
+       "apierror-writeapidenied": "You're not allowed to edit this wiki through the API.",
+
+       "apiwarn-alldeletedrevisions-performance": "For better performance when generating titles, set <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Could not parse <var>$1urlparam</var> for $2. Using only width and height.",
+       "apiwarn-badutf8": "The value passed for <var>$1</var> contains invalid or non-normalized data. Textual data should be valid, NFC-normalized Unicode without C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> has been deprecated. Please use <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> instead.",
+       "apiwarn-deprecation-expandtemplates-prop": "Because no values have been specified for the <var>prop</var> parameter, a legacy format has been used for the output. This format is deprecated, and in the future, a default value will be set for the <var>prop</var> parameter, causing the new format to always be used.",
+       "apiwarn-deprecation-httpsexpected": "HTTP used when HTTPS was expected.",
+       "apiwarn-deprecation-login-botpw": "Main-account login via <kbd>action=login</kbd> is deprecated and may stop working without warning. To continue login with <kbd>action=login</kbd>, see [[Special:BotPasswords]]. To safely continue using main-account login, see <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "Main-account login via <kbd>action=login</kbd> is deprecated and may stop working without warning. To safely log in, see <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "Fetching a token via <kbd>action=login</kbd> is deprecated. Use <kbd>action=query&meta=tokens&type=login</kbd> instead.",
+       "apiwarn-deprecation-parameter": "The parameter <var>$1</var> has been deprecated.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> is deprecated since MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> when creating new HTML documents, or <kbd>prop=modules|jsconfigvars</kbd> when updating a document client-side.",
+       "apiwarn-deprecation-purge-get": "Use of <kbd>action=purge</kbd> via GET is deprecated. Use POST instead.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> has been deprecated. Please use <kbd>$2</kbd> instead.",
+       "apiwarn-difftohidden": "Couldn't diff to r$1: content is hidden.",
+       "apiwarn-errorprinterfailed": "Error printer failed. Will retry without params.",
+       "apiwarn-errorprinterfailed-ex": "Error printer failed (will retry without params): $1",
+       "apiwarn-invalidcategory": "\"$1\" is not a category.",
+       "apiwarn-invalidtitle": "\"$1\" is not a valid title.",
+       "apiwarn-invalidxmlstylesheetext": "Stylesheet should have <code>.xsl</code> extension.",
+       "apiwarn-invalidxmlstylesheet": "Invalid or non-existent stylesheet specified.",
+       "apiwarn-invalidxmlstylesheetns": "Stylesheet should be in the {{ns:MediaWiki}} namespace.",
+       "apiwarn-moduleswithoutvars": "Property <kbd>modules</kbd> was set but not <kbd>jsconfigvars</kbd> or <kbd>encodedjsconfigvars</kbd>. Configuration variables are necessary for proper module usage.",
+       "apiwarn-notfile": "\"$1\" is not a file.",
+       "apiwarn-nothumb-noimagehandler": "Could not create thumbnail because $1 does not have an associated image handler.",
+       "apiwarn-parse-nocontentmodel": "No <var>title</var> or <var>contentmodel</var> was given, assuming $1.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> used without <var>text</var>, and parsed page properties were requested. Did you mean to use <var>page</var> instead of <var>title</var>?",
+       "apiwarn-redirectsandrevids": "Redirect resolution cannot be used together with the <var>revids</var> parameter. Any redirects the <var>revids</var> point to have not been resolved.",
+       "apiwarn-tokennotallowed": "Action \"$1\" is not allowed for the current user.",
+       "apiwarn-tokens-origin": "Tokens may not be obtained when the same-origin policy is not applied.",
+       "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>: the limit is $2.",
+       "apiwarn-truncatedresult": "This result was truncated because it would otherwise be larger than the limit of $1 bytes.",
+       "apiwarn-unclearnowtimestamp": "Passing \"$2\" for timestamp parameter <var>$1</var> has been deprecated. If for some reason you need to explicitly specify the current time without calculating it client-side, use <kbd>now<kbd>.",
+       "apiwarn-unrecognizedvalues": "Unrecognized {{PLURAL:$3|value|values}} for parameter <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "Parameter <var>$1</var> uses unsupported PHP array syntax.",
+       "apiwarn-urlparamwidth": "Ignoring width value set in <var>$1urlparam</var> ($2) in favor of width value derived from <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "invalid characters in key (only <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>, and <code>-</code> are allowed).",
+       "apiwarn-validationfailed-badpref": "not a valid preference.",
+       "apiwarn-validationfailed-cannotset": "cannot be set by this module.",
+       "apiwarn-validationfailed-keytoolong": "key too long (no more than $1 bytes allowed).",
+       "apiwarn-validationfailed": "Validation error for <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Security Warning</strong>: <var>$wgDebugAPI</var> is enabled.",
+
+       "api-feed-error-title": "Error ($1)",
+       "api-usage-docref": "See $1 for API usage.",
+       "api-exception-trace": "$1 at $2($3)\n$4",
        "api-credits-header": "Credits",
        "api-credits": "API developers:\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://phabricator.wikimedia.org/."
 }
index 1078a6d..534c359 100644 (file)
@@ -26,7 +26,8 @@
                        "Irus",
                        "Hamilton Abreu",
                        "Pompilos",
-                       "Igv"
+                       "Igv",
+                       "Fortega"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correo]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página deberían funcionar, pero la API aún se encuentra en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía una cabecera HTTP con la clave \"MediaWiki-API-Error\". El valor de la cabecera y el código de error devuelto tomarán el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
+       "apihelp-main-param-responselanginfo": "Incluye los idiomas utilizados para <var>uselang</var> y <var>errorlang</var> en el resultado.",
        "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), se establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST).\n\nEn las peticiones con autenticación, debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403. Si este parámetro coincide con la cabecera <code>Origin</code> y el origen está en la lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.\n\nEn las peticiones sin autenticación, introduce el valor <kbd>*</kbd>. Esto creará una cabecera <code>Access-Control-Allow-Origin</code>, pero el valor de <code>Access-Control-Allow-Credentials</code> será <code>false</code> y todos los datos que dependan del usuario estarán restringidos.",
        "apihelp-main-param-uselang": "El idioma que se utilizará para las traducciones de mensajes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idiomas. También puedes introducir <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
+       "apihelp-main-param-errorformat": "Formato utilizado para la salida de texto de avisos y errores.\n; plaintext: Wikitexto en el que se han eliminado las etiquetas HTML y reemplazado las entidades.\n; wikitext: Wikitexto sin analizar.\n; html: HTML.\n; raw: Clave del mensaje y parámetros.\n; none: Ninguna salida de texto, solo códigos de error.\n; bc: Formato empleado en versiones de MediaWiki anteriores a la 1.29. No se tienen en cuenta <var>errorlang</var> y <var>errorsuselocal</var>.",
+       "apihelp-main-param-errorlang": "Idioma empleado para advertencias y errores. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idioma. Puedes especificar <kbd>content</kbd> para utilizar el idioma del contenido de este wiki o <kbd>uselang</kbd> para utilizar el valor del parámetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Si se da, los textos de error emplearán mensajes localmente personalizados del espacio de nombres {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear a un usuario.",
-       "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
+       "apihelp-block-param-user": "Nombre de usuario, dirección IP o intervalo de IP que quieres bloquear. No se puede utilizar junto con <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID de usuario para bloquear. No se puede utilizar junto con <var>$1user</var>.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinite</kbd>, <kbd>indefinite</kbd>, o <kbd>never</kbd>, el bloqueo será permanente.",
        "apihelp-block-param-reason": "Razón para el bloqueo.",
        "apihelp-block-param-anononly": "Bloquear solo usuarios anónimos (es decir, desactivar ediciones anónimas de esta dirección IP).",
@@ -54,6 +60,7 @@
        "apihelp-block-param-allowusertalk": "Permitir que el usuario edite su propia página de discusión (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.",
        "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.",
+       "apihelp-block-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de bloqueos.",
        "apihelp-block-example-ip-simple": "Bloquear la dirección IP <kbd>192.0.2.5</kbd> durante 3 días por el motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear al usuario <kbd>Vandal</kbd> indefinidamente con el motivo <kbd>Vandalism</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
        "apihelp-changeauthenticationdata-description": "Cambiar los datos de autentificación para el usuario actual.",
@@ -67,6 +74,7 @@
        "apihelp-clearhasmsg-example-1": "Limpiar la marca <code>hasmsg</code> del usuario actual.",
        "apihelp-clientlogin-description": "Entrar en wiki usando el flujo interactivo.",
        "apihelp-clientlogin-example-login": "Comenzar el proceso para iniciar sesión en el wiki como usuario <kbd>Example</kbd> con la contraseña <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar el inicio de sesión después de una respuesta de la <samp>UI</samp> a la autenticación de dos pasos, en la que devuelve un <var>OATHToken</var> de <kbd>987654</kbd>.",
        "apihelp-compare-description": "Obtener la diferencia entre 2 páginas.\n\nSe debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".",
        "apihelp-compare-param-fromtitle": "Primer título para comparar",
        "apihelp-compare-param-fromid": "ID de la primera página a comparar.",
@@ -76,6 +84,8 @@
        "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.",
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
+       "apihelp-createaccount-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> devolvió true (verdadero) para <samp>hasprimarypreservedstate</samp>, deberían omitirse las peticiones marcadas como <samp>primary-required</samp>. Si devolvió un valor no vacío para <samp>preservedusername</samp>, se debe usar ese nombre de usuario en el parámetro <var>username</var>.",
+       "apihelp-createaccount-example-create": "Empezar el proceso de creación del usuario <kbd>Example</kbd> con la contraseña <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
        "apihelp-createaccount-param-password": "Contraseña (ignorada si está establecido <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio de autenticación externa (opcional).",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propiedades de página definidas por palabras mágicas en el wikitexto.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Si la salida es volátil y no debe ser reutilizada en otro lugar dentro de la página.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "El tiempo máximo tras el cual deberían invalidarse los resultados en caché.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Todos los módulos ResourceLoader que las funciones del analizador sintáctico hayan solicitado añadir a la salida. Debe solicitarse <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> junto con <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Da las variables de configuración JavaScript específicas para la página.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Da las variables de configuración JavaScript específicas para la página como una cadena JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "El árbol XML analiza el árbol de la entrada.",
        "apihelp-help-example-query": "Ayuda para dos submódulos de consulta.",
        "apihelp-imagerotate-description": "Girar una o más imágenes.",
        "apihelp-imagerotate-param-rotation": "Grados que rotar una imagen en sentido horario.",
+       "apihelp-imagerotate-param-tags": "Etiquetas que añadir a la entrada en el registro de subidas.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> grados.",
        "apihelp-imagerotate-example-generator": "Rotar todas las imágenes en <kbd>Category:Flip</kbd> <kbd>180</kbd> grados.",
        "apihelp-import-description": "Importar una página desde otra wiki, o desde un archivo XML.\n\nTenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importaciones interwiki: importar también todas las plantillas incluidas.",
        "apihelp-import-param-namespace": "Importar a este espacio de nombres. No puede usarse simultáneamente con <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpágina de esta página. No puede usarse simultáneamente con <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de importaciones y a la revisión nula de las páginas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] al espacio de nombres 100 con todo el historial.",
        "apihelp-linkaccount-description": "Vincular una cuenta de un proveedor de terceros para el usuario actual.",
        "apihelp-linkaccount-example-link": "Iniciar el proceso de vincular a una cuenta de <kbd>Ejemplo</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ya sea para ignorar las advertencias que se emiten durante la operación.",
+       "apihelp-managetags-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de administración de etiquetas.",
        "apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaism</kbd> con el motivo <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
        "apihelp-move-param-watchlist": "Incondicionalmente puede añadir o eliminar la página de lista del usuario actual, utilizar referencias o no cambiar el reloj.",
        "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
+       "apihelp-move-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de traslados y en la revisión nula de la página de destino.",
        "apihelp-move-example-move": "Trasladar <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
        "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar cadena.",
        "apihelp-options-description": "Cambiar preferencias del usuario actual.\n\nSolo se pueden establecer opciones que estén registradas en el núcleo o en una de las extensiones instaladas u opciones con claves predefinidas con <code>userjs-</code> (diseñadas para utilizarse con scripts de usuario).",
        "apihelp-options-param-reset": "Restablece las preferencias de la página web a sus valores predeterminados.",
        "apihelp-options-param-resetkinds": "Lista de tipos de opciones a restablecer cuando la opción <var>$1reset</var> esté establecida.",
-       "apihelp-options-param-change": "Lista de cambios con el formato name=value (por ejemplo: skin=vector). El valor no puede contener caracteres de barras verticales. Si no se da ningún valor (ni siquiera un signo de igual), por ejemplo: optionname|otheroption|..., la opción se restablecerá a sus valores predeterminados.",
+       "apihelp-options-param-change": "Lista de cambios con el formato nombre=valor (por ejemplo: skin=vector). Si no se da ningún valor (ni siquiera un signo de igual), por ejemplo: optionname|otheroption|..., la opción se restablecerá a sus valores predeterminados. Si algún valor contiene el carácter tubería (<kbd>|</kbd>), se debe utilizar el [[Special:ApiHelp/main#main/datatypes|separador alternativo de múltiples valores]] para que las operaciones se realicen correctamente.",
        "apihelp-options-param-optionname": "El nombre de la opción que debe establecerse en el valor dado por <var>$1optionvalue</var>.",
        "apihelp-options-param-optionvalue": "El valor de la opción especificada por <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Restablecer todas las preferencias",
        "apihelp-options-example-change": "Cambiar las preferencias <kbd>skin</kbd> y <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Restablecer todas las preferencias y establecer <kbd>skin</kbd> y <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Obtener información acerca de los módulos de la API.",
-       "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar los submódulos con un <kbd>+</kbd>.",
+       "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar submódulos con un <kbd>+</kbd>, todos los submódulos con <kbd>+*</kbd> o todos los submódulos recursivamente con <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.",
        "apihelp-paraminfo-param-querymodules": "Lista de los nombres de los módulos de consulta (valor de los parámetros <var>prop</var>, <var>meta</var> or <var>list</var>). Utiliza <kbd>$1modules=query+foo</kbd> en vez de <kbd>$1querymodules=foo</kbd>.",
        "apihelp-paraminfo-param-mainmodule": "Obtener también información sobre el módulo principal (primer nivel). Utilizar <kbd>$1modules=main</kbd> en su lugar.",
        "apihelp-paraminfo-param-pagesetmodule": "Obtener también información sobre el módulo PageSet (Proporcionar títulos= y amigos).",
        "apihelp-paraminfo-param-formatmodules": "Lista de los nombres del formato de los módulos (valor del parámetro <var>format</var>). Utiliza <var>$1modules</var> en su lugar.",
        "apihelp-paraminfo-example-1": "Mostrar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> y <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-paraminfo-example-2": "Mostrar información para todos los submódulos de <kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
+       "apihelp-parse-description": "Analiza el contenido y devuelve la salida del analizador sintáctico.\n\nVéanse los distintos módulos prop de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> para obtener información de la versión actual de una página.\n\nHay varias maneras de especificar el texto que analizar:\n# Especificar una página o revisión, mediante <var>$1page</var>, <var>$1pageid</var> o <var>$1oldid</var>.\n# Especificar explícitamente el contenido, mediante <var>$1text</var>, <var>$1title</var> y <var>$1contentmodel</var>.\n# Especificar solamente un resumen que analizar. Se debería asignar a <var>$1prop</var> un valor vacío.",
        "apihelp-parse-param-title": "Título de la página a la que pertenece el texto. Si se omite se debe especificar <var>$1contentmodel</var> y se debe utilizar el [[API]] como título.",
        "apihelp-parse-param-text": "Texto a analizar. Utiliza <var>$1title</var> or <var>$1contentmodel</var> para controlar el modelo del contenido.",
        "apihelp-parse-param-summary": "Resumen a analizar.",
        "apihelp-parse-paramvalue-prop-sections": "Da las secciones del wikitexto analizado.",
        "apihelp-parse-paramvalue-prop-revid": "Añade la ID de revisión de la página analizada.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Añade el título del wikitexto analizado.",
-       "apihelp-parse-paramvalue-prop-headitems": "Da elementos para colocar en el <code>&lt;encabezado&gt;</code> de la página.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Proporciona elementos para colocar en el <code>&lt;head&gt;</code> de la página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Da el <code>&lt;encabezado&gt;</code> analizado de la página.",
-       "apihelp-parse-paramvalue-prop-modules": "Da los módulos de ResourceLoader utilizados en la página. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
-       "apihelp-parse-paramvalue-prop-jsconfigvars": "Da la configuración JavaScript de variables específica para la página.",
+       "apihelp-parse-paramvalue-prop-modules": "Proporciona los módulos de ResourceLoader utilizados en la página. Para cargar, utiliza <code>mw.loader.using()</code>. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "Proporciona las variables de configuración de JavaScript específicas de la página. Para obtenerlas, utiliza <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Da la configuración JavaScript de variables específica para la página como cadena JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Da el HTML de los indicadores de estado utilizados en la página.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Da los enlaces interwiki del texto analizado.",
        "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
        "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
        "apihelp-parse-param-contentformat": "Formato de serialización de contenido utilizado para la introducción de texto. Sólo es válido cuando se utiliza con $1text.",
+       "apihelp-parse-param-contentmodel": "Modelo de contenido del texto de entrada. Si se omite, se debe especificar $1title, y el valor por defecto será el modelo del título especificado. Solo es válido cuando se use junto con $1text.",
        "apihelp-parse-example-page": "Analizar una página.",
        "apihelp-parse-example-text": "Analizar wikitexto.",
        "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.",
        "apihelp-protect-description": "Cambiar el nivel de protección de una página.",
        "apihelp-protect-param-title": "Título de la página a (des)proteger. No se puede utilizar con $1pageid.",
        "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
-       "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
+       "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>). Un nivel de <kbd>all</kbd> («todos») significa que cualquier usuaro puede realizar la acción, es decir, no hay restricción.\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
+       "apihelp-protect-param-expiry": "Marcas de tiempo de expiración. Si solo se establece una marca de tiempo, se utilizará para todas las protecciones. Utiliza <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, o <kbd>never</kbd> para una protección indefinida.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
        "apihelp-protect-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de protección.",
        "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
+       "apihelp-protect-param-watch": "Si se activa, añade la página en proceso de (des)protección a la lista de seguimiento del usuario actual.",
+       "apihelp-protect-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, utilizar las preferencias o no cambiar el estado de seguimiento.",
        "apihelp-protect-example-protect": "Proteger una página",
-       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
+       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd> («todos», es decir, cualquier usuario puede realizar la acción).",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
        "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.\n\nSe requiere una solicitud POST si el usuario no ha iniciado sesión.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar las tablas de enlaces.",
        "apihelp-query-param-meta": "Qué metadatos obtener.",
        "apihelp-query-param-indexpageids": "Incluir una sección de ID de páginas adicional en la que se muestran todas las ID de páginas.",
        "apihelp-query-param-export": "Exportar las revisiones actuales de las páginas dadas o generadas.",
+       "apihelp-query-param-exportnowrap": "Devuelve el XML de exportación sin envolverlo en un resultado XML (mismo formato que [[Special:Export]]). Solo se puede usar junto con $1export.",
        "apihelp-query-param-iwurl": "Si la URL completa si el título es un interwiki.",
+       "apihelp-query-param-rawcontinue": "Devuelve los datos <samp>query-continue</samp> en bruto para continuar.",
+       "apihelp-query-example-allpages": "Obtener revisiones de páginas que comiencen por <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Enumerar todas las categorías.",
        "apihelp-query+allcategories-param-from": "La categoría para comenzar la enumeración",
        "apihelp-query+allcategories-param-to": "La categoría para detener la enumeración",
        "apihelp-query+allcategories-paramvalue-prop-size": "Añade el número de páginas en la categoría.",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "Etiqueta las categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Lista las categorías con información sobre el número de páginas de cada una.",
+       "apihelp-query+allcategories-example-generator": "Recupera la información sobre la propia página de categoría para las categorías que empiezan por <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Solo puede usarse con <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede utilizarse con <var>$3user</var>.",
        "apihelp-query+allfileusages-param-from": "El título del archivo para comenzar la enumeración.",
        "apihelp-query+allfileusages-param-to": "El título del archivo para detener la enumeración.",
        "apihelp-query+allfileusages-param-prefix": "Buscar todos los títulos de los archivos que comiencen con este valor.",
+       "apihelp-query+allfileusages-param-unique": "Mostrar solo títulos únicos de archivo. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+allfileusages-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Agrega el título del archivo.",
        "apihelp-query+allfileusages-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+allimages-param-maxsize": "Limitar a imágenes con como mucho este número de bytes.",
        "apihelp-query+allimages-param-sha1": "Suma SHA1 de la imagen. Invalida $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "Suma SHA1 de la imagen en base 36 (usada en MediaWiki).",
+       "apihelp-query+allimages-param-user": "Devolver solo los archivos subidos por este usuario. Solo se puede usar con $1tipo=timestamp. No se puede usar junto con $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Cómo filtrar archivos subidos por bots. Solo se puede usar con $1sort=timestamp. No se puede usar junto con $1user.",
+       "apihelp-query+allimages-param-mime": "Tipos MIME que buscar, como, por ejemplo, <kbd>image/jpeg</kbd>.",
        "apihelp-query+allimages-param-limit": "Cuántas imágenes en total se devolverán.",
        "apihelp-query+allimages-example-B": "Mostrar una lista de archivos que empiecen por la letra <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Mostrar una lista de archivos subidos recientemente, similar a [[Special:NewFiles]].",
        "apihelp-query+alllinks-param-from": "El título del enlace para comenzar la enumeración.",
        "apihelp-query+alllinks-param-to": "El título del enlace para detener la enumeración.",
        "apihelp-query+alllinks-param-prefix": "Buscar todos los títulos vinculados que comiencen con este valor.",
+       "apihelp-query+alllinks-param-unique": "Mostrar solo títulos únicos enlazados. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+alllinks-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.",
        "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+alllinks-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+alllinks-example-B": "Enumera los títulos enlazados, incluyendo los títulos faltantes, con los ID de página de los que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados únicamente.",
        "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
        "apihelp-query+alllinks-example-generator": "Obtiene páginas que contienen los enlaces.",
        "apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.",
        "apihelp-query+allmessages-param-enableparser": "Establecer para habilitar el analizador, se preprocesará el wikitexto del mensaje (sustitución de palabras mágicas, uso de plantillas, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si se establece, no incluya el contenido de los mensajes en la salida.",
+       "apihelp-query+allmessages-param-includelocal": "Incluir también los mensajes locales, es decir, aquellos que no existen en el propio software pero sí en el espacio de nombres {{ns:MediaWiki}}.\nEsto muestra todas las páginas del espacio de nombres {{ns:MediaWiki}}, así que también mostrará las que no son propiamente mensajes, como, por ejemplo, [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Los argumentos que se sustituyen en el mensaje.",
        "apihelp-query+allmessages-param-filter": "Devolver solo mensajes con nombres que contengan esta cadena.",
        "apihelp-query+allmessages-param-customised": "Devolver solo mensajes en este estado de personalización.",
        "apihelp-query+allmessages-param-lang": "Devolver mensajes en este idioma.",
        "apihelp-query+allmessages-param-from": "Devolver mensajes que empiecen por este mensaje.",
        "apihelp-query+allmessages-param-to": "Devolver mensajes que acaben por este mensaje.",
+       "apihelp-query+allmessages-param-title": "Nombre de página que usar como contexto al analizar el mensaje (para la opción $1enableparser).",
        "apihelp-query+allmessages-param-prefix": "Devolver mensajes con este prefijo.",
        "apihelp-query+allmessages-example-ipb": "Mostrar mensajes que empiecen por <kbd>ipb-</kbd>.",
        "apihelp-query+allmessages-example-de": "Mostrar mensajes <kbd>august</kbd> y <kbd>mainpage</kbd> en alemán.",
        "apihelp-query+allpages-param-minsize": "Limitar a páginas con al menos este número de bytes.",
        "apihelp-query+allpages-param-maxsize": "Limitar a páginas con este número máximo de bytes.",
        "apihelp-query+allpages-param-prtype": "Limitar a páginas protegidas.",
+       "apihelp-query+allpages-param-prlevel": "Filtrar protecciones según el nivel de protección (se debe usar junto con el parámetro $1prtype= ).",
+       "apihelp-query+allpages-param-prfiltercascade": "Filtrar protecciones según la protección en cascada (se ignora cuando $1prtype no está fijado).",
        "apihelp-query+allpages-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+allpages-param-dir": "La dirección en la que se listará.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrar en función de si una página tiene langlinks. Tenga en cuenta que esto no puede considerar langlinks agregados por extensiones.",
        "apihelp-query+allredirects-param-from": "El título de la redirección para iniciar la enumeración.",
        "apihelp-query+allredirects-param-to": "El título de la redirección para detener la enumeración.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
+       "apihelp-query+allredirects-param-unique": "Mostrar solo títulos únicos de páginas de destino. No se puede usar junto con $1prop=ids|fragment|interwiki. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Añade el identificador de la página de redirección (no se puede usar junto con <var>$1unique</var>).",
        "apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Añade el fragmento de la redirección, si existe (no se puede usar junto con <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Añade el prefijo interwiki de la redirección, si existe (no se puede usar junto con <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "El espacio de nombres a enumerar.",
        "apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
        "apihelp-query+allredirects-param-dir": "La dirección en la que se listará.",
+       "apihelp-query+allredirects-example-B": "Enumera las páginas de destino, incluyendo las páginas desaparecidas, con los identificadores de las páginas de las que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "La lista de páginas de destino.",
        "apihelp-query+allredirects-example-unique-generator": "Obtiene todas las páginas de destino, marcando los que faltan.",
        "apihelp-query+allredirects-example-generator": "Obtiene páginas que contienen las redirecciones.",
        "apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+allrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
+       "apihelp-query+allrevisions-param-generatetitles": "Cuando se utilice como generador, genera títulos en lugar de ID de revisión.",
        "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.",
        "apihelp-query+mystashedfiles-description": "Obtener una lista de archivos en la corriente de carga de usuarios.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Buscar el tamaño del archivo y las dimensiones de la imagen.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obtener el tipo MIME y tipo multimedia del archivo.",
        "apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.",
+       "apihelp-query+alltransclusions-description": "Mostrar todas las transclusiones (páginas integradas mediante &#123;&#123;x&#125;&#125;), incluidas las inexistentes.",
        "apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.",
        "apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluidos que comiencen con este valor.",
+       "apihelp-query+alltransclusions-param-unique": "Mostrar solo títulos únicos transcluidos. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.",
        "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Añade el título de la transclusión.",
        "apihelp-query+alltransclusions-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Número de elementos que se desea obtener.",
        "apihelp-query+alltransclusions-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+alltransclusions-example-B": "Enumerar los títulos transcluidos, incluyendo los faltantes, junto con los identificadores de las páginas de las que provienen, empezando por <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluidos, marcando los que faltan.",
        "apihelp-query+alltransclusions-example-generator": "Obtiene las páginas que contienen las transclusiones.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
+       "apihelp-query+allusers-param-from": "El nombre de usuario por el que empezar la enumeración.",
+       "apihelp-query+allusers-param-to": "El nombre de usuario por el que finalizar la enumeración.",
        "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.",
        "apihelp-query+allusers-param-dir": "Dirección de ordenamiento.",
        "apihelp-query+allusers-param-group": "Incluir solo usuarios en los grupos dados.",
        "apihelp-query+allusers-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, indicar también si el usuario está conectado con el wiki identificado por el ID.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
        "apihelp-query+authmanagerinfo-description": "Recuperar información sobre el estado de autenticación actual.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Obtener información sobre las peticiones de autentificación requeridas para la acción de autentificación especificada.",
        "apihelp-query+authmanagerinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.",
+       "apihelp-query+authmanagerinfo-example-login-merged": "Obtener las peticiones que podrían utilizarse al empezar un inicio de sesión, con los campos de formulario integrados.",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Comprueba si la autentificación es suficiente para realizar la acción <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Encuentra todas las páginas que enlazan a la página dada.",
+       "apihelp-query+backlinks-param-title": "Título que buscar. No se puede usar junto con <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "apihelp-query+backlinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+backlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Añade la razón dada para el bloqueo.",
        "apihelp-query+blocks-paramvalue-prop-range": "Añade la gama de direcciones de IP afectó por el bloque.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Etiquetas la prohibición con (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-show": "Muestra solamente los elementos que cumplen estos criterios.\nPor ejemplo, para mostrar solamente los bloqueos indefinidos a direcciones IP, introduce <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
+       "apihelp-query+blocks-example-users": "Muestra los bloqueos de los usuarios <kbd>Alice</kbd> y <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Enumera todas las categorías a las que pertenecen las páginas.",
        "apihelp-query+categories-param-prop": "Qué propiedades adicionales obtener para cada categoría:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Añade la clave de ordenación (cadena hexadecimal) y el prefijo de la clave de ordenación (la parte legible) de la categoría.",
        "apihelp-query+categories-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se añadió la categoría.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Etiqueta las categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Qué tipo de categorías mostrar.",
        "apihelp-query+categories-param-limit": "Cuántas categorías se devolverán.",
+       "apihelp-query+categories-param-categories": "Enumerar solamente estas categorías. Útil para comprobar si una página determinada está en una categoría determinada.",
        "apihelp-query+categories-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+categories-example-simple": "Obtener una lista de categorías a las que pertenece la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtener información acerca de todas las categorías utilizadas en la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.",
        "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
        "apihelp-query+categorymembers-description": "Lista todas las páginas en una categoría dada.",
+       "apihelp-query+categorymembers-param-title": "Categoría que enumerar (requerida). Debe incluir el prefijo <kbd>{{ns:category}}:</kbd>. No se puede utilizar junto con <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "ID de página de la categoría para enumerar. No se puede utilizar junto con <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Añade la clave de ordenación utilizada para la ordenación en la categoría (cadena hexadecimal).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Añade la clave de ordenación utilizada para la ordenación en la categoría (parte legible de la clave de ordenación).",
        "apihelp-query+categorymembers-paramvalue-prop-type": "Añade el tipo en el que se categorizó la página (<samp>page</samp>, <samp>subcat</samp> or <samp>file</samp>).",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se incluyó la página.",
+       "apihelp-query+categorymembers-param-namespace": "Incluir solamente páginas de estos espacios de nombres. Ten en cuenta que puede haberse utilizado <kbd>$1type=subcat</kbd> o <kbd>$1type=file</kbd> en lugar de <kbd>$1namespace=14</kbd> o <kbd>6</kbd>.",
+       "apihelp-query+categorymembers-param-type": "Qué tipo de miembros de la categoría incluir. Ignorado cuando se ha establecido <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-limit": "Número máximo de páginas que devolver.",
        "apihelp-query+categorymembers-param-sort": "Propiedad por la que realizar la ordenación.",
        "apihelp-query+categorymembers-param-dir": "Dirección en la que desea ordenar.",
+       "apihelp-query+categorymembers-param-start": "Marca de tiempo por la que empezar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "Marca de tiempo por la que terminar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Clave de ordenación por la que empezar la enumeración, tal como se ha devuelto por <kbd>$1prop=sortkey</kbd>. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Clave de ordenación por la que terminar la enumeración, tal como se ha devuelto por <kbd>$1prop=sortkey</kbd>. Solo se puede utilizar junto con <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Prefijo de la clave de ordenación por el que empezar la enumeración. Solo se puede utilizar junto con <kbd>$1sort=sortkey</kbd>. Reemplaza <var>$1starthexsortkey</var>.",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "Prefijo de la clave de ordenación <strong>antes</strong> del cual termina la enumeración (no <strong>en</strong> el cual; si este valor existe, no será incluido). Solo se puede utilizar junto con <kbd>$1sort=sortkey</kbd>. Reemplaza <var>$1endhexsortkey</var>.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
        "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Category:Physics</kbd>.",
+       "apihelp-query+contributors-description": "Obtener la lista de contribuidores conectados y el número de contribuidores anónimos de una página.",
+       "apihelp-query+contributors-param-group": "Solo incluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-excludegroup": "Excluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-rights": "Solo incluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
+       "apihelp-query+contributors-param-excluderights": "Excluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.",
        "apihelp-query+contributors-param-limit": "Cuántos contribuyentes se devolverán.",
        "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+deletedrevisions-param-start": "Marca de tiempo por la que empezar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.",
+       "apihelp-query+deletedrevisions-param-end": "Marca de tiempo por la que terminar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.",
        "apihelp-query+deletedrevisions-param-tag": "Listar solo las revisiones con esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+deletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
+       "apihelp-query+deletedrevisions-example-titles": "Muestra la lista de revisiones borradas de las páginas <kbd>Main Page</kbd> y <kbd>Talk:Main Page</kbd>, con su contenido.",
+       "apihelp-query+deletedrevisions-example-revids": "Mostrar la información de la revisión borrada <kbd>123456</kbd>.",
+       "apihelp-query+deletedrevs-description": "Muestra la lista de revisiones borradas.\n\nOpera en tres modos:\n# Lista de revisiones borradas de los títulos dados, ordenadas por marca de tiempo.\n# Lista de contribuciones borradas del usuario dado, ordenadas por marca de tiempo.\n# Lista de todas las revisiones borradas en el espacio de nombres dado, ordenadas por título y marca de tiempo (donde no se ha especificado ningún título ni se ha fijado $1user).",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
+       "apihelp-query+deletedrevs-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+deletedrevs-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+deletedrevs-param-from": "Empezar a listar en este título.",
        "apihelp-query+deletedrevs-param-to": "Terminar de listar en este título.",
        "apihelp-query+deletedrevs-param-prefix": "Buscar todas las páginas que empiecen con este valor.",
        "apihelp-query+deletedrevs-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+deletedrevs-param-namespace": "Listar solo las páginas en este espacio de nombres.",
        "apihelp-query+deletedrevs-param-limit": "La cantidad máxima de revisiones que listar.",
+       "apihelp-query+deletedrevs-param-prop": "Propiedades que obtener:\n;revid: Añade el identificador de la revisión borrada.\n;parentid: Añade el identificador de la revisión anterior de la página.\n;user: Añade el usuario que hizo la revisión.\n;userid: Añade el identificador del usuario que hizo la revisión.\n;comment: Añade el comentario de la revisión.\n;parsedcomment: Añade el comentario de la revisión, pasado por el analizador sintáctico.\n;minor: Añade una etiqueta si la revisión es menor.\n;len: Añade la longitud (en bytes) de la revisión.\n;sha1: Añade el SHA-1 (base 16) de la revisión.\n;content: Añade el contenido de la revisión.\n;token:<span class=\"apihelp-deprecated\">Obsoleto.</span> Devuelve el token de edición.\n;tags: Etiquetas de la revisión.",
+       "apihelp-query+deletedrevs-example-mode1": "Muestra las últimas revisiones borradas de las páginas <kbd>Main Page</kbd> y <kbd>Talk:Main Page</kbd>, con contenido (modo 1).",
+       "apihelp-query+deletedrevs-example-mode2": "Muestra las últimas 50 contribuciones de <kbd>Bob</kbd> (modo 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "Muestra las primeras 50 revisiones borradas del espacio principal (modo 3).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar las primeras 50 páginas en el espacio de nombres {{ns:talk}} (modo 3).",
        "apihelp-query+disabled-description": "Se ha desactivado el módulo de consulta.",
+       "apihelp-query+duplicatefiles-description": "Enumerar todos los archivos que son duplicados de los archivos dados a partir de los valores hash.",
+       "apihelp-query+duplicatefiles-param-limit": "Número de archivos duplicados para devolver.",
        "apihelp-query+duplicatefiles-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+duplicatefiles-param-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Alber Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados en todos los archivos.",
        "apihelp-query+embeddedin-description": "Encuentra todas las páginas que transcluyen el título dado.",
        "apihelp-query+embeddedin-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "Identificador de página que buscar. No se puede usar junto con $1title.",
+       "apihelp-query+embeddedin-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+embeddedin-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+embeddedin-example-simple": "Mostrar las páginas que transcluyen <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obtener información sobre las páginas que transcluyen <kbd>Template:Stub</kbd>.",
+       "apihelp-query+extlinks-description": "Devuelve todas las URL externas (excluidos los interwikis) de las páginas dadas.",
        "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+extlinks-param-protocol": "Protocolo de la URL. Si está vacío y <var>$1query</var> está definido, el protocolo es <kbd>http</kbd>. Para enumerar todos los enlaces externos, deja a la vez vacíos esto y <var>$1query</var>.",
+       "apihelp-query+extlinks-param-query": "Cadena de búsqueda sin protocolo. Útil para comprobar si una determinada página contiene una determinada URL externa.",
+       "apihelp-query+extlinks-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.",
        "apihelp-query+extlinks-example-simple": "Obtener una lista de los enlaces externos en <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Enumera páginas que contienen una URL dada.",
        "apihelp-query+exturlusage-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Añade el URL utilizado en la página.",
        "apihelp-query+exturlusage-param-protocol": "Protocolo del URL. Si está vacío y se establece <var>$1query</var>, el protocolo es <kbd>http</kbd>. Deja vacío esto y <var>$1query</var> para listar todos los enlaces externos.",
+       "apihelp-query+exturlusage-param-query": "Cadena de búsqueda sin protocolo. Véase [[Special:LinkSearch]]. Deja el campo vacío para enumerar todos los enlaces externos.",
+       "apihelp-query+exturlusage-param-namespace": "Los espacios de nombres que enumerar.",
        "apihelp-query+exturlusage-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+exturlusage-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.",
        "apihelp-query+exturlusage-example-simple": "Mostrar páginas que enlacen con <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+filearchive-description": "Enumerar todos los archivos borrados de forma secuencial.",
        "apihelp-query+filearchive-param-from": "El título de imagen para comenzar la enumeración",
        "apihelp-query+filearchive-param-to": "El título de imagen para detener la enumeración.",
        "apihelp-query+filearchive-param-prefix": "Buscar todos los títulos de las imágenes que comiencen con este valor.",
+       "apihelp-query+filearchive-param-limit": "Número de imágenes que devolver en total.",
        "apihelp-query+filearchive-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+filearchive-param-sha1": "Hash SHA1 de la imagen. Reemplaza $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "Hash SHA1 de la imagen en base 36 (utilizado en MediaWiki).",
        "apihelp-query+filearchive-param-prop": "Qué información de imagen se obtendrá:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Añade el hash SHA-1 para la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "Añade la marca de tiempo de la versión subida.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Agrega el usuario que subió la versión de la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-size": "Agrega el tamaño de la imagen en bytes y la altura, la anchura y el número de páginas (si es aplicable).",
        "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analizar la descripción de la versión.",
        "apihelp-query+filearchive-paramvalue-prop-mime": "Añade el MIME de la imagen.",
        "apihelp-query+filearchive-paramvalue-prop-mediatype": "Añade el tipo multimedia de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Enumera los metadatos Exif para la versión de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Añade la profundidad de bit de la versión.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Añade el nombre de archivo de la versión archivada para las versiones que no son las últimas.",
        "apihelp-query+filearchive-example-simple": "Mostrar una lista de todos los archivos eliminados.",
+       "apihelp-query+filerepoinfo-description": "Devuelve metainformación sobre los repositorios de imágenes configurados en el wiki.",
        "apihelp-query+filerepoinfo-example-simple": "Obtener información acerca de los repositorios de archivos.",
+       "apihelp-query+fileusage-description": "Encontrar todas las páginas que utilizan los archivos dados.",
        "apihelp-query+fileusage-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada página.",
+       "apihelp-query+fileusage-param-namespace": "Incluir solo páginas de estos espacios de nombres.",
        "apihelp-query+fileusage-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+fileusage-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+fileusage-example-simple": "Obtener una lista de páginas que utilicen [[:File:Example.jpg]].",
        "apihelp-query+fileusage-example-generator": "Obtener información acerca de las páginas que utilicen [[:File:Example.jpg]].",
        "apihelp-query+imageinfo-description": "Devuelve información del archivo y su historial de subida.",
        "apihelp-query+imageinfo-param-prop": "Qué información del archivo se obtendrá:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Añade la marca de tiempo a la versión actualizada.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Añade el usuario que subió cada versión del archivo.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "Añade la ID de usuario que subió cada versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Comentarios sobre la versión.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analizar el comentario de la versión.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Agrega el título canónico del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "Devuelve la URL para el archivo y la página de descripción.",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias para el tamaño.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Añade el hash SHA-1 para la imagen.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Añade el tipo MIME del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Añade el tipo MIME de la miniatura de la imagen (se requiere la URL y el parámetro $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Añade el tipo multimedia de la imagen.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "Enumera los metadatos Exif para la versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Enumera los metadatos genéricos del formato del archivo para la versión del archivo.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Enumera metadatos con formato combinados de múltiples fuentes. Los resultados están en formato HTML.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Añade el nombre del archivo de la versión archivada para las versiones anteriores a la última.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Añade la profundidad de bits de la versión.",
        "apihelp-query+imageinfo-param-limit": "Cuántos revisiones de archivos se devolverán por perfil.",
+       "apihelp-query+imageinfo-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+imageinfo-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si se especifica y no vacío, sólo estas claves serán devueltos por $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Un controlador específico de la cadena de parámetro. Por ejemplo, los archivos Pdf pueden utilizar <kbd>page15-100px</kbd>. <var>$1urlwidth</var> debe ser utilizado y debe ser consistente con <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-example-dated": "Obtener información sobre las versiones de [[:File:Test.jpg]] a partir de 2008.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+images-param-limit": "Cuántos archivos se devolverán.",
+       "apihelp-query+images-param-images": "Mostrar solo estos archivos. Útil para comprobar si una determinada página tiene un determinado archivo.",
        "apihelp-query+images-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+images-example-simple": "Obtener una lista de los archivos usados en la [[Main Page|Portada]].",
+       "apihelp-query+images-example-generator": "Obtener información sobre todos los archivos empleados en [[Main Page]].",
+       "apihelp-query+imageusage-description": "Encontrar todas las páginas que usen el título de imagen dado.",
        "apihelp-query+imageusage-param-title": "Título a buscar. No puede usarse en conjunto con $1pageid.",
        "apihelp-query+imageusage-param-pageid": "ID de página a buscar. No puede usarse con $1title.",
        "apihelp-query+imageusage-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+imageusage-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+imageusage-param-filterredir": "Cómo filtrar las redirecciones. Si se establece a no redirecciones cuando está habilitado $1redirect, esto solo se aplica al segundo nivel.",
+       "apihelp-query+imageusage-param-limit": "Número de páginas que devolver. Si está habilitado <var>$1redirect</var>, el límite se aplica a cada nivel de forma separada (es decir, se pueden devolver hasta 2 * <var>$1limit</var>).",
        "apihelp-query+imageusage-example-simple": "Mostrar las páginas que usan [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageusage-example-generator": "Obtener información sobre las páginas que empleen [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-description": "Obtener información básica de la página.",
        "apihelp-query+info-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+info-paramvalue-prop-protection": "Listar el nivel de protección de cada página.",
+       "apihelp-query+info-paramvalue-prop-talkid": "El identificador de la página de discusión correspondiente a cada página que no es de discusión.",
        "apihelp-query+info-paramvalue-prop-subjectid": "La ID de página de la página principal de cada página de discusión.",
+       "apihelp-query+info-paramvalue-prop-url": "Muestra una URL completa, una URL de edición y la URL canónica de cada página.",
        "apihelp-query+info-paramvalue-prop-readable": "Si el usuario puede leer esta página.",
+       "apihelp-query+info-paramvalue-prop-preload": "Muestra el texto devuelto por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Proporciona la manera en que se muestra realmente el título de la página",
+       "apihelp-query+info-param-testactions": "Comprobar su el usuario actual puede realizar determinadas acciones en la página.",
        "apihelp-query+info-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.",
        "apihelp-query+info-example-simple": "Obtener información acerca de la página <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Encontrar todas las páginas que enlazan al enlace interwiki dado.\n\nPuede utilizarse para encontrar todos los enlaces con un prefijo, o todos los enlaces a un título (con un determinado prefijo). Si no se introduce ninguno de los parámetros, se entiende como «todos los enlaces interwiki».",
+       "apihelp-query+iwbacklinks-param-prefix": "Prefijo para el interwiki.",
+       "apihelp-query+iwbacklinks-param-title": "Enlace interlingüístico que buscar. Se debe usar junto con <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+iwbacklinks-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Añade el prefijo del interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Añade el título del interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-generator": "Obtener información sobre las páginas que enlacen a [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Devuelve todos los enlaces interwiki de las páginas dadas.",
        "apihelp-query+iwlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Añade el URL completo.",
        "apihelp-query+iwlinks-param-limit": "Cuántos enlaces interwiki se desea devolver.",
        "apihelp-query+iwlinks-param-prefix": "Devolver únicamente enlaces interwiki con este prefijo.",
        "apihelp-query+iwlinks-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+iwlinks-example-simple": "Obtener los enlaces interwiki de la página <kbd>Main Page</kbd>.",
        "apihelp-query+langbacklinks-param-lang": "Idioma del enlace de idioma.",
        "apihelp-query+langbacklinks-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+langbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+langbacklinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+langbacklinks-example-simple": "Obtener las páginas enlazadas a [[:fr:Test]]",
        "apihelp-query+langbacklinks-example-generator": "Obtener información acerca de las páginas enlazadas a [[:fr:Test]].",
+       "apihelp-query+langlinks-description": "Devuelve todos los enlaces interlingüísticos de las páginas dadas.",
+       "apihelp-query+langlinks-param-limit": "Número de enlaces interlingüísticos que devolver.",
        "apihelp-query+langlinks-param-url": "Obtener la URL completa o no (no se puede usar con <var>$1prop</var>).",
        "apihelp-query+langlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Añade el URL completo.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Añade el nombre del idioma localizado (o la mejor estimación). Usa <var>$1inlanguagecode</var> para controlar el idioma.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Añade el nombre nativo del idioma.",
        "apihelp-query+langlinks-param-lang": "Devolver solo enlaces de idioma con este código de idioma.",
+       "apihelp-query+langlinks-param-title": "Enlace que buscar. Se debe usar junto con <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Código de idioma para los nombres de idiomas localizados.",
+       "apihelp-query+langlinks-example-simple": "Obtener los enlaces interlingüísticos de la página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-description": "Devuelve todos los enlaces de las páginas dadas.",
+       "apihelp-query+links-param-namespace": "Mostrar solo los enlaces en estos espacios de nombres.",
        "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+links-param-titles": "Devolver solo los enlaces a estos títulos. Útil para comprobar si una determinada página enlaza a un determinado título.",
        "apihelp-query+links-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+links-example-simple": "Obtener los enlaces de la página <kbd>Main Page</kbd>",
+       "apihelp-query+links-example-namespaces": "Obtener enlaces de la página <kbd>Main Page</kbd> de los espacios de nombres {{ns:user}} and {{ns:template}}.",
+       "apihelp-query+linkshere-description": "Buscar todas las páginas que enlazan a las páginas dadas.",
        "apihelp-query+linkshere-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Identificador de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Título de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Indicar si la página es una redirección.",
+       "apihelp-query+linkshere-param-namespace": "Incluir solo páginas de estos espacios de nombres.",
        "apihelp-query+linkshere-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+linkshere-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+linkshere-example-simple": "Obtener una lista de páginas que enlacen a la [[Main Page]].",
        "apihelp-query+linkshere-example-generator": "Obtener información acerca de las páginas enlazadas a la [[Main Page|Portada]].",
+       "apihelp-query+logevents-description": "Obtener eventos de los registros.",
        "apihelp-query+logevents-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Agrega el identificador del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Añade el título de la página para el evento del registro.",
        "apihelp-query+logevents-paramvalue-prop-type": "Añade el tipo del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Añade el usuario responsable del evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Agrega el identificador del usuario responsable del evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Añade la marca de tiempo para el evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Añade el comentario del evento del registro.",
        "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Añade el comentario analizado del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Muestra detalles adicionales sobre el evento del registro.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Muestra las etiquetas para el evento del registro.",
+       "apihelp-query+logevents-param-type": "Filtrar las entradas del registro solo a este tipo.",
+       "apihelp-query+logevents-param-start": "Marca de tiempo por la que empezar la enumeración.",
+       "apihelp-query+logevents-param-end": "Marca de tiempo por la que terminar la enumeración.",
+       "apihelp-query+logevents-param-user": "Filtrar entradas a aquellas realizadas por el usuario dado.",
+       "apihelp-query+logevents-param-title": "Filtrar entradas a aquellas relacionadas con una página.",
+       "apihelp-query+logevents-param-namespace": "Filtrar entradas a aquellas en el espacio de nombres dado.",
+       "apihelp-query+logevents-param-prefix": "Filtrar entradas que empiezan por este prefijo.",
+       "apihelp-query+logevents-param-tag": "Solo mostrar las entradas de eventos con esta etiqueta.",
+       "apihelp-query+logevents-param-limit": "Número total de entradas de eventos que devolver.",
+       "apihelp-query+logevents-example-simple": "Mostrar los eventos recientes del registro.",
+       "apihelp-query+pagepropnames-description": "Mostrar todos los nombres de propiedades de página utilizados en el wiki.",
+       "apihelp-query+pagepropnames-param-limit": "Número máximo de nombres que devolver.",
+       "apihelp-query+pagepropnames-example-simple": "Obtener los 10 primeros nombres de propiedades.",
        "apihelp-query+pageprops-description": "Obtener diferentes propiedades de página definidas en el contenido de la página.",
        "apihelp-query+pageprops-param-prop": "Sólo listar estas propiedades de página (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso). Útil para comprobar si las páginas usan una determinada propiedad de página.",
+       "apihelp-query+pageprops-example-simple": "Obtener las propiedades de las páginas <kbd>Main Page</kbd> y <kbd>MediaWiki</kbd>.",
+       "apihelp-query+pageswithprop-description": "Mostrar todas las páginas que usen una propiedad de página.",
        "apihelp-query+pageswithprop-param-propname": "Propiedad de página para la cual enumerar páginas (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso).",
        "apihelp-query+pageswithprop-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Añade el identificador de página.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+pageswithprop-paramvalue-prop-value": "Añade el valor de la propiedad de página.",
        "apihelp-query+pageswithprop-param-limit": "El máximo número de páginas que se devolverán.",
+       "apihelp-query+pageswithprop-param-dir": "Dirección en la que se desea ordenar.",
        "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Buscar cadena.",
        "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-query+prefixsearch-param-offset": "Número de resultados que omitir.",
        "apihelp-query+prefixsearch-example-simple": "Buscar títulos de páginas que empiecen con <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Perfil de búsqueda que utilizar.",
+       "apihelp-query+protectedtitles-description": "Mostrar todos los títulos protegidos contra creación.",
        "apihelp-query+protectedtitles-param-namespace": "Listar solo los títulos en estos espacios de nombres.",
        "apihelp-query+protectedtitles-param-level": "Listar solo títulos con estos niveles de protección.",
        "apihelp-query+protectedtitles-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+protectedtitles-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Añade la marca de tiempo de cuando se añadió la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-user": "Agrega el usuario que agregó la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-userid": "Agrega el identificador de usuario que agregó la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Añade el comentario de la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Añade el comentario analizado para la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Añade la fecha y hora de cuando se levantará la protección.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Agrega el nivel de protección.",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.",
        "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, es sensible a mayúsculas y minúsculas.",
        "apihelp-query+querypage-param-limit": "Número de resultados que se devolverán.",
        "apihelp-query+querypage-example-ancientpages": "Devolver resultados de [[Special:Ancientpages]].",
+       "apihelp-query+random-param-namespace": "Devolver solo las páginas de estos espacios de nombres.",
+       "apihelp-query+random-param-limit": "Limita el número de páginas aleatorias que se devolverán.",
+       "apihelp-query+random-param-redirect": "Usa <kbd>$1filterredir=redirects</kbd> en su lugar.",
+       "apihelp-query+random-param-filterredir": "Cómo filtrar las redirecciones.",
+       "apihelp-query+random-example-simple": "Devuelve dos páginas aleatorias del espacio de nombres principal.",
+       "apihelp-query+random-example-generator": "Devuelve la información de dos páginas aleatorias del espacio de nombres principal.",
        "apihelp-query+recentchanges-description": "Enumerar cambios recientes.",
        "apihelp-query+recentchanges-param-start": "El sello de tiempo para comenzar la enumeración.",
        "apihelp-query+recentchanges-param-end": "El sello de tiempo para finalizar la enumeración.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.",
        "apihelp-query+recentchanges-param-user": "Listar solo los cambios de este usuario.",
        "apihelp-query+recentchanges-param-excludeuser": "No listar cambios de este usuario.",
        "apihelp-query+recentchanges-param-tag": "Listar solo los cambios con esta etiqueta.",
        "apihelp-query+recentchanges-param-prop": "Incluir piezas adicionales de información:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Añade el usuario responsable de la edición y añade una etiqueta si se trata de una IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Añade el identificador del usuario responsable de la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Añade el comentario de la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Añade el comentario analizado para la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Añade marcas para la edición.",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "Añade la longitud antigua y la longitud nueva de la página en bytes.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Etiqueta la edición si la página es una redirección.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiqueta ediciones verificables como verificadas o no verificadas.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Añade información de registro (identificador de registro, tipo de registro, etc.) a las entradas de registro.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Muestra las etiquetas de la entrada.",
        "apihelp-query+recentchanges-param-token": "Usa <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> en su lugar.",
        "apihelp-query+recentchanges-param-limit": "Cuántos cambios en total se devolverán.",
        "apihelp-query+recentchanges-param-type": "Cuántos tipos de cambios se mostrarán.",
+       "apihelp-query+recentchanges-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.",
        "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
+       "apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.",
        "apihelp-query+redirects-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+redirects-paramvalue-prop-pageid": "Identificador de página de cada redirección.",
        "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.",
        "apihelp-query+redirects-param-limit": "Cuántas redirecciones se devolverán.",
        "apihelp-query+redirects-example-simple": "Mostrar una lista de las redirecciones a la [[Main Page|Portada]]",
        "apihelp-query+redirects-example-generator": "Obtener información sobre todas las redirecciones a la [[Main Page|Portada]].",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Solo se puede usar con una sola página (modo n.º 2).",
        "apihelp-query+revisions-param-end": "Enumerar hasta esta marca de tiempo.",
        "apihelp-query+revisions-param-user": "Incluir solo las revisiones realizadas por el usuario.",
        "apihelp-query+revisions-param-excludeuser": "Excluir las revisiones realizadas por el usuario.",
+       "apihelp-query+revisions-param-tag": "Mostrar solo revisiones marcadas con esta etiqueta.",
        "apihelp-query+revisions-example-last5": "Mostrar las últimas 5 revisiones de la <kbd>Main Page</kbd>.",
        "apihelp-query+revisions+base-param-prop": "Las propiedades que se obtendrán para cada revisión:",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "El identificador de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Identificador del modelo de contenido de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentario del usuario para la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Comentario analizado del usuario para la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Texto de la revisión.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para la revisión.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere el modelo de contenido <code>$1</code>).",
+       "apihelp-query+revisions+base-param-limit": "Limitar la cantidad de revisiones que se devolverán.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Expandir las plantillas en el contenido de la revisión (requiere $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Generar el árbol de análisis sintáctico XML para el contenido de la revisión (requiere $1prop=content; reemplazado por <kbd>$1prop=parsetree</kbd>).",
+       "apihelp-query+revisions+base-param-parse": "Analizar el contenido de la revisión (requiere $1prop=content). Por motivos de rendimiento, si se utiliza esta opción, el valor de $1limit es forzado a 1.",
+       "apihelp-query+revisions+base-param-section": "Recuperar solamente el contenido de este número de sección.",
+       "apihelp-query+search-description": "Realizar una búsqueda de texto completa.",
+       "apihelp-query+search-param-namespace": "Buscar sólo en estos espacios de nombres.",
+       "apihelp-query+search-param-what": "Tipo de búsqueda que realizar.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
        "apihelp-query+search-param-prop": "Qué propiedades se devolverán:",
+       "apihelp-query+search-paramvalue-prop-size": "Añade el tamaño de la página en bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Añade el número de palabras de la página.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Añade la marca de tiempo de la última edición de la página.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Añade un fragmento analizado de la página.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Añade un fragmento analizado del título de la página.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Añade un fragmento analizado del título de la redirección.",
        "apihelp-query+search-paramvalue-prop-redirecttitle": "Añade el título de la redirección coincidente.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Añade un fragmento analizado del título de la sección correspondiente.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Añade el título de la sección correspondiente.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Añade un fragmento analizado de la categoría correspondiente.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Añade un booleano que indica si la búsqueda corresponde al contenido del archivo.",
        "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
+       "apihelp-query+search-param-backend": "Qué servidor de búsqueda utilizar, si no es el servidor por defecto.",
+       "apihelp-query+search-param-enablerewrites": "Habilita la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.",
        "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
        "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devuelve una lista de identificadores variables.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devuelve una lista de los protocolos que se permiten en los enlaces externos.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devuelve los valores predeterminados de las preferencias del usuario.",
+       "apihelp-query+siteinfo-param-numberingroup": "Muestra el número de usuarios en los grupos de usuarios.",
        "apihelp-query+siteinfo-example-simple": "Obtener información del sitio.",
        "apihelp-query+stashimageinfo-description": "Devuelve información del archivo para archivos escondidos.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias de $1filekey, para retrocompatibilidad.",
        "apihelp-query+stashimageinfo-example-params": "Devuelve las miniaturas de dos archivos escondidos.",
        "apihelp-query+tags-param-limit": "El número máximo de etiquetas para enumerar.",
        "apihelp-query+tags-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+tags-paramvalue-prop-name": "Añade el nombre de la etiqueta.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Agrega el mensaje de sistema para la etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-description": "Añade la descripción de la etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indicar si la etiqueta está definida.",
        "apihelp-query+tags-paramvalue-prop-source": "Obtiene las fuentes de la etiqueta, que pueden incluir <samp>extension</samp> para etiquetas definidas por extensiones y <samp>manual</samp> para etiquetas que pueden aplicarse manualmente por los usuarios.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la etiqueta aún se sigue aplicando.",
+       "apihelp-query+tags-example-simple": "Enumera las etiquetas disponibles.",
        "apihelp-query+templates-description": "Devuelve todas las páginas transcluidas en las páginas dadas.",
+       "apihelp-query+templates-param-namespace": "Mostrar plantillas solamente en estos espacios de nombres.",
        "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.",
        "apihelp-query+templates-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+transcludedin-description": "Encuentra todas las páginas que transcluyan las páginas dadas.",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Título de cada página.",
        "apihelp-query+transcludedin-param-namespace": "Incluir solo las páginas en estos espacios de nombres.",
        "apihelp-query+transcludedin-param-limit": "Cuántos se devolverán.",
+       "apihelp-query+transcludedin-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.",
        "apihelp-query+transcludedin-example-simple": "Obtener una lista de páginas transcluyendo <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Obtener información sobre las páginas que transcluyen <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-description": "Obtener todas las ediciones realizadas por un usuario.",
        "apihelp-query+usercontribs-param-limit": "Número máximo de contribuciones que se devolverán.",
+       "apihelp-query+usercontribs-param-namespace": "Enumerar solo las contribuciones en estos espacios de nombres.",
        "apihelp-query+usercontribs-param-prop": "Incluir piezas adicionales de información:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Añade el identificador de página y el de revisión.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Añade el comentario analizado de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Añade el nuevo tamaño de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Añade la diferencia de tamaño de la edición respecto de su progenitora.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiqueta ediciones verificadas.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista las etiquetas para la edición.",
        "apihelp-query+usercontribs-param-show": "Mostrar solo los elementos que coinciden con estos criterios. Por ejemplo, solo ediciones no menores: <kbd>$2show=!minor</kbd>.\n\nSi se establece <kbd>$2show=patrolled</kbd> o <kbd>$2show=!patrolled</kbd>, las revisiones más antiguas que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) no se mostrarán.",
+       "apihelp-query+usercontribs-param-tag": "Enumerar solo las revisiones con esta etiqueta.",
+       "apihelp-query+usercontribs-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.",
        "apihelp-query+usercontribs-example-user": "Mostrar contribuciones del usuario <kbd>Example</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar las contribuciones de todas las direcciones IP con el prefijo <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtener información sobre el usuario actual.",
        "apihelp-query+userinfo-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué motivo.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Añade una etiqueta <samp>messages</samp> si el usuario actual tiene mensajes pendientes.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos los grupos al que pertenece el usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Enumera todos los grupos a los que pertenece automáticamente el usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos los permisos que tiene el usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Enumera los grupos a los que el usuario actual se puede unir o retirar.",
        "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas las preferencias que haya establecido el usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Añade el número de ediciones del usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos los límites de velocidad aplicados al usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Añade el nombre real del usuario.",
        "apihelp-query+userinfo-paramvalue-prop-email": "Añade la dirección de correo electrónico del usuario y la fecha de autenticación por correo.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Reenvía la cabecera <code>Accept-Language</code> enviada por el cliente en un formato estructurado.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Añade la fecha de registro del usuario.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Añade el recuento de páginas no leídas de la lista de seguimiento del usuario (máximo $1, devuelve <samp>$2</samp> si el número es mayor).",
        "apihelp-query+userinfo-example-simple": "Obtener información sobre el usuario actual.",
        "apihelp-query+userinfo-example-data": "Obtener información adicional sobre el usuario actual.",
        "apihelp-query+users-description": "Obtener información sobre una lista de usuarios.",
        "apihelp-query+users-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué razón.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos los grupos a los que pertenece cada usuario.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Enumera todos los grupos a los que pertenece automáticamente un usuario.",
+       "apihelp-query+users-paramvalue-prop-rights": "Enumera todos los permisos que tiene cada usuario.",
        "apihelp-query+users-paramvalue-prop-editcount": "Añade el número de ediciones del usuario.",
+       "apihelp-query+users-paramvalue-prop-registration": "Añade la marca de tiempo del registro del usuario.",
        "apihelp-query+users-paramvalue-prop-gender": "Etiqueta el género del usuario. Devuelve \"masculino\", \"femenino\" o \"desconocido\".",
        "apihelp-query+users-example-simple": "Devolver información del usuario <kbd>Example</kbd>.",
+       "apihelp-query+watchlist-description": "Obtener los cambios recientes de las páginas de la lista de seguimiento del usuario actual.",
        "apihelp-query+watchlist-param-start": "El sello de tiempo para comenzar la enumeración",
        "apihelp-query+watchlist-param-end": "El sello de tiempo para finalizar la enumeración.",
+       "apihelp-query+watchlist-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.",
+       "apihelp-query+watchlist-param-user": "Mostrar solamente los cambios de este usuario.",
        "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
+       "apihelp-query+watchlist-param-limit": "Número de resultados que devolver en cada petición.",
        "apihelp-query+watchlist-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+watchlist-paramvalue-prop-ids": "Añade identificadores de revisiones y de páginas.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Añade el título de la página.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Añade el usuario que hizo la edición.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Añade el identificador de usuario de quien hizo la edición.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Añade el comentario analizado de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta las ediciones que están verificadas.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
+       "apihelp-query+watchlist-param-show": "Muestra solo los elementos que cumplan estos criterios. Por ejemplo, para ver solo ediciones menores realizadas por usuarios conectados, introduce $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes a páginas",
        "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
        "apihelp-query+watchlist-paramvalue-type-new": "Creaciones de páginas.",
        "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Cambios de pertenencia a categorías.",
+       "apihelp-query+watchlist-param-owner": "Utilizado junto con $1token para acceder a la lista de seguimiento de otro usuario.",
+       "apihelp-query+watchlist-example-props": "Obtener información adicional sobre la última revisión de páginas con cambios recientes en la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-allrev": "Obtener información sobre todos los cambios recientes de páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-generator": "Obtener información de página de las páginas con cambios recientes de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-generator-rev": "Obtener información de revisión de los cambios recientes de páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlist-example-wlowner": "Enumerar la última revisión de páginas con cambios recientes de la lista de seguimiento del usuario <kbd>Example</kbd>.",
+       "apihelp-query+watchlistraw-description": "Obtener todas las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-query+watchlistraw-param-namespace": "Mostrar solamente las páginas de los espacios de nombres dados.",
+       "apihelp-query+watchlistraw-param-limit": "Número de resultados que devolver en cada petición.",
        "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Añade la marca de tiempo de la última notificación al usuario sobre la edición.",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
+       "apihelp-query+watchlistraw-param-owner": "Utilizado junto con $1token para acceder a la lista de seguimiento de otro usuario.",
        "apihelp-query+watchlistraw-param-dir": "La dirección en la que se listará.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.",
        "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-removeauthenticationdata-description": "Elimina los datos de autentificación del usuario actual.",
+       "apihelp-resetpassword-description": "Enviar un email de reinicialización de la contraseña a un usuario.",
        "apihelp-revisiondelete-description": "Eliminar y restaurar revisiones",
        "apihelp-revisiondelete-param-hide": "Qué ocultar en cada revisión.",
        "apihelp-revisiondelete-param-show": "Qué mostrar en cada revisión.",
        "apihelp-revisiondelete-param-reason": "Motivo de la eliminación o restauración.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas que aplicar a la entrada en el registro de borrados.",
+       "apihelp-revisiondelete-example-revision": "Ocultar el contenido de la revisión <kbd>12345</kbd> de la página <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "Ocultar todos los datos de la entrada de registro <kbd>67890</kbd> con el motivo <kbd>BLP violation</kbd>.",
+       "apihelp-rollback-description": "Deshacer la última edición de la página.\n\nSi el último usuario que editó la página hizo varias ediciones consecutivas, todas ellas serán revertidas.",
        "apihelp-rollback-param-summary": "Resumen de edición personalizado. Si se deja vacío se utilizará el predeterminado.",
+       "apihelp-rollback-param-markbot": "Marcar las acciones revertidas y la reversión como ediciones por bots.",
+       "apihelp-rollback-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar seguimiento.",
+       "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery; Descubrimiento Muy Simple).",
+       "apihelp-rsd-example-simple": "Exportar el esquema RSD.",
+       "apihelp-setnotificationtimestamp-example-all": "Restablecer el estado de notificación para la totalidad de la lista de seguimiento.",
+       "apihelp-setnotificationtimestamp-example-page": "Restablecer el estado de notificación de <kbd>Main page</kbd>.",
+       "apihelp-setnotificationtimestamp-example-allpages": "Restablecer el estado de notificación de las páginas del espacio de nombres <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Cambiar el idioma de una página.",
+       "apihelp-setpagelanguage-description-disabled": "En este wiki no se permite modificar el idioma de las páginas.\n\nActiva <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para utilizar esta acción.",
+       "apihelp-setpagelanguage-param-title": "Título de la página cuyo idioma deseas cambiar. No se puede usar junto con <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Identificador de la página cuyo idioma deseas cambiar. No se puede usar junto con <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Código del idioma al que se desea cambiar la página. Usa <kbd>default</kbd> para restablecer la página al idioma predeterminado para el contenido del wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motivo del cambio.",
+       "apihelp-setpagelanguage-param-tags": "Cambiar las etiquetas que aplicar a la entrada de registro resultante de esta acción.",
+       "apihelp-setpagelanguage-example-language": "Cambiar el idioma de <kbd>Main Page</kbd> al euskera.",
+       "apihelp-setpagelanguage-example-default": "Cambiar el idioma de la página con identificador 123 al idioma predeterminado para el contenido del wiki.",
        "apihelp-stashedit-param-title": "Título de la página que se está editando.",
        "apihelp-stashedit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>new</kbd> para una sección nueva.",
        "apihelp-stashedit-param-sectiontitle": "El título de una sección nueva.",
        "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
        "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.",
        "apihelp-stashedit-param-summary": "Resumen de cambios.",
+       "apihelp-tag-description": "Añadir o borrar etiquetas de modificación de revisiones individuales o entradas de registro.",
        "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
        "apihelp-tag-param-reason": "Motivo del cambio.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-tag-example-log": "Eliminar la etiqueta <kbd>spam</kbd> de la entrada del registro con identificador 123 con el motivo <kbd>Wrongly applied</kbd>",
        "apihelp-unblock-description": "Desbloquear un usuario.",
-       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var>.",
+       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de usuario que desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
+       "apihelp-unblock-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de bloqueos.",
        "apihelp-unblock-example-id": "Desbloquear el bloqueo de ID #<kbd>105</kbd>",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Sorry Bob</kbd>",
+       "apihelp-undelete-param-title": "Título de la página que restaurar.",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
+       "apihelp-undelete-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de borrados.",
+       "apihelp-undelete-example-page": "Restaurar la página <kbd>Main page</kbd>.",
        "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
+       "apihelp-upload-param-filename": "Nombre del archivo de destino.",
        "apihelp-upload-param-tags": "Cambiar etiquetas para aplicar a la entrada del registro de subidas y a la revisión de página de archivo.",
+       "apihelp-upload-param-text": "Texto de página inicial para archivos nuevos.",
        "apihelp-upload-param-watch": "Vigilar la página.",
+       "apihelp-upload-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, utilizar las preferencias o no cambiar el estado de seguimiento.",
        "apihelp-upload-param-ignorewarnings": "Ignorar las advertencias.",
+       "apihelp-upload-param-file": "Contenido del archivo.",
+       "apihelp-upload-param-url": "URL de la que obtener el archivo.",
+       "apihelp-upload-param-sessionkey": "Idéntico a $1filekey, mantenido por razones de retrocompatibilidad.",
+       "apihelp-upload-param-filesize": "Tamaño de archivo total de la carga.",
+       "apihelp-upload-param-offset": "Posición del fragmento en bytes.",
+       "apihelp-upload-param-chunk": "Contenido del fragmento.",
+       "apihelp-upload-param-async": "Realizar de forma asíncrona las operaciones de archivo potencialmente grandes cuando sea posible.",
        "apihelp-upload-example-url": "Subir desde una URL.",
+       "apihelp-userrights-description": "Cambiar la pertenencia a grupos de un usuario.",
        "apihelp-userrights-param-user": "Nombre de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
        "apihelp-userrights-param-add": "Agregar el usuario a estos grupos.",
        "apihelp-userrights-param-remove": "Eliminar el usuario de estos grupos.",
        "apihelp-userrights-param-reason": "Motivo del cambio.",
+       "apihelp-userrights-param-tags": "Cambia las etiquetas que aplicar a la entrada del registro de derechos del usuario.",
        "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "Añade el usuario con identificador <kbd>123</kbd> al grupo <kbd>bot</kbd>, y lo borra de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "Valida una contraseña contra las políticas de contraseñas del wiki.\n\nLa validez es <samp>Good</samp> si la contraseña es aceptable, <samp>Change</samp> y la contraseña se puede usar para iniciar sesión pero debe cambiarse o <samp>Invalid</samp> si la contraseña no se puede usar.",
+       "apihelp-validatepassword-param-password": "Contraseña para validar.",
+       "apihelp-validatepassword-param-user": "Nombre de usuario, para pruebas de creación de cuentas. El usuario nombrado no debe existir.",
+       "apihelp-validatepassword-param-email": "Dirección de correo electrónico, para pruebas de creación de cuentas.",
+       "apihelp-validatepassword-param-realname": "Nombre real, para pruebas de creación de cuentas.",
+       "apihelp-validatepassword-example-1": "Validar la contraseña <kbd>foobar</kbd> para el usuario actual.",
+       "apihelp-validatepassword-example-2": "Validar la contraseña <kbd>qwerty</kbd> para la creación del usuario <kbd>Example</kbd>.",
+       "apihelp-watch-description": "Añadir o borrar páginas de la lista de seguimiento del usuario actual.",
+       "apihelp-watch-param-title": "La página que seguir o dejar de seguir. Usa <var>$1titles</var> en su lugar.",
+       "apihelp-watch-param-unwatch": "Si se define, en vez de seguir la página, se dejará de seguir.",
        "apihelp-watch-example-watch": "Vigilar la página <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-generator": "Seguir las primeras páginas del espacio de nombres principal.",
        "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
        "apihelp-json-description": "Extraer los datos de salida en formato JSON.",
        "apihelp-json-param-callback": "Si se especifica, envuelve la salida dentro de una llamada a una función dada. Por motivos de seguridad, cualquier dato específico del usuario estará restringido.",
        "apihelp-none-description": "No extraer nada.",
        "apihelp-php-description": "Extraer los datos de salida en formato serializado PHP.",
        "apihelp-rawfm-description": "Extraer los datos de salida, incluidos los elementos de depuración, en formato JSON (embellecido en HTML).",
-       "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:mediawiki}} que termine en <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:MediaWiki}} que termine en <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si se especifica, añade un espacio de nombres XML.",
+       "api-format-title": "Resultado de la API de MediaWiki",
+       "api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro <var>format</var> para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea <kbd>format=$2</kbd>.\n\nPara obtener más información, consulta la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].",
+       "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
+       "api-help-title": "Ayuda de la API de MediaWiki",
+       "api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está en desuso.",
+       "api-help-flag-internal": "<strong>Este módulo es interno o inestable.</strong> Su funcionamiento puede cambiar sin previo aviso.",
        "api-help-flag-readrights": "Este módulo requiere permisos de lectura.",
        "api-help-flag-writerights": "Este módulo requiere permisos de escritura.",
        "api-help-flag-mustbeposted": "Este módulo solo acepta solicitudes POST.",
        "api-help-param-integer-min": "{{PLURAL:$1|1=El valor no debe ser menor|2=Los valores no deben ser menores}} a $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=El valor no debe ser mayor|2=Los valores no deben ser mayores}} a $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=El valor debe|2=Los valores deben}} estar entre $2 y $3.",
-       "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd>.",
+       "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd> o con una [[Special:ApiHelp/main#main/datatypes|alternativa]].",
        "api-help-param-multi-max": "El número máximo de los valores es {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para los bots).",
+       "api-help-param-multi-all": "Para especificar todos los valores, utiliza <kbd>$1</kbd>.",
        "api-help-param-default": "Predeterminado: $1",
        "api-help-param-default-empty": "Predeterminado: <span class=\"apihelp-empty\">(vacío)</span>",
        "api-help-param-continue": "Cuando haya más resultados disponibles, utiliza esto para continuar.",
        "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedido a|Concedidos a}}: $2",
+       "api-help-open-in-apisandbox": "<small>[abrir en la zona de pruebas]</small>",
+       "api-help-authmanagerhelper-messageformat": "Formato utilizado para los mensajes devueltos.",
+       "api-help-authmanagerhelper-preservestate": "Preservar el estado de un intento fallido anterior de inicio de sesión, si es posible.",
+       "apierror-articleexists": "El artículo que intentaste crear ya estaba creado.",
+       "apierror-assertbotfailed": "La aserción de que el usuario tiene el derecho <code>bot</code> falló.",
+       "apierror-assertnameduserfailed": "La aserción de que el usuario es «$1» falló.",
+       "apierror-assertuserfailed": "La aserción de que el usuario está conectado falló.",
+       "apierror-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
+       "apierror-badconfig-resulttoosmall": "El valor de <code>$wgAPIMaxResultSize</code> en este wiki es demasiado pequeño como para contener información básica de resultados.",
+       "apierror-baddiff": "La comparación no puede recuperarse. Una o ambas revisiones no existen o no tienes permiso para verlas.",
+       "apierror-badformat-generic": "El formato solicitado $1 no es compatible con el modelo de contenido $2.",
+       "apierror-badformat": "El formato solicitado $1 no es compatible con el modelo de contenido $2 utilizado por $3.",
+       "apierror-badgenerator-notgenerator": "El módulo <kbd>$1</kbd> no puede utilizarse como un generador.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> desconocido.",
+       "apierror-badip": "El parámetro IP no es válido.",
+       "apierror-badmd5": "El hash MD5 suministrado es incorrecto.",
+       "apierror-badmodule-badsubmodule": "El módulo <kbd>$1</kbd> no tiene un submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "El módulo <kbd>$1</kbd> no tiene submódulos.",
+       "apierror-badparameter": "Valor no válido para el parámetro <var>$1</var>.",
+       "apierror-badquery": "La consulta no es válida.",
+       "apierror-badtimestamp": "Valor no válido \"$2\" para el parámetro de marca de tiempo <var>$1</var>.",
+       "apierror-badurl": "Valor no válido \"$2\" para el parámetro de URL <var>$1</var>.",
+       "apierror-baduser": "Valor no válido \"$2\" para el parámetro de usuario <var>$1</var>.",
+       "apierror-blockedfrommail": "Se te ha bloqueado de enviar email.",
+       "apierror-blocked": "Se te ha bloqueado de editar.",
+       "apierror-cannotreauthenticate": "Esta acción no está disponible, ya que tu identidad no se puede verificar.",
+       "apierror-cannotviewtitle": "No tienes permiso para ver $1.",
+       "apierror-cantblock-email": "No tienes permiso para bloquear a los usuarios el envío de correo electrónico a través de la wiki.",
+       "apierror-cantblock": "No tienes permiso para bloquear usuarios.",
+       "apierror-cantchangecontentmodel": "No tienes permiso para cambiar el modelo de contenido de una página.",
+       "apierror-canthide": "No tienes permiso para ocultar nombres de usuario del registro de bloqueos.",
+       "apierror-cantimport-upload": "No tienes permiso para importar páginas subidas.",
+       "apierror-cantimport": "No tienes permiso para importar páginas.",
+       "apierror-cantoverwrite-sharedfile": "El fichero objetivo existe en un repositorio compartido y no tienes permiso para reemplazarlo.",
+       "apierror-cantsend": "No estás conectado, no tienes una dirección de correo electrónico confirmada o no tienes permiso para enviar correo electrónico a otros usuarios, así que no puedes enviar correo electrónico.",
+       "apierror-cantundelete": "No se ha podido restaurar: puede que las revisiones solicitadas no existan o que ya se hayan restaurado.",
+       "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
+       "apierror-contentserializationexception": "La serialización de contenido falló: $1",
+       "apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
+       "apierror-databaseerror": "[$1] Error en la consulta de la base de datos.",
+       "apierror-deletedrevs-param-not-1-2": "El parámetro <var>$1</var> no se puede utilizar en los modos 1 o 2.",
+       "apierror-deletedrevs-param-not-3": "El parámetro <var>$1</var> no se puede usar en modo 3.",
+       "apierror-emptynewsection": "Crear secciones vacías no es posible.",
+       "apierror-emptypage": "Crear páginas vacías no está permitido.",
+       "apierror-exceptioncaught": "[$1] Excepción capturada: $2",
+       "apierror-filedoesnotexist": "El archivo no existe.",
+       "apierror-fileexists-sharedrepo-perm": "El archivo objetivo existe en un repositorio compartido. Usa el parámetro <var>ignorewarnings</var> para reemplazarlo.",
+       "apierror-filenopath": "No se pudo obtener la ruta local del archivo.",
+       "apierror-filetypecannotberotated": "El tipo de archivo no se puede girar.",
+       "apierror-formatphp": "Esta respuesta no se puede representar con <kbd>format=php</kbd>. Véase https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "El título de <kbd>$1</kbd> debe ser un archivo.",
+       "apierror-import-unknownerror": "Error desconocido en la importación: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> no puede ser mayor que $2 (fijado a $3) para bots o administradores de sistema.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> no puede ser mayor que $2 (fijado a $3) para usuarios.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> no puede ser menor que $2 (fijado a $3).",
+       "apierror-invalidcategory": "El nombre de la categoría que has introducido no es válida.",
+       "apierror-invalidexpiry": "Tiempo de expiración \"$1\" no válido.",
+       "apierror-invalidlang": "Código de idioma no válido para el parámetro <var>$1</var>.",
+       "apierror-invalidparammix-cannotusewith": "El parámetro <kbd>$1</kbd> no se puede utilizar junto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "El parámetro <kbd>$1</kbd> solo se puede utilizar junto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> no se puede combinar con los parámetros <var>oldid</var>, <var>pageid</var> y <var>page</var>. Por favor, utiliza <var>title</var> y <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Los parámetros}} $1 no se pueden utilizar juntos.",
+       "apierror-invalidsection": "El parámetro de sección debe ser un ID de sección válido, o bien <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "El hash SHA1Base36 proporcionado no es válido.",
+       "apierror-invalidsha1hash": "El hash SHA1 proporcionado no es válido.",
+       "apierror-invalidtitle": "Título incorrecto \"$1\".",
+       "apierror-invalidurlparam": "Valor no válido para <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nombre de usuario «$1» no válido.",
+       "apierror-invaliduserid": "El identificador de usuario <var>$1</var> no es válido.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|El parámetro|Al menos uno de los parámetros}} $1 es necesario.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|El parámetro|Uno de los parámetros}} $1 es necesario.",
+       "apierror-missingparam": "Se debe establecer el parámetro <var>$1</var>.",
+       "apierror-missingrev-pageid": "No hay ninguna revisión actual de la página con ID $1.",
+       "apierror-missingtitle-createonly": "Los títulos faltantes solo se pueden proteger con <kbd>create</kbd>.",
+       "apierror-missingtitle": "El título especificado no existe.",
+       "apierror-missingtitle-byname": "La página $1 no existe.",
+       "apierror-moduledisabled": "El módulo <kbd>$1</kbd> ha sido deshabilitado.",
+       "apierror-multival-only-one-of": "Solo {{PLURAL:$3|se permite el valor|se permiten los valores}} $2 para el parámetro <var>$1</var>.",
+       "apierror-multival-only-one": "Solo se permite un valor para el parámetro <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> no se puede utilizar más que con una sola página.",
+       "apierror-mustbeloggedin-changeauth": "Debes estar conectado para poder cambiar los datos de autentificación.",
+       "apierror-mustbeloggedin-generic": "Debes estar conectado.",
+       "apierror-mustbeloggedin-linkaccounts": "Debes estar conectado para enlazar cuentas.",
+       "apierror-mustbeloggedin-removeauth": "Debes estar conectado para borrar datos de autentificación.",
+       "apierror-mustbeloggedin": "Debes estar conectado para $1.",
+       "apierror-mustbeposted": "El módulo <kbd>$1</kbd> requiere una petición POST.",
+       "apierror-nochanges": "No se solicitó ningún cambio.",
+       "apierror-noedit-anon": "Los usuarios anónimos no pueden editar páginas.",
+       "apierror-noedit": "No tienes permiso para editar páginas.",
+       "apierror-noimageredirect-anon": "Los usuarios anónimos no pueden crear redirecciones de imágenes.",
+       "apierror-noimageredirect": "No tienes permiso para crear redirecciones de imágenes.",
+       "apierror-nosuchlogid": "No hay ninguna entrada de registro con identificador $1.",
+       "apierror-nosuchpageid": "No hay ninguna página con identificador $1.",
+       "apierror-nosuchrcid": "No hay ningún cambio reciente con identificador $1.",
+       "apierror-nosuchrevid": "No hay ninguna revisión con identificador $1.",
+       "apierror-nosuchsection": "No hay ninguna sección $1.",
+       "apierror-nosuchsection-what": "No hay ninguna sección $1 en $2.",
+       "apierror-nosuchuserid": "No hay ningún usuario con ID $1.",
+       "apierror-notarget": "No has especificado un destino válido para esta acción.",
+       "apierror-opensearch-json-warnings": "No se pueden representar los avisos en formato JSON de OpenSearch.",
+       "apierror-pagecannotexist": "En este espacio de nombres no se permiten páginas reales.",
+       "apierror-pagelang-disabled": "En este wiki no se puede cambiar el idioma de una página.",
+       "apierror-paramempty": "El parámetro <var>$1</var> no puede estar vacío.",
+       "apierror-permissiondenied": "No tienes permiso para $1.",
+       "apierror-permissiondenied-generic": "Permiso denegado.",
+       "apierror-permissiondenied-unblock": "No tienes permiso para desbloquear usuarios.",
+       "apierror-promised-nonwrite-api": "La cabecera HTTP <code>Promise-Non-Write-API-Action</code> no se puede enviar a módulos de la API en modo escritura.",
+       "apierror-protect-invalidaction": "Tipo de protección «$1» no válido.",
+       "apierror-protect-invalidlevel": "Nivel de protección «$1» no válido.",
+       "apierror-readapidenied": "Necesitas permiso de lectura para utilizar este módulo.",
+       "apierror-readonly": "El wiki está actualmente en modo de solo lectura.",
+       "apierror-reauthenticate": "No te has autentificado recientemente en esta sesión. Por favor, vuelve a autentificarte.",
+       "apierror-revdel-paramneeded": "Se requiere al menos un valor para <var>hide</var> y/o <var>show</var>.",
+       "apierror-revwrongpage": "r$1 no es una revisión de $2.",
+       "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.",
+       "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.",
+       "apierror-show": "Parámetro incorrecto: no se pueden proporcionar valores mutuamente excluyentes.",
+       "apierror-spamdetected": "Tu edición fue rechazada por contener un fragmento de spam: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "No tienes permiso para ver los resultados de esta página especial.",
+       "apierror-stashwrongowner": "Propietario incorrecto: $1",
+       "apierror-systemblocked": "Has sido bloqueado automáticamente por el software MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "La expansión de plantillas solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
+       "apierror-unknownaction": "La acción especificada, <kbd>$1</kbd>, no está reconocida.",
+       "apierror-unknownerror-nocode": "Error desconocido.",
+       "apierror-unknownerror": "Error desconocido: «$1»",
+       "apierror-unknownformat": "Formato no reconocido «$1».",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro no reconocido|Parámetros no reconocidos}}: $1.",
+       "apierror-unrecognizedvalue": "Valor no reconocido para el parámetro <var>$1</var>: $2.",
+       "apierror-urlparamnormal": "No se pudieron normalizar los parámetros de imagen de $1.",
+       "apierror-writeapidenied": "No tienes permiso para editar este wiki a través de la API.",
+       "apiwarn-alldeletedrevisions-performance": "Para conseguir un mejor rendimiento a la hora de generar títulos, establece <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "No se pudo analizar <var>$1urlparam</var> para $2. Se utilizarán solamente la anchura y altura.",
+       "apiwarn-badutf8": "El valor pasado para <var>$1</var> contiene datos no válidos o no normalizados. Los datos textuales deberían estar en Unicode válido, normalizado en NFC y sin caracteres de control C0 excepto HT (\\t), LF (\\n) y CR (\\r).",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>prop=deletedrevisions</kbd> o <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-httpsexpected": "Se ha utilizado HTTP cuando se esperaba HTTPS.",
+       "apiwarn-deprecation-parameter": "El parámetro <var>$1</var> ha quedado obsoleto.",
+       "apiwarn-deprecation-purge-get": "El uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Usa POST en su lugar.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>$2</kbd>.",
+       "apiwarn-invalidcategory": "\"$1\" no es una categoría.",
+       "apiwarn-invalidtitle": "«$1» no es un título válido.",
+       "apiwarn-invalidxmlstylesheetext": "Las hojas de estilo deben tener la extensión <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "La hoja de estilos especificada no es válida o no existe.",
+       "apiwarn-invalidxmlstylesheetns": "La hoja de estilos debería estar en el espacio de nombres {{ns:MediaWiki}}.",
+       "apiwarn-notfile": "\"$1\" no es un archivo.",
+       "apiwarn-parse-nocontentmodel": "No se proporcionó <var>title</var> ni <var>contentmodel</var>. Se asume $1.",
+       "apiwarn-tokennotallowed": "La acción «$1» no está permitida para el usuario actual.",
+       "apiwarn-truncatedresult": "Se ha truncado este resultado porque de otra manera sobrepasaría el límite de $1 bytes.",
+       "apiwarn-unclearnowtimestamp": "El paso de «$2» para el parámetro <var>$1</var> de la marca de tiempo ha quedado obsoleto. Si por alguna razón necesitas especificar de forma explícita la hora actual sin calcularla desde el lado del cliente, utiliza <kbd>now</kbd> («ahora»).",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor no reconocido|Valores no reconocidos}} para el parámetro <var>$1</var>: $2.",
+       "apiwarn-validationfailed-badchars": "caracteres no válidos en la clave (solamente se admiten los caracteres <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code> y <code>-</code>).",
+       "apiwarn-validationfailed-badpref": "no es una preferencia válida.",
+       "apiwarn-validationfailed-cannotset": "no puede ser establecido por este módulo.",
+       "apiwarn-validationfailed-keytoolong": "clave demasiado larga (no puede tener más de $1 bytes).",
+       "apiwarn-validationfailed": "Error de validación de <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Aviso de seguridad</strong>: <var>$wgDebugAPI</var> está habilitado.",
+       "api-feed-error-title": "Error ($1)",
+       "api-usage-docref": "Véase $1 para el uso de la API.",
+       "api-exception-trace": "$1 en $2($3)\n$4",
        "api-credits-header": "Créditos",
        "api-credits": "Desarrolladores de la API:\n* Roan Kattouw (desarrollador principal, sep. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador y desarrollador principal, sep. 2006-sep. 2007)\n* Brad Jorsch (desarrollador principal, 2013-actualidad)\n\nEnvía comentarios, sugerencias y preguntas a mediawiki-api@lists.wikimedia.org\no informa de un error en https://phabricator.wikimedia.org/."
 }
index 9a923c7..52a526d 100644 (file)
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
+       "apihelp-main-param-responselanginfo": "Inclure les langues utilisées pour <var>uselang</var> et <var>errorlang</var> dans le résultat.",
        "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST).\n\nPour les requêtes authentifiées, il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, des entêtes <code>Access-Control-Allow-Origin</code> et <code>Access-Control-Allow-Credentials</code> seront positionnés.\n\nPour les requêtes non authentifiées, spécifiez la valeur <kbd>*</kbd>. Cela positionnera l’entête <code>Access-Control-Allow-Origin</code>, mais <code>Access-Control-Allow-Credentials</code> vaudra <code>false</code> et toutes les données spécifiques à l’utilisateur seront filtrées.",
        "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoie une liste de codes de langue, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
+       "apihelp-main-param-errorformat": "Format à utiliser pour la sortie du texte d’avertissement et d’erreur.\n; plaintext: Wikitexte avec balises HTML supprimées et les entités remplacées.\n; wikitext: wikitexte non analysé.\n; html: HTML.\n; raw: Clé de message et paramètres.\n; none: Aucune sortie de texte, uniquement les codes erreur.\n; bc: Format utilisé avant MédiaWiki 1.29. <var>errorlang</var> et <var>errorsuselocal</var> sont ignorés.",
+       "apihelp-main-param-errorlang": "Langue à utiliser pour les avertissements et les erreurs. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoyant une liste de codes de langue, ou spécifier <kbd>content</kbd> pour utiliser la langue du contenu de ce wiki, ou spécifier <kbd>uselang</kbd> pour utiliser la même valeur que le paramètre <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "S’il est fourni, les textes d’erreur utiliseront des messages adaptés à la langue dans l’espace de noms {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquer un utilisateur.",
-       "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
+       "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer. Ne peut pas être utilisé en même temps que <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID d'utilisateur à bloquer. Ne peut pas être utilisé avec <var>$1user</var>.",
        "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
        "apihelp-block-param-reason": "Motif du blocage.",
        "apihelp-block-param-anononly": "Bloquer uniquement les utilisateurs anonymes (c’est-à-dire désactiver les modifications anonymes pour cette adresse IP).",
@@ -55,6 +60,7 @@
        "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
+       "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
        "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
        "apihelp-changeauthenticationdata-description": "Modifier les données d’authentification pour l’utilisateur actuel.",
        "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée",
        "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport",
        "apihelp-delete-description": "Supprimer une page.",
-       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
+       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
        "apihelp-delete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des suppressions.",
        "apihelp-edit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
        "apihelp-edit-param-token": "Le jeton doit toujours être envoyé en tant que dernier paramètre, ou au moins après le paramètre $1text.",
        "apihelp-edit-example-edit": "Modifier une page",
-       "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>",
-       "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique",
+       "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>.",
+       "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique.",
        "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.",
        "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
        "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.",
        "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.",
-       "apihelp-feedrecentchanges-param-invert": "Tous les espaces de nom sauf le sélectionné.",
+       "apihelp-feedrecentchanges-param-invert": "Tous les espaces de noms sauf celui sélectionné.",
        "apihelp-feedrecentchanges-param-associated": "Inclure l’espace de noms associé (discussion ou principal).",
        "apihelp-feedrecentchanges-param-days": "Jours auxquels limiter le résultat.",
        "apihelp-feedrecentchanges-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
        "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
+       "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléchargement.",
        "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
        "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
        "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-templates": "Pour les importations interwiki : importer aussi tous les modèles inclus.",
        "apihelp-import-param-namespace": "Importer vers cet espace de noms. Impossible à utiliser avec <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page. Impossible à utiliser avec <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Modifier les balises à appliquer à l'entrée du journal d'importation et à la version zéro des pages importées.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
        "apihelp-linkaccount-description": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
        "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
        "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
-       "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui se produirait au cours de l’opération.",
+       "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui surviendrait au cours de l’opération.",
+       "apihelp-managetags-param-tags": "Modifier les balises à appliquer à l’entrée du journal de gestion des balises.",
        "apihelp-managetags-example-create": "Créer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Supprimer la page et la redirection de la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
+       "apihelp-move-param-tags": "Modifier les balises à appliquer à l'entrée du journal des renommages et à la version zéro de la page de destination.",
        "apihelp-move-example-move": "Déplacer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
        "apihelp-opensearch-param-search": "Chaîne de recherche.",
        "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
        "apihelp-query+allmessages-param-enableparser": "Si positionné pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si positionné, ne pas inclure le contenu des messages dans la sortie.",
-       "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais sous forme d’une page MediaWiki:.\nCela liste toutes les pages MediaWiki:, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais dans l’espace de noms {{ns:MediaWiki}}.\nCela liste toutes les pages de l’espace de noms {{ns:MediaWiki}}, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Arguments à substituer dans le message.",
        "apihelp-query+allmessages-param-filter": "Renvoyer uniquement les messages avec des noms contenant cette chaîne.",
        "apihelp-query+allmessages-param-customised": "Renvoyer uniquement les messages dans cet état de personnalisation.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
        "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
        "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Si <kbd>$2prop=badfile</kbd> est positionné, il s'agit du titre de la page utilisé pour évaluer la [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
        "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008",
        "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.",
-       "apihelp-query+usercontribs-param-user": "Les utilisateurs pour lesquels récupérer les contributions.",
-       "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Écrase $1user.",
+       "apihelp-query+usercontribs-param-user": "Utilisateurs pour lesquels il faut récupérer les contributions.   Ne peut pas être utilisé avec <var>$1userid</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Ne peut pas être utilisé avec <var>$1user</var> ou <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Utilisateurs pour lesquels il faut récupérer les contributions.   Ne peut pas être utilisé avec <var>$1user</var> ou <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Lister uniquement les contributions dans ces espaces de nom.",
        "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Ajoute l’ID de page et l’ID de révision.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indique si un compte peut être créé pour les noms d’utilisateurs valides mais non enregistrés.",
        "apihelp-query+users-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
+       "apihelp-query+users-param-userids": "Une liste d’ID utilisateur pour lesquels obtenir des informations.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-revisiondelete-param-show": "Quoi démasquer pour chaque révision",
        "apihelp-revisiondelete-param-suppress": "S’il faut supprimer les données aux administrateurs comme aux autres.",
        "apihelp-revisiondelete-param-reason": "Motif de suppression ou d’annulation de suppression.",
+       "apihelp-revisiondelete-param-tags": "Balises à appliquer à l’entrée dans le journal de suppression.",
        "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>",
        "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
        "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
        "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Modifier la langue d’une page.",
+       "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
+       "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser <kbd>defaut</kbd> pour réinitialiser la page sur la langue par défaut du contenu du wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motif de la modification.",
+       "apihelp-setpagelanguage-param-tags": "Modifier les balises à appliquer à l'entrée du journal résultant de cette action.",
+       "apihelp-setpagelanguage-example-language": "Changer la langue de la <kbd>page principale</kbd> en basque.",
+       "apihelp-setpagelanguage-example-default": "Remplacer la langue de la page ayant l'ID 123 par la langue par défaut du contenu du wiki.",
        "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.",
        "apihelp-stashedit-param-title": "Titre de la page en cours de modification.",
        "apihelp-stashedit-param-section": "Numéro de section. <kbd>0</kbd> pour la section du haut, <kbd>new</kbd> pour une nouvelle section.",
        "apihelp-tag-param-add": "Balises à ajouter. Seules les balises définies manuellement peuvent être ajoutées.",
        "apihelp-tag-param-remove": "Balises à supprimer. Seules les balises qui sont soit définies manuellement soit pas du tout définies peuvent être supprimées.",
        "apihelp-tag-param-reason": "Motif de la modification.",
+       "apihelp-tag-param-tags": "Balises à appliquer à l’entrée de journal qui sera créée en résultat de cette action.",
        "apihelp-tag-example-rev": "Ajoute la balise <kbd>vandalism</kbd> à partir de l’ID de révision 123 sans indiquer de motif",
        "apihelp-tag-example-log": "Supprimer la balise <kbd>spam</kbd> à partir de l’ID d’entrée de journal 123 avec le motif <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "Obtenir les jetons pour les actions modifiant les données.\n\nCe module est obsolète, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Récupérer un jeton de modification (par défaut).",
        "apihelp-tokens-example-emailmove": "Récupérer un jeton de courriel et un jeton de déplacement.",
        "apihelp-unblock-description": "Débloquer un utilisateur.",
-       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de l'utilisateur à débloquer. Ne peut être utilisé avec <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motif de déblocage.",
        "apihelp-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.",
        "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif pour la modification.",
+       "apihelp-userrights-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des droits utilisateur.",
        "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>bot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID <kbd>123</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
+       "apihelp-validatepassword-description": "Valider un mot de passe en suivant les règles des mots de passe du wiki.\n\nLa validation est <samp>Good</samp> si le mot de passe est acceptable, <samp>Change</samp> s'il peut être utilisé pour se connecter et doit être changé, ou  <samp>Invalid</samp> s'il n'est pas utilisable.",
+       "apihelp-validatepassword-param-password": "Mot de passe à valider.",
+       "apihelp-validatepassword-param-user": "Nom de l'utilisateur, pour tester la création de compte. L'utilisateur ne doit pas déja exister.",
+       "apihelp-validatepassword-param-email": "Adresse courriel, pour tester la création de compte.",
+       "apihelp-validatepassword-param-realname": "Vrai nom, pour tester la création de compte.",
+       "apihelp-validatepassword-example-1": "Valider le mot de passe <kbd>foobar</kbd> pour l'utilisateur actuel.",
+       "apihelp-validatepassword-example-2": "Valider le mot de passe <kbd>qwerty</kbd> pour la création de l'utilisateur <kbd>Example</kbd>.",
        "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
        "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
-       "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:mediawiki}} se terminant par <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:MediaWiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-help-authmanagerhelper-returnurl": "Renvoyer l’URL pour les flux d’authentification tiers, qui doit être absolue. Cela ou <var>$1continue</var> est obligatoire.\n\nDès réception d’une réponse <samp>REDIRECT</samp>, vous ouvrirez typiquement un navigateur ou un affichage web vers l’URL <samp>redirecttarget</samp> spécifiée pour un flux d’authentification tiers. Une fois ceci terminé, le tiers renverra le navigateur ou l’affichage web vers cette URL. Vous devez extraire toute requête ou paramètre POST de l’URL et les passer comme une requête <var>$1continue</var> à ce module de l’API.",
        "api-help-authmanagerhelper-continue": "Cette requête est une continuation après une précédente réponse <samp>UI</samp> ou <samp>REDIRECT</samp>. Cela ou <var>$1returnurl</var> est obligatoire.",
        "api-help-authmanagerhelper-additional-params": "Ce module accepte des paramètres supplémentaires selon les requêtes d’authentification disponibles. Utiliser <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd> (ou une réponse précédente de ce module, le cas échéant) pour déterminer les requêtes disponibles et les champs qu’elles utilisent.",
+       "apierror-allimages-redirect": "Utiliser <kbd>gaifilterredir=nonredirects</kbd> au lieu de <var>redirects</var> quand <kbd>allimages</kbd> est utilisé comme générateur.",
+       "apierror-allpages-generator-redirects": "Utiliser <kbd>gapfilterredir=nonredirects</kbd> au lieu de <var>redirects</var> quand <kbd>allpages</kbd> est utilisé comme un générateur.",
+       "apierror-appendnotsupported": "Impossible d’ajouter aux pages utilisant le modèle de contenu $1.",
+       "apierror-articleexists": "L’article que vous essayez de créer l’a déjà été.",
+       "apierror-assertbotfailed": "La vérification que l’utilisateur a le droit <code>bot</code> a échoué.",
+       "apierror-assertnameduserfailed": "La vérification que l’utilisateur est « $1 » a échoué.",
+       "apierror-assertuserfailed": "La vérification que l’utilisateur est connecté a échoué.",
+       "apierror-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
+       "apierror-badconfig-resulttoosmall": "La valeur de <code>$wgAPIMaxResultSize</code> sur ce wiki est trop petite pour contenir des informations de résultat basiques.",
+       "apierror-badcontinue": "Paramètre de continuation non valide. Vous devez passer la valeur d’origine renvoyée par la requête précédente.",
+       "apierror-baddiff": "La différence ne peut être récupérée. Une ou les deux révisions n’existent pas ou vous n’avez pas le droit de les voir.",
+       "apierror-baddiffto": "<var>$1diffto</var> doit être fixé à un nombre positif ou nul, <kbd>prev</kbd>, <kbd>next</kbd> ou <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2.",
+       "apierror-badformat": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2 utilisé par $3.",
+       "apierror-badgenerator-notgenerator": "Le module <kbd>$1</kbd> ne peut pas être utilisé comme générateur.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> inconnu.",
+       "apierror-badip": "Paramètre IP non valide.",
+       "apierror-badmd5": "Le hachage MD5 fourni n’était pas correct.",
+       "apierror-badmodule-badsubmodule": "Le module <kbd>$1</kbd> n’a pas de sous-module « $2 ».",
+       "apierror-badmodule-nosubmodules": "Le module <kbd>$1</kbd> n’a pas de sous-modules.",
+       "apierror-badparameter": "Valeur non valide pour le paramètre <var>$1</var>.",
+       "apierror-badquery": "Requête invalide.",
+       "apierror-badtimestamp": "Valeur non valide « $2 » pour le paramètre de référence horaire  <var>$1</var>.",
+       "apierror-badtoken": "Jeton CSRF non valide.",
+       "apierror-badupload": "Le paramètre de téléchargement de fichier <var>$1</var> n’est pas un téléchargement de fichier ; assurez-vous d’utiliser <code>multipart/form-data</code> pour votre POST et d’inclure un nom de fichier dans l’entête <code>Content-Disposition</code>.",
+       "apierror-badurl": "Valeur « $2 » non valide pour le paramètre d’URL <var>$1</var>.",
+       "apierror-baduser": "Valeur « $2 » non valide pour le paramètre utilisateur <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "La séparation multi-valeur U+001F ne peut être utilisée que pour des paramètres multi-valeurs.",
+       "apierror-bad-watchlist-token": "Jeton de liste de suivi fourni non valide. Veuillez mettre un jeton valide dans [[Special:Preferences]].",
+       "apierror-blockedfrommail": "Vous avez été bloqué pour l’envoi de courriel.",
+       "apierror-blocked": "Vous avez été bloqué pour modifier.",
+       "apierror-botsnotsupported": "Cette interface n’est pas supportée pour les robots.",
+       "apierror-cannotreauthenticate": "Cette action n’est pas disponible car votre identité ne peut pas être vérifiée.",
+       "apierror-cannotviewtitle": "Vous n’êtes pas autorisé à voir $1.",
+       "apierror-cantblock-email": "Vous n’avez pas le droit de bloquer des utilisateurs pour envoyer des courriels via ce wiki.",
+       "apierror-cantblock": "Vous n’avez pas le droit de bloquer des utilisateurs.",
+       "apierror-cantchangecontentmodel": "Vous n’avez pas le droit de modifier le modèle de contenu d’une page.",
+       "apierror-canthide": "Vous n’avez pas le droit de masquer les noms d’utilisateur du journal de blog.",
+       "apierror-cantimport-upload": "Vous n’avez pas le droit d’importer des pages téléchargées.",
+       "apierror-cantimport": "Vous n’avez pas le droit d’importer des pages.",
+       "apierror-cantoverwrite-sharedfile": "Le fichier cible existe dans un dépôt partagé et vous n’avez pas le droit de l’écraser.",
+       "apierror-cantsend": "Vous n’êtes pas connecté, vous n’avez pas d’adresse de courriel confirmée, ou vous n’êtes pas autorisé à envoyer des courriels aux autres utilisateurs, donc vous ne pouvez envoyer de courriel.",
+       "apierror-cantundelete": "Impossible d’annuler : les révisions demandées peuvent ne plus exister, ou avoir déjà été annulées.",
+       "apierror-changeauth-norequest": "Échec à la création de la requête de modification.",
+       "apierror-chunk-too-small": "La taille minimale d’un segment est de $1 {{PLURAL:$1|octet|octets}} pour les segments hors le dernier.",
+       "apierror-cidrtoobroad": "Les plages CIDR $1 plus large que /$2 ne sont pas acceptées.",
+       "apierror-compare-inputneeded": "Un titre, un ID de page ou un numéro de révision est nécessaire pour les paramètres <var>from</var> et <var>to</var>.",
+       "apierror-contentserializationexception": "Échec de sérialisation du contenu : $1",
+       "apierror-contenttoobig": "Le contenu que vous avez fourni dépasse la limite de taille d’un article, qui est de $1 {{PLURAL:$1|kilooctet|kilooctets}}.",
+       "apierror-copyuploadbaddomain": "Les téléchargements par URL ne sont pas autorisés pour ce domaine.",
+       "apierror-copyuploadbadurl": "Les téléchargements ne sont pas autorisés depuis cette URL.",
+       "apierror-create-titleexists": "Les titres existants ne peuvent pas être protégés avec <kbd>create</kbd>.",
+       "apierror-csp-report": "Erreur lors du traitement du rapport CSP: $1.",
+       "apierror-databaseerror": "[$1] erreur de requête de base de données.",
+       "apierror-deletedrevs-param-not-1-2": "Le paramètre <var>$1</var> ne peut pas être utilisé dans les modes 1 ou 2.",
+       "apierror-deletedrevs-param-not-3": "Le paramètre <var>$1</var> ne peut pas être utilisé dans le mode 3.",
+       "apierror-emptynewsection": "Il n'est pas possible de créer de nouvelles sections vides.",
+       "apierror-emptypage": "Il n'est pas possible de créer de nouvelles pages vides.",
+       "apierror-exceptioncaught": "[$1] Exception interceptée: $2",
+       "apierror-filedoesnotexist": "Le fichier n’existe pas.",
+       "apierror-fileexists-sharedrepo-perm": "Le fichier cible existe dans un dépôt partagé. Utilisr le paramètre <var>ignorewarnings</var> pour l’écraser.",
+       "apierror-filenopath": "Il n'est pas possible de récupérer le chemin du fichier local.",
+       "apierror-filetypecannotberotated": "Le type du fichier ne peut pas être tourné.",
+       "apierror-formatphp": "Cette réponse ne peut pas être représentée en utilisant <kbd>format=php</kbd>. Voir https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "Le titre pour <kbd>$1</kbd> doit être un fichier.",
+       "apierror-import-unknownerror": "Erreur inconnue lors de l'importation: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> ne peut pas dépasser $2 (fixé à $3) pour les robots ou les opérateurs système.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> ne peut pas dépasser $2 (fixé à $3) pour les utilisateurs.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> ne peut pas être inférieur à $2 (fixé à $3).",
+       "apierror-invalidcategory": "Le nom de la catégorie que vous avez entré n'est pas valide.",
+       "apierror-invalid-chunk": "Le déplacement plus le segment actuel dépassent la taille demandée du fichier.",
+       "apierror-invalidexpiry": "Heure d'expiration invalide \"$1\".",
+       "apierror-invalid-file-key": "Ne correspond pas à une clé valide de fichier.",
+       "apierror-invalidlang": "Code de langue non valide pour le paramètre <var>$1</var>.",
+       "apierror-invalidoldimage": "Le paramètre oldimage a un format non valide.",
+       "apierror-invalidparammix-cannotusewith": "Le paramètre <kbd>$1</kbd> ne peut pas être utilisé avec <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "Le paramètre <kbd>$1</kbd> ne peut être utilisé qu’avec <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> ne peut pas être combiné avec le paramètre <var>oldid</var>, <var>pageid</var> ou <var>page</var>. Veuillez utiliser <var>title</var> et <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Les paramètres}} $1 ne peuvent pas être utilisés ensemble.",
+       "apierror-invalidsection": "Le paramètre section doit être un ID de section valide ou <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "Le hachage SHA1Base36 fourni n’est pas valide.",
+       "apierror-invalidsha1hash": "Le hachage SHA1 fourni n’est pas valide.",
+       "apierror-invalidtitle": "Mauvais titre « $1 ».",
+       "apierror-invalidurlparam": "Valeur non valide pour <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nom d'utilisateur invalide \"$1\".",
+       "apierror-invaliduserid": "L'ID d'utilisateur <var>$1</var> n'est pas valide.",
+       "apierror-maxlag-generic": "Attente d’un serveur de base de données : $1 {{PLURAL:$1|seconde|secondes}} de délai.",
+       "apierror-maxlag": "Attente de $2 : $1 {{PLURAL:$1|seconed|secondes}} de délai.",
+       "apierror-mimesearchdisabled": "La recherche MIME est désactivée en mode Misère.",
+       "apierror-missingcontent-pageid": "Contenu manquant pour la page d’ID $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Le paramètre|Au moins un des paramètres}} $1 est obligatoire.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|Le paramètre|Un des paramètres}} $1 est obligatoire.",
+       "apierror-missingparam": "Le paramètre <var>$1</var> doit être défini.",
+       "apierror-missingrev-pageid": "Aucune révision actuelle de la page d’ID $1.",
+       "apierror-missingtitle-createonly": "Les titres manquants ne peuvent être protégés qu’avec <kbd>create</kbd>.",
+       "apierror-missingtitle": "La page que vous avez spécifié n’existe pas.",
+       "apierror-missingtitle-byname": "La page $1 n’existe pas.",
+       "apierror-moduledisabled": "Le module <kbd>$1</kbd> a été désactivé.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Seul|Seul un des}} $2 est autorisé pour le paramètre <var>$1</var>.",
+       "apierror-multival-only-one": "Une seule valeur est autorisée pour le paramètre <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> ne peut être utilisé qu’avec une seule page.",
+       "apierror-mustbeloggedin-changeauth": "Vous devez être connecté pour modifier les données d’authentification.",
+       "apierror-mustbeloggedin-generic": "Vous devez être connecté.",
+       "apierror-mustbeloggedin-linkaccounts": "Vous devez être connecté pour lier des comptes.",
+       "apierror-mustbeloggedin-removeauth": "Vous devez être connecté pour supprimer les données d’authentification.",
+       "apierror-mustbeloggedin-uploadstash": "La réserve de téléchargement n’est disponible que pour les utilisateurs connectés.",
+       "apierror-mustbeloggedin": "Vous devez être connecté pour $1.",
+       "apierror-mustbeposted": "Le module <kbd>$1</kbd> nécessite une requête POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Le paramètre suivant a été trouvé|Les paramètres suivants ont été trouvés}} dans la chaîne de requête, mais doit être dans le corps du POST : $1.",
+       "apierror-noapiwrite": "La modification de ce wiki via l’API est désactivée. Assurez-vous que la déclaration <code>$wgEnableWriteAPI=true;</code> st inclue dans le fichier <code>LocalSettings.php</code> du wiki.",
+       "apierror-nochanges": "Aucun changement n’a été demandé.",
+       "apierror-nodeleteablefile": "Pas de telle ancienne version du fichier.",
+       "apierror-no-direct-editing": "La modification directe via l’API n’est pas supportée pour le modèle de contenu $1 utilisée par $2.",
+       "apierror-noedit-anon": "Les utilisateurs anonymes ne peuvent pas modifier les pages.",
+       "apierror-noedit": "Vous n’avez pas le droit de modifier les pages.",
+       "apierror-noimageredirect-anon": "Les utilisateurs anonymes ne peut pas créer des redirections d’image.",
+       "apierror-noimageredirect": "Vous n’avez pas le droit de créer des redirections d’image.",
+       "apierror-nosuchlogid": "Il n’y a pas d’entrée du journal avec l’ID $1.",
+       "apierror-nosuchpageid": "Il n’y a pas de page avec l’ID $1.",
+       "apierror-nosuchrcid": "Il n’y a pas de modification récente avec l’ID $1.",
+       "apierror-nosuchrevid": "Il n’y a pas de révision d’ID $1.",
+       "apierror-nosuchsection": "Il n’y a pas de section $1.",
+       "apierror-nosuchsection-what": "Il ’y a pas de section $1 dans $2.",
+       "apierror-nosuchuserid": "Il n'y a pas d'utilisateur ayant l'ID $1.",
+       "apierror-notarget": "Vous n’avez pas spécifié une cible valide pour cette action.",
+       "apierror-notpatrollable": "La révision r$1 ne peut pas être patrouillée car elle est trop ancienne.",
+       "apierror-nouploadmodule": "Aucun module de téléchargement défini.",
+       "apierror-opensearch-json-warnings": "Les avertissements ne peuvent pas être représentés dans le format JSON OpenSearch.",
+       "apierror-pagecannotexist": "L’espace de noms ne permet pas de pages réelles.",
+       "apierror-pagedeleted": "La page a été supprimée depuis que vous avez récupéré son horodatage.",
+       "apierror-pagelang-disabled": "Il n'est pas possible de modifier la langue d'une page sur ce wiki.",
+       "apierror-paramempty": "Le paramètre <var>$1</var> ne peut pas être vide.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> n’est supporté que pour le contenu wikitexte.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> n’est supporté que pour le contenu wikitexte. $1 utilise le modèle de contenu $2.",
+       "apierror-pastexpiry": "Le temps d’expiration « $1 » est dans le passé.",
+       "apierror-permissiondenied": "Vous n’avez pas le droit de $1.",
+       "apierror-permissiondenied-generic": "Autorisation refusée.",
+       "apierror-permissiondenied-patrolflag": "Vous avez besoin du droit <code>patrol</code> ou <code>patrolmarks</code> pour demander le drapeau patrouillé.",
+       "apierror-permissiondenied-unblock": "Vous n’avez pas le droit de débloquer les utilisateurs.",
+       "apierror-prefixsearchdisabled": "La recherche de préfixe est désactivée en mode misérable.",
+       "apierror-promised-nonwrite-api": "L’entête HTTP <code>Promise-Non-Write-API-Action</code> ne peut pas être envoyé aux modules de l’API en mode écriture.",
+       "apierror-protect-invalidaction": "Type de protection non valide « $1 ».",
+       "apierror-protect-invalidlevel": "Niveau de protection non valide « $1 ».",
+       "apierror-ratelimited": "Vous avez dépassé votre limite de débit. Veuillez attendre un peu et réessayer.",
+       "apierror-readapidenied": "Vous avez besoin du droit de lecture pour utiliser ce module.",
+       "apierror-readonly": "Ce wiki est actuellement en mode lecture seule.",
+       "apierror-reauthenticate": "Vous n’avez pas authentifié récemment cette session ; veuillez vous authentifier de nouveau.",
+       "apierror-redirect-appendonly": "Vous avez essayé de modifier en utilisant le mode de suivi de redirection, qui doit être utilisé en lien avec <kbd>section=new</kbd>, <var>prependtext</var>, ou <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "Le même champ ne peut pas être utilisé à la fois en <var>hide</var> et <var>show</var>.",
+       "apierror-revdel-needtarget": "Un titre cible est nécessaire pour ce type RevDel.",
+       "apierror-revdel-paramneeded": "Au moins une valeur est nécessaire pour <var>hide</var> ou <var>show</var>.",
+       "apierror-revisions-norevids": "Le paramètre <var>revids</var> ne peut pas être utilisé avec les options de liste (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, et <var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>, <var>pageids</var> ou un générateur a été utilisé pour fournir plusieurs pages, mais les paramètres <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> et <var>$1end</var> ne peuvent être utilisés que sur une seule page.",
+       "apierror-revwrongpage": "r$1 n'est pas une révision de $2.",
+       "apierror-searchdisabled": "La recherche <var>$1</var> est désactivée.",
+       "apierror-sectionreplacefailed": "Impossible de fusionner la section mise à jour.",
+       "apierror-sectionsnotsupported": "Les sections ne sont pas prises en charge pour le modèle de contenu $1.",
+       "apierror-sectionsnotsupported-what": "Les sections ne sont pas prises en charge par $1.",
+       "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.",
+       "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si <var>$wgShowHostNames</var> vaut vrai.",
+       "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.",
+       "apierror-spamdetected": "Votre modification a été refusée parce qu'elle contenait un fragment de spam: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.",
+       "apierror-stashedfilenotfound": "Impossible de trouver le fichier dans la réserve: $1.",
+       "apierror-stashedit-missingtext": "Pas de texte en réserve associé à la donnée de hachage.",
+       "apierror-stashfailed-complete": "Un téléchargement par morceaux est déjà achevé, vérifiez l’état pour plus de détails.",
+       "apierror-stashfailed-nosession": "Aucune session de téléchargement par morceaux avec cette clé.",
+       "apierror-stashfilestorage": "Impossible de mettre le téléchargement en réserve: $1",
+       "apierror-stashinvalidfile": "Fichier de réserve invalide.",
+       "apierror-stashnosuchfilekey": "Filekey inconnue: $1.",
+       "apierror-stashpathinvalid": "La clé du fichier n'a pas le bon format ou est invalide: $1 .",
+       "apierror-stashwrongowner": "Erreur de propriétaire: $1",
+       "apierror-stashzerolength": "Fichier est de longueur nulle, et n'a pas pu être mis dans la réserve: $1.",
+       "apierror-systemblocked": "Vous avez été bloqué automatiquement par MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Le développement du modèle n'est effectif que sur un contenu wikitext. $1 utilise le modèle de contenu $2.",
+       "apierror-toofewexpiries": "$1 {{PLURAL:$1|horodatage d’expiration a été fourni|horodatages d’expiration ont été fournis}} alors que $2 {{PLURAL:$2|était attendu|étaient attendus}}.",
+       "apierror-unknownaction": "L'action spécifiée, <kbd>$1</kbd>, n'est pas reconnue.",
+       "apierror-unknownerror-editpage": "Erreur inconnue EditPage: $1.",
+       "apierror-unknownerror-nocode": "Erreur inconnue.",
+       "apierror-unknownerror": "Erreur inconnue : « $1 ».",
+       "apierror-unknownformat": "Format inconnu \"$1\".",
+       "apierror-unrecognizedparams": "Paramètre{{PLURAL:$2||s}} non reconnu{{PLURAL:$2||s}} : $1.",
+       "apierror-unrecognizedvalue": "Valeur non reconnue du paramètre <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Le dépôt local des fichiers ne prend pas en charge la recherche de toutes les images.",
+       "apierror-upload-filekeyneeded": "Un <var>filekey</var> est nécessaire si le <var>décalage</var> est non nul.",
+       "apierror-upload-filekeynotallowed": "Pas possible de fournir une <var>filekey</var> si <var>offset</var> vaut 0.",
+       "apierror-upload-inprogress": "Le téléversement à partir de la réserve est déjà en cours.",
+       "apierror-upload-missingresult": "Pas de résultat dans les données d'état.",
+       "apierror-urlparamnormal": "Impossible de normaliser les paramètres de l'image pour $1.",
+       "apierror-writeapidenied": "Vous n'êtes pas autorisé à modifier ce wiki au travers de l'API.",
+       "apiwarn-alldeletedrevisions-performance": "Pour de meilleures performances lors de la génération des titres, mettre <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Impossible d'analyser <var>$1urlparam</var> pour $2. En utilisant seulement la largeur et la hauteur.",
+       "apiwarn-badutf8": "La valeur passée pour <var>$1</var> contient des données non valides ou non normalisées. Les données textuelles doivent être de l’Unicode valide normalisé en NFC sans caractères de contrôle c0 autres que HT (\\t), LF (\\n) et CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement  codés avec des pourcents dans l'URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> est devenu obsolète. Veuillez utiliser <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd> à la place.",
+       "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre <var>prop</var>, un format d’héritage a été utilisé pour la sortie. Ce format est obsolète et, dans le futur, une valeur par défaut sera fixée pour le paramètre <var>prop</var>, provoquant ainsi l’utilisation systématique du nouveau format.",
+       "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.",
+       "apiwarn-deprecation-login-botpw": "La connexion au compte principal via <kbd>action=login</kbd> est obsolète et peut ne plus fonctionner sans avertissement. Pour continuer à vous connecter avec <kbd>action=login</kbd>, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via <kbd>action=login</kbd> est obsolète et peut ne plus fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "La récupération d’un jeton via <kbd>action=login</kbd> est obsolète. Utilisez <kbd>action=query&meta=tokens&type=login</kbd> à la place.",
+       "apiwarn-deprecation-parameter": "Le paramètre <var>$1</var> est obsolète.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> est obsolète depuis MédiaWiki 1.28. Utilisez <kbd>prop=headhtml</kbd> lors de la création de nouveaux documents HTML, ou <kbd>prop=modules|jsconfigvars</kbd> lors de la mise à jour d’un document côté client.",
+       "apiwarn-deprecation-purge-get": "L'utilisation de <kbd>action=purge</kbd> via un GET est obsolète. Utiliser POST à la place.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> est obsolète. Veuillez utiliser <kbd>$2</kbd> à la place.",
+       "apiwarn-difftohidden": "Impossible de faire un diff avec r$1 : le contenu est masqué.",
+       "apiwarn-errorprinterfailed": "Erreur échec imprimante. Nouvel essai sans paramètres.",
+       "apiwarn-errorprinterfailed-ex": "Erreur d’échec de l’impression (réessayera sans paramètres) : $1",
+       "apiwarn-invalidcategory": "« $1 » n'est pas une catégorie.",
+       "apiwarn-invalidtitle": "« $1 » n’est pas un titre valide.",
+       "apiwarn-invalidxmlstylesheetext": "Une feuille de style doit avoir une extension <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "Feuille de style spécifiée non valide ou inexistante.",
+       "apiwarn-invalidxmlstylesheetns": "La feuille de style devrait être dans l’espace de noms {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "La propriété <kbd>modules</kbd> a été définie mais pas <kbd>jsconfigvars</kbd> ni <kbd>encodedjsconfigvars</kbd>. Les variables de configuration sont nécessaires pour une utilisation correcte du module.",
+       "apiwarn-notfile": "« $1 » n'est pas un fichier.",
+       "apiwarn-nothumb-noimagehandler": "Impossible de créer la vignette car $1 n’a pas de gestionnaire d’image associé.",
+       "apiwarn-parse-nocontentmodel": "Ni <var>title</var> ni <var>contentmodel</var> n’ont été fournis, $1 est supposé.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> utilisé sans <var>text</var>, et les propriétés de page analysées sont nécessaires. Voulez-vous dire que vous voulez utiliser <var>page</var> à la place de <var>title</var> ?",
+       "apiwarn-redirectsandrevids": "La résolution de la redirection ne peut pas être utilisée avec le paramètre <var>revids</var>. Toutes les redirections vers lesquelles pointent <var>revids</var> n’ont pas été résolues.",
+       "apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
+       "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
+       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>: la limite est $2.",
+       "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
+       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now<kbd>.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre <var>$1</var> : $2.",
+       "apiwarn-unsupportedarray": "Le paramètre <var>$1</var> utilise une syntaxe PHP de tableau non prise en charge.",
+       "apiwarn-urlparamwidth": "Valeur de la largeur définie dans <var>$1urlparam</var> ($2) ignorée en faveur de la largeur calculée à partir de <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "caractères non valides dans la clé (<code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>et <code>-</code> sont les seuls autorisés).",
+       "apiwarn-validationfailed-badpref": "pas une préférence valide.",
+       "apiwarn-validationfailed-cannotset": "ne peut pas être initialisé par ce module.",
+       "apiwarn-validationfailed-keytoolong": "clé trop longue (au plus $1 octets).",
+       "apiwarn-validationfailed": "Erreur de validation pour <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Avertissement de sécurité</strong>: <var>$wgDebugAPI</var> est activé.",
+       "api-feed-error-title": "Erreur ($1)",
+       "api-usage-docref": "Voir $1 concernant l'utilisation de l'API.",
+       "api-exception-trace": "$1 à $2($3)\n$4",
        "api-credits-header": "Remerciements",
        "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
index 69fdf56..4dc2104 100644 (file)
        "apihelp-main-param-requestid": "Calquera valor dado aquí será incluído na resposta. Pode usarse para distingir peticións.",
        "apihelp-main-param-servedby": "Inclúa o nome do servidor que servía a solicitude nos resultados.",
        "apihelp-main-param-curtimestamp": "Incluir a marca de tempo actual no resultado.",
+       "apihelp-main-param-responselanginfo": "Incluír no resultado as linguas usada para <var>uselang</var> e <var>errorlang</var>.",
        "apihelp-main-param-origin": "Cando se accede á API usando unha petición AJAX entre-dominios (CORS), inicializar o parámetro co dominio orixe. Isto debe incluírse en calquera petición pre-flight, e polo tanto debe ser parte da petición URI (non do corpo POST). Para peticións autenticadas, isto debe coincidir exactamente cunha das orixes na cabeceira <code>Origin</code>, polo que ten que ser fixado a algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parámetro non coincide coa cabeceira <code>Origin</code>, devolverase unha resposta 403. Se este parámetro coincide coa cabeceira <code>Origin</code> e a orixe está na lista branca, as cabeceiras <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serán fixadas.\n\nPara peticións non autenticadas, especifique o valor <kbd>*</kbd>. Isto fará que se fixe a cabeceira <code>Access-Control-Allow-Origin</code>, pero <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os datos específicos do usuario serán ocultados.",
        "apihelp-main-param-uselang": "Linga a usar para a tradución de mensaxes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devolve unha lista de códigos de lingua, ou especificando <kbd>user</kbd> coa preferencia de lingua do usuario actual, ou especificando <kbd>content</kbd> para usar a lingua do contido desta wiki.",
+       "apihelp-main-param-errorformat": "Formato a usar para a saída do texto de aviso e de erroː\n; plaintext:  texto wiki sen as etiquetas HTML e coas entidades substituídas.\n; wikitext: texto wiki sen analizar.\n; html: HTML.\n; raw: Clave de mensaxe e parámetros.\n; none: Sen saída de texto, só os códigos de erro.\n; bc: Formato utilizado antes de MediaWiki 1.29. <var>errorlang</var> e <var>errorsuselocal</var> non se teñen en conta.",
        "apihelp-block-description": "Bloquear un usuario.",
-       "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear.",
+       "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear. Non pode usarse xunto con <var>$1userid</var>",
+       "apihelp-block-param-userid": "Identificador de usuario a bloquear. Non pode usarse xunto con <var>$1user</var>.",
        "apihelp-block-param-expiry": "Tempo de caducidade. Pode ser relativo (p. ex.<kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. 2014-09-18T12:34:56Z</kbd>). Se se pon kbd>infinite</kbd>, <kbd>indefinite</kbd>, ou <kbd>never</kbd>, o bloqueo nunca caducará.",
        "apihelp-block-param-reason": "Motivo para o bloqueo.",
        "apihelp-block-param-anononly": "Bloquear só usuarios anónimos (é dicir, desactivar edicións anónimas desta dirección IP).",
        "apihelp-query+allmessages-param-prop": "Que propiedades obter.",
        "apihelp-query+allmessages-param-enableparser": "Marcar para activar o analizador, isto preprocesará o texto wiki da mensaxe (substituir palabras máxicas, xestionar modelo, etc.)",
        "apihelp-query+allmessages-param-nocontent": "Se se marca, non inclúe o contido das mensaxes na saída.",
-       "apihelp-query+allmessages-param-includelocal": "Tamén inclúe mensaxes locais, p.ex. mensaxes que non existen no software pero existen como unha páxina MediaWiki:. \nIsto lista todas as páxinas MediaWiki:, polo que tamén listará as que non son realmente mensaxes como [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Tamén inclúe mensaxes locais, p.ex. mensaxes que non existen no software pero existen como no espazo de nomes {{ns:MediaWiki}}. \nIsto lista todas as páxinas do espazo de nomes {{ns:MediaWiki}}, polo que tamén listará as que non son realmente mensaxes como [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Argumentos a substituír na mensaxe.",
        "apihelp-query+allmessages-param-filter": "Retornar só mensaxes con nomes que conteñan esta cadea.",
        "apihelp-query+allmessages-param-customised": "Devolver só mensaxes neste estado de personalización.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Engade o nome de ficheiro da versión do ficheiro para versións anteriores ás últimas.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Engade a profundidade de bits da versión.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pola páxina Special:Upload para obter información sobre un ficheiro existente. Non previsto para usar fóra do núcleo MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Engadido cando o ficheiro está na [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "Cantas revisións de ficheiro a devolver por ficheiro.",
        "apihelp-query+imageinfo-param-start": "Selo de tempo dende o que comezar a lista.",
        "apihelp-query+imageinfo-param-end": "Selo de tempo no que rematar a lista.",
        "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Cambiar a lingua dunha páxina.",
+       "apihelp-setpagelanguage-param-reason": "Motivo do cambio.",
+       "apihelp-setpagelanguage-example-language": "Cambiar a lingua de <kbd>Main Page</kbd> ó éuscaro.",
+       "apihelp-setpagelanguage-example-default": "Cambiar a lingua da páxina con identificador 123 á lingua predeterminada para o contido da wiki.",
        "apihelp-stashedit-description": "Preparar unha edición na caché compartida.\n\nEstá previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.",
        "apihelp-stashedit-param-title": "Título da páxina que se está a editar.",
        "apihelp-stashedit-param-section": "Número de selección. O <kbd>0</kbd> é para a sección superior, <kbd>novo</kbd> para unha sección nova.",
        "apihelp-tokens-example-edit": "Recuperar un identificador de modificación (por defecto).",
        "apihelp-tokens-example-emailmove": "Recuperar un identificador de correo e un identificador de movemento.",
        "apihelp-unblock-description": "Desbloquear un usuario.",
-       "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nome de usuario, dirección IP ou rango de direccións IP a desbloquear. Non pode usarse xunto con <var>$1id</var>.",
+       "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Nome de usuario, enderezo IP ou rango de enderezos IP a desbloquear. Non pode usarse xunto con <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID de usuario a desbloquear. Non pode usarse xunto con <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Razón para desbloquear.",
        "apihelp-unblock-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de bloqueo.",
        "apihelp-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
+       "apihelp-userrights-param-tags": "Cambia as etiquetas a aplicar á entrada do rexistro de dereitos de usuario.",
        "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Engadir ó usuario con ID <kbd>123</kbd> ó grupo <kbd>bot</kbd>, e borralo dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-validatepassword-param-password": "Contrasinal a validar.",
        "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
        "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
        "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
        "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
-       "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:mediawiki}} rematando con <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:MediaWiki}} rematando con <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
        "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-help-authmanagerhelper-returnurl": "Devolve o URL para os fluxos de autenticación de terceiros, que debe ser absoluto. Este ou <var>$1continue</var> é obrigatorio.\n\nLogo da recepción dunha resposta <samp>REDIRECT</samp>, vostede normalmente abrirá un navegador web ou un visor web para ver a URL <samp>redirecttarget</samp> especificada para un fluxo de autenticación de terceiros. Cando isto se complete, a aplicación de terceiros enviará ó navegador web ou visor web a esta URL. Vostede debe eliminar calquera consulta ou parámetros POST da URL e pasalos como unha consulta <var>$1continue</var> a este módulo API.",
        "api-help-authmanagerhelper-continue": "Esta petición é unha continucación despois dun resposta precedente <samp>UI</samp> ou <samp>REDIRECT</samp>. Esta ou <var>$1returnurl</var> é requirida.",
        "api-help-authmanagerhelper-additional-params": "Este módulo acepta parámetros adicionais dependendo das consultas de autenticación dispoñibles. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (ou unha resposta previa deste módulo, se aplicable) para determinar as consultas dispoñibles e os campos que usan.",
+       "apierror-articleexists": "O artigo que intentou crear xa existe.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> descoñecido.",
+       "apierror-badip": "O parámetro IP non é válido.",
+       "apierror-badmd5": "O código hash MD5 non era incorrecto.",
+       "apierror-badmodule-badsubmodule": "O módulo <kbd>$1</kbd> non ten un submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "O módulo <kbd>$1</kbd> non ten submódulos.",
+       "apierror-badparameter": "Valor non válido para o parámetro <var>$1</var>.",
+       "apierror-badquery": "A consulta non é válida.",
+       "apierror-badtimestamp": "Valor \"$2\" non válido para o parámetro de data e hora <var>$1</var>.",
+       "apierror-badtoken": "Identificador CSRF non válido.",
+       "apierror-badurl": "Valor \"$2\" non válido para o parámetro de URL <var>$1</var>.",
+       "apierror-baduser": "Valor \"$2\" non válido para o parámetro de usuario <var>$1</var>.",
+       "apierror-blocked": "Foi bloqueado fronte á edición.",
+       "apierror-botsnotsupported": "Esta interface non está dispoñible para bots.",
+       "apierror-cannotviewtitle": "Non está autorizado para ver $1.",
+       "apierror-cantblock": "Non ten permisos para bloquear usuarios.",
+       "apierror-cantimport": "Non ten permisos para importar páxinas.",
+       "apierror-changeauth-norequest": "Erro ó crear a petición de modificación.",
+       "apierror-chunk-too-small": "O tamaño mínimo dun segmento é de  $1 {{PLURAL:$1|byte|bytes}} para os segmentos non finais.",
+       "apierror-cidrtoobroad": "Os rangos CIDR $1 maiores que /$2 non son aceptados.",
+       "apierror-compare-inputneeded": "É necesario un título, un ID de páxina ou un número de revisión para os parámetros <var>from</var> e <var>to</var>.",
+       "apierror-contentserializationexception": "Erro de serialización do contidoː $1",
+       "apierror-contenttoobig": "O contido que achegou excede o límite de tamaño dun artigo, que é de  {{PLURAL:$1|kilobyte|kilobytes}}.",
+       "apierror-copyuploadbaddomain": "As subas por URL non están permitidas para este dominio.",
+       "apierror-copyuploadbadurl": "As subas non están permitidas para esta URL.",
+       "apierror-create-titleexists": "Os títulos existentes non poden ser protexidos con <kbd>create</kbd>.",
+       "apierror-csp-report": "Erro procesando o informe CSPː $1.",
+       "apierror-databaseerror": "[$1] erro de consulta da base de datos.",
+       "apierror-deletedrevs-param-not-1-2": "O parámetro <var>$1</var> non pode usarse nos modos 1 e 2.",
+       "apierror-deletedrevs-param-not-3": "O parámetro <var>$1</var> non pode usarse no modo 3.",
+       "apierror-emptynewsection": "Non é posible crear novas seccións baleiras.",
+       "apierror-emptypage": "Non é posible crear novas páxinas baleiras.",
+       "apierror-exceptioncaught": "[$1] Excepción capturada: $2",
+       "apierror-filedoesnotexist": "O ficheiro non existe.",
+       "apierror-fileexists-sharedrepo-perm": "O ficheiro obxectivo existe nun servidor compartido. Use o parámetro <var>ignorewarnings</var> para ignoralo.",
+       "apierror-filenopath": "Non é posible obter o camiño do ficheiro local.",
+       "apierror-filetypecannotberotated": "O tipo de ficheiro non permite que sexa rotado.",
+       "apierror-formatphp": "Esta resposta non pode ser representada usando kbd>format=php</kbd>. Consulte https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "O título para <kbd>$1</kbd> debe ser un ficheiro.",
+       "apierror-import-unknownerror": "Erro descoñecido ó importarː $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> non pode pasar de $2 (fixado a $3) para bots ou administradores do sistema.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> non pode pasar de $2 (fixado a $3) para os usuarios.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> non pode ser menor de $2 (fixado a $3).",
+       "apierror-invalidcategory": "O nome da categoría que indicou non é válido.",
+       "apierror-invalid-chunk": "O desplazamento máis o segmento actual é maior que o tamaño solicitado do ficheiro.",
+       "apierror-invalidexpiry": "Hora de caducidade incorrecta \"$1\".",
+       "apierror-invalid-file-key": "Non se corresponde cunha clave válida de ficheiro.",
+       "apierror-invalidlang": "Código de lingua incorrecto para o parámetro <var>$1</var>.",
+       "apierror-invalidoldimage": "O parámetro oldimage ten un formato incorrecto.",
+       "apierror-invalidparammix-cannotusewith": "O parámetro <kbd>$1</kbd> non pode usarse xunto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "O parámetro <kbd>$1</kbd> só pode usarse xunto con <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> non se pode combinar cos parámetros <var>oldid</var>, <var>pageid</var> e <var>page</var>. Por favor, utilice <var>title</var> e <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Os parámetros}} $1 non poden usarse xuntos.",
+       "apierror-invalidsection": "O parámetro sección debe ser un ID de sección válido ou <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "O código hash SHA1Base36 proporcionado non é correcto.",
+       "apierror-invalidsha1hash": "O código hash SHA1 proporcionado non é correcto.",
+       "apierror-invalidtitle": "Título incorrecto \"$1\".",
+       "apierror-invalidurlparam": "Valor non válido para <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Nome de usuario incorrecto \"$1\".",
+       "apierror-maxlag-generic": "Esparando por un servidor de base de datosː $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
+       "apierror-maxlag": "Esperando por $2: $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
+       "apierror-mimesearchdisabled": "A busca MIME está desactivada no modo Miser (tacaño).",
+       "apierror-missingparam": "O parámetro <var>$1</var> debe estar definido.",
+       "apierror-missingtitle": "A páxina que especificou non existe.",
+       "apierror-missingtitle-byname": "A páxina $1 non existe.",
+       "apierror-moduledisabled": "O módulo <kbd>$1</kbd> foi deshabilitado.",
+       "apierror-multival-only-one-of": "Só {{PLURAL:$3|se permite o valor|se permiten os valores}} $2 para o parámetro <var>$1</var>.",
+       "apierror-multival-only-one": "Só se permite un valor para o parámetro <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> non se pode utilizar máis que con unha soa páxina.",
+       "apierror-noedit-anon": "Os usuarios anónimos non poden editar páxinas.",
+       "apierror-noedit": "Non ten permisos para editar páxinas.",
+       "apierror-nosuchsection": "Non hai ningunha sección $1.",
+       "apierror-nosuchsection-what": "Non hai ningunha sección $1 en $2.",
+       "apierror-permissiondenied-generic": "Permisos rexeitados.",
+       "apierror-protect-invalidaction": "Tipo de protección \"$1\" non válido.",
+       "apierror-protect-invalidlevel": "Nivel de protección \"$1\" non válido.",
+       "apierror-readapidenied": "Necesita permiso de lectura para utilizar ese módulo.",
+       "apierror-readonly": "A wiki está actualmente en modo de só lectura.",
+       "apierror-stashwrongowner": "Erro de propietarioː $1",
+       "apierror-unknownerror-nocode": "Erro descoñecido.",
+       "apierror-unknownerror": "Erro descoñecido: \"$1\".",
+       "apierror-unknownformat": "Formato descoñecido \"$1\".",
+       "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
+       "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
+       "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
+       "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
+       "apiwarn-notfile": "\"$1\" non é un ficheiro.",
+       "api-feed-error-title": "Erro ($1)",
+       "api-usage-docref": "Consulte $1 para ver o uso da API.",
+       "api-exception-trace": "$1 en $2($3)\n$4",
        "api-credits-header": "Créditos",
        "api-credits": "Desenvolvedores da API:\n* Roan Kattouw (desenvolvedor principal, set. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador e desenvolvedor principal, set. 2006-sep. 2007)\n* Brad Jorsch (desenvolvedor principal, 2013-actualidade)\n\nEnvía comentarios, suxerencias e preguntas a mediawiki-api@lists.wikimedia.org\nou informa dun erro en https://phabricator.wikimedia.org/."
 }
index 52b28d6..e684be5 100644 (file)
@@ -11,7 +11,8 @@
                        "Elyashiv",
                        "Umherirrender",
                        "Macofe",
-                       "MojoMann"
+                       "MojoMann",
+                       "Mikey641"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|תיעוד]]\n* [[mw:API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n</div>\n<strong>מצב:</strong> כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\n<strong>בקשות שגויות:</strong> כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "כל ערך שיינתן כאן ייכלל בתשובה. אפשר להשתמש בזה כדי להבדיל בין בקשות.",
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
        "apihelp-main-param-curtimestamp": "הכללת חותם־הזמן הנוכחי בתוצאה.",
+       "apihelp-main-param-responselanginfo": "לכלול את השפות שמשמשות ל־<var>uselang</var> ול־<var>errorlang</var> בתוצאה.",
        "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST).\n\nעבור בקשות מאומתות, זה חייב להיות תואם במדויק לאחד המקורות בכותרת <code>Origin</code>, כך שזה צריך להיות מוגדר למשהו כמו <kbd>https://en.wikipedia.org</kbd> או <kbd>https://meta.wikimedia.org</kbd>. אם הפרמטר הזה אינו תואם לכותרת <code>Origin</code>, תוחזר תשובת 403. אם הפרמטר הזה תורם לכותרת <code>Origin</code> והמקור נמצא ברשימה הלבנה, תוגדרנה הכותרות <code>Access-Control-Allow-Origin</code> ו־<code>Access-Control-Allow-Credentials</code>.\n\nעבור בקשות בלתי־מאומתות, יש לציין את הערך <kbd>*</kbd>. זה יגרום לכותרת להיות <code>Access-Control-Allow-Origin</code>, אבל <code>Access-Control-Allow-Credentials</code> תהיה <code>false</code> וכל הנתונים הייחודיים למשתמש יהיו מוגבלים.",
        "apihelp-main-param-uselang": "באיזו שפה להשתמש לתרגומי הודעות. הקריאה <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> עם <kbd>siprop=languages</kbd> מחזירה רשימת קודים. ציון <kbd>user</kbd> כדי להשתמש בהעדפת השפה של המשתמש הנוכחי, וציון <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
+       "apihelp-main-param-errorformat": "תסדיר לשימוש בפלט טקסט אזהרות ושגיאות.\n; plaintext: קוד ויקי ללא תגי HTML ועם ישויות מוחלפות.\n; wikitext: קוד ויקי לא מפוענח.\n; html: קוד HTML.\n; raw: מפתח הודעה ופרמטרים.\n; none: ללא פלט טקסט, רק הודעות השגיאה.\n; bc: התסדיר ששימש לפני מדיה־ויקי 1.29. התעלמות מ־<var>errorlang</var> ו־ <var>errorsuselocal</var>.",
+       "apihelp-main-param-errorlang": "השפה שתשמש לאזהרות לשגיאות <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> עם <kbd>siprop=languages</kbd> תחזיר רשימת קודי שפה, ואפשר גם לציין <kbd>content</kbd> כדי להשתמש בשפת התוכן של הוויקי הזה, או לציין <kbd>uselang</kbd> עם אותו הערך הפרמטר <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "אם ניתן, הטקסטים של השגיאות ישתמשו בהודעות מותאמות מקומית ממרחב השם {{ns:MediaWiki}}.",
        "apihelp-block-description": "חסימת משתמש.",
-       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
+       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח כתובות IP שברצונך לחסום. אי־אפשר להשתמש בזה יחד עם <var>$1userid</var>",
+       "apihelp-block-param-userid": "מזהה המשתמש לחסימה. לא יכול לשמש יחד עם <var>$1user</var>.",
        "apihelp-block-param-expiry": "זמן תפוגה. יכול להיות יחסי (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלט (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם זה מוגדר ל־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>, או <kbd>never</kbd>, החסימה לא תפוג לעולם.",
        "apihelp-block-param-reason": "סיבה לחסימה.",
        "apihelp-block-param-anononly": "לחסום משתמשים אלמוניים בלבד (דהיינו, השבתת עריכות אלמוניות מכתובת ה־IP הזאת)",
        "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.",
        "apihelp-imagerotate-description": "סיבוב של תמונה אחת או יותר.",
        "apihelp-imagerotate-param-rotation": "בכמה מעלות לסובב בכיוון השעון.",
+       "apihelp-imagerotate-param-tags": "אילו תגים להחיל על העיול ביומן ההעלאות.",
        "apihelp-imagerotate-example-simple": "לסובב את <kbd>File:Example.png</kbd> ב־<kbd>90</kbd> מעלות.",
        "apihelp-imagerotate-example-generator": "לסובב את כל התמונות ב־<kbd>Category:Flip</kbd> ב־<kbd>180</kbd> מעלות.",
        "apihelp-import-description": "לייבא דף מוויקי אחר או מקובץ XML.\n\nיש לשים לב לכך שפעולת HTTP POST צריכה להיעשות בתור העלאת קובץ (כלומר, עם multipart/form-data) בזמן שליחת קובץ לפרמטר <var>xml</var>.",
        "apihelp-query+allmessages-param-prop": "אלו מאפיינים לקבל.",
        "apihelp-query+allmessages-param-enableparser": "יש להגדיר כדי להפעיל את המפענח, יעשה קדם־עיבוד לקוד ויקי של ההודעה (יחליף מילות קסם, יטפל בתבניות, וכו').",
        "apihelp-query+allmessages-param-nocontent": "אם זה מוגדר, לא לכלול את תוכן ההודעות בפלט.",
-       "apihelp-query+allmessages-param-includelocal": "×\9c×\9b×\9c×\95×\9c ×\92×\9d ×\94×\95×\93×¢×\95ת ×\9eק×\95×\9e×\99×\95ת, ×\9b×\9c×\95×\9eר ×\94×\95×\93×¢×\95ת ×©×\90×\99× ×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\9b× ×\94, ×\90×\91×\9c ×\9b×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\95ר ×\93×£ ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.\n×\96×\94 ×¨×\95ש×\9d ×\90ת ×\9b×\9c ×\93פ×\99 MediaWiki: כך שזה ירשום גם דפים שאינם באמת הודעות, כגון [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "×\9c×\9b×\9c×\95×\9c ×\92×\9d ×\94×\95×\93×¢×\95ת ×\9eק×\95×\9e×\99×\95ת, ×\9b×\9c×\95×\9eר ×\94×\95×\93×¢×\95ת ×©×\90×\99× ×\9f ×§×\99×\99×\9e×\95ת ×\91ת×\9b× ×\94, ×\90×\91×\9c ×\9b×\9f ×§×\99×\99×\9e×\95ת ×\91×\9eר×\97×\91 {{ns:MediaWiki}}.\n×\96×\94 ×¨×\95ש×\9d ×\90ת ×\9b×\9c ×\94×\93פ×\99×\9d ×\91×\9eר×\97×\91 {{ns:MediaWiki}}, כך שזה ירשום גם דפים שאינם באמת הודעות, כגון [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "ארגומנטים שיוחלפו לתוך ההודעה.",
        "apihelp-query+allmessages-param-filter": "החזרה רק של הודעות עם שמות שמכילים את המחרוזת הזאת.",
        "apihelp-query+allmessages-param-customised": "להחזיר רק הודעות במצב ההתאמה הזה.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסת הארכיון עבור הגרסאות שאינן האחרונה.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "הוספת עומק הביטים של הגרסה.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "משמש את Special:Upload כדי לקבל מידע על קובץ קיים. לא נועד לשימוש מחוץ לליבת MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "מוסיף האם הקובץ נמצא ב־[[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "כמה גרסאות של קובץ לכל קובץ.",
        "apihelp-query+imageinfo-param-start": "מאיז חותם־זמן להתחיל רשימה.",
        "apihelp-query+imageinfo-param-end": "באיזה חותם־זמן לסיים את הרשימה.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "אם תרגומים של המאפיין extmetadata זמינים, לאחזר את כולם.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "אם זה מוגדר ולא ריק, רק המפתחות האלה יוחזרו עבור $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "מחרוזת פרמטר ייחודית למטפל. למשל, PDF־ים יכולים להשתמש ב־<kbd>page15-100px</kbd>.‏ <var>$1urlwidth</var> צריך לשמש ולהיות עקבי עם <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "אם <kbd>$2prop=badfile</kbd> מוגדר, זאת כותרת הדף שתשמש בזמן שערוך ה־[[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.",
        "apihelp-query+imageinfo-example-simple": "קבלת מידע על הגרסה הנוכחית של [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "אחזור מידע על גרסאות של [[:File:Test.jpg]] מ־2008 ואחרי‏־כן.",
        "apihelp-query+usercontribs-param-limit": "המספר המרבי של התרומות להחזיר.",
        "apihelp-query+usercontribs-param-start": "באיזה חותם־הזמן להתחיל.",
        "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים",
-       "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות.",
-       "apihelp-query+usercontribs-param-userprefix": "×\90×\97×\96×\95ר ×ª×¨×\95×\9e×\95ת ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×©×\94ש×\9e×\95ת ×©×\9c×\94×\9d ×\9eת×\97×\99×\9c×\99×\9d ×\91ער×\9a ×\94×\96×\94. ×\93×\95רס ×\90ת $1user.",
+       "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות. לא יכול לשמש עם <var>$1userids</var> או <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "×\90×\97×\96×\95ר ×ª×¨×\95×\9e×\95ת ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×©×\94ש×\9e×\95ת ×©×\9c×\94×\9d ×\9eת×\97×\99×\9c×\99×\9d ×\91ער×\9a ×\94×\96×\94. ×\9c×\90 ×\99×\9b×\95×\9c ×\9cש×\9eש ×¢×\9d <var>$1user</var> ×\90×\95 <var>$1userids</var>.",
        "apihelp-query+usercontribs-param-namespace": "לרשום רק תרומות במרחבי השם האלה.",
        "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "הוספת מזהה הדף ומזהה הגרסה.",
        "apihelp-query+users-paramvalue-prop-cancreate": "ציון האם אפשר ליצור חשבון עבור שמות משתמש תקינים, אבל לא רשומים.",
        "apihelp-query+users-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+users-param-users": "רשימת משתמשים שעליהם צריך לקבל מידע.",
+       "apihelp-query+users-param-userids": "רשימת מזהי משתמש שעבורם יתקבל המידע.",
        "apihelp-query+users-param-token": "יש להשתמש ב־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> במקום.",
        "apihelp-query+users-example-simple": "החזרת מידע עבור המשתמש <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "קבלת שינויים אחרונים לדפים ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-revisiondelete-param-show": "הסתרה של מה לבטל עבור כל גרסה.",
        "apihelp-revisiondelete-param-suppress": "האם להעלים נתונים ממפעילים ומאחרים.",
        "apihelp-revisiondelete-param-reason": "סיבה למחיקה או לשחזור ממחיקה.",
+       "apihelp-revisiondelete-param-tags": "אילו תגים להחיל על העיול ביומן המחיקה.",
        "apihelp-revisiondelete-example-revision": "הסתרת התוכן של הגרסה <kbd>12345</kbd> בדף <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "הסתרת כל הנתוהים על עיול היומן <kbd>67890</kbd> עם הסיבה <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "ביטול העריכה האחרונה לדף.\n\nאם המשמש האחרון שערך את הדף עשה מספר עריכות זו אחר זו, הן תשוחזרנה.",
        "apihelp-setnotificationtimestamp-example-page": "אתחול מצב ההודעה עבור <kbd>Main Page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "שנה את השפה של דף",
+       "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
+       "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.",
        "apihelp-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.",
        "apihelp-stashedit-param-title": "כותרת הדף הנערך.",
        "apihelp-stashedit-param-section": "מספר הפסקה. <kbd>0</kbd> עבור הפסקה הראשונה, <kbd>new</kbd> עבור פסקה חדשה.",
        "apihelp-tag-param-add": "התגים להוספה. אפשר להוסיף רק תגים קיימים.",
        "apihelp-tag-param-remove": "תגים להסרה. רק תגים שהוגדרו ידנית או שאינם מוגדרים כלל יכולים להיות מוסרים.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
+       "apihelp-tag-param-tags": "אילו תגים להחיל על עיול היומן שייווצר כתוצאה מהפעולה הזאת.",
        "apihelp-tag-example-rev": "הוספת התג <kbd>vandalism</kbd> לגרסה עם המזהה 123 בלי לציין סיבה",
        "apihelp-tag-example-log": "הסרת התג <kbd>spam</kbd> מעיול עם המזהה 123 עם הסיבה <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "אחזור אסימון עריכה (בררת המחדל).",
        "apihelp-tokens-example-emailmove": "אחזור אסימון דוא\"ל ואסימון העברה.",
        "apihelp-unblock-description": "שחרור משתמש מחסימה.",
-       "apihelp-unblock-param-id": "מזהה החסימה לשחרור (מתקבל דרך <kbd>list=blocks</kbd>). לא יכול לשמש יחד עם <var>$1user</var>.",
-       "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח IP לחסימה. לא יכול לשמש יחד עם <var>$1id</var>",
+       "apihelp-unblock-param-id": "מזהה החסימה לשחרור (מתקבל דרך <kbd>list=blocks</kbd>). לא יכול לשמש יחד עם <var>$1user</var> או <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח כתובות IP לחסימה. לא יכול לשמש יחד עם <var>$1id</var> או <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "מזהה המשתמש שישוחרר מחסימה. לא יכול לשמש יחד עם <var>$1id</var> או <var>$1user</var>.",
        "apihelp-unblock-param-reason": "סיבה להסרת חסימה.",
        "apihelp-unblock-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-unblock-example-id": "לשחרר את החסימה עם מזהה #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו.",
        "apihelp-userrights-param-remove": "הסרת משתמש מהקבוצות האלו.",
        "apihelp-userrights-param-reason": "סיבה לשינוי.",
+       "apihelp-userrights-param-tags": "לשנות את התגים שיוחלו על העיול ביומן הרשאות המשתמש.",
        "apihelp-userrights-example-user": "הוספת המשתמש <kbd>FooBot</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה <kbd>123</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
+       "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
+       "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
+       "apihelp-validatepassword-param-email": "כתובת הדוא\"ל, לשימוש בעת בדיקת יצירת חשבון.",
+       "apihelp-validatepassword-param-realname": "שם אמתי, לשימוש בעת בדיקת יצירת חשבון.",
+       "apihelp-validatepassword-example-1": "לבדוק את תקינות הססמה <kbd>foobar</kbd> עבור המשתמש הנוכחי.",
+       "apihelp-validatepassword-example-2": "לבדוק את תקינות הססמה <kbd>qwerty</kbd> ליצירת החשבון <kbd>Example</kbd>.",
        "apihelp-watch-description": "להוסיף דפים לרשימת המעקב של המשתמש הנוכחי או הסרתם ממנה.",
        "apihelp-watch-param-title": "הדף להוסיף לרשימת המעקב או להסיר ממנה. יש להשתמש במקום זאת ב־<var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "אם זה מוגדר, הדף יהיה לא במעקב במקום להיות במעקב.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
        "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
-       "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:mediawiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:MediaWiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-help-authmanagerhelper-returnurl": "כתובת URL לחזרה עם זרימות אימות צד־שלישי, חייב להיות מוחלט. נדרש או זה או <var>$1continue</var>.\n\nעם קבלת תשובת <samp>REDIRECT</samp>, בדרך־כלל תפתח דפדפן או תצוגת וב בכתובת ה־<samp>redirecttarget</samp> שצוינה בשביל זרימת אימות צד־שלישי. כשזה יושלם, הצד השלישי ישלח את הדפדפן או את תצוגת הווב לכתובת הזאת. יש לחלץ את כל הפרמטרים של שאילתה או בקשת POST מה־URL ולהעביר אותם בתור בקשת <var>$1continue</var> למודול ה־API הזה.",
        "api-help-authmanagerhelper-continue": "הבקשה הזאת היא המשך אחרי תשובת <samp>UI</samp> או <samp>REDIRECT</samp> קודמת. נדרש זה או <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "המודול הזה מקבל פרמטרים נוספים בהתאם לבקשות אימות זמינות. יש להשתמש ב־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> עם <kbd>amirequestsfor=$1</kbd> (או תגובה קודמת מהמודול הזה, אם זה זמין) כדי להבין מה הבקשות הזמינות ובאילו שדות הן משתמשות.",
+       "apierror-allimages-redirect": "יש להשתמש ב־<kbd>gaifilterredir=nonredirects</kbd> במקום ב־<var>redirects</var> בעת שימוש ב־<kbd>allimages</kbd> בתור מחולל.",
+       "apierror-allpages-generator-redirects": "יש להשתמש ב־<kbd>gaifilterredir=nonredirects</kbd> במקום ב־<var>redirects</var> בעת שימוש ב־<kbd>allpages</kbd> בתור מחולל.",
+       "apierror-appendnotsupported": "אי־אפשר להוסיף את זה לדפים שמשתמשים בדגם תוכן $1.",
+       "apierror-articleexists": "הערך שניסית ליצור כבר נוצר.",
+       "apierror-assertbotfailed": "הבדיקה שלמשתמש יש הרשאת <code>bot</code> נכשלה.",
+       "apierror-assertnameduserfailed": "הבדיקה שהמשתמש הוא \"$1\" נכשלה.",
+       "apierror-assertuserfailed": "הבדיקה שהמשתמש נכנס לחשבון נכשלה.",
+       "apierror-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא שימשה משתמש חסום.",
+       "apierror-badconfig-resulttoosmall": "הערך של <code dir=\"ltr\">$wgAPIMaxResultSize</code> בוויקי הזה קטן מלהחזיק מידע בסיסי על תוצאה.",
+       "apierror-badcontinue": "פרמטר continue בלתי־תקין. יש להעביר את הערך המקורי שהחזירה השאילתה הקודמת.",
+       "apierror-baddiff": "לא ניתן לאחזר את ההשוואה. גרסה אחת לא קיימת או ששתיהן לא קיימות, או שאין לך הרשאה להציג אותן.",
+       "apierror-baddiffto": "יש להגדיר את <var>$1diffto</var> למספר שאינו שלילי, <kbd dir=\"ltr\">prev</kbd>, <kbd dir=\"ltr\">next</kbd> או <kbd dir=\"ltr\">cur</kbd>",
+       "apierror-badformat-generic": "התסדיר המבוקש $1 אינו נתמך במודל התוכן $2.",
+       "apierror-badformat": "התסדיר המבוקש $1 אינו נתמך במודל התוכן $2 שמשמש ב־$3.",
+       "apierror-badgenerator-notgenerator": "המודול <kbd>$1</kbd> אינו יכול לשמש כמחולל.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> בלתי־ידוע.",
+       "apierror-badip": "הפרמטר IP אינו תקין.",
+       "apierror-badmd5": "גיבוב MD5 היה שגוי.",
+       "apierror-badmodule-badsubmodule": "למודול <kbd>$1</kbd> אין תת־מודול \"$2\".",
+       "apierror-badmodule-nosubmodules": "למודול <kbd>$1</kbd> אין תת־מודולים.",
+       "apierror-badparameter": "ערך בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-badquery": "שאילתה בלתי־תקינה.",
+       "apierror-badtimestamp": "ערך בלתי־תקין \"$2\" לפרמטר חותם זמן <var>$1</var>.",
+       "apierror-badtoken": "אסימון CSRF בלתי־תקין.",
+       "apierror-badupload": "פרמטר העלאת הקובץ <var>$1</var> הוא לא העלאת קובץ; יש להקפיד להשתמש ב־<code>multipart/form-data</code> בשביל בקשת ה־POST שלך ולכלול שם קובץ בכותר <code>Content-Disposition</code>.",
+       "apierror-badurl": "ערך בלתי־תקין \"$2\" לפרמטר URL בשם <var>$1</var>.",
+       "apierror-baduser": "ערך בלתי־תקין \"$2\" לפרמטר משתמש בשם <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "הפרדת ערכים מרובים ב־U+001F אפשרית רק בפרמטרים מרובי־פרמטרים.",
+       "apierror-bad-watchlist-token": "סופק אסימון רשימת מעקב בלתי־תקין. נא להשתמש באסימון תקין ב־[[Special:Preferences]].",
+       "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
+       "apierror-blocked": "נחסמת מעריכה.",
+       "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
+       "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
+       "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
+       "apierror-cantblock": "אין לך הרשאה לחסום משתמשים.",
+       "apierror-cantchangecontentmodel": "אין לך הרשאה לשנות את דגם התוכן של דף.",
+       "apierror-canthide": "אין לך הרשאה להסתיר שמות משתמשים ביומן החסימה.",
+       "apierror-cantimport-upload": "אין לך הרשאה לייבא דפים מוּעלים.",
+       "apierror-cantimport": "אין לך הרשאה לייבא דפים.",
+       "apierror-cantoverwrite-sharedfile": "קובץ היעד קיים במאגר משותף ואין לך הרשאה לעקוף אותו.",
+       "apierror-cantsend": "לא נכנסת לחשבון, אין לך חשבון דואר אלקטרוני מאושר, או שאסור לך לשלוח דואר אלקטרוני למשתמשים אחרים, אז אינך לך אפשרות לשלוח דואר אלקטרוני.",
+       "apierror-cantundelete": "לא היה אפשר לשחזר ממחיקה: אולי הגרסאות המבוקשות אינן קיימות, ואולי הן כבר נמחקו.",
+       "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
+       "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
+       "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
+       "apierror-compare-inputneeded": "כותרת, מזהה דף, או מספר גרסה נחוצים בשביל הפרמטרים <var>from</var> ו־<var>to</var>.",
+       "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
+       "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.",
+       "apierror-copyuploadbaddomain": "העלאות לפי URL אינם מורשות מהמתחם הזה.",
+       "apierror-copyuploadbadurl": "העלאה אינה מותרת מה־URL הזה.",
+       "apierror-create-titleexists": "כותרות קיימות אינם יכולות מוגנות עם <kbd>create</kbd>.",
+       "apierror-csp-report": "בעיבוד דו\"ח CSP אירעה שגיאה: $1",
+       "apierror-databaseerror": "[$1] שגיאת שאילתת מסד נתונים.",
+       "apierror-deletedrevs-param-not-1-2": "הפרמטר <var>$1</var> אינו יכול לשמש במצבים 1 או 2.",
+       "apierror-deletedrevs-param-not-3": "הפרמטר <var>$1</var> אינו יכול במצב 3.",
+       "apierror-emptynewsection": "יצירת פסקאות חדשות ריקות בלתי־אפשרי.",
+       "apierror-emptypage": "יצירת דפים חדשים ריקים אינו מותר.",
+       "apierror-exceptioncaught": "[$1] נתפס חריג: $2",
+       "apierror-filedoesnotexist": "הקובץ אינו קיים.",
+       "apierror-fileexists-sharedrepo-perm": "קובץ היעד קיים במאגר משותף. יש להשתמש בפרמטר <var>ignorewarnings</var> כדי לעקוף אותו.",
+       "apierror-filenopath": "לא ניתן לקבל נתיב לקובץ מקומי.",
+       "apierror-filetypecannotberotated": "לא ניתן לסובב את סוג הקובץ הזה.",
+       "apierror-formatphp": "התשובה הזאת לא יכולה להיות מיוצגת עם <kbd>format=php</kbd>. ר' https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "הכותרת בשביל <kbd>$1</kbd> צריכה להיות קובץ.",
+       "apierror-import-unknownerror": "שגיאה בלתי־ידועה בייצוא: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור בוטים או מפעילים.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
+       "apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+       "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+       "apierror-invalidtitle": "כותרת רעה \"$1\".",
+       "apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+       "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+       "apierror-mustbeloggedin-generic": "חובה להיכנס.",
+       "apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
+       "apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
+       "apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
+       "apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+       "apierror-nochanges": "לא התבקשו שינויים.",
+       "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
+       "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
+       "apierror-nosuchlogid": "אין עיול יומן עם המזהה $1.",
+       "apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
+       "apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
+       "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
+       "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
+       "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
+       "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
+       "apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
+       "apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+       "apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
+       "apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+       "apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+       "apiwarn-invalidcategory": "\"$1\" אינה קטגוריה.",
+       "apiwarn-invalidtitle": "\"$1\" אינה כותרת תקינה.",
+       "apiwarn-notfile": "\"$1\" אינו קובץ.",
+       "apiwarn-validationfailed-badpref": "לא העדפה תקינה.",
+       "apiwarn-validationfailed-cannotset": "לא יכולה להיות מוגדרת על־ידי המודול הזה.",
+       "apiwarn-validationfailed-keytoolong": "המפתח ארוך מדי (מותר לכתוב לא יותר מ־$1 בתים).",
+       "apiwarn-validationfailed": "שגיאה בבדיקת תקינות עבור <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>אזהרת אבטחה</strong>: <var dir=\"ltr\">$wgDebugAPI</var> מופעל.",
+       "api-feed-error-title": "שגיאה ($1)",
+       "api-usage-docref": "ר' $1 לשימוש ב־API.",
+       "api-exception-trace": "$1 בקובץ $2 (שורה $3)\n$4",
        "api-credits-header": "קרדיטים",
        "api-credits": "מפתחי ה־API:\n* רואן קטאו (מפתח מוביל 2007–2009)\n* ויקטור וסילייב\n* בריאן טונג מין\n* סאם ריד\n* יורי אסטרחן (יוצר, מפתח מוביל מספטמבר 2006 עד ספטמבר 2007)\n* בראד יורש (מפתח מוביל מאז 2013)\n\nאנא שלחו הערות, הצעות ושאלות לכתובת mediawiki-api@lists.wikimedia.org או כתבו דיווח באג באתר https://phabricator.wikimedia.org."
 }
index e0920f6..232386e 100644 (file)
@@ -92,5 +92,6 @@
        "api-help-param-limit2": "Nem engedélyezett több mint $1 (botoknak $2).",
        "api-help-param-integer-min": "Az {{PLURAL:$1|1=érték nem lehet kisebb|2=értékek nem lehetnek kisebbek}} mint $2.",
        "api-help-param-integer-max": "Az {{PLURAL:$1|1=érték nem lehet nagyobb|2=értékek nem lehetnek nagyobbak}} mint $3.",
-       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Az értéknek $2 és $3 között kell lennie.|2=Az értékeknek $2 és $3 között kell lenniük.}}"
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Az értéknek $2 és $3 között kell lennie.|2=Az értékeknek $2 és $3 között kell lenniük.}}",
+       "api-help-param-default": "Alapértelmezett: $1"
 }
index 0f8a9ad..dad298f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "McDutchie"
+                       "McDutchie",
+                       "Rafaneta"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n</div>\n<strong>Stato:</strong> Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\n<strong>Requestas erronee:</strong> Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\n<strong>Tests:</strong> Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].",
        "apihelp-main-param-smaxage": "Fixar le capite de controlo de cache HTTP <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
        "apihelp-main-param-maxage": "Fixar le capite de controlo de cache HTTP <code>max-age</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
        "apihelp-main-param-assert": "Verificar si le usator ha aperite session si mittite a <kbd>user</kbd>, o si ha le derecto de usator robot si <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Verificar que le usator currente es le usator nominate.",
        "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.",
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
-       "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Illo debe corresponder exactemente a un del origines in le capite <code>Origin</code>, dunque debe esser mittite a qualcosa como <kbd>http://ia.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si iste parametro non corresponde al capite <code>Origin</code>, un responsa 403 essera retornate. Si iste parametro corresponde al capite <code>Origin</code> e le origine es in le lista blanc, un capite <code>Access-Control-Allow-Origin</code> essera inserite.",
+       "apihelp-main-param-responselanginfo": "Includer le linguas usate pro <var>uselang</var> e <var>errorlang</var> in le resultato.",
+       "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST).\n\nPro requestas authenticate, isto debe corresponder exactemente a un del origines in le capite <code>Origin</code>, dunque debe esser mittite a qualcosa como <kbd>http://ia.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si iste parametro non corresponde al capite <code>Origin</code>, un responsa 403 essera retornate. Si iste parametro corresponde al capite <code>Origin</code> e le origine es in le lista blanc, le capites <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> essera inserite.\n\nPro requestas non authenticate, specifica le valor <kbd>*</kbd>. Isto causara le insertion del capite <code>Access-Control-Allow-Origin</code>, ma <code>Access-Control-Allow-Credentials</code> essera mittite a <code>false</code> e tote le datos specific al usator essera restringite.",
        "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> retorna un lista de codices de lingua, o specifica <kbd>user</kbd> pro usar le preferentia de lingua del usator actual, o specifica <kbd>content</kbd> pro usar le lingua de contento de iste wiki.",
        "apihelp-block-description": "Blocar un usator.",
-       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.",
+       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo de adresses IP a blocar. Non pote esser usate insimul a <var>$1userid</var>",
        "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. <kbd>5 months</kbd> o <kbd>2 weeks<.kbd>) o absolute (p.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si es mittite a <kbd>infinite</kbd>, <kbd>indefinite</kbd> o <kbd>never</kbd>, le blocada nunquam expirara.",
        "apihelp-block-param-reason": "Motivo del blocada.",
        "apihelp-block-param-anononly": "Blocar solmente usatores anonyme (i.e. disactivar modificationes anonyme pro iste adresse IP).",
@@ -53,6 +56,6 @@
        "apihelp-createaccount-description": "Crear un nove conto de usator.",
        "apihelp-createaccount-param-name": "Nomine de usator.",
        "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.",
-       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del <kbd>Pagina principal</kbd> que non ha essite facite per le usator anonyme <kbd>127.0.0.1</kbd>",
        "api-credits": "Programmatores del API:\n* Roan Kattouw (programmator dirigente Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, programmator dirigente Sept. 2006–Sept. 2007)\n* Brad Jorsch (programmator dirigente 2013–presente)\n\nInvia tu commentos, suggestiones e questiones a mediawiki-api@lists.wikimedia.org\no insere un reportage de bug a https://phabricator.wikimedia.org/."
 }
index 192e812..5ae3547 100644 (file)
@@ -92,6 +92,7 @@
        "apihelp-expandtemplates-param-text": "Teks wiki yang akan diubah.",
        "apihelp-expandtemplates-param-revid": "ID revisi, untuk <nowiki>{{REVISIONID}}</nowiki> dan variabel serupa.",
        "apihelp-expandtemplates-param-prop": "Bagian informasi manakah yang ingin didapatkan.\n\nPerhatikan bahwa jika tidak ada nilai yang dipilih, hasilnya akan mengandung teks wiki, namun keluaran akan berupa format usang.",
+       "apihelp-feedcontributions-param-deletedonly": "Tampilkan hanya kontribusi terhapus.",
        "apihelp-login-example-login": "Masuk log.",
        "apihelp-move-param-noredirect": "Jangan buat pengalihan.",
        "apihelp-move-param-unwatch": "Hapus halaman dan pengalihan dari daftar pantauan pengguna ini.",
index ea3f415..8c76914 100644 (file)
@@ -15,7 +15,8 @@
                        "Urielejh",
                        "Matteocng",
                        "Einreiher",
-                       "Mpiva"
+                       "Mpiva",
+                       "Margherita.mignanelli"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
@@ -26,7 +27,7 @@
        "apihelp-main-param-servedby": "Includi nel risultato il nome dell'host che ha servito la richiesta.",
        "apihelp-main-param-curtimestamp": "Includi nel risultato il timestamp attuale.",
        "apihelp-block-description": "Blocca  un utente.",
-       "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.",
+       "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare. Non può essere usato insieme a <var>$1userid</var>",
        "apihelp-block-param-expiry": "Tempo di scadenza. Può essere relativo (ad esempio, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o assoluto (ad esempio <kbd>2014-09-18T12:34:56Z</kbd>). Se impostato a <kbd>infinite</kbd>, <kbd>indefinite</kbd> o <kbd>never</kbd>, il blocco non scadrà mai.",
        "apihelp-block-param-reason": "Motivo del blocco.",
        "apihelp-block-param-anononly": "Blocca solo gli utenti non registrati (cioè disattiva i contributi anonimi da questo indirizzo IP).",
        "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
        "apihelp-revisiondelete-param-show": "Cosa mostrare per ogni versione.",
        "apihelp-revisiondelete-param-reason": "Motivo per l'eliminazione o il ripristino.",
+       "apihelp-setpagelanguage-description": "Cambia la lingua di una pagina.",
+       "apihelp-setpagelanguage-param-reason": "Motivo per la modifica.",
        "apihelp-stashedit-param-title": "Titolo della pagina che si sta modificando.",
        "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.",
        "apihelp-stashedit-param-text": "Contenuto della pagina.",
        "apihelp-tokens-param-type": "Tipi di token da richiedere.",
        "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "apihelp-unblock-description": "Sblocca un utente",
+       "apihelp-unblock-param-user": "Nome utente, indirizzo IP o range di IP da sbloccare. Non può essere usato insieme a <var>$1id</var> o <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID utente da sbloccare. Non può essere usato insieme a <var>$1id</var> o <var>$1userid</var>.",
        "apihelp-unblock-param-reason": "Motivo dello sblocco.",
        "apihelp-unblock-param-tags": "Modifica etichette da applicare all'elemento del registro dei blocchi.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-userrights-param-add": "Aggiungi l'utente a questi gruppi.",
        "apihelp-userrights-param-remove": "Rimuovi l'utente da questi gruppi.",
        "apihelp-userrights-param-reason": "Motivo del cambiamento.",
+       "apihelp-validatepassword-description": "Convalida una password seguendo le politiche del wiki sulle password.\n\nLa validità è riportata come <samp>Good</samp> se la password è accettabile, <samp>Change</samp> se la password può essere utilizzata per l'accesso ma deve essere modificata, o <samp>Invalid</samp> se la password non è utilizzabile.",
+       "apihelp-validatepassword-param-password": "Password da convalidare.",
+       "apihelp-validatepassword-example-1": "Convalidare la password <kbd>foobar</kbd> per l'attuale utente.",
+       "apihelp-validatepassword-example-2": "Convalida la password <kbd>qwerty</kbd> per la creazione dell'utente <kbd>Example</kbd>.",
        "apihelp-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.",
        "apihelp-format-param-wrappedhtml": "Restituisce l'HTML ben formattato e i moduli ResourceLoader associati come un oggetto JSON.",
        "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
+       "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.",
        "api-credits-header": "Crediti"
 }
index d9d079b..49f8de7 100644 (file)
@@ -25,7 +25,8 @@
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
        "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> は <kbd>siprop=languages</kbd> を付けると言語コードの一覧を返します。<kbd>user</kbd> を指定することで現在の利用者の個人設定の言語を、<kbd>content</kbd> を指定することでこのウィキの本文の言語を使用することもできます。",
        "apihelp-block-description": "利用者をブロックします。",
-       "apihelp-block-param-user": "ブロックする利用者名、IPアドレスまたはIPレンジ。",
+       "apihelp-block-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。<var>$1userid</var>とは同時に使用できません。",
+       "apihelp-block-param-userid": "ブロックする利用者のID。<var>$1user</var>とは同時に使用できません。",
        "apihelp-block-param-expiry": "有効期限。相対的 (例: <kbd>5 months</kbd> または <kbd>2 weeks</kbd>) または絶対的 (e.g. <kbd>2014-09-18T12:34:56Z</kbd>) どちらでも構いません。<kbd>infinite</kbd>, <kbd>indefinite</kbd>, もしくは <kbd>never</kbd> と設定した場合, 無期限ブロックとなります。",
        "apihelp-block-param-reason": "ブロックの理由。",
        "apihelp-block-param-anononly": "匿名利用者のみブロックします(つまり、このIPアドレスからの匿名での編集を不可能にします)。",
        "apihelp-userrights-param-userid": "利用者ID。",
        "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
        "apihelp-userrights-param-reason": "変更の理由。",
+       "apihelp-watch-description": "現在の利用者のウォッチリストにページを追加/除去します。",
        "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
        "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に返します。",
        "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-xml-description": "データを XML 形式で出力します。",
-       "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:mediawiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
+       "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:MediaWiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
        "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
        "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
index e4e6e8c..dfe77e3 100644 (file)
                        "Priviet",
                        "Ykhwong",
                        "Jonghaya",
-                       "Jerrykim306"
+                       "Jerrykim306",
+                       "코코아"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\9d´ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ \"MediaWiki-API-Error\" í\82¤ê°\80 í\8f¬í\95¨ë\90\9c HTTP í\97¤ë\8d\94ê°\80 ì \84ì\86¡ë\90\98ë©° ë°\98í\99\98ë\90\98ë\8a\94 í\97¤ë\8d\94ì\99\80 ì\98¤ë¥\98 ì½\94ë\93\9cì\9d\98 ê°\92ì\9d\80 ë\8f\99ì\9d¼í\95\9c ê°\92ì\9c¼ë¡\9c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|ì\84¤ëª\85문ì\84\9c]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API ì\95\8c림 ì\82¬í\95­]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ë²\84ê·¸ ë°\8f ì\9a\94ì²­]\n</div>\n<strong>ì\83\81í\83\9c:</strong> ì\9d´ í\8e\98ì\9d´ì§\80ì\97\90 ë³´ì\9d´ë\8a\94 ëª¨ë\93  ê¸°ë\8a¥ì\9d\80 ì \95ì\83\81ì \81ì\9c¼ë¡\9c ì\9e\91ë\8f\99í\95\98ì§\80ë§\8c, APIë\8a\94 ì\97¬ì \84í\9e\88 í\99\9cë°\9cí\95\98ê²\8c ê°\9cë°\9cë\90\98ê³  ì\9e\88ì\9c¼ë©°, ì\96¸ì \9cë\93 ì§\80 ë³\80ê²½ë\90  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\97\85ë\8d°ì\9d´í\8a¸ ê³µì§\80를 ë°\9bì\95\84보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸]를 êµ¬ë\8f\85í\95\98ì\8b­ì\8b\9cì\98¤.\n\n<strong>ì\9e\98못ë\90\9c ì\9a\94ì²­:</strong> APIì\97\90 ì\9e\98못ë\90\9c ì\9a\94ì²­ì\9d´ ì \84ì\86¡ë\90\98ë©´ \"MediaWiki-API-Error\" í\82¤ê°\80 í\8f¬í\95¨ë\90\9c HTTP í\97¤ë\8d\94ê°\80 ì \84ì\86¡ë\90\98ë©° ë°\98í\99\98ë\90\98ë\8a\94 í\97¤ë\8d\94ì\99\80 ì\98¤ë¥\98 ì½\94ë\93\9cì\9d\98 ê°\92ì\9d\80 ëª¨ë\91\90 ë\8f\99ì\9d¼í\95\9c ê°\92ì\9c¼ë¡\9c ì\84¤ì \95ë\90©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[mw:API:Errors and warnings/ko|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>Waiting for $host: $lag seconds lagged</samp> 메시지가 제공됩니다.<br />[[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
        "apihelp-main-param-requestid": "주어진 요청 값은 응답에 포함됩니다. 요청을 구분하기 위해 사용될 수 있습니다.",
        "apihelp-main-param-servedby": "결과에 요청을 처리한 호스트네임을 포함합니다.",
        "apihelp-main-param-curtimestamp": "결과의 타임스탬프를 포함합니다.",
+       "apihelp-main-param-responselanginfo": "<var>uselang</var> 및 <var>errorlang</var>에 사용되는 언어를 결과에 포함합니다.",
+       "apihelp-main-param-origin": "크로스 도메인 AJAX 요청 (CORS)을 사용하여 API에 접근할 때, 이것을 발신 도메인으로 설정하십시오. 모든 pre-flight 요청에 포함되어야 하며, 이에 따라 (POST 본문이 아닌) 요청 URI의 일부여야 합니다.\n\n인증된 요청의 경우, <code>Origin</code> 헤더의 발신지들 중 하나와 정확히 일치해야 하므로 <kbd>https://en.wikipedia.org</kbd> 또는 <kbd>https://meta.wikimedia.org</kbd>와 같이 설정되어야 합니다. 이 변수가 <code>Origin</code> 헤더와 일치하지 않으면 403 응답이 반환됩니다. 이 변수가 <code>Origin</code> 헤더와 일치하고 발신지가 화이트리스트에 있을 경우 <code>Access-Control-Allow-Origin</code>과 <code>Access-Control-Allow-Credentials</code> 헤더가 설정됩니다.\n\n인증되지 않은 요청의 경우, <kbd>*</kbd> 값을 지정하십시오. 이를 통해 <code>Access-Control-Allow-Origin</code> 헤더가 설정되지만 <code>Access-Control-Allow-Credentials</code>는 <code>false</code>로 설정되어 모든 사용자 지정 데이터가 제한을 받게 됩니다.",
        "apihelp-main-param-uselang": "메시지 번역을 위한 언어입니다. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>에 <kbd>siprop=languages</kbd>를 함께 사용하면 언어 코드의 목록을 반환하고, <kbd>user</kbd>를 지정하면 현재 사용자의 언어 환경 설정을 사용하며, <kbd>content</kbd>를 지정하면 이 위키의 콘텐츠 언어를 사용합니다.",
+       "apihelp-main-param-errorformat": "경고 및 오류 텍스트 출력을 위해 사용할 형식입니다.\n; plaintext: HTML 태그가 제거되고 엔티티가 치환된 위키텍스트입니다.\n; wikitext: 구문 분석되지 않은 위키텍스트입니다.\n; html: HTML입니다.\n; raw: 메시지 키와 변수입니다.\n; none: 텍스트 없이 오류 코드만 출력합니다.\n; bc: 미디어위키 1.29 이전에 사용된 형식입니다. <var>errorlang</var> 및 <var>errorsuselocal</var>은 무시됩니다.",
+       "apihelp-main-param-errorlang": "경고와 오류를 위해 사용할 언어입니다. <kbd>siprop=languages</kbd>가 포함된 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>는 언어 코드의 목록을 반환하고, <kbd>content</kbd>를 지정하면 이 위키의 내용 상의 언어를 사용하며, <kbd>uselang</kbd>을 지정하면 <var>uselang</var> 변수와 동일한 값을 사용합니다.",
+       "apihelp-main-param-errorsuselocal": "지정하면 오류 텍스트가 {{ns:MediaWiki}} 이름공간에서 지역적으로 정의된 메시지를 사용합니다.",
        "apihelp-block-description": "사용자를 차단합니다.",
-       "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
+       "apihelp-block-param-user": "차단할 사용자 이름, IP 주소, 또는 IP 주소 대역입니다. <var>$1userid</var>와(과) 함께 사용할 수 없습니다.",
+       "apihelp-block-param-userid": "차단할 사용자 ID입니다. <var>$1user</var>와(과) 함께 사용할 수 없습니다.",
        "apihelp-block-param-expiry": "기한. 상대값(예시: <kbd>5 months</kbd> 또는 </kbd>2 weeks</kbd>) 또는 절대값(예시: <kbd>2014-09-18T12:34:56Z</kbd>)이 될 수 있습니다. <kbd>infinite</kbd>, <kbd>indefinite</kbd> 또는 <kbd>never</kbd>로 설정하면 무기한으로 설정됩니다.",
        "apihelp-block-param-reason": "차단 이유.",
        "apihelp-block-param-anononly": "익명 사용자만 차단합니다. (즉, 이 IP의 익명 편집을 막음)",
@@ -54,6 +61,7 @@
        "apihelp-clearhasmsg-example-1": "현재 계정의 <code>hasmsg</code> 플래그를 삭제합니다.",
        "apihelp-clientlogin-description": "상호작용 플로우를 이용하여 위키에 로그인합니다.",
        "apihelp-clientlogin-example-login": "사용자 <kbd>Example</kbd>, 비밀번호 <kbd>ExamplePassword</kbd>로 위키 로그인 과정을 시작합니다.",
+       "apihelp-clientlogin-example-login2": "<kbd>987654</kbd>의 <var>OATHToken</var>을 지정하여 2요소 인증을 위한 <samp>UI</samp> 응답 이후에 로그인을 계속합니다.",
        "apihelp-compare-description": "두 문서 간의 차이를 가져옵니다.\n\n대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.",
        "apihelp-compare-param-fromtitle": "비교할 첫 이름.",
        "apihelp-compare-param-fromid": "비교할 첫 문서 ID.",
        "apihelp-feedrecentchanges-param-invert": "선택한 항목을 제외한 모든 이름공간.",
        "apihelp-feedrecentchanges-param-associated": "관련 (토론 또는 일반) 이름공간을 포함합니다.",
        "apihelp-feedrecentchanges-param-limit": "반환할 결과의 최대 수.",
-       "apihelp-feedrecentchanges-param-from": "이후의 변경 사항을 보여줍니다.",
+       "apihelp-feedrecentchanges-param-from": "이후의 변경사항을 보여줍니다.",
        "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
        "apihelp-protect-example-protect": "문서 보호",
        "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
+       "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.",
+       "apihelp-query-param-list": "가져올 목록입니다.",
+       "apihelp-query-param-meta": "가져올 메타데이터입니다.",
+       "apihelp-query-param-indexpageids": "반환된 모든 페이지 ID를 나열하는 부가적인 페이지 ID 섹션을 포함합니다.",
+       "apihelp-query-param-export": "기존의 페이지나 생성된 페이지들 전체의 현재 판들을 내보냅니다.",
+       "apihelp-query-param-exportnowrap": "XML 결과물로 래핑하지 않고 엑스포트 XML을 반환합니다. $1export와만 같이 사용할 수 있습니다.",
+       "apihelp-query-param-iwurl": "제목이 인터위키 링크인 경우 전체 URL을 가져올지의 여부입니다.",
+       "apihelp-query-param-rawcontinue": "계속하기 위해 순수 <samp>query-continue</samp> 데이터를 반환합니다.",
        "apihelp-query+allcategories-description": "모든 분류를 열거합니다.",
        "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.",
        "apihelp-query+allcategories-param-dir": "정렬 방향.",
        "apihelp-query+alldeletedrevisions-param-user": "이 사용자에 대한 판만 나열합니다.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "이 사용자에 대한 판을 나열하지 않습니다.",
        "apihelp-query+alldeletedrevisions-param-namespace": "이 이름공간의 문서만 나열합니다.",
+       "apihelp-query+alldeletedrevisions-example-user": "<kbd>Example</kbd>님의 최근 50개의 삭제된 기여를 나열합니다.",
        "apihelp-query+allfileusages-paramvalue-prop-title": "파일의 제목을 추가합니다.",
        "apihelp-query+allfileusages-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+allfileusages-example-unique": "고유한 파일 제목을 나열합니다.",
        "apihelp-query+allfileusages-example-unique-generator": "모든 파일 제목을 가져오되, 존재하지 않는 항목을 표시합니다.",
        "apihelp-query+allfileusages-example-generator": "파일을 포함하는 문서를 가져옵니다.",
        "apihelp-query+allimages-description": "모든 그림을 순차적으로 열거합니다.",
+       "apihelp-query+allimages-example-recent": "최근 업로드된 파일을 보여줍니다. [[Special:NewFiles]]와 유사합니다.",
        "apihelp-query+alllinks-paramvalue-prop-title": "링크의 제목을 추가합니다.",
        "apihelp-query+alllinks-param-namespace": "열거할 이름공간.",
        "apihelp-query+alllinks-param-limit": "반환할 총 항목 수입니다.",
        "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]]의 현재 판에 대한 정보를 가져옵니다.",
        "apihelp-query+imageinfo-example-dated": "2008년 및 그 이후의 [[:File:Test.jpg]]의 판에 대한 정보를 가져옵니다.",
        "apihelp-query+images-param-limit": "반환할 파일 수.",
+       "apihelp-query+images-example-simple": "[[Main Page|대문]]에 사용된 파일 목록을 가져옵니다.",
+       "apihelp-query+images-example-generator": "[[Main Page|대문]]에 사용된 모든 파일에 관한 정보를 가져옵니다.",
        "apihelp-query+imageusage-param-namespace": "열거할 이름공간.",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]]를 이용하여 페이지의 정보를 가져옵니다.",
        "apihelp-query+info-description": "기본 페이지 정보를 가져옵니다.",
        "apihelp-query+prefixsearch-param-limit": "반환할 결과의 최대 수",
        "apihelp-query+prefixsearch-param-profile": "검색 프로파일 사용",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "보호 수준을 추가합니다.",
+       "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages|특수:오래된문서]]에서 결과를 반환합니다.",
        "apihelp-query+recentchanges-param-prop": "추가 정보를 포함합니다:",
        "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.",
        "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd>을 검색합니다.",
        "apihelp-query+search-example-text": "<kbd>meaning</kbd>의 텍스트를 검색합니다.",
+       "apihelp-query+siteinfo-description": "사이트의 전반적인 정보를 반환합니다.",
        "apihelp-query+siteinfo-param-prop": "가져올 정보:",
-       "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보.",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "등록된 이름공간 및 기본 이름의 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "등록된 이름공간 별칭의 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "특수 문서의 별칭 목록입니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "매직 워드와 별칭의 목록입니다.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "사이트 통계를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "인터위키 맵을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 필터링 및 지역화 선택 가능)",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "반복 지연이 가장 높은 데이터베이스 서버를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "사용자 그룹 및 관련 권한을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "위키에 설치된 라이브러리를 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "위키에 설치된 확장 기능을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "사용 중인 모든 스킨의 목록을 반환합니다. (<var>$1inlanguagecode</var>를 사용하여 지역화 선택이 가능하며, 이를 사용하지 않으면 본문의 언어를 사용함)",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "파서 확장 태그의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "파서 함수 훅의 목록을 반환합니다.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "예약된 모든 훅(<var>[[mw:Manual:$wgHooks|$wgHooks]]</var>의 내용)의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "변수 ID의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "외부 링크에 허용된 프로토콜의 목록을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "사용자 환경 설정의 기본값을 반환합니다.",
        "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "업로드 대화 상자 구성을 반환합니다.",
+       "apihelp-query+siteinfo-param-filteriw": "인터위키 맵의 로컬 또는 로컬이 아닌 항목만 반환합니다.",
+       "apihelp-query+siteinfo-param-showalldb": "가장 지연이 심한 서버뿐 아니라, 모든 데이터베이스 서버를 나열합니다.",
        "apihelp-query+siteinfo-param-numberingroup": "사용자 그룹의 사용자 수를 나열합니다.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "지역화된 언어 이름 (가능한 경우) 및 스킨 이름의 언어 코드입니다.",
        "apihelp-query+siteinfo-example-simple": "사이트 정보를 가져옵니다.",
        "apihelp-query+siteinfo-example-interwiki": "로컬 인터위키 접두사 목록을 가져옵니다.",
+       "apihelp-query+siteinfo-example-replag": "현재의 반복 지연을 검사합니다.",
        "apihelp-query+tags-param-limit": "나열할 태그의 최대 수.",
        "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.",
        "apihelp-query+templates-param-limit": "반환할 틀 수.",
        "apihelp-query+tokens-param-type": "요청할 토큰의 종류.",
+       "apihelp-query+tokens-example-simple": "csrf 토큰을 가져옵니다. (기본값)",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "각 문서의 페이지 ID.",
        "apihelp-query+transcludedin-paramvalue-prop-title": "각 문서의 제목.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.",
        "apihelp-query+users-param-prop": "포함할 정보:",
        "apihelp-query+users-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
        "apihelp-query+users-paramvalue-prop-registration": "사용자의 등록 타임스탬프를 추가합니다.",
+       "apihelp-query+users-param-userids": "정보를 가져올 사용자 ID의 목록입니다.",
        "apihelp-query+users-param-token": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>을 대신 사용하십시오.",
        "apihelp-query+users-example-simple": "사용자 <kbd>Example</kbd>의 정보를 반환합니다.",
        "apihelp-query+watchlist-description": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.",
        "apihelp-query+watchlist-param-user": "이 사용자의 변경 사항만 나열합니다.",
-       "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경 사항을 나열하지 않습니다.",
+       "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경사항을 나열하지 않습니다.",
        "apihelp-query+watchlist-paramvalue-prop-ids": "판 ID와 페이지 ID를 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-title": "문서의 제목을 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
        "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
        "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
+       "apihelp-setpagelanguage-description": "문서의 언어를 변경합니다.",
+       "apihelp-setpagelanguage-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>을 활성화하십시오.",
+       "apihelp-setpagelanguage-param-reason": "변경 이유.",
+       "apihelp-setpagelanguage-example-language": "<kbd>Main Page</kbd>의 언어를 바스크어로 변경합니다.",
        "apihelp-stashedit-param-sectiontitle": "새 문단을 위한 제목.",
        "apihelp-stashedit-param-text": "문서 내용.",
        "apihelp-stashedit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-tag-param-reason": "변경 이유.",
        "apihelp-tokens-param-type": "요청할 토큰의 종류.",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "apihelp-unblock-param-user": "차단을 해제할 사용자 이름, IP 주소, IP 주소 대역입니다. <var>$1id</var> 또는 <var>$1userid</var>와(과) 함께 사용할 수 없습니다.",
+       "apihelp-unblock-param-userid": "차단을 해제할 사용자 ID입니다. <var>$1id</var> 또는 <var>$1user</var>와(과) 함께 사용할 수 없습니다.",
        "apihelp-unblock-param-reason": "차단 해제 이유.",
+       "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.",
        "apihelp-userrights-param-user": "사용자 이름.",
        "apihelp-userrights-param-userid": "사용자 ID.",
-       "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
+       "apihelp-validatepassword-param-email": "계정 생성을 테스트할 때 사용할 이메일 주소입니다.",
+       "apihelp-validatepassword-param-realname": "계정 생성을 테스트할 때 사용할 실명입니다.",
+       "apihelp-json-description": "데이터를 JSON 형식으로 출력합니다.",
+       "apihelp-json-param-formatversion": "출력 형식:\n;1:하위 호환 포맷 (XML 스타일 불린, 콘텐츠 노드를 위한 <samp>*</samp> 키 등).\n;2:실험적인 모던 포맷. 상세 내용은 바뀔 수 있습니다!\n;latest:최신 포맷(현재 <kbd>2</kbd>)을 이용하지만 경고 없이 바뀔 수 있습니다.",
+       "apihelp-jsonfm-description": "데이터를 JSON 포맷으로 출력합니다. (HTML의 가독성 증가)",
+       "apihelp-rawfm-description": "디버깅 요소를 포함하여 데이터를 JSON 형식으로 출력합니다. (HTML의 가독성 증가)",
        "apihelp-xml-param-includexmlnamespace": "지정하면 XML 이름공간을 추가합니다.",
        "api-format-title": "미디어위키 API 결과",
+       "api-pageset-param-titles": "작업할 제목의 목록입니다.",
+       "api-pageset-param-pageids": "작업할 페이지 ID의 목록입니다.",
+       "api-pageset-param-revids": "작업할 판 ID의 목록입니다.",
+       "api-pageset-param-generator": "특정 쿼리 모듈을 실행함으로써 작업할 페이지의 목록입니다.\n\n<strong>참고:</strong> 발생기 변수명은 \"g\"로 시작해야 합니다. 예시를 참고하십시오.",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
        "api-help-param-type-user": "유형: {{PLURAL:$1|1=사용자 이름|2=사용자 이름 목록}}",
-       "api-help-param-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 (<kbd>{{!}}</kbd>로 구분)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 (<kbd>{{!}}</kbd>로 구분)}}: $2 또는 [[Special:ApiHelp/main#main/datatypes|alternative]]: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}",
        "api-help-param-limit": "$1 초과는 허용되지 않습니다.",
        "api-help-param-limit2": "$1 초과는 허용되지 않습니다. (봇의 경우 $2)",
        "api-help-param-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.",
+       "api-help-param-multi-separate": "<kbd>|</kbd> 또는 [[Special:ApiHelp/main#main/datatypes|대안]]으로 값을 구분합니다.",
        "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})",
        "api-help-param-default": "기본값: $1",
        "api-help-param-default-empty": "기본값: <span class=\"apihelp-empty\">(비어 있음)</span>",
+       "api-help-param-token": "\"$1\" 토큰은 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]에서 가져옵니다",
        "api-help-param-token-webui": "호환성을 위해, 웹 UI에 사용된 토큰도 허용합니다.",
        "api-help-param-continue": "더 많은 결과를 이용할 수 있을 때, 계속하려면 이것을 사용하십시오.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(설명 없음)</span>",
        "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
        "api-help-right-apihighlimits": "API 쿼리에서 더 높은 제한 사용 (느린 쿼리: $1, 빠른 쿼리: $2) 느린 쿼리에 대한 제한은 다중값 매개변수에도 적용됩니다.",
        "api-help-open-in-apisandbox": "<small>[연습장에서 열기]</small>",
+       "api-help-authmanagerhelper-request": "<kbd>amirequestsfor=$1</kbd>을(를) 지정하여 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>가 반환한 <samp>id</samp>를 통해 이 인증 요청을 사용합니다.",
        "api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.",
+       "api-help-authmanagerhelper-additional-params": "이 모듈은 사용 가능한 인증 요청에 따라 추가 변수를 허용합니다. 사용 가능한 요청 및 사용되는 필드를 결정하려면 <kbd>amirequestsfor=$1</kbd>(또는 해당되는 경우 이 모듈의 과거 응답)과 함께 <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>을(를) 사용하십시오.",
+       "apierror-articleexists": "작성하려는 문서가 이미 만들어져 있습니다.",
+       "apierror-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
+       "apierror-badgenerator-unknown": "알 수 없는 <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP 변수가 유효하지 않습니다.",
+       "apierror-badmd5": "제공된 MD5 해시가 잘못되었습니다.",
+       "apierror-badmodule-badsubmodule": "<kbd>$1</kbd> 모듈에 \"$2\" 하위 모듈이 없습니다.",
+       "apierror-badmodule-nosubmodules": "<kbd>$1</kbd> 모듈은 하위 모듈이 없습니다.",
+       "apierror-badquery": "유효하지 않은 쿼리입니다.",
+       "apierror-badtoken": "잘못된 CSRF 토큰.",
+       "apierror-blockedfrommail": "이메일 보내기에서 차단되어 있습니다.",
+       "apierror-blocked": "편집에서 차단되어 있습니다.",
+       "apierror-botsnotsupported": "이 인터페이스는 봇을 위해 지원되지 않습니다.",
+       "apierror-cannotviewtitle": "$1을(를) 볼 권한이 없습니다.",
+       "apierror-cantblock": "사용자를 차단할 권한이 없습니다.",
+       "apierror-canthide": "차단 기록에서 사용자 이름을 숨길 권한이 없습니다.",
+       "apierror-cantimport-upload": "업로드된 페이지를 가져올 권한이 없습니다.",
+       "apierror-cantimport": "페이지를 가져올 권한이 없습니다.",
+       "apierror-cantsend": "로그인하지 않았거나 인증된 이메일 주소가 없거나 다른 사용자로 이메일을 보낼 권한이 없기 때문에 이메일을 보낼 수 없습니다.",
+       "apierror-databaseerror": "[$1] 데이터베이스 쿼리 오류.",
+       "apierror-emptynewsection": "비어있는 새 문단을 만들 수 없습니다.",
+       "apierror-emptypage": "새 문서로 빈 문서를 만들 수 없습니다.",
+       "apierror-exceptioncaught": "[$1] 예외가 발생했습니다: $2",
+       "apierror-filedoesnotexist": "파일이 존재하지 않습니다.",
+       "apierror-filenopath": "로컬 파일 경로를 가져올 수 없습니다.",
+       "apierror-import-unknownerror": "알 수 없는 가져오기 오류: $1.",
+       "apierror-invalidcategory": "입력한 분류 이름이 올바르지 않습니다.",
+       "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
+       "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.",
+       "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
+       "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.",
+       "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.",
+       "apierror-invalidtitle": "잘못된 제목 \"$1\".",
+       "apierror-invaliduser": "잘못된 사용자 이름 \"$1\".",
+       "apierror-invaliduserid": "<var>$1</var> 사용자 ID는 유효하지 않습니다.",
+       "apierror-maxlag-generic": "데이터베이스 서버 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.",
+       "apierror-maxlag": "$2 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.",
+       "apierror-missingparam": "<var>$1</var> 변수는 설정해야 합니다.",
+       "apierror-missingtitle": "지정한 페이지가 존재하지 않습니다.",
+       "apierror-missingtitle-byname": "$1 문서가 존재하지 않습니다.",
+       "apierror-moduledisabled": "<kbd>$1</kbd> 모듈은 비활성화되었습니다.",
+       "apierror-mustbeloggedin-generic": "로그인해야 합니다.",
+       "apierror-mustbeloggedin-linkaccounts": "계정을 연결하려면 로그인해야 합니다.",
+       "apierror-mustbeloggedin": "$1에 로그인해야 합니다.",
+       "apierror-mustbeposted": "<kbd>$1</kbd> 모듈은 POST 요청이 필요합니다.",
+       "apierror-noedit-anon": "익명 사용자는 문서를 편집할 수 없습니다.",
+       "apierror-noedit": "문서를 편집할 권한이 없습니다.",
+       "apierror-noimageredirect": "그림 넘겨주기를 만들 권한이 없습니다.",
+       "apierror-nosuchrevid": "ID $1에 해당하는 판이 없습니다.",
+       "apierror-nosuchuserid": "ID $1에 해당하는 사용자가 없습니다.",
+       "apierror-notarget": "이 작업을 위한 유효한 대상을 지정하지 않았습니다.",
+       "apierror-pagecannotexist": "이름공간은 실제 페이지를 허용하지 않습니다.",
+       "apierror-pagelang-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.",
+       "apierror-permissiondenied": "$1에 대한 권한이 없습니다.",
+       "apierror-permissiondenied-generic": "권한이 없습니다.",
+       "apierror-permissiondenied-unblock": "사용자의 차단을 해제할 권한이 없습니다.",
+       "apierror-protect-invalidaction": "잘못된 보호 유형 \"$1\".",
+       "apierror-protect-invalidlevel": "잘못된 보호 수준 \"$1\".",
+       "apierror-ratelimited": "속도 제한을 초과했습니다. 잠시 기다렸다가 다시 시도하십시오.",
+       "apierror-readapidenied": "이 모듈을 사용하려면 읽기 권한이 필요합니다.",
+       "apierror-readonly": "위키는 현재 읽기 전용 모드입니다.",
+       "apierror-revwrongpage": "r$1은(는) $2의 판이 아닙니다.",
+       "apierror-specialpage-cantexecute": "특수 문서의 결과를 볼 권한이 없습니다.",
+       "apierror-stashwrongowner": "잘못된 소유자: $1",
+       "apierror-systemblocked": "당신은 미디어위키에 의해서 자동으로 차단되었습니다.",
+       "apierror-unknownerror-editpage": "알 수 없는 EditPage 오류: $1.",
+       "apierror-unknownerror-nocode": "알 수 없는 오류.",
+       "apierror-unknownerror": "알 수 없는 오류: \"$1\"",
+       "apierror-unknownformat": "인식되지 않는 형식 \"$1\".",
+       "apierror-unsupportedrepo": "로컬 파일 저장소는 모든 그림의 조회를 지원하지 않습니다.",
+       "apierror-upload-missingresult": "상태 데이터에 결과가 없습니다.",
+       "apierror-writeapidenied": "API를 통해 이 위키를 편집할 권한이 없습니다.",
+       "apiwarn-deprecation-httpsexpected": "HTTPS를 예측하였으나 HTTP가 사용되었습니다.",
+       "apiwarn-difftohidden": "r$1에 대한 차이를 만들 수 없습니다: 내용이 숨겨져 있습니다.",
+       "apiwarn-invalidcategory": "\"$1\"은(는) 분류가 아닙니다.",
+       "apiwarn-invalidtitle": "\"$1\"은(는) 올바른 제목이 아닙니다.",
+       "apiwarn-invalidxmlstylesheetns": "스타일시트는 {{ns:MediaWiki}} 이름공간에 있어야 합니다.",
+       "apiwarn-notfile": "\"$1\"은(는) 파일이 아닙니다.",
+       "apiwarn-unsupportedarray": "<var>$1</var> 변수는 지원되지 않는 PHP 배열 문법을 사용합니다.",
+       "apiwarn-validationfailed-keytoolong": "키가 너무 깁니다. ($1 바이트 이상 허용하지 않습니다)",
+       "api-feed-error-title": "오류 ($1)",
+       "api-usage-docref": "API 사용법을 보려면 $1을(를) 참고하십시오.",
+       "api-credits-header": "크레딧",
        "api-credits": "API 개발자:\n* Yuri Astrakhan (만든이, 선임 개발자 2006년 9월~2007년 9월)\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시고,\n버그 보고는 https://phabricator.wikimedia.org/ 에 해주시기 바랍니다."
 }
index 47b79ab..a803645 100644 (file)
@@ -8,7 +8,7 @@
        "apihelp-main-param-assertuser": "Iwwerpréifen ob den aktuelle Benotzer de Benotzer mat deem Numm ass.",
        "apihelp-main-param-curtimestamp": "Den aktuellen Zäitstempel an d'Resultat integréieren.",
        "apihelp-block-description": "E Benotzer spären.",
-       "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
+       "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich fir ze spären. Kann net zesumme mat <var>$1userid</var> benotzt ginn.",
        "apihelp-block-param-reason": "Grond fir ze spären.",
        "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP-Adress ausschalten)",
        "apihelp-block-param-nocreate": "Opmaache vun engem Benotzerkont verhënneren.",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
+       "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren",
+       "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.",
+       "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der <kbd>Main Page</kbd> op baskesch.",
        "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
        "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-stashedit-param-text": "Inhalt vun der Säit",
        "apihelp-userrights-param-user": "Benotzernumm.",
        "apihelp-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
+       "apihelp-validatepassword-param-password": "Passwuert fir ze validéieren.",
+       "apihelp-validatepassword-example-1": "Validéiert d'Passwuert <kbd>foobar</kbd> fir den aktuelle Benotzer.",
        "apihelp-watch-example-watch": "D'Säit <kbd>Main Page</kbd> iwwerwaachen.",
        "api-help-source": "Quell: $1",
        "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-param-type-user": "Typ: {{PLURAL:$1|1=Benotzernumm|2=Lëscht vu Benotzernimm}}",
        "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:",
        "api-help-permissions": "{{PLURAL:$1|Autorisatioun|Autorisatiounen}}:",
-       "api-help-open-in-apisandbox": "<small>[an der Sandkëscht opmaachen]</small>"
+       "api-help-open-in-apisandbox": "<small>[an der Sandkëscht opmaachen]</small>",
+       "apierror-articleexists": "Den Artikel deen dir probéiert hutt unzeleeë gouf schonn ugeluecht.",
+       "apierror-autoblocked": "Är IP-Adress gouf automatesch gespaart well se vun engem gespaarte Benotzer benotzt gouf.",
+       "apierror-badip": "IP-Parameter ass net valabel.",
+       "apierror-cantblock": "Dir hutt net d'Recht fir Benotzer ze spären.",
+       "apierror-cantimport": "Dir hutt net déi néideg Rechter fir Säiten z'importéieren.",
+       "apierror-copyuploadbadurl": "D'Eroplueden ass vun dëser URL net erlaabt.",
+       "apierror-filetypecannotberotated": "Den Typ vu Fichier kann net rotéiert ginn.",
+       "apierror-import-unknownerror": "Onbekannte Feeler beim Import: $1\nf",
+       "apierror-invalidcategory": "Den Numm vun der Kategorie deen Dir aginn hutt ass net valabel.",
+       "apierror-invalidtitle": "Schlechten Titel \"$1\".",
+       "apierror-invaliduserid": "Benotzer ID <var>$1</var> ass net valabel.",
+       "apierror-missingtitle": "D'Säit déi Dir spezifizéiert hutt gëtt et net.",
+       "apierror-missingtitle-byname": "D'Säit $1 gëtt et net.",
+       "apierror-moduledisabled": "De(n) <kbd>$1</kbd> Modul gouf ausgeschalt.",
+       "apierror-mustbeloggedin-generic": "Dir musst ageloggt sinn.",
+       "apierror-nochanges": "Et goufe keng Ännerungen ugefrot.",
+       "apierror-nodeleteablefile": "Et gëtt keng esou al Versioun vum Fichier.",
+       "apierror-noedit": "Dir hutt net déi néideg Rechter fir Säiten z'änneren.",
+       "apierror-nosuchuserid": "Et gëtt kee Benotzer mat der ID $1.",
+       "apierror-notarget": "Dir hutt kee valabelt Zil fir dës Aktioun spezifizéiert.",
+       "apierror-notpatrollable": "D'Versioun r$1 kann net nogekuckt gi well se ze al ass.",
+       "apierror-pagecannotexist": "Nummraum erlaabt keng aktuell Säiten.",
+       "apierror-pagelang-disabled": "D'Ännere vun der Sprooch vun enger Säit ass op dëser Wiki net erlaabt.",
+       "apierror-permissiondenied-generic": "Autorisatioun refuséiert.",
+       "apierror-permissiondenied-unblock": "Dir hutt net d'Recht fir d'Spär vu Benotzer opzehiewen.",
+       "apierror-readonly": "D'Wiki kann elo just geliest ginn.",
+       "apierror-revwrongpage": "r$1 ass keng Versioun vu(n) $2.",
+       "apierror-stashwrongowner": "Falsche Besëtzer: $1",
+       "apierror-systemblocked": "Dir gouft automatesch vu MediaWiki gespaart.",
+       "apierror-unknownerror-editpage": "Onbekannten EditPage-Feeler: $1",
+       "apierror-unknownerror-nocode": "Onbekannte Feeler.",
+       "apierror-unknownerror": "Onbekannte Feeler: \"$1\".",
+       "apierror-unknownformat": "Net-erkannte Format \"$1\".",
+       "apierror-unrecognizedparams": "Net {{PLURAL:$2|erkannte Parameter|erkannt Parameteren}}: $1",
+       "apierror-writeapidenied": "Dir däerft dës Wiki net iwwer den API ännneren.",
+       "apiwarn-invalidcategory": "\"$1\" ass keng Kategorie.",
+       "apiwarn-invalidtitle": "\"$1\" ass kee valabelen Titel",
+       "apiwarn-notfile": "\"$1\" ass kee Fichier.",
+       "apiwarn-tokennotallowed": "Aktioun \"$1\" ass net erlaabt fir den aktuelle Benotzer.",
+       "apiwarn-validationfailed-badpref": "keng valabel Astellung",
+       "api-feed-error-title": "Feeler ($1)"
 }
index 25012ba..0935c59 100644 (file)
        "apihelp-options-example-complex": "Nustatyti visus pageidavimus iš naujo, tada nustatyti <kbd>skin</kbd> ir <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Gauti informaciją apie API modulius.",
        "apihelp-protect-example-protect": "Apsaugoti puslapį.",
+       "apihelp-query-param-list": "Kurios sąrašus gauti.",
+       "apihelp-query-param-meta": "Kokius metaduomenis gauti.",
        "apihelp-query+allcategories-param-dir": "Rūšiavimo kryptis.",
        "apihelp-query+allcategories-param-min": "Gražinti tik kategorijas, kuriuose yra bent tiek narių.",
        "apihelp-query+allcategories-param-max": "Gražinti tik kategorijas, kuriuose yra iki tiek narių.",
        "apihelp-query+allcategories-param-limit": "Kiek kategorijų gražinti.",
        "apihelp-query+allcategories-paramvalue-prop-size": "Prideda puslapių kategorijoje skaičių.",
+       "apihelp-query+alldeletedrevisions-param-from": "Pradėti sąrašą šiuo pavadinimu.",
+       "apihelp-query+alldeletedrevisions-param-to": "Sustabdyti sąrašą ties šiuo pavadinimu.",
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Prideda failo pavadinimą.",
        "apihelp-query+allfileusages-param-limit": "Kiek iš viso gražinti objektų.",
+       "apihelp-query+allfileusages-example-unique": "Pateikti unikalius failų pavadinimus.",
+       "apihelp-query+allfileusages-example-unique-generator": "Gauna visus failų pavadinimus, paženklinant trūkstamus.",
        "apihelp-query+allfileusages-example-generator": "Gauti puslapius, kuriuose yra failai.",
+       "apihelp-query+allimages-param-sort": "Pagal ką rūšiuoti.",
        "apihelp-query+allimages-param-limit": "Kiek iš viso gražinti paveikslėlių.",
        "apihelp-query+allimages-example-B": "Rodyti failų sąrašą, pradedant raide <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Rodyti neseniai įkeltų failų sąrašą, panašu į [[Special:NewFiles]].",
        "apihelp-query+logevents-param-prop": "Kurias savybes gauti:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Prideda žurnalo įvykio ID.",
        "apihelp-query+logevents-paramvalue-prop-type": "Prideda žurnalo įvykio tipą.",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Kiekvieno puslapio ID.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Kiekvieno puslapio pavadinimas.",
+       "apihelp-query+transcludedin-param-limit": "Kiek gražinti.",
+       "apihelp-query+usercontribs-description": "Gauti visus vartotojo keitimus.",
+       "apihelp-query+usercontribs-param-limit": "Maksimalus gražinamų įnašų skaičius.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Prideda keitimo komentarą.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Prideda naują keitimo dydį.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Prideda vartotojo tikrą vardą.",
+       "apihelp-query+userinfo-example-simple": "Gauti informacijos apie dabartinį vartotoją.",
+       "apihelp-query+userinfo-example-data": "Gauti papildomos informacijos apie dabartinį vartotoją.",
+       "apihelp-query+users-description": "Gauti informacijos apie vartotojų sąrašą.",
+       "apihelp-query+users-param-prop": "Kokią informaciją įtraukti:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Pažymi ar vartotojas užblokuotas, kas tai padarė ir dėl kokios priežasties.",
+       "apihelp-query+users-paramvalue-prop-groups": "Nurodo grupes, kurioms priklauso kiekvienas vartotojas.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Nurodo visas grupes, kuriuose vartotojas yra automatiškai kaip narys.",
+       "apihelp-query+users-paramvalue-prop-rights": "Nurodo visas teises, kurias turi kiekvienas vartotojas.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Prideda vartotojo keitimų skaičių.",
+       "apihelp-query+users-paramvalue-prop-registration": "Prideda vartotojo registracijos laiko žymę.",
+       "apihelp-query+users-param-users": "Sąrašas vartotojų, kurių informaciją gauti.",
+       "apihelp-query+users-param-userids": "Vartotojų ID sąrašas, kurių informaciją gauti:",
+       "apihelp-query+users-param-token": "Vietoj to naudoti <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+users-example-simple": "Gražinti informaciją apie vartotoją <kbd>Example</kbd>.",
+       "apihelp-query+watchlist-param-user": "Nurodyti tik pakeitimus, atliktus šio vartotojo.",
+       "apihelp-query+watchlist-param-excludeuser": "Nenurodyti pakeitimų, kuriuos atliko šis vartotojas.",
+       "apihelp-query+watchlist-param-limit": "Kiek viso rezultatų gražinti vienai užklausai.",
+       "apihelp-query+watchlist-param-prop": "Kokias papildomas savybes gauti:",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Prideda puslapio pavadinimą.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Prideda naują vartotoją, kuris atliko pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Prideda vartotojo ID, kuris atliko pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Prideda keitimo komentarą.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Prideda keitimo laiko žymę.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Prideda naują ir seną puslapio ilgius.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Prideda laiko žymę, kada vartotojui buvo pranešta apie pakeitimą.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Prideda žurnalo informaciją, kai reikia.",
+       "apihelp-query+watchlist-param-type": "Kokios keitimų tipus rodyti:",
        "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Žurnalo įrašai.",
+       "apihelp-resetpassword-param-user": "Iš naujo nustatomas vartotojas.",
+       "apihelp-resetpassword-param-email": "Iš naujo nustatomo vartotojo el. pašto adresas.",
+       "apihelp-setpagelanguage-description": "Keisti puslapio kalbą.",
+       "apihelp-setpagelanguage-param-reason": "Keitimo priežastis.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
        "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
        "apihelp-stashedit-param-text": "Puslapio turinys.",
-       "api-format-prettyprint-status": "Šis atsakymas būtų gražintas su HTTP statusu $1 $2."
+       "apihelp-stashedit-param-summary": "Keisti santrauką.",
+       "apihelp-tag-param-reason": "Keitimo priežastis.",
+       "apihelp-unblock-description": "Atblokuoti naudotoją.",
+       "apihelp-unblock-param-reason": "Atblokavimo priežastis.",
+       "apihelp-unblock-example-id": "Atblokuoti blokavimo ID #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "Atblokuoti vartoją <kbd>Bob</kbd> su priežastimi <kbd>Sorry Bob</kbd>.",
+       "apihelp-undelete-param-title": "Atkuriamo puslapio pavadinimas.",
+       "apihelp-undelete-param-reason": "Atkūrimo priežastis.",
+       "apihelp-undelete-example-page": "Atkurti puslapį <kbd>Main Page</kbd>.",
+       "apihelp-upload-param-watch": "Stebėti šį puslapį.",
+       "apihelp-upload-param-ignorewarnings": "Ignuoruoti bet kokius įspėjimus.",
+       "apihelp-upload-param-file": "Failo turinys.",
+       "apihelp-upload-param-url": "URL, iš kurio gauti failą.",
+       "apihelp-upload-example-url": "Įkelti iš URL.",
+       "apihelp-upload-example-filekey": "Baigti įkėlimą, kuris nepavyko dėl įspėjimų.",
+       "apihelp-userrights-description": "Keisti vartotoju grupės narystę.",
+       "apihelp-userrights-param-user": "Vartotojo vardas.",
+       "apihelp-userrights-param-userid": "Vartotojo ID.",
+       "apihelp-userrights-param-add": "Pridėti vartotoją į šias grupes.",
+       "apihelp-userrights-param-remove": "Pašalinti vartotoją iš šių grupių.",
+       "apihelp-userrights-param-reason": "Keitimo priežastis.",
+       "apihelp-watch-description": "Pridėti ar pašalinti puslapius iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-watch-example-watch": "Stebėti puslapį <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "Nebestebėti puslapio <kbd>Main Page</kbd>.",
+       "api-format-title": "MedijaViki API rezultatas",
+       "api-format-prettyprint-status": "Šis atsakymas būtų gražintas su HTTP statusu $1 $2.",
+       "api-help-title": "MedijaViki API pagalba",
+       "api-help-main-header": "Pagrindinis modulis",
+       "api-help-source": "Šaltinis: $1",
+       "api-help-source-unknown": "Šaltinis: <span class=\"apihelp-unknown\">nežinomas</span>",
+       "api-help-license": "Licencija: [[$1|$2]]",
+       "api-help-license-noname": "Licencija: [[$1|Žiūrėti nuorodą]]",
+       "api-help-license-unknown": "Licencija: <span class=\"apihelp-unknown\">nežinoma</span>",
+       "api-help-parameters": "{{PLURAL:$1|Parametras|Parametrai}}:",
+       "api-help-param-required": "Šis parametras yra reikalingas.",
+       "api-help-datatypes-header": "Duomenų tipai",
+       "api-help-param-limit": "Leidžiama ne daugiau nei $1.",
+       "api-help-param-limit2": "Leidžiama ne daugiau nei $1 ($2 robotams).",
+       "api-help-param-default": "Numatytasis: $1",
+       "api-help-param-default-empty": "Numatytasis: <span class=\"apihelp-empty\">(tuščia)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(nėra aprašymo)</span>",
+       "api-help-examples": "{{PLURAL:$1|Pavyzdys|Pavyzdžiai}}:",
+       "api-help-permissions": "{{PLURAL:$1|Leidimas|Leidimai}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Suteikta}}: $2",
+       "apierror-articleexists": "Straipsnis, kurį bandėte sukurti, jau yra sukurtas.",
+       "apierror-autoblocked": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jis buvo naudojamas užblokuoto vartotojo.",
+       "apierror-badgenerator-unknown": "Nežinomas <kbd>generator=$1</kbd>.",
+       "apierror-badip": "IP parametras negalimas.",
+       "apierror-badquery": "Negalima užklausa.",
+       "apierror-badurl": "Negalima reikšmė „$2“ URL parametrui <var>$1</var>.",
+       "apierror-blockedfrommail": "Jus buvote užblokuotas nuo el. laiško siuntimo.",
+       "apierror-blocked": "Jus buvote užblokuotas nuo redagavimo.",
+       "apierror-botsnotsupported": "Ši sąsaja negali būti palaikoma robotams.",
+       "apierror-cannotreauthenticate": "Veiksmas negalimas, nes jūsų tapatybė negali būti patvirtinta.",
+       "apierror-cannotviewtitle": "Jūs negalite peržiūrėti $1.",
+       "apierror-cantblock": "Neturite teisės blokuoti vartotojus.",
+       "apierror-cantchangecontentmodel": "Neturite teisės pakeisti puslapio turinio modelį.",
+       "apierror-cantimport-upload": "Neturite teisės importuoti įkeltų puslapių.",
+       "apierror-cantimport": "Neturite teisės importuoti puslapių.",
+       "apierror-copyuploadbadurl": "Įkėlimas neleidžiamas iš šio URL.",
+       "apierror-databaseerror": "[$1] Duomenų bazės užklausos klaida.",
+       "apierror-emptynewsection": "Neįmanoma kurti naujų tuščių skyrių.",
+       "apierror-filedoesnotexist": "Failas neegzistuoja.",
+       "apierror-filetypecannotberotated": "Failo tipas negali būti pasuktas.",
+       "apierror-import-unknownerror": "Nežinoma klaida importuojant: $1.",
+       "apierror-invalidcategory": "Kategorijos pavadinimas, kurį įvedėte, yra negalimas.",
+       "apierror-invalidparammix": "{{PLURAL:$2|parametrai}} $1 negali būti naudojami kartu.",
+       "apierror-invalidtitle": "Blogas pavadinimas „$1“.",
+       "apierror-invaliduser": "Negalimas vartotojo vardas „$1“.",
+       "apierror-invaliduserid": "Vartotojo ID <var>$1</var> nėra galimas.",
+       "apierror-missingtitle": "Puslapis, kurį nurodėte, neegzistuoja.",
+       "apierror-missingtitle-byname": "Puslapis $1 neegzistuoja",
+       "apierror-multpages": "<var>$1</var> gali būti naudojamas tik su vienu puslapiu.",
+       "apierror-mustbeloggedin-generic": "Turite būti prisijungęs.",
+       "apierror-mustbeloggedin-linkaccounts": "Turite būti prisijungęs, kad galėtumėte susieti paskyras.",
+       "apierror-mustbeloggedin": "Turite būti prisijungęs, kad $1.",
+       "apierror-nochanges": "Neprašyta jokių keitimų.",
+       "apierror-noedit-anon": "Anoniminiai vartotojai negali redaguoti puslapių.",
+       "apierror-noedit": "Neturite teisės redaguoti puslapius.",
+       "apierror-nosuchlogid": "Nėra žurnalo įrašo su ID $1.",
+       "apierror-nosuchpageid": "Nėra puslapio su ID $1.",
+       "apierror-nosuchsection": "Nėra skyriaus $1.",
+       "apierror-nosuchsection-what": "$2 nėra sekcijos $1.",
+       "apierror-nosuchuserid": "Nėra vartotojo su ID $1.",
+       "apierror-pagelang-disabled": "Puslapio kalbos keitimas nėra leidžiamas šioje viki.",
+       "apierror-paramempty": "Parametras <var>$1</var> negali būti tusčiau.",
+       "apierror-permissiondenied": "Neturite leidimo $1.",
+       "apierror-permissiondenied-generic": "Teisė nesuteikta.",
+       "apierror-protect-invalidaction": "Negalimas apsaugos tipas „$1“.",
+       "apierror-protect-invalidlevel": "Negalimas apsaugos lygis „$1“.",
+       "apierror-readonly": "Viki šiuo metu yra skaitymo režime.",
+       "apierror-sectionreplacefailed": "Nepavyko sujungti atnaujinto skyriaus.",
+       "apierror-specialpage-cantexecute": "Neturite teisės peržiūrėti šio specialaus puslapio rezultatus.",
+       "apierror-stashwrongowner": "Neteisingas savininkas: $1",
+       "apierror-unknownerror-nocode": "Nežinoma klaida.",
+       "apierror-unknownerror": "Nežinoma klaida: „$1“.",
+       "apierror-unknownformat": "Neatpažintas formatas „$1“.",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Neatpažintas parametras|Neatpažinti parametrai}}: $1.",
+       "apierror-writeapidenied": "Negalite redaguoti šios viki per API.",
+       "apiwarn-deprecation-httpsexpected": "panaudotas HTTP, kai buvo tikėtasi HTTPS.",
+       "apiwarn-invalidcategory": "„$1“ nėra kategorija.",
+       "apiwarn-invalidtitle": "„$1“ nėra galimas pavadinimas.",
+       "apiwarn-notfile": "„$1“ nėra failas.",
+       "apiwarn-tokennotallowed": "Veiksmas „$1“ nėra leidžiamas dabartiniam vartotojui.",
+       "apiwarn-validationfailed-badpref": "negalimas nustatymas.",
+       "apiwarn-validationfailed": "Patvirtinimo klaida skirta <kbd>$1</kbd>: $2",
+       "api-feed-error-title": "Klaida ($1)",
+       "api-credits-header": "Kreditai"
 }
index b163c22..6c90a3e 100644 (file)
@@ -9,5 +9,6 @@
        "apihelp-block-param-reason": "Bloķēšanas iemesls:",
        "apihelp-delete-description": "Dzēst lapas",
        "apihelp-emailuser-description": "Sūtīt e-pastu lietotājam",
-       "apihelp-userrights-param-userid": "Lietotāja ID:"
+       "apihelp-userrights-param-userid": "Lietotāja ID:",
+       "apierror-nosuchuserid": "Nav lietotāja ar ID $1."
 }
index 8240e08..3abfdeb 100644 (file)
@@ -8,7 +8,7 @@
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документација]]\n*  [[mw:API:FAQ|ЧПП]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на  [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].",
        "apihelp-main-param-action": "Кое дејство да се изврши.",
        "apihelp-main-param-format": "Формат на изводот.",
-       "apihelp-main-param-maxlag": "Ð\9cакÑ\81ималниоÑ\82 заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код <samp>maxlag</samp> со порака од обликот <samp>Го чекам $host: има заостаток од $lag секунди</samp>.<br />Погл. [[mw:Manual:Maxlag_parameter|Прирачник: Параметар Maxlag]]",
+       "apihelp-main-param-maxlag": "Ð\9dаÑ\98големиоÑ\82 Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ен заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код <samp>maxlag</samp> со порака од обликот <samp>Го чекам $host: има заостаток од $lag секунди</samp>.<br />Погл. [[mw:Manual:Maxlag_parameter|Прирачник: Параметар Maxlag]]",
        "apihelp-main-param-smaxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
        "apihelp-feedrecentchanges-param-days": "На кои денови да се ограничат резултатите.",
-       "apihelp-feedrecentchanges-param-limit": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-feedrecentchanges-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки Ð²Ð¾ Ð¸Ñ\81Ñ\85одоÑ\82 за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "apihelp-feedrecentchanges-param-hidebots": "Скриј ги промените напарвени од ботови.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° резултати за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе резултати за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
        "apihelp-opensearch-param-redirects": "Како да се работи со пренасочувања:\n;return: Дај го самото пренасочување.\n;resolve: Дај ја целната страница. Може да даде помалку од $1limit резултати.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-phpfm-description": "Давај го изводот во серијализиран PHP-формат (подобрен испис во HTML).",
        "apihelp-rawfm-description": "Давај го изводот со елементи за отстранување грешки во JSON-формат (подобрен испис во HTML).",
        "apihelp-xml-description": "Давај го изводот во XML-формат.",
-       "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:mediawiki}}“ што ќе завршува со <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
        "api-format-title": "Резултат од Извршникот на МедијаВики",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Вредноста мора да изнесува|2=Вредностите мораат да изнесуваат}} помеѓу $2 и $3.",
        "api-help-param-upload": "Мора да биде објавено како податотечно подигање користејќи податоци кои се повеќеделни или од образец.",
        "api-help-param-multi-separate": "Одделувајте ги вредностите со <kbd>|</kbd>.",
-       "api-help-param-multi-max": "Ð\9cакÑ\81ималниоÑ\82 Ð±Ñ\80оÑ\98 Ð½Ð° Ð²Ñ\80едноÑ\81Ñ\82и Ð¸Ð·Ð½ÐµÑ\81Ñ\83ва {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} за ботови).",
+       "api-help-param-multi-max": "Ð\9dаÑ\98веÑ\9cе Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ени Ð²Ñ\80едноÑ\81Ñ\82и: {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} за ботови).",
        "api-help-param-default": "По основно: $1",
        "api-help-param-default-empty": "По основно: <span class=\"apihelp-empty\">(празно)</span>",
        "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].",
        "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> резултати пред да продолжите; во крајни случаи може да не добиете ниеден резултат.",
        "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
-       "api-help-param-continue": "УпоÑ\82Ñ\80ебеÑ\82е Ð³Ð¾ Ð¾Ð²Ð° Ð·Ð° Ð´Ð° Ð¿Ñ\80одолжиÑ\82е ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð° Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\80аÑ\81положиви Ñ\80езÑ\83лÑ\82аÑ\82и.",
+       "api-help-param-continue": "УпоÑ\82Ñ\80ебеÑ\82е Ð³Ð¾ Ð¾Ð²Ð° Ð·Ð° Ð´Ð° Ð¿Ñ\80одолжиÑ\82е ÐºÐ¾Ð³Ð° Ð¸Ð¼Ð° Ð¿Ð¾Ð²ÐµÑ\9cе Ñ\80аÑ\81положиви Ñ\81Ñ\82авки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
        "api-help-examples": "{{PLURAL:$1|Пример|Примери}}:",
        "api-help-permissions": "{{PLURAL:$1|Дозвола|Дозволи}}:",
index f1b4cfe..6506036 100644 (file)
@@ -5,7 +5,8 @@
                        "Chameleon222",
                        "Macofe",
                        "Jon Harald Søby",
-                       "Event"
+                       "Event",
+                       "Kingu"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentasjon]]\n* [[mw:API:FAQ|Ofte stilte spørsmål]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-post-liste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-kunngjøringer]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Feil & forespørsler]\n</div>\n<strong>Status:</strong> Alle funksjonene som vises på denne siden skal virke, men API-en er fortsatt i aktiv utvikling, og kan bli endret når som helst. Abonner på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki sin API-kunnkjøringsepostliste] for nyheter om oppdateringer.\n\n<strong>Feile kall:</strong> Hvis det blir sendt feile kall til API-et, blir det sendt en HTTP-header med nøkkelen \"MediaWiki-API-Error\" og da blir både header-verdien og feilkoden sendt tilbake med samme verdi. For mer informasjon se [[mw:API:Errors_and_warnings|API: Feil og advarsler]].\n\n<strong>Testing:</strong> For enkelt å teste API-kall, se [[Special:ApiSandbox]].",
@@ -18,7 +19,7 @@
        "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.",
        "apihelp-main-param-uselang": "Språk å bruke for meldingsoversettelser. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd> returnerer en liste over språkkoder, eller spesifiser <kbd>user</kbd> for å bruke den nåværende brukerens språkpreferanser, eller spesifiser <kbd>content</kbd> for å bruke denne wikiens innholdsspråk.",
        "apihelp-block-description": "Blokker en bruker.",
-       "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres.",
+       "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres. Kan ikke brukes sammen med <var>$1userid</var>",
        "apihelp-block-param-expiry": "Utløpstid. Kan være relativ (f.eks. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolutt (f.eks. <kbd>2014-09-18T12:34:56Z</kbd>). Om den er satt til <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd> vil blokkeringen ikke ha noen utløpsdato.",
        "apihelp-block-param-reason": "Årsak for blokkering.",
        "apihelp-block-param-anononly": "Blokker bare anonyme brukere (dvs. hindre anonyme redigeringer fra denne IP-adressen).",
@@ -88,7 +89,7 @@
        "apihelp-edit-param-minor": "Mindre redigering.",
        "apihelp-edit-param-notminor": "Ikke mindre redigering.",
        "apihelp-edit-param-bot": "Merk denne redigeringen som en botendring.",
-       "apihelp-edit-param-basetimestamp": "Tidsstempel for grunnrevisjonen, brukes for å oppdage redigeringskonflikter. Kan hentes via [[Special.ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-basetimestamp": "Tidsstempel for grunnrevisjonen, brukes for å oppdage redigeringskonflikter. Kan hentes via [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Tidsstempel for når redigeringsprosessen begynte, brukes for å oppdage redigeringskonflikter. En gyldig verdi kan hentes med <var>[[Special:ApiHelp/main|curtimestamp]]</var> når man begynner en redigeringsprosess (f.eks. når man laster sideinnholdet som redigeres).",
        "apihelp-edit-param-recreate": "Overstyr feil om at siden har blitt slettet i mellomtiden.",
        "apihelp-edit-param-createonly": "Ikke rediger siden dersom den finnes allerede.",
        "apihelp-expandtemplates-description": "Ekspanderer alle maler i wikitekst.",
        "apihelp-expandtemplates-param-title": "Sidetittel.",
        "apihelp-expandtemplates-param-text": "Wikitekst som skal konverteres.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Den utvidede wikiteksten.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Kategorier som er tilstede i innputt som ikke representeres i utputt.",
        "apihelp-feedcontributions-param-year": "Fra år (og tidligere).",
        "apihelp-feedcontributions-param-month": "Fra måned (og tidligere).",
        "apihelp-feedcontributions-param-tagfilter": "Filtrer bidrag som har disse merkene.",
        "apihelp-feedcontributions-param-deletedonly": "Vis bare slettede bidrag.",
        "apihelp-feedcontributions-param-toponly": "Vis kun redigeringer som er gjeldende revisjoner.",
        "apihelp-feedcontributions-param-newonly": "Bare vis bidrag som er sideopprettinger.",
+       "apihelp-feedcontributions-param-hideminor": "Skjul mindre endringer.",
        "apihelp-feedcontributions-param-showsizediff": "Vis størrelsesforskjellen mellom revisjoner.",
+       "apihelp-feedcontributions-example-simple": "Returner bidrag for brukeren <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-feedformat": "Matingens format.",
+       "apihelp-feedrecentchanges-param-namespace": "Navnerom resultater skal begrenses til.",
+       "apihelp-feedrecentchanges-param-invert": "Alle navnerom utenom det valgte.",
+       "apihelp-feedrecentchanges-param-associated": "Inkluder tilknyttede navnerom (diskusjons- eller hovednavnerom).",
+       "apihelp-feedrecentchanges-param-days": "Dager resultatene skal begrenses til.",
+       "apihelp-feedrecentchanges-param-limit": "Maksimalt antall resultater som skal returneres",
        "apihelp-feedrecentchanges-param-from": "Vis endringer siden da.",
        "apihelp-feedrecentchanges-param-hideminor": "Skjul mindre endringer.",
        "apihelp-feedrecentchanges-param-hidebots": "Skjul botendringer.",
+       "apihelp-feedrecentchanges-param-hideanons": "Skjul endringer gjort av anonyme brukere.",
+       "apihelp-feedrecentchanges-param-hideliu": "Skjul endringer gjort av registrerte brukere.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Skjul patruljerte endringer.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Skjul endringer gjort av den aktuelle brukeren.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Skjul endringer i kategorimedlemsskap.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrer etter tagger.",
+       "apihelp-feedrecentchanges-param-target": "Vis bare endringer på sider som lenkes fra denne siden.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Vis endringer på sider som lenker til den valgte siden i stedet.",
+       "apihelp-feedrecentchanges-param-categories": "Vis bare endringer på sider i alle disse kategoriene.",
+       "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.",
+       "apihelp-feedrecentchanges-example-simple": "Vis siste endringer.",
+       "apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.",
+       "apihelp-feedwatchlist-description": "Returnerer en overvåkningslistemating.",
+       "apihelp-feedwatchlist-param-feedformat": "Matingens format.",
        "apihelp-help-param-toc": "Inkluder en innholdsfortegnelse i HTML-utdataen.",
        "apihelp-help-example-main": "Hjelp for hovedmodulen.",
        "apihelp-help-example-recursive": "All hjelp på en side.",
        "apihelp-help-example-help": "Hjelp for selve hjelpemodulen.",
        "apihelp-help-example-query": "Hjelp for to utspørringsundermoduler.",
        "apihelp-imagerotate-description": "Roter ett eller flere bilder.",
-       "apihelp-import-param-summary": "Importsammendrag.",
+       "apihelp-import-param-summary": "Sammendrag for importering av loggelement.",
        "apihelp-import-param-xml": "Opplastet XML-fil.",
        "apihelp-login-param-name": "Brukernavn.",
        "apihelp-login-param-password": "Passord.",
        "api-help-flag-generator": "Denne modulen kan brukes som en generator.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametre}}:",
        "api-help-param-deprecated": "Utgått.",
-       "api-help-param-required": "Denne parameteren er påkrevd."
+       "api-help-param-required": "Denne parameteren er påkrevd.",
+       "apierror-multival-only-one": "Bare én verdi er tillatt for parameteret <var>$1</var>.",
+       "apierror-permissiondenied-generic": "Tilgang nektet.",
+       "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
 }
index ac2c8b7..fc3fe7b 100644 (file)
@@ -14,7 +14,8 @@
                        "Robin van der Vliet",
                        "Edoderoo",
                        "Lemondoge",
-                       "Hex"
+                       "Hex",
+                       "Mainframe98"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
        "apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
+       "apihelp-main-param-responselanginfo": "Toon de talen gebruikt voor <var>uselang</var> en <var>errorlang</var> in het resultaat.",
        "apihelp-block-description": "Gebruiker blokkeren.",
-       "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren.",
+       "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren. Kan niet samen worden gebruikt me <var>$1userid</var>",
+       "apihelp-block-param-userid": "Gebruikers-ID om te blokkeren. Kan niet worden gebruikt in combinatie met <var>$1user</var>.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
        "apihelp-block-param-anononly": "Alleen anonieme gebruikers blokkeren (uitschakelen van anonieme bewerkingen via dit IP-adres)",
        "apihelp-block-param-nocreate": "Voorkom registeren van accounts.",
        "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
+       "apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het <code>hideuser</code> recht).",
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.",
+       "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.",
        "apihelp-block-example-ip-simple": "Het IP-adres <kbd>192.0.2.5</kbd> voor drie dagen blokkeren met <kbd>First strike</kbd> als opgegeven reden.",
+       "apihelp-block-example-user-complex": "Blokkeer gebruiker<kbd>Vandal</kbd> voor altijd met reden <kbd>Vandalism</kbd> en voorkom het aanmaken van nieuwe accounts en het versturen van email",
+       "apihelp-changeauthenticationdata-example-password": "Poging tot het wachtwoord van de huidige gebruiker te veranderen naar <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Controleer de geldigheid van een token van <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tokentype wordt getest.",
+       "apihelp-checktoken-param-token": "Token om te controleren.",
+       "apihelp-checktoken-param-maxtokenage": "Maximum levensduur van de token, in seconden.",
+       "apihelp-checktoken-example-simple": "Test de geldigheid van een <kbd>csrf</kbd> token.",
+       "apihelp-clearhasmsg-description": "Wist de <code>hasmsg</code> vlag voor de huidige gebruiker.",
+       "apihelp-clearhasmsg-example-1": "Wis de <code>hasmsg</code> vlag voor de huidige gebruiker.",
+       "apihelp-clientlogin-description": "Log in op de wiki met behulp van de interactieve flow.",
+       "apihelp-clientlogin-example-login": "Start het inlogproces op de wiki als gebruiker <kbd>Example</kbd> met wachtwoord <kbd>ExamplePassword</kbd>.",
        "apihelp-compare-param-fromtitle": "Eerste paginanaam om te vergelijken.",
        "apihelp-compare-param-fromid": "Eerste pagina-ID om te vergelijken.",
        "apihelp-compare-param-fromrev": "Eerste versie om te vergelijken.",
        "apihelp-compare-param-torev": "Tweede versie om te vergelijken.",
        "apihelp-createaccount-description": "Nieuwe gebruikersaccount aanmaken.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
+       "apihelp-createaccount-param-password": "Wachtwoord (genegeerd als <var>$1mailpassword</var> is ingesteld).",
+       "apihelp-createaccount-param-domain": "Domein voor externe authentificatie (optioneel).",
        "apihelp-createaccount-param-email": "E-mailadres van de gebruiker (optioneel).",
        "apihelp-createaccount-param-realname": "Echte naam van de gebruiker (optioneel).",
+       "apihelp-createaccount-param-reason": "Optionele reden voor het aanmaken van het account voor in het logboek.",
+       "apihelp-createaccount-param-language": "Taalcode om als standaard in te stellen voor de gebruiker (optioneel, standaard de inhoudstaal).",
+       "apihelp-createaccount-example-pass": "Maak gebruiker <kbd>testuser</kbd> aan met wachtwoord <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Maak gebruiker <kbd>testmailuser</kbd> aan en e-mail een willekeurig gegenereerd wachtwoord.",
        "apihelp-delete-description": "Een pagina verwijderen.",
+       "apihelp-delete-param-pageid": "ID van de pagina om te verwijderen. Kan niet samen worden gebruikt met <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reden voor verwijdering. Wanneer dit niet is opgegeven wordt een automatisch gegenereerde reden gebruikt.",
        "apihelp-delete-param-watch": "De pagina aan de volglijst van de huidige gebruiker toevoegen.",
        "apihelp-delete-param-unwatch": "De pagina van de volglijst van de huidige gebruiker verwijderen.",
@@ -56,6 +78,7 @@
        "apihelp-disabled-description": "Deze module is uitgeschakeld.",
        "apihelp-edit-description": "Aanmaken en bewerken van pagina's.",
        "apihelp-edit-param-title": "Naam van de pagina om te bewerken. Kan niet gebruikt worden samen met <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID van de pagina om te bewerken. Kan niet samen worden gebruikt met <var>$1title</var>.",
        "apihelp-edit-param-sectiontitle": "De naam van de nieuwe sectie.",
        "apihelp-edit-param-text": "Pagina-inhoud.",
        "apihelp-edit-param-tags": "Wijzigingslabels om aan de versie toe te voegen.",
        "apihelp-edit-param-nocreate": "Een foutmelding geven als de pagina niet bestaat.",
        "apihelp-edit-param-watch": "Voeg de pagina toe aan de volglijst van de huidige gebruiker.",
        "apihelp-edit-param-unwatch": "Verwijder de pagina van de volglijst van de huidige gebruiker.",
+       "apihelp-edit-param-md5": "De MD5-hash van de $1text parameter, of de $1prependtext en $1appendtext parameters samengevoegd. Indien ingesteld, wordt de bewerking niet gemaakt, tenzij de hash juist is.",
+       "apihelp-edit-param-prependtext": "Voeg deze tekst toe aan het begin van de pagina. Overschrijft $1text.",
+       "apihelp-edit-param-appendtext": "Voeg deze tekst toe aan het begin van de pagina. Overschrijft $1text.\n\nGebruik $1section=new in plaats van deze parameter om een nieuw kopje toe te voegen.",
+       "apihelp-edit-param-undo": "Maak deze versie ongedaan. Overschrijft $1text, $1prependtext en $1appendtext.",
        "apihelp-edit-param-redirect": "Doorverwijzingen automatisch oplossen.",
+       "apihelp-edit-param-contentmodel": "Inhoudsmodel van de nieuwe inhoud.",
+       "apihelp-edit-param-token": "Het token moet altijd worden verzonden als de laatste parameter, of tenminste na de $1text parameter.",
        "apihelp-edit-example-edit": "Een pagina bewerken.",
+       "apihelp-edit-example-prepend": "Voeg <kbd>__NOTOC__</kbd> toe aan het begin van een pagina.",
        "apihelp-edit-example-undo": "Versies 13579 tot 13585 ongedaan maken met automatische beschrijving.",
        "apihelp-emailuser-description": "Gebruiker e-mailen.",
        "apihelp-emailuser-param-target": "Gebruiker naar wie de e-mail moet worden gestuurd.",
        "apihelp-emailuser-param-subject": "Onderwerpkoptekst.",
        "apihelp-emailuser-param-text": "E-mailtekst.",
        "apihelp-emailuser-param-ccme": "Mij een kopie sturen van deze e-mail.",
+       "apihelp-emailuser-example-email": "Stuur een e-mail naar de gebruiker <kbd>WikiSysop</kbd> met de tekst <kbd>Inhoud</kbd>.",
        "apihelp-expandtemplates-param-title": "Paginanaam.",
        "apihelp-expandtemplates-param-text": "Wikitekst om om te zetten.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "De uitgevulde wikitekst.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "De maximale tijdsduur waarna de cache van het resultaat moet worden weggegooid.",
        "apihelp-feedcontributions-description": "Haalt de feed van de gebruikersbijdragen op.",
        "apihelp-feedcontributions-param-feedformat": "De indeling van de feed.",
+       "apihelp-feedcontributions-param-user": "De gebruiker om de bijdragen voor te verkrijgen.",
        "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
        "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
        "apihelp-feedcontributions-param-deletedonly": "Alleen verwijderde bijdragen weergeven.",
+       "apihelp-feedcontributions-param-hideminor": "Verberg kleine bewerkingen.",
+       "apihelp-feedrecentchanges-param-feedformat": "De indeling van de feed.",
+       "apihelp-feedrecentchanges-param-namespace": "Naamruimte om de resultaten tot te beperken.",
+       "apihelp-feedrecentchanges-param-invert": "Alle naamruimten behalve de geselecteerde.",
+       "apihelp-feedrecentchanges-param-limit": "Het maximaal aantal weer te geven resultaten.",
        "apihelp-feedrecentchanges-param-hideminor": "Kleine wijzigingen verbergen.",
        "apihelp-feedrecentchanges-param-hidebots": "Wijzigingen gedaan door bots verbergen.",
        "apihelp-feedrecentchanges-param-hideanons": "Wijzigingen gedaan door anonieme gebruikers verbergen.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filteren op label.",
        "apihelp-feedrecentchanges-example-simple": "Recente wijzigingen weergeven.",
        "apihelp-feedrecentchanges-example-30days": "Recente wijzigingen van de afgelopen 30 dagen weergeven.",
+       "apihelp-feedwatchlist-param-feedformat": "De indeling van de feed.",
        "apihelp-filerevert-description": "Een oude versie van een bestand terugplaatsen.",
+       "apihelp-filerevert-param-filename": "Doel bestandsnaam, zonder het Bestand: voorvoegsel.",
+       "apihelp-filerevert-param-comment": "Opmerking voor het uploaden.",
+       "apihelp-help-param-helpformat": "Indeling van de help uitvoer.",
+       "apihelp-help-example-main": "Hulp voor de hoofdmodule.",
+       "apihelp-help-example-submodules": "Hulp voor <kbd>action=query</kbd> en alle submodules.",
+       "apihelp-help-example-recursive": "Alle hulp op een pagina.",
+       "apihelp-help-example-help": "Help voor de help-module zelf.",
        "apihelp-imagerotate-description": "Een of meerdere afbeeldingen draaien.",
+       "apihelp-imagerotate-example-simple": "Roteer <kbd>File:Example.png</kbd> met <kbd>90</kbd> graden.",
+       "apihelp-imagerotate-example-generator": "Roteer alle afbeeldingen in <kbd>Category:Flip</kbd> met <kbd>180</kbd> graden.",
+       "apihelp-import-description": "Importeer een pagina van een andere wiki, of van een XML bestand.\n\nMerk op dat de HTTP POST moet worden uitgevoerd als bestandsupload (bijv. door middel van multipart/form-data) wanneer een bestand wordt verstuurd voor de <var>xml</var> parameter.",
+       "apihelp-import-param-summary": "Importsamenvatting voor het logboek.",
        "apihelp-import-param-xml": "Geüpload XML-bestand.",
+       "apihelp-import-param-interwikisource": "Voor interwiki imports: wiki om van te importeren.",
        "apihelp-import-param-namespace": "Importeren in deze naamruimte. Can niet samen gebruikt worden met <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importeren als subpagina van deze pagina. Kan niet samen met <var>$1namespace</var> gebruikt worden.",
        "apihelp-login-param-name": "Gebruikersnaam.",
        "apihelp-patrol-example-revid": "Een versie markeren als gecontroleerd.",
        "apihelp-protect-param-reason": "Reden voor opheffen van de beveiliging.",
        "apihelp-protect-example-protect": "Een pagina beveiligen",
+       "apihelp-query+allcategories-param-dir": "Richting om in te sorteren.",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Voegt het aantal pagina's in de categorie toe.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
        "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Toon geen versies door deze gebruiker.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Toon alleen pagina's in deze naamruimte.",
+       "apihelp-query+alllinks-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+alllinks-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
        "apihelp-query+allmessages-param-enableparser": "Stel in om de parser in te schakelen, zorgt voor het voorverwerken van de wikitekst van een bericht (vervangen van magische woorden, de afhandeling van sjablonen, enzovoort).",
+       "apihelp-query+allredirects-description": "Toon alle doorverwijzingen naar een naamruimte.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Vraag het MIME- en mediatype van het bestand op.",
+       "apihelp-query+mystashedfiles-param-limit": "Hoeveel bestanden te tonen.",
+       "apihelp-query+allusers-param-excludegroup": "Sluit gebruikers in de gegeven groepen uit.",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Voegt informatie over een actuale blokkade van de gebruiker toe.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Toont de groepen waar de gebruiker in zit. Dit gebruikt meer serverbronnen en kan minder resultaten teruggeven dat de opgegeven limiet.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Toon alle groepen de gebruiker automatisch in zit.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Toon de rechten die de gebruiker heeft.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Voegt het aantal bewerkingen van de gebruiker toe.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Voegt de registratiedatum van de gebruiker toe, indien beschikbaar (kan leeg zijn).",
+       "apihelp-query+allusers-param-witheditsonly": "Toon alleen gebruikers die bewerkingen hebben gemaakt.",
+       "apihelp-query+allusers-param-activeusers": "Toon alleen gebruikers die actief zijn geweest in de laatste $1 {{PLURAL:$1|dag|dagen}}.",
+       "apihelp-query+allusers-example-Y": "Toon gebruikers vanaf <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Haal informatie op over de huidige authentificatie status.",
+       "apihelp-query+backlinks-description": "Vind alle pagina's die verwijzen naar de gegeven pagina.",
+       "apihelp-query+backlinks-param-title": "Titel om op te zoeken. Kan niet worden gebruikt in combinatie met<var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "Pagina ID om op te zoeken. Kan niet worden gebruikt in combinatie met <var>$1title</var>.",
+       "apihelp-query+backlinks-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+backlinks-example-simple": "Toon verwijzingen naar de <kbd>Hoofdpagina</kbd>.",
+       "apihelp-query+blocks-description": "Toon alle geblokkeerde gebruikers en IP-adressen.",
+       "apihelp-query+blocks-param-limit": "Het maximum aantal blokkades te tonen.",
+       "apihelp-query+blocks-paramvalue-prop-id": "Voegt de blokkade ID toe.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Voegt de gebruikernaam van de geblokeerde gebruiker toe.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Voegt de gebruiker-ID van de geblokkeerde gebruiker toe.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Labelt de blokkade met (automatische blokkade, alleen anoniem, enzovoort).",
+       "apihelp-query+blocks-example-simple": "Toon blokkades.",
+       "apihelp-query+blocks-example-users": "Toon blokkades van gebruikers <kbd>Alice</kbd> en <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Toon alle categorieën waar de pagina in zit.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
+       "apihelp-query+categories-param-show": "Welke soort categorieën te tonen.",
+       "apihelp-query+categories-param-limit": "Hoeveel categorieën te tonen.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Voegt de pagina-ID toe.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Voegt de titel en de naamruimte-ID van de pagina toe.",
+       "apihelp-query+categorymembers-param-dir": "Richting om in te sorteren.",
        "apihelp-query+deletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
        "apihelp-query+deletedrevs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+embeddedin-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Pagina ID van elke pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+imageusage-param-namespace": "De naamruimte om door te lopen.",
+       "apihelp-query+imageusage-example-simple": "Toon pagina's die gebruik maken van [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Toon informatie over pagina's die gebruik maken van [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+iwbacklinks-param-prefix": "Voorvoegsel voor de interwiki.",
        "apihelp-query+logevents-param-type": "Logboekregels alleen voor dit type filteren.",
        "apihelp-query+logevents-param-tag": "Alleen logboekregels weergeven met dit label.",
        "apihelp-query+logevents-example-simple": "Recente logboekregels weergeven.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Voegt het beveiligingsniveau toe.",
+       "apihelp-query+protectedtitles-example-simple": "Toon beveiligde titels.",
+       "apihelp-query+querypage-param-limit": "Aantal resultaten om te tonen.",
+       "apihelp-query+querypage-example-ancientpages": "Toon resultaten van [[Special:Ancientpages]].",
+       "apihelp-query+random-param-namespace": "Toon alleen pagina's in deze naamruimten.",
+       "apihelp-query+random-param-limit": "Beperk het aantal aan willekeurige pagina's dat wordt getoond.",
+       "apihelp-query+random-example-simple": "Toon twee willekeurige pagina's uit de hoofdnaamruimte.",
+       "apihelp-query+random-example-generator": "Toon pagina informatie over twee willekeurige pagina's uit de hoofdnaamruimte.",
+       "apihelp-query+recentchanges-param-user": "Toon alleen wijzigingen door deze gebruiker.",
+       "apihelp-query+recentchanges-param-excludeuser": "Toon geen wijzigingen door deze gebruiker",
        "apihelp-query+recentchanges-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Voegt de bewerkingssamenvatting voor de bewerking toe.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Voegt logboekgegevens toe aan logboekregels (logboek-ID, logboektype, enzovoort).",
+       "apihelp-query+recentchanges-example-simple": "Toon recente wijzigingen.",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Pagina ID van elke doorverwijzing.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titel van elke doorverwijzing.",
+       "apihelp-query+redirects-param-namespace": "Toon alleen pagina's in deze naamruimten.",
+       "apihelp-query+redirects-param-limit": "Hoeveel doorverwijzingen te tonen.",
+       "apihelp-query+redirects-example-simple": "Toon een lijst van doorverwijzingen naar [[Main Page]].",
+       "apihelp-query+redirects-example-generator": "Toon informatie over alle doorverwijzingen naar [[Main Page]].",
        "apihelp-query+revisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Versietekst.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Labels voor de versie.",
        "apihelp-query+revisions+base-param-difftotextpst": "\"pre-save\"-transformatie uitvoeren op de tekst alvorens de verschillen te bepalen. Alleen geldig als dit wordt gebruikt met <var>$1difftotext</var>.",
+       "apihelp-query+search-description": "Voer een volledige tekst zoekopdracht uit.",
+       "apihelp-query+search-param-limit": "Hoeveel pagina's te tonen.",
+       "apihelp-query+search-example-simple": "Zoeken naar <kbd>betekenis</kbd>.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Toon geregistreerde naamruimte aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Toon speciale pagina aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Toon magische woorden en hun aliassen.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Toon site statistieken.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Toont bibliotheken die op de wiki zijn geïnstalleerd.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Toont uitbreidingen die op de wiki zijn geïnstalleerd.",
        "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Geeft een lijst met bestandsextensies (bestandstypen) die geüpload mogen worden.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Toont wiki rechten (licentie) informatie als deze beschikbaar is.",
        "apihelp-query+tags-description": "Wijzigingslabels weergeven.",
        "apihelp-query+tags-paramvalue-prop-name": "Voegt de naam van het label toe.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Voegt het systeembericht toe voor het label.",
        "apihelp-query+tags-paramvalue-prop-description": "Voegt beschrijving van het label toe.",
        "apihelp-query+tags-paramvalue-prop-defined": "Geeft aan of het label is gedefinieerd.",
        "apihelp-query+tags-paramvalue-prop-active": "Of het label nog steeds wordt toegepast.",
+       "apihelp-query+tags-example-simple": "Toon beschikbare labels.",
+       "apihelp-query+templates-description": "Toon alle pagina's ingesloten op de gegeven pagina's.",
+       "apihelp-query+templates-param-limit": "Het aantal sjablonen om te tonen.",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Pagina ID van elke pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+usercontribs-description": "Toon alle bewerkingen door een gebruiker.",
+       "apihelp-query+usercontribs-param-limit": "Het maximum aantal bewerkingen om te tonen.",
+       "apihelp-query+usercontribs-param-namespace": "Toon alleen bijdragen in deze naamruimten.",
        "apihelp-query+usercontribs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+usercontribs-example-ipprefix": "Toon bijdragen van alle IP-adressen met het voorvoegsel <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-description": "Toon informatie over de huidige gebruiker.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Toon de gebruikers echte naam.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Voegt logboekgegevens toe waar van toepassing.",
        "apihelp-query+watchlist-param-type": "Welke typen wijzigingen weer te geven:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Gewone paginabewerkingen.",
        "apihelp-query+watchlist-paramvalue-type-log": "Logboekregels.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Wijzigingen in categorielidmaatschap.",
        "apihelp-stashedit-param-text": "Pagina-inhoud.",
+       "apihelp-unblock-param-user": "Gebruikersnaam, IP-adres of IP-range om te deblokkeren. Kan niet samen worden gebruikt met <var>$1id</var> of <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Gebruikers-ID om te deblokkeren. Kan niet worden gebruikt in combinatie met <var>$1id</var> of <var>$1user</var>.",
        "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
        "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
        "apihelp-rawfm-description": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).",
        "api-help-param-deprecated": "Verouderd.",
        "api-help-datatypes-header": "Gegevenstypen",
        "api-help-param-default": "Standaard: $1",
+       "apierror-autoblocked": "Uw IP-adres is automatisch geblokeerd, omdat het gebruikt is door een geblokkeerde gebruiker.",
+       "apierror-badmodule-nosubmodules": "De module <kbd>$1</kbd> heeft geen submodules.",
+       "apierror-blockedfrommail": "U bent geblokkeerd en kunt geen emails verzenden.",
+       "apierror-blocked": "U bent geblokkeerd en kunt niet bewerken.",
+       "apierror-filedoesnotexist": "Bestand bestaat niet.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> mag niet minder zijn dan $2 (ingesteld op $3).",
+       "apierror-invalidcategory": "De opgegeven categorienaam is niet geldig.",
+       "apierror-invaliduser": "Ongeldige gebruikersnaam \"$1\".",
+       "apierror-maxlag-generic": "Wachten op een database server: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
+       "apierror-maxlag": "Wachten op $2: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
+       "apierror-missingtitle": "De opgegeven pagina bestaat niet.",
+       "apierror-missingtitle-byname": "De pagina $1 bestaat niet.",
+       "apierror-mustbeloggedin-generic": "U moet ingelogd zijn.",
+       "apierror-nosuchuserid": "Er is geen gebruiker met ID $1.",
+       "apierror-permissiondenied": "U heeft geen toestemming om $1.",
+       "apierror-permissiondenied-generic": "Toegang geweigerd.",
+       "apierror-readonly": "De wiki is momenteel in alleen-lezen modus.",
+       "apierror-systemblocked": "U bent automatisch geblokkeerd door MediaWiki.",
+       "apierror-unknownerror-nocode": "Onbekende fout.",
+       "apierror-unknownerror": "Onbekende fout: \"$1\".",
+       "apierror-unrecognizedparams": "Niet-herkende {{PLURAL:$2|parameter|parameters}}: $1.",
+       "apiwarn-invalidcategory": "\"$1\" is geen categorie.",
+       "apiwarn-invalidtitle": "\"$1\" is geen geldige titel.",
+       "apiwarn-notfile": "\"$1\" is geen bestand.",
+       "apiwarn-validationfailed-badpref": "geen geldige voorkeur.",
+       "api-feed-error-title": "Fout ($1)",
+       "api-usage-docref": "Zie $1 voor API gebruik.",
        "api-credits-header": "Vermeldingen",
        "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://phabricator.wikimedia.org/."
 }
index 7ecfebe..8d1f4a5 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Cedric31",
-                       "Macofe"
+                       "Macofe",
+                       "Nicolas Eynaud"
                ]
        },
        "apihelp-main-param-action": "Quina accion cal efectuar.",
@@ -17,6 +18,7 @@
        "apihelp-compare-param-totitle": "Segond títol de comparar.",
        "apihelp-compare-param-toid": "ID de la segonda pagina de comparar.",
        "apihelp-compare-param-torev": "Segonda revision de comparar.",
+       "apihelp-compare-example-1": "Crear un diff entre lei revisions 1 e 2",
        "apihelp-createaccount-description": "Creatz un novèl compte d'utilizaire.",
        "apihelp-createaccount-param-name": "Nom d'utilizaire.",
        "apihelp-createaccount-param-password": "Senhal (ignorat se <var>$1mailpassword</var> es definit).",
@@ -49,6 +51,7 @@
        "apihelp-feedrecentchanges-param-feedformat": "Lo format del flux.",
        "apihelp-feedrecentchanges-param-hideminor": "Amagar las modificacions menoras.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar per balisa.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar lei darriers cambiaments.",
        "apihelp-filerevert-param-comment": "Telecargar lo comentari.",
        "apihelp-filerevert-param-archivename": "Nom d’archiu de la revision de restablir.",
        "apihelp-import-param-summary": "Resumit de l’importacion de l’entrada de jornal.",
@@ -58,6 +61,7 @@
        "apihelp-login-param-domain": "Domeni (facultatiu).",
        "apihelp-login-example-login": "Se connectar.",
        "apihelp-managetags-description": "Efectuar de prètzfaits de gestion relatius a la modificacion de las balisas.",
+       "apihelp-mergehistory-description": "Fusionar leis istorics de pagina",
        "apihelp-move-description": "Desplaçar una pagina.",
        "apihelp-opensearch-param-search": "Cadena de recèrca.",
        "apihelp-parse-example-page": "Analisar una pagina.",
        "apihelp-query+allcategories-description": "Enumerar totas las categorias.",
        "apihelp-query+alldeletedrevisions-param-from": "Aviar la lista a aqueste títol.",
        "apihelp-query+allimages-param-sort": "Proprietat per la quala cal triar.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Ajustatz lo títol de la redireccion.",
        "apihelp-query+blocks-example-simple": "Listar los blocatges",
        "apihelp-query+blocks-example-users": "Listar los blocatges dels utilizaires <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Tèxte de la revision.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Balisas de la revision.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambiaments extèrnes",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creacions de pagina",
+       "apihelp-resetpassword-description": "Mandar un corrier electronic de reïnicializacion de son senhau a l'utilizaire.",
+       "apihelp-stashedit-param-text": "Contengut de la pagina",
        "apihelp-tag-param-reason": "Motiu de la modificacion.",
        "apihelp-unblock-description": "Desblocar un utilizaire.",
        "apihelp-unblock-param-reason": "Motiu del desblocatge.",
        "apihelp-unblock-example-id": "Levar lo blocatge d’ID #<kbd>105</kbd>.",
+       "apihelp-undelete-param-reason": "Motiu de restauracion.",
        "apihelp-userrights-param-user": "Nom d'utilizaire.",
        "apihelp-userrights-param-userid": "ID de l'utilizaire.",
+       "apihelp-validatepassword-param-password": "Senhau de validar.",
        "api-help-main-header": "Modul principal",
+       "api-help-flag-deprecated": "Lo module es desaprovat.",
        "api-help-source": "Font : $1",
        "api-help-source-unknown": "Font : <span class=\"apihelp-unknown\">desconeguda</span>",
        "api-help-license": "Licéncia : [[$1|$2]]",
        "api-help-param-required": "Aqueste paramètre es obligatòri.",
        "api-help-datatypes-header": "Tipe de donadas",
        "api-help-param-default": "Per defaut : $1",
+       "apierror-badquery": "Requista invalida.",
+       "apierror-cannotviewtitle": "Siatz autorizat a veire $1.",
+       "apierror-cantblock-email": "Sus aqueu wiki, avètz pas lei drechs necessaris per empedir leis utilizats de mandar de corriers electronics.",
+       "apierror-cantblock": "Avètz pas lei drechs necessaris per blocar d'utilizaires.",
+       "apierror-canthide": "Avètz pas lei drechs necessaris per escondre lo nom d'un utilizaire dins lo jornau dei blocatges.",
+       "apierror-cantimport-upload": "Avètz pas lei drechs necessaris per importar de paginas telecargadas.",
+       "apierror-cantimport": "Avètz pas lei drechs necesaris per importar de paginas.",
+       "apierror-copyuploadbadurl": "Telecargament pas autorizat a partir d'aquel URL.",
+       "apierror-create-titleexists": "Lei títols existents pòdon pas èsser protegits amb <kbd>create</kbd>.",
+       "apierror-emptynewsection": "La creacion de seccions vuejas novèlas es pas possibla.",
+       "apierror-filedoesnotexist": "Lo fichier existís pas.",
+       "apierror-noedit": "Avètz pas lei drechs necessaris per editar de paginas.",
+       "apierror-noimageredirect-anon": "Leis utilizaires anonims pòdon pas crear de redireccions d'imatge.",
+       "apierror-noimageredirect": "Avètz pas lei drechs necessaris per crear de redireccions d'imatge.",
+       "apierror-nosuchsection": "I a ges seccion $1",
+       "apierror-nosuchsection-what": "I a pas de seccion $1 dins $2.",
+       "apierror-permissiondenied-generic": "Autorizacion refusada.",
+       "apierror-unknownerror-nocode": "Error desconeguda.",
+       "apierror-unknownerror": "Error desconeguda : $1",
+       "apierror-unknownformat": "Format $1 non reconegut",
+       "apierror-unrecognizedvalue": "Valor pas reconeguda per lo paramètre <var>$1</var>: $2.",
+       "apiwarn-invalidcategory": "\"$1\" es pas una categoria.",
+       "apiwarn-invalidtitle": "\"$1\" es pas un títol valide.",
+       "apiwarn-notfile": "$1 es pas un fichier.",
+       "apiwarn-tokennotallowed": "L'accion $1 es pas autorizada per l'utilizaire actuau.",
+       "apiwarn-validationfailed-badpref": "Pas una preferéncia valida.",
+       "api-feed-error-title": "Error ($1)",
        "api-credits-header": "Mercejaments"
 }
index 7ba3854..1dfbcba 100644 (file)
@@ -29,7 +29,7 @@
        "apihelp-main-param-curtimestamp": "Dołącz obecny znacznik czasu do wyniku.",
        "apihelp-main-param-uselang": "Język, w którym mają być pokazywane tłumaczenia wiadomości. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> z <kbd>siprop=languages</kbd> zwróci listę języków lub ustaw jako <kbd>user</kbd>, aby pobrać z preferencji zalogowanego użytkownika lub <kbd>content</kbd>, aby wykorzystać język zawartości tej wiki.",
        "apihelp-block-description": "Zablokuj użytkownika.",
-       "apihelp-block-param-user": "Nazwa użytkownika, adres IP lub zakres adresów IP, które chcesz zablokować.",
+       "apihelp-block-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz zablokować. Nie można używać razem z <var>$1userid</var>.",
        "apihelp-block-param-expiry": "Czas trwania. Może być względny (np. <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) lub konkretny (np. <kbd>2014-09-18T12:34:56Z</kbd>). Jeśli jest ustawiony na <kbd>infinite</kbd>, <kbd>indefinite</kbd>, lub <kbd>never</kbd>, blokada nigdy nie wygaśnie.",
        "apihelp-block-param-reason": "Powód blokady.",
        "apihelp-block-param-anononly": "Blokuj tylko anonimowych użytkowników (blokuje anonimowe edycje z tego adresu IP).",
        "apihelp-emailuser-param-text": "Treść emaila.",
        "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.",
        "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Rozwiń wszystkie szablony w wikitexcie.",
+       "apihelp-expandtemplates-description": "Rozwija wszystkie szablony zawarte w wikitekście.",
        "apihelp-expandtemplates-param-title": "Tytuł strony.",
        "apihelp-expandtemplates-param-text": "Wikitext do przekonwertowania.",
+       "apihelp-expandtemplates-param-revid": "ID wersji, dla <nowiki>{{REVISIONID}}</nowiki> i podobnych zmiennych.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Rozszerzony wikitext.",
+       "apihelp-feedcontributions-description": "Zwraca kanał wkładu użytkownika.",
        "apihelp-feedcontributions-param-feedformat": "Format danych wyjściowych.",
+       "apihelp-feedcontributions-param-user": "Jakich użytkowników pobrać wkład.",
+       "apihelp-feedcontributions-param-namespace": "Z jakiej przestrzeni nazw wyświetlać wkład użytkownika.",
        "apihelp-feedcontributions-param-year": "Od roku (i wcześniej).",
        "apihelp-feedcontributions-param-month": "Od miesiąca (i wcześniej).",
+       "apihelp-feedcontributions-param-tagfilter": "Pokaż tylko wkład z tymi znacznikami.",
        "apihelp-feedcontributions-param-deletedonly": "Pokazuj tylko usunięty wkład.",
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
        "apihelp-feedcontributions-param-hideminor": "Ukryj drobne zmiany.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
+       "apihelp-feedcontributions-example-simple": "Zwróć liste edycji dokonanych przez użytkownika <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Zwraca kanał ostatnich zmian.",
        "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.",
+       "apihelp-feedrecentchanges-param-associated": "Uwzględnij powiązaną przestrzeń nazw (dyskusja lub treść).",
        "apihelp-feedrecentchanges-param-days": "Dni, do których ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-feedrecentchanges-param-from": "Pokaż zmiany od tamtej chwili.",
        "apihelp-feedrecentchanges-param-hideliu": "Ukryj zmiany zrobione przez zarejestrowanych użytkowników.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ukryj sprawdzone zmiany.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ukryj zmiany zrobione przez obecnego użytkownika.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ukryj zmiany w kategoryzacji.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtruj po znacznikach.",
+       "apihelp-feedrecentchanges-param-target": "Pokaż tylko zmiany na stronach linkowanych z tej strony.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Pokaż zmiany na stronach linkujących do wybranej strony.",
+       "apihelp-feedrecentchanges-param-categories": "Pokaż zmiany tylko na stronach będących we wszystkich tych kategoriach.",
+       "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.",
        "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
        "apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.",
+       "apihelp-feedwatchlist-description": "Zwraca kanał listy obserwowanych.",
+       "apihelp-feedwatchlist-param-feedformat": "Format kanału.",
+       "apihelp-feedwatchlist-param-hours": "Wymień strony zmienione w ciągu tylu godzin licząc od teraz.",
+       "apihelp-feedwatchlist-param-linktosections": "Linkuj bezpośrednio do zmienionych sekcji jeżeli to możliwe.",
+       "apihelp-feedwatchlist-example-default": "Pokaż kanał listy obserwowanych.",
+       "apihelp-feedwatchlist-example-all6hrs": "Pokaż wszystkie zmiany na obserwowanych stronach dokonane w ciągu ostatnich 6 godzin.",
        "apihelp-filerevert-description": "Przywróć plik do starej wersji.",
        "apihelp-filerevert-param-filename": "Docelowa nazwa pliku bez prefiksu Plik:",
        "apihelp-filerevert-param-comment": "Prześlij komentarz.",
        "apihelp-filerevert-example-revert": "Przywróć <kbd>Wiki.png</kbd> do wersji z <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
        "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości <var>action</var> i <var>format</var> parametry, lub <kbd>main</kbd>). Może określić podmoduły z <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "Dołącz pomoc podmodułów nazwanego modułu.",
        "apihelp-help-param-recursivesubmodules": "Zawiera pomoc dla podmodułów rekursywnie.",
        "apihelp-help-param-helpformat": "Format wyjściowy pomocy.",
        "apihelp-help-param-toc": "Dołącz spis treści do wyjściowego HTML.",
        "apihelp-login-example-login": "Zaloguj się",
        "apihelp-logout-description": "Wyloguj i wyczyść dane sesji.",
        "apihelp-logout-example-logout": "Wyloguj obecnego użytkownika.",
+       "apihelp-managetags-description": "Wykonywanie zadań związanych z zarządzaniem znacznikami zmian.",
+       "apihelp-managetags-param-operation": "Jakiej operacji dokonać:\n;create:Stworzenie nowego znacznika zmian do ręcznego użycia.\n;delete:Usunięcie znacznika zmian z bazy danych, włącznie z usunięciem danego znacznika z wszystkich oznaczonych nim zmian i wpisów rejestru i ostatnich zmian.\n;activate:Aktywuj znacznik zmian, użytkownicy będą mogli go ręcznie przypisywać.\n;deactivate:Dezaktywuj znacznik zmian, użytkownicy nie będą mogli przypisywać go ręcznie.",
+       "apihelp-managetags-param-tag": "Znacznik do utworzenia, usunięcia, aktywacji lub dezaktywacji. Do utworzenia znacznika, nazwa nie misi istnieć. Do usunięcia znacznika, musi on istnieć. Do aktywacji znacznika, musi on istnieć i nie może być w użyciu przez żadne rozszerzenie. Do dezaktywowania znacznika, musi on być do tej pory aktywowany i ręcznie zdefiniowany.",
        "apihelp-managetags-param-reason": "Opcjonalny powód utworzenia, usunięcia, włączenia lub wyłączenia znacznika.",
        "apihelp-managetags-param-ignorewarnings": "Czy zignorować ostrzeżenia, które pojawiają się w trakcie operacji.",
+       "apihelp-managetags-example-create": "Stworzenie znacznika o nazwie <kbd>spam</kbd> z powodem <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Usunięcie znacznika <kbd>vandlaism</kbd> z powodu <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "Aktywacja znacznika o nazwie <kbd>spam</kbd> z powodem <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Dezaktywacja znacznika o nazwie <kbd>spam</kbd> z powodu <kbd>No longer required</kbd>",
        "apihelp-mergehistory-description": "Łączenie historii edycji.",
+       "apihelp-mergehistory-param-from": "Tytuł strony, z której historia ma zostać połączona. Nie może być używane z <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "ID strony, z której historia ma zostać połączona. Nie może być używane z <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Tytuł strony, z którą połączyć historię. Nie może być używane z <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "ID strony, z którą połączyć historię. Nie może być używane z <var>$1to</var>.",
        "apihelp-mergehistory-param-reason": "Powód łączenia historii.",
+       "apihelp-mergehistory-example-merge": "Połącz całą historię strony <kbd>Oldpage</kbd> ze stroną <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Przenieś stronę.",
        "apihelp-move-param-to": "Tytuł na jaki zmienić nazwę strony.",
        "apihelp-move-param-reason": "Powód zmiany nazwy.",
        "apihelp-stashedit-param-text": "Zawartość strony.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-description": "Odblokuj użytkownika.",
+       "apihelp-unblock-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz odblokować. Nie można używać jednocześnie z <var>$1id</var> lub <var>$1userid</var>.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-help-right-apihighlimits": "Użyj wyższych limitów w zapytaniach API (dla zapytań powolnych: $1; dla zapytań szbkich: $2). Limity zapytań powolnych są także stosowane dla parametrów z podanymi wieloma wartościami.",
        "api-help-open-in-apisandbox": "<small>[otwórz w brudnopisie]</small>",
+       "apierror-baddiff": "Różnicy wersji nie można odtworzyć. Jedna lub obie wersje nie istnieją, lub nie masz uprawnień do ich wyświetlenia.",
+       "apierror-badgenerator-unknown": "Nieznany <kbd>generator=$1</kbd>.",
+       "apierror-badip": "Parametr IP nie jest prawidłowy.",
+       "apierror-badquery": "Nieprawidłowe zapytanie.",
+       "apierror-blockedfrommail": "Została Ci zablokowana możliwość wysyłania e-maili.",
+       "apierror-blocked": "Została Ci zablokowana możliwość edycji.",
+       "apierror-cantblock": "Nie masz uprawnień do blokowania użytkowników.",
+       "apierror-cantimport": "Nie masz uprawnień do importowania stron.",
+       "apierror-cantsend": "Nie jesteś zalogowany, nie masz potwierdzonego adresu e-mail, albo nie masz prawa wysyłać e-maili do innych użytkowników, więc nie możesz wysłać wiadomości e-mail.",
+       "apierror-filedoesnotexist": "Plik nie istnieje.",
+       "apierror-integeroutofrange-abovebotmax": "Wartość <var>$1</var> dla botów i administratorów nie może przekraczać $2 (ustawiono $3).",
+       "apierror-integeroutofrange-abovemax": "Wartość <var>$1</var> dla użytkowników nie może przekraczać $2 (ustawiono $3).",
+       "apierror-integeroutofrange-belowminimum": "Wartość <var>$1</var> nie może być mniejsza niż $2 (ustawiono $3).",
+       "apierror-invalidlang": "Nieprawidłowy kod języka dla parametru <var>$1</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Parametry}} $1 nie mogą być używane razem.",
+       "apierror-invalidtitle": "Zły tytuł „$1”.",
+       "apierror-invalidurlparam": "Nieprawidłowa wartość <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-missingparam": "Parametr <var>$1</var> musi być podany.",
+       "apierror-missingtitle": "Wybrana przez ciebie strona nie istnieje.",
+       "apierror-missingtitle-byname": "Strona $1 nie istnieje.",
+       "apierror-moduledisabled": "Moduł <kbd>$1</kbd> został wyłączony.",
+       "apierror-mustbeloggedin-generic": "Musisz być zalogowany.",
+       "apierror-mustbeloggedin": "Musisz się zalogować, aby mieć możliwość $1.",
+       "apierror-noedit-anon": "Niezarejestrowani użytkownicy nie mogą edytować stron.",
+       "apierror-noedit": "Nie masz uprawnień do edytowania stron.",
+       "apierror-permissiondenied": "Nie masz uprawnień do $1.",
+       "apierror-permissiondenied-generic": "Brak dostępu.",
+       "apierror-permissiondenied-unblock": "Nie masz uprawnień do odblokowania użytkowników.",
+       "apierror-protect-invalidaction": "Nieprawidłowy rodzaj zabezpieczenia „$1”.",
+       "apierror-protect-invalidlevel": "Nieprawidłowy poziom zabezpieczeń „$1”.",
+       "apierror-specialpage-cantexecute": "Nie masz uprawnień, aby zobaczyć wyniki tej strony specjalnej.",
+       "apierror-stashwrongowner": "Nieprawidłowy właściciel: $1",
+       "apierror-unknownerror-nocode": "Nieznany błąd.",
+       "apierror-unknownerror": "Nieznany błąd: „$1”.",
+       "apierror-unknownformat": "Nierozpoznany format „$1”.",
+       "apierror-unrecognizedvalue": "Nierozpoznana wartość parametru <var>$1</var>: $2.",
+       "apiwarn-invalidcategory": "„$1” nie jest kategorią.",
+       "apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
+       "apiwarn-notfile": "„$1” nie jest plikiem.",
+       "api-feed-error-title": "Błąd ($1)",
+       "api-exception-trace": "$1 w $2($3)\n$4",
        "api-credits-header": "Twórcy",
        "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://phabricator.wikimedia.org/."
 }
index 38af0cb..9899945 100644 (file)
@@ -9,7 +9,8 @@
                        "Almondega",
                        "Raphaelras",
                        "Caçador de Palavras",
-                       "LucyDiniz"
+                       "LucyDiniz",
+                       "Eduardo Addad de Oliveira"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
@@ -17,6 +18,7 @@
        "apihelp-main-param-smaxage": "Define o cabeçalho <code>s-maxage</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
        "apihelp-main-param-maxage": "Define o cabeçalho <code>max-age</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
        "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.",
+       "apihelp-main-param-servedby": "Inclua o nome de host que atendeu a solicitação nos resultados.",
        "apihelp-main-param-curtimestamp": "Inclui a data atual no resultado.",
        "apihelp-block-description": "Bloquear um usuário",
        "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
index 20a2eda..38b7bc0 100644 (file)
        "apihelp-main-param-requestid": "Qualquer valor fornecido aqui será incluído na resposta. Pode ser usado para distinguir pedidos.",
        "apihelp-main-param-servedby": "Incluir nos resultados o nome do servidor que serviu o pedido.",
        "apihelp-main-param-curtimestamp": "Incluir a data e hora atuais no resultado.",
+       "apihelp-main-param-responselanginfo": "Incluir as línguas usadas para <var>uselang</var> e <var>errorlang</var> no resultado.",
        "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias e, portanto, tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto, tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (''white-listed'') os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e o acesso a todos os dados específicos do utilizador está restringido.",
-       "apihelp-main-param-uselang": "Língua a usar nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
+       "apihelp-main-param-uselang": "A língua a ser usada nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
+       "apihelp-main-param-errorformat": "O formato a ser usado no texto de avisos e erros.\n; plaintext: Texto wiki com os elementos HTML removidos e as entidades substituídas.\n; wikitext: Texto wiki sem análise sintática.\n; html: HTML.\n; raw: Chave e parâmetros da mensagem.\n; none: Sem saída de texto, só os códigos de erro.\n; bc: Formato usado antes do MediaWiki 1.29. <var>errorlang</var> e <var>errorsuselocal</var> são ignorados.",
+       "apihelp-main-param-errorlang": "A língua a ser usada para avisos e erros. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki, ou especifique <kbd>uselang</kbd> para usar o mesmo valor que o parâmetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Se fornecido, os textos de erro utilizarão mensagens personalizadas localmente do espaço nominal {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear um utilizador.",
-       "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados.",
+       "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados. Não pode ser usado em conjunto com <var>$1userid</var>",
+       "apihelp-block-param-userid": "O identificador do utilizador a ser bloqueado. Não pode ser usado em conjunto com <var>$1user</var>.",
        "apihelp-block-param-expiry": "O período de expiração. Pode ser relativo (p. ex. <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. <kbd>2014-09-18T12:34:56Z</kbd>). Se definido como <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, o bloqueio nunca expirará.",
        "apihelp-block-param-reason": "O motivo do bloqueio.",
        "apihelp-block-param-anononly": "Bloquear só utilizadores anónimos (isto é, impedir edições anónimas a partir deste endereço IP)",
@@ -34,6 +39,7 @@
        "apihelp-block-param-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Se o utilizador já está bloqueado, sobrescrever o bloco existente.",
        "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
+       "apihelp-block-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
        "apihelp-changeauthenticationdata-description": "Alterar os dados de autenticação do utilizador atual.",
        "apihelp-help-example-query": "Ajuda para dois submódulos de consulta.",
        "apihelp-imagerotate-description": "Rodar uma ou mais imagens.",
        "apihelp-imagerotate-param-rotation": "Graus de rotação da imagem no sentido horário.",
+       "apihelp-imagerotate-param-tags": "Etiquetas a aplicar à entrada no registo de carregamentos.",
        "apihelp-imagerotate-example-simple": "Rodar <kbd>File:Example.png</kbd> <kbd>90</kbd> graus.",
        "apihelp-imagerotate-example-generator": "Rodar todas as imagens na categoria <kbd>Category:Flip</kbd> em <kbd>180</kbd> graus.",
        "apihelp-import-description": "Importar uma página de outra wiki ou de um ficheiro XML.\n\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, com multipart/form-data como Content-Type) ao enviar um ficheiro para o parâmetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importações interwikis: importar também todas as predefinições incluídas.",
        "apihelp-import-param-namespace": "Importar para este espaço nominal. Não pode ser usado em conjunto com <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpágina desta página. Não pode ser usado em conjunto com <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de importações e à revisão nula nas páginas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] para o espaço nominal 100 com o historial completo.",
        "apihelp-linkaccount-description": "Ligar uma conta de um fornecedor terceiro ao utilizador atual.",
        "apihelp-linkaccount-example-link": "Iniciar o processo de ligação a uma conta do fornecedor <kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta a ser criada, eliminada, ativada ou desativada. Para criar uma etiqueta ela não pode existir. Para eliminar uma etiqueta, ela tem de existir. Para ativar uma etiqueta, ela tem de existir e não estar a ser utilizada por nenhuma extensão. Para desativar uma etiqueta, ela tem de estar ativa e definida manualmente.",
        "apihelp-managetags-param-reason": "Um motivo, opcional, para a criação, eliminação, ativação ou desativação da etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Indica se devem ser ignorados todos os avisos gerados durante a operação.",
+       "apihelp-managetags-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de gestão de etiquetas.",
        "apihelp-managetags-example-create": "Criar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Eliminar a etiqueta <kbd>vandlaism</kbd> com o motivo <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Ativar uma etiqueta com o nome <kbd>spam</kbd> e o motivo <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Remover a página e o redirecionamento das páginas vigiadas do utilizador atual.",
        "apihelp-move-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
+       "apihelp-move-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de movimentações e à revisão nula na página de destino.",
        "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> para <kbd>Goodtitle</kbd> sem deixar um redirecionamento.",
        "apihelp-opensearch-description": "Pesquisar a wiki usando o protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Texto a pesquisar.",
        "apihelp-patrol-description": "Patrulhar uma página ou revisão.",
        "apihelp-patrol-param-rcid": "Identificador da mudança recente a patrulhar.",
        "apihelp-patrol-param-revid": "Identificador da revisão a patrulhar.",
-       "apihelp-patrol-param-tags": "Etiquetas de modificação a aplicar à entrada do registo de patrulha.",
+       "apihelp-patrol-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de edições patrulhadas.",
        "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente.",
        "apihelp-patrol-example-revid": "Patrulhar uma revisão.",
        "apihelp-protect-description": "Alterar o nível de proteção de uma página.",
        "apihelp-query+allmessages-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+allmessages-param-enableparser": "Definir, para ativar o analisador sintático e pré-processar o texto da mensagem com notação wiki (substituir palavras mágicas, processar predefinições, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Se definido, não incluir o conteúdo das mensagens no resultado de saída.",
-       "apihelp-query+allmessages-param-includelocal": "Incluir também as mensagens locais, isto é, mensagens que não existem no software mas existem como uma página no espaço nominal MediaWiki:.\nIsto lista todas as páginas do espaço nominal MediaWiki:, portanto, também irá listar aquelas que não são verdadeiramente mensagens, como [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Incluir também as mensagens locais, isto é, mensagens que não existem no software mas existem como uma página no espaço nominal {{ns:MediaWiki}}.\nIsto lista todas as páginas do espaço nominal {{ns:MediaWiki}}, portanto, também irá listar aquelas que não são verdadeiramente mensagens, como [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Os argumentos a serem substituídos na mensagem.",
        "apihelp-query+allmessages-param-filter": "Devolver só as mensagens cujos nomes contêm este texto.",
        "apihelp-query+allmessages-param-customised": "Devolver só as mensagens neste estado de personalização.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pela página Special:Upload para obter informação sobre um ficheiro existente. Não se destina a ser usado fora do núcleo central do MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Indica se o ficheiro está na lista [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-limit": "O número de revisões a serem devolvidas por ficheiro.",
        "apihelp-query+imageinfo-param-start": "Data e hora a partir da qual será começada a listagem.",
        "apihelp-query+imageinfo-param-end": "Data e hora na qual será terminada a listagem.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se estiverem disponíveis traduções para a propriedade extmetadata, obtê-las todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se for especificado e não estiver vazio, só serão devolvidas estas chaves para $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Um parâmetro de texto específico do objeto. Por exemplo, ficheiros PDF podem usar <kbd>page15-100px</kbd>. <var>$1urlwidth</var> tem de ser usado e ser consistente com <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Se <kbd>$2prop=badfile</kbd> estiver definido, este é o título da página usado ao calcular a [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Procurar ficheiros só no repositório local.",
        "apihelp-query+imageinfo-example-simple": "Obter informação sobre a versão atual do ficheiro [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Obter informação sobre as versões de [[:File:Test.jpg]] a partir de 2008.",
        "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições a serem devolvidas.",
        "apihelp-query+usercontribs-param-start": "A data e hora da contribuição pela qual será começada a devolução de resultados.",
        "apihelp-query+usercontribs-param-end": "A data e hora da contribuição na qual será terminada a devolução de resultados.",
-       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas.",
-       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Tem precedência sobre $1user.",
+       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1userids</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Os identificadores dos utilizadores cujas contribuições serão obtidas. Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Listar só as contribuições nestes espaços nominais.",
        "apihelp-query+usercontribs-param-prop": "Incluir informações adicionais:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona os identificadores da página e da revisão.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indica se pode ser criada uma conta para os nomes de utilizador não registados, mas válidos.",
        "apihelp-query+users-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar se o utilizador tem ligação com a wiki designada por este identificador.",
        "apihelp-query+users-param-users": "Uma lista de utilizadores dos quais serão obtidas informações.",
+       "apihelp-query+users-param-userids": "Uma lista de identificadores dos utilizadores de que serão obtidas informações.",
        "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Devolver informações sobre o utilizador <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.",
        "apihelp-revisiondelete-param-show": "O que deve ser mostrado para cada revisão.",
        "apihelp-revisiondelete-param-suppress": "Indica se devem ser suprimidos os dados aos administradores como a todos os restantes utilizadores.",
        "apihelp-revisiondelete-param-reason": "O motivo da eliminação ou restauro.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar à entrada no registo de eliminações.",
        "apihelp-revisiondelete-example-revision": "Ocultar o conteúdo da revisão <kbd>12345</kbd> na página <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada <kbd>67890</kbd> do registo com o motivo <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Desfazer a última edição da página.\n\nSe o último utilizador a editar a página realizou várias edições em sequência, estas serão todas desfeitas.",
        "apihelp-setnotificationtimestamp-example-page": "Reiniciar o estado de notificação da página <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página <kbd>Main page</kbd> de forma a que todas as edições desde 1 de janeiro de 2012 passem a ser consideradas não vistas",
        "apihelp-setnotificationtimestamp-example-allpages": "Reiniciar o estado de notificação das páginas no espaço nominal <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Alterar a língua de uma página.",
+       "apihelp-setpagelanguage-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para usar esta operação.",
+       "apihelp-setpagelanguage-param-title": "O título da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "O identificador da página cuja língua pretende alterar. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "O código de língua, da língua para a qual a página será alterada. Usar <kbd>default</kbd> para redefinir a língua da página para a língua padrão de conteúdo da wiki.",
+       "apihelp-setpagelanguage-param-reason": "Motivo da alteração.",
+       "apihelp-setpagelanguage-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que resultar desta operação.",
+       "apihelp-setpagelanguage-example-language": "Alterar a língua da página <kbd>Main Page</kbd> para basco.",
+       "apihelp-setpagelanguage-example-default": "Alterar a língua da página com o identificador 123 para a língua padrão de conteúdo da wiki.",
        "apihelp-stashedit-description": "Preparar uma edição na ''cache'' partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
        "apihelp-stashedit-param-title": "Título da página que está a ser editada.",
        "apihelp-stashedit-param-section": "Número da secção. <kbd>0</kbd> para a secção do topo, <kbd>new</kbd> para uma secção nova.",
        "apihelp-tag-param-add": "As etiquetas a serem adicionadas. Só podem ser adicionadas as etiquetas definidas manualmente.",
        "apihelp-tag-param-remove": "As etiquetas a serem removidas. Só podem ser removidas as etiquetas definidas manualmente ou completamente indefinidas.",
        "apihelp-tag-param-reason": "O motivo da alteração.",
+       "apihelp-tag-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que será criada em resultado desta operação.",
        "apihelp-tag-example-rev": "Adicionar a etiqueta <kbd>vandalism</kbd> à revisão com o identificador 123, sem especificar um motivo.",
        "apihelp-tag-example-log": "Remover a etiqueta <kbd>spam</kbd> da entrada do registo com o identificador 123, com o motivo <kbd>Wrongly applied</kbd>.",
        "apihelp-tokens-description": "Obter chaves para operações de modificação de dados.\n\nEste módulo é obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Obter uma chave de edição (padrão).",
        "apihelp-tokens-example-emailmove": "Obter uma chave de correio eletrónico e uma chave de movimentação.",
        "apihelp-unblock-description": "Desbloquear um utilizador.",
-       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Nome de utilizador, endereço IP ou gama de endereços IP a desbloquear. Não pode ser usado em conjunto com <var>$1id</var>.",
+       "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a ser desbloqueado. Não pode ser usado em conjunto com <var>$1id</var> ou <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "O identificador do utilizador a ser desbloqueado. Não pode ser usado em conjunto com <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
        "apihelp-unblock-param-tags": "As etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
        "apihelp-userrights-param-remove": "Remover o utilizador destes grupos.",
        "apihelp-userrights-param-reason": "O motivo da alteração.",
+       "apihelp-userrights-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de privilégios de utilizadores.",
        "apihelp-userrights-example-user": "Adicionar o utilizador <kbd>FooBot</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Adicionar o utilizador com o identificador <kbd>123</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "Validar uma palavra-passe face às regras para palavras-passe da wiki.\n\nA validade é reportada <samp>Good</samp> (Boa) se a palavra-passe é aceitável, <samp>Change</samp> (Alterar) se a palavra-passe pode ser usada para iniciar uma sessão mas terá de ser alterada, ou <samp>Invalid</samp> (Inválida) se a palavra-passe não é utilizável.",
+       "apihelp-validatepassword-param-password": "A palavra-passe a ser validada.",
+       "apihelp-validatepassword-param-user": "O nome de utilizador, para ser usado ao testar a criação de conta. O nome de utilizador não pode existir.",
+       "apihelp-validatepassword-param-email": "O endereço de correio eletrónico, para ser usado ao testar a criação de conta.",
+       "apihelp-validatepassword-param-realname": "O nome verdadeiro, para ser usado ao testar a criação de conta.",
+       "apihelp-validatepassword-example-1": "Validar a palavra-passe <kbd>foobar</kbd> para o utilizador atual.",
+       "apihelp-validatepassword-example-2": "Validar a palavra-passe <kbd>qwerty</kbd> para a criação do utilizador <kbd>Example</kbd>.",
        "apihelp-watch-description": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.",
        "apihelp-watch-param-title": "A página a vigiar ou deixar de ser vigiada. Em vez disto, usar <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se definido, a página deixará de ser vigiada, em vez de o ser.",
        "apihelp-phpfm-description": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).",
        "apihelp-rawfm-description": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).",
        "apihelp-xml-description": "Produzir os dados de saída em formato XML.",
-       "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:mediawiki}} e acabar em <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:MediaWiki}} e acabar em <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se especificado, adiciona um espaço nominal XML.",
        "apihelp-xmlfm-description": "Produzir os dados de saída em formato XML (realce sintático em HTML).",
        "api-format-title": "Resultado da API do MediaWiki.",
index fd6a4dd..ef2ba8f 100644 (file)
        "apihelp-main-param-requestid": "{{doc-apihelp-param|main|requestid}}",
        "apihelp-main-param-servedby": "{{doc-apihelp-param|main|servedby}}",
        "apihelp-main-param-curtimestamp": "{{doc-apihelp-param|main|curtimestamp}}",
+       "apihelp-main-param-responselanginfo": "{{doc-apihelp-param|main|responselanginfo}}",
        "apihelp-main-param-origin": "{{doc-apihelp-param|main|origin}}",
        "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}",
+       "apihelp-main-param-errorformat": "{{doc-apihelp-param|main|errorformat}}",
+       "apihelp-main-param-errorlang": "{{doc-apihelp-param|main|errorlang}}",
+       "apihelp-main-param-errorsuselocal": "{{doc-apihelp-param|main|errorsuselocal}}",
        "apihelp-block-description": "{{doc-apihelp-description|block}}",
        "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}",
+       "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
        "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
@@ -41,6 +46,7 @@
        "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
+       "apihelp-block-param-tags": "{{doc-apihelp-param|block|tags}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}",
        "apihelp-changeauthenticationdata-description": "{{doc-apihelp-description|changeauthenticationdata}}",
        "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
        "apihelp-imagerotate-description": "{{doc-apihelp-description|imagerotate}}",
        "apihelp-imagerotate-param-rotation": "{{doc-apihelp-param|imagerotate|rotation}}",
+       "apihelp-imagerotate-param-tags": "{{doc-apihelp-param|imagerotate|tags}}",
        "apihelp-imagerotate-example-simple": "{{doc-apihelp-example|imagerotate}}",
        "apihelp-imagerotate-example-generator": "{{doc-apihelp-example|imagerotate}}",
        "apihelp-import-description": "{{doc-apihelp-description|import}}",
        "apihelp-import-param-templates": "{{doc-apihelp-param|import|templates}}",
        "apihelp-import-param-namespace": "{{doc-apihelp-param|import|namespace}}",
        "apihelp-import-param-rootpage": "{{doc-apihelp-param|import|rootpage}}",
+       "apihelp-import-param-tags": "{{doc-apihelp-param|import|tags}}",
        "apihelp-import-example-import": "{{doc-apihelp-example|import}}",
        "apihelp-linkaccount-description": "{{doc-apihelp-description|linkaccount}}",
        "apihelp-linkaccount-example-link": "{{doc-apihelp-example|linkaccount}}",
        "apihelp-managetags-param-tag": "{{doc-apihelp-param|managetags|tag}}",
        "apihelp-managetags-param-reason": "{{doc-apihelp-param|managetags|reason}}",
        "apihelp-managetags-param-ignorewarnings": "{{doc-apihelp-param|managetags|ignorewarnings}}",
+       "apihelp-managetags-param-tags": "{{doc-apihelp-param|managetags|tags}}",
        "apihelp-managetags-example-create": "{{doc-apihelp-example|managetags}}",
        "apihelp-managetags-example-delete": "{{doc-apihelp-example|managetags|info={{doc-important|The text \"vandlaism\" in this message is intentionally misspelled; the example being documented by this message is the deletion of a misspelled tag.}}}}",
        "apihelp-managetags-example-activate": "{{doc-apihelp-example|managetags}}",
        "apihelp-move-param-unwatch": "{{doc-apihelp-param|move|unwatch}}",
        "apihelp-move-param-watchlist": "{{doc-apihelp-param|move|watchlist}}",
        "apihelp-move-param-ignorewarnings": "{{doc-apihelp-param|move|ignorewarnings}}",
+       "apihelp-move-param-tags": "{{doc-apihelp-param|move|tags}}",
        "apihelp-move-example-move": "{{doc-apihelp-example|move}}",
        "apihelp-opensearch-description": "{{doc-apihelp-description|opensearch}}",
        "apihelp-opensearch-param-search": "{{doc-apihelp-param|opensearch|search}}",
        "apihelp-query+allfileusages-param-prefix": "{{doc-apihelp-param|query+allfileusages|prefix}}",
        "apihelp-query+allfileusages-param-unique": "{{doc-apihelp-param|query+allfileusages|unique}}",
        "apihelp-query+allfileusages-param-prop": "{{doc-apihelp-param|query+allfileusages|prop|paramvalues=1}}",
-       "apihelp-query+allfileusages-paramvalue-prop-ids": "{{doc-apihelp-param|query+allfileusages|prop|ids}}",
-       "apihelp-query+allfileusages-paramvalue-prop-title": "{{doc-apihelp-param|query+allfileusages|prop|title}}",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+allfileusages|prop|ids}}",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+allfileusages|prop|title}}",
        "apihelp-query+allfileusages-param-limit": "{{doc-apihelp-param|query+allfileusages|limit}}",
        "apihelp-query+allfileusages-param-dir": "{{doc-apihelp-param|query+allfileusages|dir}}",
        "apihelp-query+allfileusages-example-B": "{{doc-apihelp-example|query+allfileusages}}",
        "apihelp-query+allredirects-param-prefix": "{{doc-apihelp-param|query+allredirects|prefix}}",
        "apihelp-query+allredirects-param-unique": "{{doc-apihelp-param|query+allredirects|unique}}",
        "apihelp-query+allredirects-param-prop": "{{doc-apihelp-param|query+allredirects|prop|paramvalues=1}}",
-       "apihelp-query+allredirects-paramvalue-prop-ids": "{{doc-apihelp-param|query+allredirects|prop|ids}}",
-       "apihelp-query+allredirects-paramvalue-prop-title": "{{doc-apihelp-param|query+allredirects|prop|title}}",
-       "apihelp-query+allredirects-paramvalue-prop-fragment": "{{doc-apihelp-param|query+allredirects|prop|fragment}}",
-       "apihelp-query+allredirects-paramvalue-prop-interwiki": "{{doc-apihelp-param|query+allredirects|prop|interwiki}}",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+allredirects|prop|ids}}",
+       "apihelp-query+allredirects-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+allredirects|prop|title}}",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "{{doc-apihelp-paramvalue|query+allredirects|prop|fragment}}",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "{{doc-apihelp-paramvalue|query+allredirects|prop|interwiki}}",
        "apihelp-query+allredirects-param-namespace": "{{doc-apihelp-param|query+allredirects|namespace}}",
        "apihelp-query+allredirects-param-limit": "{{doc-apihelp-param|query+allredirects|limit}}",
        "apihelp-query+allredirects-param-dir": "{{doc-apihelp-param|query+allredirects|dir}}",
        "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}",
        "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}",
        "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop|paramvalues=1}}",
-       "apihelp-query+categorymembers-paramvalue-prop-ids": "{{doc-apihelp-param|query+categorymembers|prop|ids}}",
-       "apihelp-query+categorymembers-paramvalue-prop-title": "{{doc-apihelp-param|query+categorymembers|prop|title}}",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "{{doc-apihelp-param|query+categorymembers|prop|sortkey}}",
-       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "{{doc-apihelp-param|query+categorymembers|prop|sortkeyprefix}}",
-       "apihelp-query+categorymembers-paramvalue-prop-type": "{{doc-apihelp-param|query+categorymembers|prop|type}}",
-       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "{{doc-apihelp-param|query+categorymembers|prop|timestamp}}",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+categorymembers|prop|ids}}",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+categorymembers|prop|title}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "{{doc-apihelp-paramvalue|query+categorymembers|prop|sortkey}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "{{doc-apihelp-paramvalue|query+categorymembers|prop|sortkeyprefix}}",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "{{doc-apihelp-paramvalue|query+categorymembers|prop|type}}",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+categorymembers|prop|timestamp}}",
        "apihelp-query+categorymembers-param-namespace": "{{doc-apihelp-param|query+categorymembers|namespace}}",
        "apihelp-query+categorymembers-param-type": "{{doc-apihelp-param|query+categorymembers|type}}",
        "apihelp-query+categorymembers-param-limit": "{{doc-apihelp-param|query+categorymembers|limit}}",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "{{doc-apihelp-paramvalue|query+imageinfo|prop|archivename}}",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "{{doc-apihelp-paramvalue|query+imageinfo|prop|bitdepth}}",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "{{doc-apihelp-paramvalue|query+imageinfo|prop|uploadwarning}}",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "{{doc-apihelp-paramvalue|query+imageinfo|prop|badfile}}",
        "apihelp-query+imageinfo-param-limit": "{{doc-apihelp-param|query+imageinfo|limit}}",
        "apihelp-query+imageinfo-param-start": "{{doc-apihelp-param|query+imageinfo|start}}",
        "apihelp-query+imageinfo-param-end": "{{doc-apihelp-param|query+imageinfo|end}}",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "{{doc-apihelp-param|query+imageinfo|extmetadatamultilang}}",
        "apihelp-query+imageinfo-param-extmetadatafilter": "{{doc-apihelp-param|query+imageinfo|extmetadatafilter}}",
        "apihelp-query+imageinfo-param-urlparam": "{{doc-apihelp-param|query+imageinfo|urlparam}}",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "{{doc-apihelp-param|query+imageinfo|badfilecontexttitle}}",
        "apihelp-query+imageinfo-param-localonly": "{{doc-apihelp-param|query+imageinfo|localonly}}",
        "apihelp-query+imageinfo-example-simple": "{{doc-apihelp-example|query+imageinfo}}",
        "apihelp-query+imageinfo-example-dated": "{{doc-apihelp-example|query+imageinfo}}",
        "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}",
        "apihelp-query+langbacklinks-param-limit": "{{doc-apihelp-param|query+langbacklinks|limit}}",
        "apihelp-query+langbacklinks-param-prop": "{{doc-apihelp-param|query+langbacklinks|prop|paramvalues=1}}",
-       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "{{doc-apihelp-param|query+langbacklinks|prop|lllang}}",
-       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "{{doc-apihelp-param|query+langbacklinks|prop|lltitle}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "{{doc-apihelp-paramvalue|query+langbacklinks|prop|lllang}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "{{doc-apihelp-paramvalue|query+langbacklinks|prop|lltitle}}",
        "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}",
        "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}",
        "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}",
        "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop|paramvalues=1}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-param|query+pageswithprop|prop|ids}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-title": "{{doc-apihelp-param|query+pageswithprop|prop|title}}",
-       "apihelp-query+pageswithprop-paramvalue-prop-value": "{{doc-apihelp-param|query+pageswithprop|prop|value}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|ids}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|title}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|value}}",
        "apihelp-query+pageswithprop-param-limit": "{{doc-apihelp-param|query+pageswithprop|limit}}",
        "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}",
        "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}",
        "apihelp-query+usercontribs-param-end": "{{doc-apihelp-param|query+usercontribs|end}}",
        "apihelp-query+usercontribs-param-user": "{{doc-apihelp-param|query+usercontribs|user}}",
        "apihelp-query+usercontribs-param-userprefix": "{{doc-apihelp-param|query+usercontribs|userprefix}}",
+       "apihelp-query+usercontribs-param-userids": "{{doc-apihelp-param|query+usercontribs|userids}}",
        "apihelp-query+usercontribs-param-namespace": "{{doc-apihelp-param|query+usercontribs|namespace}}",
        "apihelp-query+usercontribs-param-prop": "{{doc-apihelp-param|query+usercontribs|prop|paramvalues=1}}",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+usercontribs|prop|ids}}",
        "apihelp-query+users-paramvalue-prop-cancreate": "{{doc-apihelp-paramvalue|query+users|prop|cancreate}}",
        "apihelp-query+users-param-attachedwiki": "{{doc-apihelp-param|query+users|attachedwiki}}",
        "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}",
+       "apihelp-query+users-param-userids": "{{doc-apihelp-param|query+users|userids}}",
        "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}",
        "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}",
        "apihelp-query+watchlist-description": "{{doc-apihelp-description|query+watchlist}}",
        "apihelp-revisiondelete-param-show": "{{doc-apihelp-param|revisiondelete|show}}",
        "apihelp-revisiondelete-param-suppress": "{{doc-apihelp-param|revisiondelete|suppress}}",
        "apihelp-revisiondelete-param-reason": "{{doc-apihelp-param|revisiondelete|reason}}",
+       "apihelp-revisiondelete-param-tags": "{{doc-apihelp-param|revisiondelete|tags}}",
        "apihelp-revisiondelete-example-revision": "{{doc-apihelp-example|revisiondelete}}",
        "apihelp-revisiondelete-example-log": "{{doc-apihelp-example|revisiondelete}}",
        "apihelp-rollback-description": "{{doc-apihelp-description|rollback}}",
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
+       "apihelp-setpagelanguage-description": "{{doc-apihelp-description|setpagelanguage}}",
+       "apihelp-setpagelanguage-description-disabled": "{{doc-apihelp-description|setpagelanguage|info=This message is used when changing the language of a page is not allowed on the wiki because <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> is not enabled.|seealso={{msg-mw|apihelp-setpagelanguage-description}}}}",
+       "apihelp-setpagelanguage-param-title": "{{doc-apihelp-param|setpagelanguage|title}}",
+       "apihelp-setpagelanguage-param-pageid": "{{doc-apihelp-param|setpagelanguage|pageid}}",
+       "apihelp-setpagelanguage-param-lang": "{{doc-apihelp-param|setpagelanguage|lang}}",
+       "apihelp-setpagelanguage-param-reason": "{{doc-apihelp-param|setpagelanguage|reason}}",
+       "apihelp-setpagelanguage-param-tags": "{{doc-apihelp-param|setpagelanguage|tags}}",
+       "apihelp-setpagelanguage-example-language": "{{doc-apihelp-example|setpagelanguage}}",
+       "apihelp-setpagelanguage-example-default": "{{doc-apihelp-example|setpagelanguage}}",
        "apihelp-stashedit-description": "{{doc-apihelp-description|stashedit}}",
        "apihelp-stashedit-param-title": "{{doc-apihelp-param|stashedit|title}}",
        "apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}",
        "apihelp-tag-param-add": "{{doc-apihelp-param|tag|add}}",
        "apihelp-tag-param-remove": "{{doc-apihelp-param|tag|remove}}",
        "apihelp-tag-param-reason": "{{doc-apihelp-param|tag|reason}}",
+       "apihelp-tag-param-tags": "{{doc-apihelp-param|tag|tags}}",
        "apihelp-tag-example-rev": "{{doc-apihelp-example|tag}}",
        "apihelp-tag-example-log": "{{doc-apihelp-example|tag}}",
        "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}",
        "apihelp-unblock-description": "{{doc-apihelp-description|unblock}}",
        "apihelp-unblock-param-id": "{{doc-apihelp-param|unblock|id}}",
        "apihelp-unblock-param-user": "{{doc-apihelp-param|unblock|user}}",
+       "apihelp-unblock-param-userid": "{{doc-apihelp-param|unblock|userid}}",
        "apihelp-unblock-param-reason": "{{doc-apihelp-param|unblock|reason}}",
        "apihelp-unblock-param-tags": "{{doc-apihelp-param|unblock|tags}}",
        "apihelp-unblock-example-id": "{{doc-apihelp-example|unblock}}",
        "apihelp-userrights-param-add": "{{doc-apihelp-param|userrights|add}}",
        "apihelp-userrights-param-remove": "{{doc-apihelp-param|userrights|remove}}",
        "apihelp-userrights-param-reason": "{{doc-apihelp-param|userrights|reason}}",
+       "apihelp-userrights-param-tags": "{{doc-apihelp-param|userrights|tags}}",
        "apihelp-userrights-example-user": "{{doc-apihelp-example|userrights}}",
        "apihelp-userrights-example-userid": "{{doc-apihelp-example|userrights}}",
+       "apihelp-validatepassword-description": "{{doc-apihelp-description|validatepassword}}",
+       "apihelp-validatepassword-param-password": "{{doc-apihelp-param|validatepassword|password}}",
+       "apihelp-validatepassword-param-user": "{{doc-apihelp-param|validatepassword|user}}",
+       "apihelp-validatepassword-param-email": "{{doc-apihelp-param|validatepassword|email}}",
+       "apihelp-validatepassword-param-realname": "{{doc-apihelp-param|validatepassword|realname}}",
+       "apihelp-validatepassword-example-1": "{{doc-apihelp-example|validatepassword}}",
+       "apihelp-validatepassword-example-2": "{{doc-apihelp-example|validatepassword}}",
        "apihelp-watch-description": "{{doc-apihelp-description|watch}}",
        "apihelp-watch-param-title": "{{doc-apihelp-param|watch|title}}",
        "apihelp-watch-param-unwatch": "{{doc-apihelp-param|watch|unwatch}}",
        "apihelp-jsonfm-description": "{{doc-apihelp-description|jsonfm|seealso=* {{msg-mw|apihelp-json-description}}}}",
        "apihelp-none-description": "{{doc-apihelp-description|none}}",
        "apihelp-php-description": "{{doc-apihelp-description|php|seealso=* {{msg-mw|apihelp-phpfm-description}}}}",
-       "apihelp-php-param-formatversion": "{{doc-apihelp-param|json|formatversion}}",
+       "apihelp-php-param-formatversion": "{{doc-apihelp-param|php|formatversion}}",
        "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}",
        "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
        "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-datatypes-header": "Header for the data type section in the API help output",
-       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd&gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside <nowiki><kbd></kbd></nowiki> or <nowiki><var></var></nowiki> tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd&gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-authmanagerhelper-returnurl": "{{doc-apihelp-param|description=the \"returnurl\" parameter for AuthManager-using API modules|noseealso=1}}",
        "api-help-authmanagerhelper-continue": "{{doc-apihelp-param|description=the \"continue\" parameter for AuthManager-using API modules|noseealso=1}}",
        "api-help-authmanagerhelper-additional-params": "Message to display for AuthManager modules that take additional parameters to populate AuthenticationRequests. Parameters:\n* $1 - AuthManager action used by this module\n* $2 - Module parameter prefix, e.g. \"login\"\n* $3 - Module name, e.g. \"clientlogin\"\n* $4 - Module path, e.g. \"clientlogin\"",
+       "apierror-allimages-redirect": "{{doc-apierror}}",
+       "apierror-allpages-generator-redirects": "{{doc-apierror}}",
+       "apierror-appendnotsupported": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model",
+       "apierror-articleexists": "{{doc-apierror}}",
+       "apierror-assertbotfailed": "{{doc-apierror}}",
+       "apierror-assertnameduserfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User name passed in.",
+       "apierror-assertuserfailed": "{{doc-apierror}}",
+       "apierror-autoblocked": "{{doc-apierror}}",
+       "apierror-badconfig-resulttoosmall": "{{doc-apierror}}",
+       "apierror-badcontinue": "{{doc-apierror}}",
+       "apierror-baddiff": "{{doc-apierror}}",
+       "apierror-baddiffto": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-badformat-generic": "{{doc-apierror}}\n\nParameters:\n* $1 - Content format.\n* $2 - Content model.",
+       "apierror-badformat": "{{doc-apierror}}\n\nParameters:\n* $1 - Content format.\n* $2 - Content model.\n* $3 - Title using the model.",
+       "apierror-badgenerator-notgenerator": "{{doc-apierror}}\n\nParameters:\n* $1 - Generator module name.",
+       "apierror-badgenerator-unknown": "{{doc-apierror}}\n\nParameters:\n* $1 - Generator module name.",
+       "apierror-badip": "{{doc-apierror}}",
+       "apierror-badmd5": "{{doc-apierror}}",
+       "apierror-badmodule-badsubmodule": "{{doc-apierror}}\n\nParameters:\n* $1 - Module path.\n* $2 - Submodule name.",
+       "apierror-badmodule-nosubmodules": "{{doc-apierror}}\n\nParameters:\n* $1 - Module path.",
+       "apierror-badparameter": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-badquery": "{{doc-apierror}}",
+       "apierror-badtimestamp": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-badtoken": "{{doc-apierror}}",
+       "apierror-badupload": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-badurl": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-baduser": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Value of the parameter.",
+       "apierror-badvalue-notmultivalue": "{{doc-apierror}}",
+       "apierror-bad-watchlist-token": "{{doc-apierror}}",
+       "apierror-blockedfrommail": "{{doc-apierror}}",
+       "apierror-blocked": "{{doc-apierror}}",
+       "apierror-botsnotsupported": "{{doc-apierror}}",
+       "apierror-cannotreauthenticate": "{{doc-apierror}}",
+       "apierror-cannotviewtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Title.",
+       "apierror-cantblock-email": "{{doc-apierror}}",
+       "apierror-cantblock": "{{doc-apierror}}",
+       "apierror-cantchangecontentmodel": "{{doc-apierror}}",
+       "apierror-canthide": "{{doc-apierror}}",
+       "apierror-cantimport-upload": "{{doc-apierror}}",
+       "apierror-cantimport": "{{doc-apierror}}",
+       "apierror-cantoverwrite-sharedfile": "{{doc-apierror}}",
+       "apierror-cantsend": "{{doc-apierror}}",
+       "apierror-cantundelete": "{{doc-apierror}}",
+       "apierror-changeauth-norequest": "{{doc-apierror}}",
+       "apierror-chunk-too-small": "{{doc-apierror}}\n\nParameters:\n* $1 - Minimum size in bytes.",
+       "apierror-cidrtoobroad": "{{doc-apierror}}\n\nParameters:\n* $1 - \"IPv4\" or \"IPv6\"\n* $2 - Minimum CIDR mask length.",
+       "apierror-compare-inputneeded": "{{doc-apierror}}",
+       "apierror-contentserializationexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, may end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-contenttoobig": "{{doc-apierror}}\n\nParameters:\n* $1 - Maximum article size in kilobytes.",
+       "apierror-copyuploadbaddomain": "{{doc-apierror}}",
+       "apierror-copyuploadbadurl": "{{doc-apierror}}",
+       "apierror-create-titleexists": "{{doc-apierror}}",
+       "apierror-csp-report": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code, e.g. \"toobig\".",
+       "apierror-databaseerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.",
+       "apierror-deletedrevs-param-not-1-2": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}",
+       "apierror-deletedrevs-param-not-3": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}",
+       "apierror-emptynewsection": "{{doc-apierror}}",
+       "apierror-emptypage": "{{doc-apierror}}",
+       "apierror-exceptioncaught": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.\n* $2 - Exception message, which may end with punctuation. Probably in English.",
+       "apierror-filedoesnotexist": "{{doc-apierror}}",
+       "apierror-fileexists-sharedrepo-perm": "{{doc-apierror}}",
+       "apierror-filenopath": "{{doc-apierror}}",
+       "apierror-filetypecannotberotated": "{{doc-apierror}}",
+       "apierror-formatphp": "{{doc-apierror}}",
+       "apierror-imageusage-badtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Module name.",
+       "apierror-import-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error message returned by the import, probably in English.",
+       "apierror-integeroutofrange-abovebotmax": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Maximum allowed value\n* $3 - Supplied value",
+       "apierror-integeroutofrange-abovemax": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Maximum allowed value\n* $3 - Supplied value",
+       "apierror-integeroutofrange-belowminimum": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name\n* $2 - Minimum allowed value\n* $3 - Supplied value",
+       "apierror-invalidcategory": "{{doc-apierror}}",
+       "apierror-invalid-chunk": "{{doc-apierror}}",
+       "apierror-invalidexpiry": "{{doc-apierror}}\n\nParameters:\n* $1 - Value provided.",
+       "apierror-invalid-file-key": "{{doc-apierror}}",
+       "apierror-invalidlang": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-invalidoldimage": "{{doc-apierror}}",
+       "apierror-invalidparammix-cannotusewith": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name or \"parameter=value\" text.\n* $2 - Parameter name or \"parameter=value\" text.",
+       "apierror-invalidparammix-mustusewith": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name or \"parameter=value\" text.\n* $2 - Parameter name or \"parameter=value\" text.",
+       "apierror-invalidparammix-parse-new-section": "{{doc-apierror}}",
+       "apierror-invalidparammix": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names or \"parameter=value\" text.\n* $2 - Number of parameters.",
+       "apierror-invalidsection": "{{doc-apierror}}",
+       "apierror-invalidsha1base36hash": "{{doc-apierror}}",
+       "apierror-invalidsha1hash": "{{doc-apierror}}",
+       "apierror-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Title that is invalid",
+       "apierror-invalidurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Key\n* $3 - Value.",
+       "apierror-invaliduser": "{{doc-apierror}}\n\nParameters:\n* $1 - User name that is invalid.",
+       "apierror-invaliduserid": "{{doc-apierror}}",
+       "apierror-maxlag-generic": "{{doc-apierror}}\n\nParameters:\n* $1 - Database is lag in seconds.",
+       "apierror-maxlag": "{{doc-apierror}}\n\nParameters:\n* $1 - Database lag in seconds.\n* $2 - Database server that is lagged.",
+       "apierror-mimesearchdisabled": "{{doc-apierror}}",
+       "apierror-missingcontent-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-missingparam-at-least-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.",
+       "apierror-missingparam-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.",
+       "apierror-missingparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-missingrev-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-missingtitle-createonly": "{{doc-apierror}}",
+       "apierror-missingtitle": "{{doc-apierror}}",
+       "apierror-missingtitle-byname": "{{doc-apierror}}",
+       "apierror-moduledisabled": "{{doc-apierror}}\n\nParameters:\n* $1 - Name of the module.",
+       "apierror-multival-only-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Possible values for the parameter.\n* $3 - Number of values.",
+       "apierror-multival-only-one": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-multpages": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name",
+       "apierror-mustbeloggedin-changeauth": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-generic": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-linkaccounts": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-removeauth": "{{doc-apierror}}",
+       "apierror-mustbeloggedin-uploadstash": "{{doc-apierror}}",
+       "apierror-mustbeloggedin": "{{doc-apierror}}\n\nParameters:\n* $1 - One of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}\n* {{msg-mw|permissionserrorstext-withaction}}",
+       "apierror-mustbeposted": "{{doc-apierror}}\n\nParameters:\n* $1 - Module name.",
+       "apierror-mustpostparams": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter names.\n* $2 - Number of parameters.",
+       "apierror-noapiwrite": "{{doc-apierror}}",
+       "apierror-nochanges": "{{doc-apierror}}",
+       "apierror-nodeleteablefile": "{{doc-apierror}}",
+       "apierror-no-direct-editing": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model.\n* $2 - Title using the model.",
+       "apierror-noedit-anon": "{{doc-apierror}}",
+       "apierror-noedit": "{{doc-apierror}}",
+       "apierror-noimageredirect-anon": "{{doc-apierror}}",
+       "apierror-noimageredirect": "{{doc-apierror}}",
+       "apierror-nosuchlogid": "{{doc-apierror}}\n\nParameters:\n* $1 - Log ID number.",
+       "apierror-nosuchpageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.",
+       "apierror-nosuchrcid": "{{doc-apierror}}\n\nParameters:\n* $1 - RecentChanges ID number.",
+       "apierror-nosuchrevid": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apierror-nosuchsection": "{{doc-apierror}}\n\nParameters:\n* $1 - Section identifier. Probably a number or \"T-\" followed by a number.",
+       "apierror-nosuchsection-what": "{{doc-apierror}}\n\nParameters:\n* $1 - Section identifier. Probably a number or \"T-\" followed by a number.\n* $2 - Page title, revision ID formatted with {{msg-mw|revid}}, or page ID formatted with {{msg-mw|pageid}}.",
+       "apierror-nosuchuserid": "{{doc-apierror}}",
+       "apierror-notarget": "{{doc-apierror}}",
+       "apierror-notpatrollable": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apierror-nouploadmodule": "{{doc-apierror}}",
+       "apierror-opensearch-json-warnings": "{{doc-apierror}}",
+       "apierror-pagecannotexist": "{{doc-apierror}}",
+       "apierror-pagedeleted": "{{doc-apierror}}",
+       "apierror-pagelang-disabled": "{{doc-apierror}}",
+       "apierror-paramempty": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apierror-parsetree-notwikitext": "{{doc-apierror}}",
+       "apierror-parsetree-notwikitext-title": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.\n* $2 - Content model.",
+       "apierror-pastexpiry": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied expiry time.",
+       "apierror-permissiondenied": "{{doc-apierror}}\n\nParameters:\n* $1 - One of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.\n\nSee also:\n* {{msg-mw|permissionserrorstext-withaction}}",
+       "apierror-permissiondenied-generic": "{{doc-apierror}}",
+       "apierror-permissiondenied-patrolflag": "{{doc-apierror}}\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}",
+       "apierror-permissiondenied-unblock": "{{doc-apierror}}\n\nSee also:\n* {{msg-mw|apierror-permissiondenied}}",
+       "apierror-prefixsearchdisabled": "{{doc-apierror}}",
+       "apierror-promised-nonwrite-api": "{{doc-apierror}}",
+       "apierror-protect-invalidaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied protection type.",
+       "apierror-protect-invalidlevel": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied protection level.",
+       "apierror-ratelimited": "{{doc-apierror}}",
+       "apierror-readapidenied": "{{doc-apierror}}",
+       "apierror-readonly": "{{doc-apierror}}",
+       "apierror-reauthenticate": "{{doc-apierror}}",
+       "apierror-redirect-appendonly": "{{doc-apierror}}",
+       "apierror-revdel-mutuallyexclusive": "{{doc-apierror}}",
+       "apierror-revdel-needtarget": "{{doc-apierror}}",
+       "apierror-revdel-paramneeded": "{{doc-apierror}}",
+       "apierror-revisions-norevids": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-revisions-singlepage": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apierror-revwrongpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n* $2 - Page title.",
+       "apierror-searchdisabled": "{{doc-apierror}}\n\nParameters:\n* $1 - Search parameter that is disabled.",
+       "apierror-sectionreplacefailed": "{{doc-apierror}}",
+       "apierror-sectionsnotsupported": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model that doesn't support sections.",
+       "apierror-sectionsnotsupported-what": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title, revision ID formatted with {{msg-mw|revid}}, or page ID formatted with {{msg-mw|pageid}}.",
+       "apierror-show": "{{doc-apierror}}",
+       "apierror-siteinfo-includealldenied": "{{doc-apierror}}",
+       "apierror-sizediffdisabled": "{{doc-apierror}}",
+       "apierror-spamdetected": "{{doc-apierror}}\n\nParameters:\n* $1 - Matching \"spam filter\".\n\nSee also:\n* {{msg-mw|spamprotectionmatch}}",
+       "apierror-specialpage-cantexecute": "{{doc-apierror}}",
+       "apierror-stashedfilenotfound": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashedit-missingtext": "{{doc-apierror}}",
+       "apierror-stashexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. May be English or localized, may or may not end in punctuation.",
+       "apierror-stashfailed-complete": "{{doc-apierror}}",
+       "apierror-stashfailed-nosession": "{{doc-apierror}}",
+       "apierror-stashfilestorage": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, which may already end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashinvalidfile": "{{doc-apierror}}",
+       "apierror-stashnosuchfilekey": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashpathinvalid": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashwrongowner": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, which should already end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-stashzerolength": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.",
+       "apierror-systemblocked": "{{doc-apierror}}",
+       "apierror-templateexpansion-notwikitext": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.\n* $2 - Content model.",
+       "apierror-toofewexpiries": "{{doc-apierror}}\n\nParameters:\n* $1 - Number provided.\n* $2 - Number needed.",
+       "apierror-unknownaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Action provided.",
+       "apierror-unknownerror-editpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (an integer).",
+       "apierror-unknownerror-nocode": "{{doc-apierror}}",
+       "apierror-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (possibly a message key) not handled by ApiBase::parseMsg().",
+       "apierror-unknownformat": "{{doc-apierror}}\n\nParameters:\n* $1 - Format provided.",
+       "apierror-unrecognizedparams": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameters.\n* $2 - Number of parameters.",
+       "apierror-unrecognizedvalue": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Parameter value.",
+       "apierror-unsupportedrepo": "{{doc-apierror}}",
+       "apierror-upload-filekeyneeded": "{{doc-apierror}}",
+       "apierror-upload-filekeynotallowed": "{{doc-apierror}}",
+       "apierror-upload-inprogress": "{{doc-apierror}}",
+       "apierror-upload-missingresult": "{{doc-apierror}}",
+       "apierror-urlparamnormal": "{{doc-apierror}}\n\nParameters:\n* $1 - Image title.",
+       "apierror-writeapidenied": "{{doc-apierror}}",
+       "apiwarn-alldeletedrevisions-performance": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
+       "apiwarn-badurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Image title.",
+       "apiwarn-badutf8": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n{{doc-important|Do not translate \"\\t\", \"\\n\", and \"\\r\"}}",
+       "apiwarn-checktoken-percentencoding": "{{doc-apierror}}",
+       "apiwarn-deprecation-deletedrevs": "{{doc-apierror}}",
+       "apiwarn-deprecation-expandtemplates-prop": "{{doc-apierror}}",
+       "apiwarn-deprecation-httpsexpected": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-botpw": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-nobotpw": "{{doc-apierror}}",
+       "apiwarn-deprecation-login-token": "{{doc-apierror}}",
+       "apiwarn-deprecation-parameter": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apiwarn-deprecation-parse-headitems": "{{doc-apierror}}",
+       "apiwarn-deprecation-purge-get": "{{doc-apierror}}",
+       "apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
+       "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apiwarn-errorprinterfailed": "{{doc-apierror}}",
+       "apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
+       "apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
+       "apiwarn-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied title.",
+       "apiwarn-invalidxmlstylesheetext": "{{doc-apierror}}",
+       "apiwarn-invalidxmlstylesheet": "{{doc-apierror}}",
+       "apiwarn-invalidxmlstylesheetns": "{{doc-apierror}}",
+       "apiwarn-moduleswithoutvars": "{{doc-apierror}}",
+       "apiwarn-notfile": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied file name.",
+       "apiwarn-nothumb-noimagehandler": "{{doc-apierror}}\n\nParameters:\n* $1 - File name.",
+       "apiwarn-parse-nocontentmodel": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model being assumed.",
+       "apiwarn-parse-titlewithouttext": "{{doc-apierror}}",
+       "apiwarn-redirectsandrevids": "{{doc-apierror}}",
+       "apiwarn-tokennotallowed": "{{doc-apierror}}\n\nParameters:\n* $1 - Token type being requested, typically named after the action requiring the token.",
+       "apiwarn-tokens-origin": "{{doc-apierror}}",
+       "apiwarn-toomanyvalues": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Maximum number of values allowed.",
+       "apiwarn-truncatedresult": "{{doc-apierror}}\n\nParameters:\n* $1 - Size limit in bytes.",
+       "apiwarn-unclearnowtimestamp": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Supplied value.",
+       "apiwarn-unrecognizedvalues": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - List of unknown values supplied.\n* $3 - Number of unknown values.",
+       "apiwarn-unsupportedarray": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.",
+       "apiwarn-urlparamwidth": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Width being ignored.\n* $3 - Width being used.",
+       "apiwarn-validationfailed-badchars": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-badpref": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-cannotset": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.",
+       "apiwarn-validationfailed-keytoolong": "{{doc-apierror}}\n\nUsed with {{msg-mw|apiwarn-validationfailed}}.\n\nParameters:\n* $1 - Maximum allowed key length in bytes.",
+       "apiwarn-validationfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User preference name.\n* $2 - Failure message, such as {{msg-mw|apiwarn-validationfailed-badpref}}. Probably already ends with punctuation",
+       "apiwarn-wgDebugAPI": "{{doc-apierror}}",
+       "api-feed-error-title": "Used as a feed item title when an error occurs in <kbd>action=feedwatchlist</kbd>.\n\nParameters:\n* $1 - API error code\n{{Identical|Error}}",
+       "api-usage-docref": "\n\nParameters:\n* $1 - URL of the API auto-generated documentation.",
+       "api-exception-trace": "\n\nParameters:\n* $1 - Exception class.\n* $2 - File from which the exception was thrown.\n* $3 - Line number from which the exception was thrown.\n* $4 - Exception backtrace.",
        "api-credits-header": "Header for the API credits section in the API help output\n{{Identical|Credit}}",
        "api-credits": "API credits text, displayed in the API help output"
 }
index 2879020..9eb4a2e 100644 (file)
                        "MaxSem",
                        "Irus",
                        "MaxBioHazard",
-                       "Kareyac"
+                       "Kareyac",
+                       "Mailman",
+                       "Ping08"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "apihelp-main-param-maxlag": "Ð\9cакÑ\81ималÑ\8cное Ð¾Ñ\82Ñ\81Ñ\82авание Ð¼Ð¾Ð¶ÐµÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¸Ñ\81полÑ\8cзован, ÐºÐ¾Ð³Ð´Ð° Ð\9cедиавики Ñ\83Ñ\81Ñ\82анавливаеÑ\82Ñ\81Ñ\8f Ð½Ð° Ñ\80еплиÑ\86иÑ\80Ñ\83емой Ð±Ð°Ð·Ñ\8b Ð´Ð°Ð½Ð½Ñ\8bÑ\85 ÐºÐ»Ð°Ñ\81Ñ\82еÑ\80а. Ð§Ñ\82обÑ\8b Ñ\81паÑ\81Ñ\82и Ð´ÐµÐ¹Ñ\81Ñ\82вий, Ñ\81поÑ\81обнÑ\8bÑ\85 Ð¿Ñ\80иÑ\87иниÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾Ñ\82Ñ\81Ñ\82аваÑ\82Ñ\8c Ñ\80епликаÑ\86ии Ñ\81айÑ\82а, Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶ÐµÑ\82 Ð·Ð°Ñ\81Ñ\82авлÑ\8fÑ\82Ñ\8c ÐºÐ»Ð¸ÐµÐ½Ñ\82а Ð¶Ð´Ð°Ñ\82Ñ\8c Ð´Ð¾ Ð·Ð°Ð´ÐµÑ\80жки Ñ\80епликаÑ\86ии Ð¼ÐµÐ½Ñ\8cÑ\88е Ñ\83казанного Ð·Ð½Ð°Ñ\87ениÑ\8f. Ð\92 Ñ\81лÑ\83Ñ\87ае Ñ\87Ñ\80езмеÑ\80ной Ð·Ð°Ð´ÐµÑ\80жки, ÐºÐ¾Ð´ Ð¾Ñ\88ибки <samp>maxlag</samp> Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82Ñ\81Ñ\8f Ñ\81 Ñ\81ообÑ\89ением <samp>ждеÑ\82 $ведÑ\83Ñ\89ий: $оÑ\82Ñ\81Ñ\82аваÑ\82Ñ\8c Ñ\81екÑ\83нд Ð¾Ñ\82Ñ\81Ñ\82ала</samp>.<br />См. [[mw:Manual:Maxlag_parameter|Maxlag Ð¿Ð°Ñ\80амеÑ\82Ñ\80]] Ð´Ð»Ñ\8f Ð¿Ð¾Ð»Ñ\83Ñ\87ениÑ\8f Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cной Ð¸Ð½Ñ\84оÑ\80маÑ\86ии.",
+       "apihelp-main-param-maxlag": "Ð\97наÑ\87ение Ð¼Ð°ÐºÑ\81ималÑ\8cного Ð¾Ñ\82Ñ\81Ñ\82аваниÑ\8f Ð¼Ð¾Ð¶ÐµÑ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f, ÐºÐ¾Ð³Ð´Ð° MediaWiki Ñ\83Ñ\81Ñ\82анавливаеÑ\82Ñ\81Ñ\8f Ð½Ð° ÐºÐ»Ð°Ñ\81Ñ\82еÑ\80 Ð¸Ð· Ñ\80еплиÑ\86иÑ\80Ñ\83емÑ\8bÑ\85 Ð±Ð°Ð· Ð´Ð°Ð½Ð½Ñ\8bÑ\85. Ð§Ñ\82обÑ\8b Ð¸Ð·Ð±ÐµÐ¶Ð°Ñ\82Ñ\8c Ñ\83Ñ\85Ñ\83дÑ\88ениÑ\8f Ñ\81иÑ\82Ñ\83аÑ\86ии Ñ\81 Ð¾Ñ\82Ñ\81Ñ\82аванием Ñ\80епликаÑ\86ии Ñ\81айÑ\82а, Ñ\8dÑ\82оÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 Ð¼Ð¾Ð¶ÐµÑ\82 Ð·Ð°Ñ\81Ñ\82авиÑ\82Ñ\8c ÐºÐ»Ð¸ÐµÐ½Ñ\82а Ð¶Ð´Ð°Ñ\82Ñ\8c, ÐºÐ¾Ð³Ð´Ð° Ð·Ð°Ð´ÐµÑ\80жка Ñ\80епликаÑ\86ии Ñ\81Ñ\82анеÑ\82 Ð½Ð¸Ð¶Ðµ Ñ\83казанного Ð·Ð½Ð°Ñ\87ениÑ\8f. Ð\92 Ñ\81лÑ\83Ñ\87ае Ñ\87Ñ\80езмеÑ\80ной Ð·Ð°Ð´ÐµÑ\80жки Ð²Ð¾Ð·Ð²Ñ\80аÑ\89аеÑ\82Ñ\81Ñ\8f ÐºÐ¾Ð´ Ð¾Ñ\88ибки Â«<samp>maxlag</samp>» Ñ\81 Ñ\81ообÑ\89ением Â«<samp>Waiting for $host: $lag seconds lagged</samp>».<br />См. Ð¿Ð¾Ð´Ñ\80обнее Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ð¾Ð¿Ð¸Ñ\81анием [[mw:Manual:Maxlag_parameter|паÑ\80амеÑ\82Ñ\80а maxlag]].",
        "apihelp-main-param-smaxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-maxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано <kbd>user</kbd>, или что имеет права бота, если задано <kbd>bot</kbd>.",
        "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
        "apihelp-main-param-curtimestamp": "Включить в результаты временную метку.",
        "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST).\n\nДля аутентифицированных запросов он должен точно соответствовать одному из источников в заголовке <code>Origin</code>, так что он должен быть задан наподобие <kbd>https://ru.wikipedia.org</kbd> или <kbd>https://meta.wikimedia.org</kbd>. Если параметр не соответствует заголовку <code>Origin</code>, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку <code>Origin</code>, и источник находится в белом списке, будут установлены заголовки <code>Access-Control-Allow-Origin</code> и <code>Access-Control-Allow-Credentials</code>.\n\nДля неаутентифицированных запросов укажите значение <kbd>*</kbd>. Это приведёт к установке заголовка <code>Access-Control-Allow-Origin</code> заголовка должен быть установлен, но <code>Access-Control-Allow-Credentials</code> примет значение <code>false</code> и все пользовательские данные будут ограничены.",
-       "apihelp-main-param-uselang": "Язык, используемый для перевода Сообщений. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> с <kbd>siprop=языки</kbd> возвращает список кодов языков, или указать <kbd>пользователей</kbd> , чтобы использовать текущий язык пользователя предпочтения, или указать <kbd>контента</kbd> для использования этой Вики содержание язык.",
+       "apihelp-main-param-uselang": "Язык, используемый для перевода сообщений. Запрос «<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>» с «<kbd>siprop=languages</kbd>» возвращает список кодов языков; укажите «<kbd>user</kbd>», чтобы использовать текущие языковые настройки пользователя, или «<kbd>content</kbd>» для использования основного языка этой вики.",
+       "apihelp-main-param-errorlang": "Язык, используемый для вывода предупреждений и сообщений об ошибках. Запрос «<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>» с «<kbd>siprop=languages</kbd>» возвращает список кодов языков; укажите «<kbd>content</kbd>» для использования основного языка этой вики, или «<kbd>uselang</kbd>» для использования того же значения, что и в параметре «<var>uselang</var>».",
        "apihelp-block-description": "Блокировка участника.",
-       "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать.",
+       "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать. Нельзя использовать вместе с <var>$1userid</var>",
+       "apihelp-block-param-userid": "ID участника, которого вы хотите заблокировать. Нельзя использовать одновременно вместе с <var>$1user</var>.",
        "apihelp-block-param-expiry": "Время истечения срока действия. Могут быть относительными (например, <kbd>5 месяцев</kbd> или <kbd>2 недели</kbd>) или абсолютными (например, <kbd>2014-09-18T12:34:56Z</kbd>). Если задано <kbd>бессрочно</kbd>, <kbd>бессрочно</kbd>, или <kbd>не</kbd>, блок никогда не истекает.",
        "apihelp-block-param-reason": "Причина блокировки.",
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-query+deletedrevs-example-mode1": "Юҡ ителгән һуңғы биттәрҙең исемлеге, баш биттең<kbd>-һы </kbd> һәм<kbd>әйтергә:баш биттең /kbd>-һы,континент менән(режим 1).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Юҡ ителгән тәүге 50 биттең исемлеге {{НС:фекер алышыу}} исемдәр арауығы(режим 3).",
        "apihelp-query+duplicatefiles-example-generated": "Поиск дубликатов всех файлов.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Добавляет указание на то, находится ли файл в списке [[MediaWiki:Bad image list]]",
        "apihelp-query+logevents-description": "Получать события из журналов.",
        "apihelp-query+logevents-example-simple": "Список последних зарегистрированных событий.",
        "apihelp-query+pagepropnames-example-simple": "Получить первые 10 имен свойств.",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
        "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
        "apihelp-unblock-description": "Разблокировать пользователя.",
+       "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с <var>$1id</var> или <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "ID участника, которого вы хотите разблокировать. Нельзя использовать одновременно с <var>$1id</var> или <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Причина разблокировки",
        "apihelp-unblock-example-id": "Разблокировать блок с идентификатором #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Разблокировать пользователя <kbd>Bob</kbd> по причине <kbd>Sorry Bob</kbd>.",
        "apihelp-userrights-param-add": "Добавить пользователя в эти группы.",
        "apihelp-userrights-param-remove": "Удалить пользователя из этих групп.",
        "apihelp-userrights-param-reason": "Причина изменений",
+       "apihelp-userrights-param-tags": "Изменить теги для подачи заявки на запись в журнале прав пользователей.",
        "apihelp-watch-example-watch": "Следить за страницей <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Не следить за страницей <kbd>Main Page</kbd>.",
        "apihelp-json-description": "Выходные данные в формате json.",
        "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
        "api-help-permissions": "{{PLURAL:$1|Permission|Permissions}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> не может быть более $2 (на $3) для пользователей.",
+       "apierror-nosuchuserid": "Нет пользователя с ID $1.",
+       "apierror-pagelang-disabled": "Меняется язык страницы не допускается в этой Вики.",
+       "apierror-protect-invalidaction": "Недопустимый тип защиты \"$1\".",
+       "apierror-systemblocked": "Вы были заблокированы автоматически Медиавики.",
+       "apierror-unknownformat": "Неизвестный Формат \"$1\".",
+       "apierror-urlparamnormal": "Не могли нормализовать параметры изображения для $1.",
+       "api-feed-error-title": "Ошибка ($1)",
        "api-credits-header": "Создатели"
 }
index e409591..0c4bd1c 100644 (file)
@@ -29,7 +29,8 @@
        "apihelp-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i headern <code>Origin</code> exakt, så den måste sättas till något i stil med <kbd>http://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Om denna parameter inte överensstämmer med headern <code>Origin</code>, returneras ett 403-svar. Om denna parameter överensstämmer med headern <code>Origin</code> och källan är vitlistad, sätts en <code>Access-Control-Allow-Origin</code>-header.",
        "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd>, eller ange <kbd>user</kbd> för att använda den aktuella användarens språkpreferenser, eller ange <kbd>content</kbd> för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
-       "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall du vill blockera.",
+       "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall att blockera. Kan inte användas tillsammans med <var>$1userid</var>",
+       "apihelp-block-param-userid": "Användar-ID att blocker. Kan inte användas tillsammans med <var>$1user</var>.",
        "apihelp-block-param-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolut (t.ex. <kbd>2014-09-18T12:34:56Z</kbd>). Om satt till <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd>, kommer blockeringen aldrig att löpa ut.",
        "apihelp-block-param-reason": "Orsak till blockering.",
        "apihelp-block-param-anononly": "Blockera endast anonyma användare (t.ex. inaktivera anonyma redigeringar för denna IP-adress).",
        "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.",
        "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.",
        "apihelp-stashedit-param-summary": "Ändra sammanfattning.",
+       "apihelp-unblock-param-id": "ID för blockeringen att häva (hämtas genom <kbd>list=blocks</kbd>). Kan inte användas tillsammans med <var>$1user</var> eller <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Användarnamn, IP-adresser eller IP-adressintervall att häva blockering för. Kan inte användas tillsammans med <var>$1id</var> eller <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Användar-ID att häva blockering för. Kan inte användas tillsammans med <var>$1id</var> eller <var>$1user</var>.",
        "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.",
        "apihelp-upload-example-url": "Ladda upp från URL.",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
        "api-help-param-limit": "Inte mer än $1 tillåts.",
        "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts.",
-       "api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]]."
+       "api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]].",
+       "apierror-articleexists": "Artikeln du försökte skapa har redan skapats.",
+       "apierror-baddiff": "Diff kan inte hämtas. En eller båda sidversioner finns inte eller du har inte behörighet för att visa dem.",
+       "apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
+       "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
+       "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.",
+       "apierror-unknownformat": "Okänt format \"$1\".",
+       "api-feed-error-title": "Fel ($1)"
 }
index 5626b70..6efd3f4 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "AntanO",
                        "கலைவாணன்",
-                       "Info-farmer"
+                       "Info-farmer",
+                       "ElangoRamanujam"
                ]
        },
        "apihelp-main-param-action": "எச்செயலை செயற்படுத்த",
        "apihelp-import-param-rootpage": "இப்பக்கத்தின் துணைப்பக்கமாக இறக்குமதி செய்யவும். <kbd>$1namespace</kbd> அளவுரு வழங்கப்பட்டிருந்தால் இது புறக்கணிக்கப்படும்.",
        "api-help-source": "மூலம்: $1",
        "api-help-license": "அனுமதி: [[$1|$2]]",
-       "api-help-license-noname": "அனுமதி: [[$1|இணைப்பைப் பார்]]"
+       "api-help-license-noname": "அனுமதி: [[$1|இணைப்பைப் பார்]]",
+       "apierror-invalidtitle": "தவறான தலைப்பு ”$1”",
+       "apierror-mustbeloggedin-generic": "தாங்கள் புகுபதிந்திருக்கவேண்டும்.",
+       "apierror-mustbeloggedin": "தாங்கள் $1-ல் புகுபதிந்திருக்கவேண்டும்.",
+       "apierror-nochanges": "மாற்றங்களேதும் கோரப்படவில்லை.",
+       "apierror-permissiondenied-generic": "அனுமதி மறுக்கப்பட்டது.",
+       "apierror-unknownerror-nocode": "இனம்புரியாப் பிழை.",
+       "apierror-unknownerror": "இனமறியாப் பிழை:\"$1\".",
+       "apiwarn-invalidtitle": "\"$1\" என்பது செல்லும் தலைப்பல்ல.",
+       "apiwarn-notfile": "”$1” ஒரு கோப்பல்ல.",
+       "api-feed-error-title": "பிழை ($1)"
 }
index 96a47fc..b7491b5 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Veeven",
                        "HAUSANRIK",
-                       "Ravichandra"
+                       "Ravichandra",
+                       "Jedimaster26"
                ]
        },
        "apihelp-block-description": "ఓ వాడుకరిని నిరోధించండి.",
@@ -15,5 +16,6 @@
        "apihelp-edit-example-edit": "ఓ పేజీని మార్చు.",
        "apihelp-emailuser-description": "వాడుకరికి ఈమెయిలు పంపించండి.",
        "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి",
+       "apihelp-query+users-param-userids": "వివరములు సేకరించవలసిన ఉపయోగదారుల పేర్లు",
        "apihelp-rawfm-description": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతో కలిపి, JSON పద్ధతిలో (HTMLలో అందంగా-ముద్రించు)"
 }
index fe9d085..9aaba31 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Kaganer"
+                       "Kaganer",
+                       "Mouse21"
                ]
        },
+       "apihelp-block-description": "Блокировка пыриськисьёс.",
        "apihelp-edit-example-edit": "Бамез тупатъяно.",
        "apihelp-login-example-login": "Пырыны."
 }
index d5b4c62..11a79c2 100644 (file)
@@ -11,7 +11,8 @@
                        "Mix Gerder",
                        "Piramidion",
                        "Andriykopanytsia",
-                       "Максим Підліснюк"
+                       "Максим Підліснюк",
+                       "AS"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].",
        "apihelp-main-param-requestid": "Будь-яке значення, вказане тут, буде включене у відповідь. Може використовуватися, щоб відрізняти запити.",
        "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
        "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
+       "apihelp-main-param-responselanginfo": "Включати мови, які були використані для <var>uselang</var> і <var>errorlang</var>, у результат.",
        "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). \n\nДля автентифікованих запитів він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовки <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неавтентифікованих запитів укажіть значення <kbd>*</kbd>. Це дасть встановлення заголовка <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> буде <code>false</code> і всі дані про користувача будуть заборонені.",
        "apihelp-main-param-uselang": "Мова, що використовується для перекладу повідомлень. Список кодів можна видати на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
+       "apihelp-main-param-errorformat": "Формат попереджень і тексту помилок.\n; plaintext: вікітекст із прираними HTML-тегами і заміненими HTML-мнемоніками.\n; wikitext: неопрацьований вікітекст.\n; html: HTML.\n; raw: лише ключ і параметри повідомлення.\n; none: без тексту, тільки коди помилок.\n; bc: формат, який використовувався до MediaWiki 1.29. <var>errorlang</var> і <var>errorsuselocal</var> ігноруються.",
+       "apihelp-main-param-errorlang": "Мова, яку використовувати для попереджень і помилок. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> із <kbd>siprop=languages</kbd> повертає список кодів мов, або ж вкажіть <kbd>content</kbd>, щоб використати мову вмісту поточної вікі, або вкажіть <kbd>uselang</kbd>, щоб використовувати те ж значення, що й параметр <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Якщо задано, тексти помилок використовуватимуть локальні повідомлення з простору назв {{ns:MediaWiki}}.",
        "apihelp-block-description": "Заблокувати користувача.",
-       "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
+       "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування. Не може бути використано разом із <var>$1userid</var>",
+       "apihelp-block-param-userid": "Ідентифікатор користувача, який заблокувати. Не може бути використано разом із <var>$1user</var>.",
        "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
        "apihelp-block-param-reason": "Причина блокування.",
        "apihelp-block-param-anononly": "Блокувати тільки анонімних користувачів (тобто відключити можливість анонімних редагувань з цієї IP-адреси).",
@@ -39,6 +45,7 @@
        "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.",
        "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
+       "apihelp-block-param-tags": "Змінити теги для застосування їх до запису в журналі блокувань.",
        "apihelp-block-example-ip-simple": "Блокувати IP-адресу <kbd>192.0.2.5</kbd> на три дні з причиною <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Блокувати користувача<kbd>Vandal</kbd> на невизначений термін з причиною <kbd>Vandalism</kbd> і заборонити створення нових облікових записів та надсилання електронної пошти.",
        "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.",
        "apihelp-help-example-query": "Довідка для двох підмодулів запитів.",
        "apihelp-imagerotate-description": "Поворот одного або декількох зображень.",
        "apihelp-imagerotate-param-rotation": "Градуси для повороту зображення за годинниковою стрілкою.",
+       "apihelp-imagerotate-param-tags": "Теги для застосування до запису в журналі завантажень.",
        "apihelp-imagerotate-example-simple": "Повернути <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусів.",
        "apihelp-imagerotate-example-generator": "Повернути усі зображення у <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусів.",
        "apihelp-import-description": "Імпортувати сторінку з іншої вікі або з XML-файлу.\n\nЗважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра <var>xml</var>.",
        "apihelp-import-param-templates": "Для інтервікі-імпорту: імпортувати також усі включені шаблони.",
        "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Змінити теги для застосування до запису в журналі імпорту і до нульової версії імпортованих сторінок.",
        "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.",
        "apihelp-linkaccount-description": "Пов'язати обліковий запис третьої сторони з поточним користувачем.",
        "apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з <kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "Мітка для створення, вилучення, активування чи деактивування. Для створення мітки, вона повинна не існувати. Для вилучення мітки, вона повинна існувати. Для активування мітки, вона повинна існувати і не використовуватися жодним розширенням. Для деактивування мітки, вона має бути жива і визначена вручну.",
        "apihelp-managetags-param-reason": "Необов'язкова причина створення, вилучення, активування чи деактивування мітки.",
        "apihelp-managetags-param-ignorewarnings": "Чи ігнорувати усі попередження, що з'являються під час операції.",
+       "apihelp-managetags-param-tags": "Змінити теги для застосування до запису в журналі керування тегами.",
        "apihelp-managetags-example-create": "Створити мітку з назвою <kbd>spam</kbd> з причиною <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Вилучити мітку <kbd>vandlaism</kbd> з причиною <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Активувати мітку з назвою <kbd>spam</kbd> з причиною <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Вилучити сторінку й перенаправлення зі списку спостереження поточного користувача.",
        "apihelp-move-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
        "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження",
+       "apihelp-move-param-tags": "Змінити теги для застосування до запису в журналі перейменувань і до нульової версії цільової сторінки.",
        "apihelp-move-example-move": "Перейменувати <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd> без збереження перенаправлення.",
        "apihelp-opensearch-description": "Шукати у вікі з використанням протоколу OpenSearch.",
        "apihelp-opensearch-param-search": "Рядок пошуку.",
        "apihelp-query+allmessages-param-prop": "Які властивості отримати.",
        "apihelp-query+allmessages-param-enableparser": "Встановити увімкнення парсеру, це попередньо обробить вікітекст повідомлення (підставити магічні слова, розкрити шаблони тощо).",
        "apihelp-query+allmessages-param-nocontent": "Якщо вказано, не включати повідомлення вміст повідомлення у результат.",
-       "apihelp-query+allmessages-param-includelocal": "Також включити локальні повідомлення, тобто повідомлення, що не існують у програмному забезпеченні, але існують як сторінка MediaWiki:.\nЦе видає список усіх сторінок MediaWiki:, так що у ньому будуть сторінки, які насправді не є повідомленнями, як-то [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-includelocal": "Також включити локальні повідомлення, тобто повідомлення, що не існують у програмному забезпеченні, але існують як сторінка в просторі назв {{ns:MediaWiki}}.\nЦе видає список усіх сторінок простору {{ns:MediaWiki}}, так що у ньому також будуть сторінки, які насправді не є повідомленнями, як-то [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Аргументи будуть підставлятися в повідомлення.",
        "apihelp-query+allmessages-param-filter": "Видати лише повідомлення з назвами, що місять цей рядок.",
        "apihelp-query+allmessages-param-customised": "Видати лише повідомлення у цьому стані налаштувань.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Додає назву файлу архівної версії для неостанніх версій.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Додає бітну глибину версії.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Використовується на Special:Upload page для отримання інформації про наявний файл. Не призначено для використання поза ядром MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Додає інформацію про те, чи перебуває файл у \n[[MediaWiki:Bad image list|списку недозволених файлів]]",
        "apihelp-query+imageinfo-param-limit": "Скільки виводити версій кожного файлу.",
        "apihelp-query+imageinfo-param-start": "Часова мітка, з якої почати список.",
        "apihelp-query+imageinfo-param-end": "Часова мітка, на якій закінчити список.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Якщо переклади властивості extmetadata доступні, вибрати їх усі.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Якщо вказано і не порожньо, буде видано лише ці ключі для $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Рядок окремого параметра. Наприклад, PDF-ки можуть використовувати <kbd>page15-100px</kbd>. <var>$1urlwidth</var> повинно використовуватись і бути сумісним з <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Якщо встановлено <kbd>$2prop=badfile</kbd>, це — назва сторінки, що буде використана при аналізі [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Шукати лише файли у локальному репозиторії.",
        "apihelp-query+imageinfo-example-simple": "Вибрати інформацію про поточну версію [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Вибрати інформацію про версії [[:File:Test.jpg]] від 2008 і раніше.",
        "apihelp-query+usercontribs-param-limit": "Максимальна кількість елементів внеску для виведення.",
        "apihelp-query+usercontribs-param-start": "З якої часової мітки виводити.",
        "apihelp-query+usercontribs-param-end": "До якої часової мітки виводити.",
-       "apihelp-query+usercontribs-param-user": "Користувачі, для яких отримати внесок.",
-       "apihelp-query+usercontribs-param-userprefix": "Отримати внесок усіх користувачів, чиї імена починаються цим значенням. Перевизначає $1user.",
+       "apihelp-query+usercontribs-param-user": "Користувачі, для яких отримати внесок. Не можна використовувати з <var>$1userids</var> чи <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Отримати внесок усіх користувачів, чиї імена починаються цим значенням. Не можна використовувати з <var>$1user</var> чи <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Ідентифікатори користувачів, для яких отримати внесок. Не можна використовувати з <var>$1user</var> чи <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Перерахувати записи внеску лише в цих просторах назв.",
        "apihelp-query+usercontribs-param-prop": "Включити додаткові відомомсті:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Додає ID сторінки й ID версії.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Вказує, чи можна створити обліковий запис для допустимих, але незареєстрованих імен користувачів.",
        "apihelp-query+users-param-attachedwiki": "Із <kbd>$1prop=centralids</kbd>, вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.",
        "apihelp-query+users-param-users": "Список користувачів, для яких отримати інформацію.",
+       "apihelp-query+users-param-userids": "Список ідентифікаторів користувачів, щодо яких треба отримати інформацію.",
        "apihelp-query+users-param-token": "Використати натомість <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Вивести інформацію для користувача <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Отримати нещодавні зміни сторінок у списку спостереження поточного користувача.",
        "apihelp-revisiondelete-param-show": "Що показати у кожній з версії.",
        "apihelp-revisiondelete-param-suppress": "Чи приховати дані від адміністраторів так само як від усіх інших.",
        "apihelp-revisiondelete-param-reason": "Причина вилучення або відновлення.",
+       "apihelp-revisiondelete-param-tags": "Теги для застосування до запису в журналі вилучень",
        "apihelp-revisiondelete-example-revision": "Приховати вміст версії <kbd>12345</kbd> сторінки <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Приховати всі дані у записі журналу <kbd>67890</kbd> з причиною <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Скасувати останнє редагування цієї сторінки.\n\nЯкщо користувач, який редагував сторінку, зробив декілька редагувань підряд, їх усі буде відкочено.",
        "apihelp-setnotificationtimestamp-example-page": "Стерти статус сповіщень для <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Встановити часову мітку сповіщень для <kbd>Main page</kbd> так, що всі редагування після 1 січня 2012 будуть виглядати як не переглянуті.",
        "apihelp-setnotificationtimestamp-example-allpages": "Стерти статус сповіщень для сторінок у просторі назв <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-description": "Змінити мову сторінки.",
+       "apihelp-setpagelanguage-description-disabled": "Зміна мови сторінки заборонена в цій вікі. \n\nУвімкніть <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, щоб використовувати цю дію.",
+       "apihelp-setpagelanguage-param-title": "Назва сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "Ідентифікатор сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "Код мови, якою треба замінити поточну мову сторінки. Використовуйте <kbd>default</kbd>, щоб встановити стандартну мову вмісту цієї вікі як мову сторінки.",
+       "apihelp-setpagelanguage-param-reason": "Причина зміни.",
+       "apihelp-setpagelanguage-param-tags": "Змінити теги для застосування до запису в журналі, який буде результатом цієї дії.",
+       "apihelp-setpagelanguage-example-language": "Змінити мову сторінки <kbd>Main Page</kbd> на «баскська».",
+       "apihelp-setpagelanguage-example-default": "Змінити мову сторінки з ідентифікатором 123 на стандартну мову вмісту вікі.",
        "apihelp-stashedit-description": "Підготувати редагування в загальний кеш.\n\nЦе призначено для використання через AJAX з форми редагування, щоб поліпшити продуктивність збереження сторінки.",
        "apihelp-stashedit-param-title": "Назва редагованої сторінки.",
        "apihelp-stashedit-param-section": "Номер розділу. <kbd>0</kbd> для вступного розділу, <kbd>new</kbd> для нового розділу.",
        "apihelp-tag-param-add": "Мітки, які слід додати. Лише визначені вручну мітки може бути додано.",
        "apihelp-tag-param-remove": "Мітки, які слід вилучити. Лише мітки, які було визначено вручну, або взагалі не визначено, можуть бути вилучені.",
        "apihelp-tag-param-reason": "Причина зміни.",
+       "apihelp-tag-param-tags": "Теги для застосування до запису в журналі, що буде створений в результаті цієї дії.",
        "apihelp-tag-example-rev": "Додати мітку <kbd>vandalism</kbd> до версії з ідентифікатором 123 без вказання причини",
        "apihelp-tag-example-log": "Вилучити мітку <kbd>spam</kbd> з запису журналу з ідентифікатором 123 з причиною <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "Отримати жетони для дій пов'язаних зі зміною даних.\n\nЦей модуль застарів на користь [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-example-edit": "Отримати жетон редагування (за замовчуванням).",
        "apihelp-tokens-example-emailmove": "Отримати жетон електронної пошти та жетон перейменування.",
        "apihelp-unblock-description": "Розблокувати користувача.",
-       "apihelp-unblock-param-id": "Ідентифікатор блоку чи розблокування (отриманий через <kbd>list=blocks</kbd>). Не може бути використано разом з <var>$1user</var>.",
-       "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом з <var>$1id</var>.",
+       "apihelp-unblock-param-id": "Ідентифікатор блоку чи розблокування (отриманий через <kbd>list=blocks</kbd>). Не може бути використано разом із <var>$1user</var> або <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом із <var>$1id</var> або <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "Ідентифікатор користувача до розблокування. Не може бути використано разом із <var>$1id</var> або <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Причина розблокування.",
        "apihelp-unblock-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі блокувань.",
        "apihelp-unblock-example-id": "Зняти блокування з ідентифікатором #<kbd>105</kbd>.",
        "apihelp-userrights-param-add": "Додати користувача до цих груп.",
        "apihelp-userrights-param-remove": "Вилучити користувача із цих груп.",
        "apihelp-userrights-param-reason": "Причина зміни.",
+       "apihelp-userrights-param-tags": "Змінити теги для застосування до запису в журналі зміни прав користувача.",
        "apihelp-userrights-example-user": "Додати користувача <kbd>FooBot</kbd> до групи <kbd>bot</kbd> та вилучити із груп <kbd>sysop</kbd> та <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Додати користувача з ідентифікатором <kbd>123</kbd> до групи <kbd>bot</kbd> та вилучити із груп <kbd>sysop</kbd> та <kbd>bureaucrat</kbd>.",
+       "apihelp-validatepassword-description": "Перевірити пароль на предмет відповідності політикам вікі щодо паролів.\n\nРезультати перевірки вказуються як <samp>Good</samp> якщо пароль прийнятний, <samp>Change</samp> якщо пароль може використовуватись для входу, але його треба змінити, і <samp>Invalid</samp> — якщо пароль використовувати не можна.",
+       "apihelp-validatepassword-param-password": "Пароль до перевірки.",
+       "apihelp-validatepassword-param-user": "Ім'я користувача, для використання при тестуванні створення облікового запису. Вказаний користувач не повинен існувати.",
+       "apihelp-validatepassword-param-email": "Адреса електронної пошти, для використання при тестуванні створення облікового запису.",
+       "apihelp-validatepassword-param-realname": "Справжнє ім'я, для використання при тестуванні створення облікового запису.",
+       "apihelp-validatepassword-example-1": "Перевірити пароль <kbd>foobar</kbd> для поточного користувача.",
+       "apihelp-validatepassword-example-2": "Перевірити пароль <kbd>qwerty</kbd> для створення користувача <kbd>Example</kbd>.",
        "apihelp-watch-description": "Додати або вилучити сторінки з списку спостереження поточного користувача.",
        "apihelp-watch-param-title": "Сторінки до додання/вилучення. Використовуйте <var>$1titles</var> натомість.",
        "apihelp-watch-param-unwatch": "Якщо вказано, сторінку буде вилучено зі списку спостереження замість додання до нього.",
        "apihelp-phpfm-description": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).",
        "apihelp-rawfm-description": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).",
        "apihelp-xml-description": "Виводити дані у форматі XML.",
-       "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:mediawiki}}, що закінчується на <code>.xsl</code>.",
+       "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:MediaWiki}}, що закінчується на <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.",
        "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).",
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-help-authmanagerhelper-returnurl": "URL-адреса повернення для сторонніх автентифікаційних потоків повинна бути абсолютною. Обов'язковим є це, або <var>$1continue</var>. \n\nПри отриманні відповіді <samp>REDIRECT</samp>, найбільш звичною Вашою дією буде відкриття браузерного чи іншого веб-перегляду вказаного URL-посилання для стороннього потоку автентифікації. Коли ця операція буде завершена, стороння програма перенаправить веб-переглядач на цю URL-адресу. Ви повинні видобувати будь-які параметри запитів або POST-параметри із цієї URL-адреси, і передавати їх як запит <var>$1continue</var> до цього модуля API.",
        "api-help-authmanagerhelper-continue": "Цей запит є продовженням після попередньої відповіді <samp>UI</samp> або <samp>REDIRECT</samp>. Або це, або <var>$1returnurl</var> є обов'язковим.",
        "api-help-authmanagerhelper-additional-params": "Цей модуль приймає додаткові параметри, залежно від доступних автентифікаційних запитів. Використовуйте <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$1</kbd> (або попередню відповідь від цього модуля, якщо це застосовно), аби визначити доступні запити та поля, які вони використовують.",
+       "apierror-allimages-redirect": "Використовуйте <kbd>gaifilterredir=nonredirects</kbd> замість <var>redirects</var> при використанні <kbd>allimages</kbd> як генератора.",
+       "apierror-allpages-generator-redirects": "Використовуйте <kbd>gapfilterredir=nonredirects</kbd> замість <var>redirects</var> при використанні <kbd>allpages</kbd> як генератора.",
+       "apierror-appendnotsupported": "Не вдається додавати до сторінок, що використовують контентну модель $1.",
+       "apierror-articleexists": "Статтю, яку Ви намагались створити, вже було створено.",
+       "apierror-assertbotfailed": "Твердження, що користувач має право <code>bot</code>, виявилося хибним.",
+       "apierror-assertnameduserfailed": "Твердження, що ім'я користувача — «$1», виявилося хибним.",
+       "apierror-assertuserfailed": "Твердження, що користувач перебуває в системі, виявилося хибним.",
+       "apierror-autoblocked": "Вашу IP-адресу було автоматично заблоковано, оскільки її використовував заблокований користувач.",
+       "apierror-badconfig-resulttoosmall": "Значення <code>$wgAPIMaxResultSize</code> у цій вікі є надто малим, щоб містити базову інформацію щодо результатів.",
+       "apierror-badcontinue": "Параметр продовження недійсний. Вам треба вказати початкове значення, отримане з попереднього запиту.",
+       "apierror-baddiff": "Цю різницю версій неможливо відтворити: одна або й обидві версії не існують, або Ви не маєте прав на їх перегляд.",
+       "apierror-baddiffto": "Для <var>$1diffto</var> треба задати невід'ємне число,<kbd>prev</kbd>, <kbd>next</kbd> або <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "Запитуваний формат $1 не підтримується контентною моделлю$2.",
+       "apierror-badformat": "Запитуваний формат $1 не підтримується контентною моделлю $2, що використовується $3.",
+       "apierror-badgenerator-notgenerator": "Модуль <kbd>$1</kbd> не може бути використаний як генератор.",
+       "apierror-badgenerator-unknown": "Невідомий <kbd>generator=$1</kbd>.",
+       "apierror-badip": "Параметр IP є недійсним.",
+       "apierror-badmd5": "Вказаний хеш MD5 був неправильним.",
+       "apierror-badmodule-badsubmodule": "Модуль <kbd>$1</kbd> не має підмодуля «$2».",
+       "apierror-badmodule-nosubmodules": "Модуль <kbd>$1</kbd> не має підмодулів.",
+       "apierror-badparameter": "Недійсне значення для параметра <var>$1</var>.",
+       "apierror-badquery": "Неприпустимий запит.",
+       "apierror-badtimestamp": "Недійсне значення «$2» для параметра мітки часу <var>$1</var>.",
+       "apierror-badtoken": "Недійсний токен CSRF.",
+       "apierror-badupload": "Параметр завантаження файлу <var>$1</var> не є завантаженням файлу; не забудьте використати <code>multipart/form-data</code> для Вашого POST і додайте назву файлу в шапку <code>Content-Disposition</code>.",
+       "apierror-badurl": "Недійсне значення «$2» для URL-параметра <var>$1</var>.",
+       "apierror-baduser": "Недійсне значення «$2» для параметра користувача <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "Відокремлення значень через U+001F може використовуватись лише в тих параметрах, де використання двох і більше значень є прийнятним.",
+       "apierror-bad-watchlist-token": "Надано некоректний токен списку спостереження. Будь ласка, подайте коректний токен на сторінці [[Special:Preferences|Спеціальна:Налаштування]].",
+       "apierror-blockedfrommail": "Вам заблоковано можливість надсилання електронної пошти.",
+       "apierror-blocked": "Вам заблоковано можливість редагування.",
+       "apierror-botsnotsupported": "Інтерфейс не підтримується для ботів.",
+       "apierror-cannotreauthenticate": "Ця діє недоступна, оскільки Вашу ідентичність неможливо перевірити.",
+       "apierror-cannotviewtitle": "Ви не маєте дозволу на перегляд $1.",
+       "apierror-cantblock-email": "Ви не маєте прав на блокування користувачам можливості надсилання електронної пошти через вікі.",
+       "apierror-cantblock": "Ви не маєте прав на блокування користувачів.",
+       "apierror-cantchangecontentmodel": "Ви не маєте прав на зміну контентної моделі сторінки.",
+       "apierror-canthide": "Ви не маєте прав на приховування імен користувачів у журналі блокувань.",
+       "apierror-cantimport-upload": "Ви не маєте прав на імпорт завантажених сторінок.",
+       "apierror-cantimport": "Ви не маєте прав на імпорт сторінок.",
+       "apierror-cantoverwrite-sharedfile": "Цільовий файл існує в загальному репозиторії, і Ви не маєте прав, щоб проігнорувати це.",
+       "apierror-cantsend": "Ви не увійшли в систему, не маєте підтвердженої електронної адреси, або не маєте дозволу на надсилання електронної пошти іншим користувачам, тож Ви не можете надсилати електронну пошту.",
+       "apierror-cantundelete": "Не вдалося відновити: запитувані версії або не існують, або їх вже було відновлено.",
+       "apierror-changeauth-norequest": "Не вдалося створити запит на зміну.",
+       "apierror-chunk-too-small": "Мінімальний розмір шматка становить $1 {{PLURAL:$1|байт|байти|байтів}} для некінцевих шматків.",
+       "apierror-cidrtoobroad": "$1 CIDR-діапазони, ширші ніж /$2, недозволені.",
+       "apierror-compare-inputneeded": "Назва, ідентифікатор сторінки, або номер версії потрібні як для параметра <var>from</var>, так і для <var>to</var>.",
+       "apierror-contentserializationexception": "Невдача серіалізації вмісту: $1",
+       "apierror-contenttoobig": "Наданий Вами вміст перевищує ліміт у $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}} розміру сторінки.",
+       "apierror-copyuploadbaddomain": "Завантаження за URL-адресою недозволені з цього домену.",
+       "apierror-copyuploadbadurl": "Завантаження з цієї URL-адреси недозволені.",
+       "apierror-create-titleexists": "Наявні назви не можна захистити за допомогою <kbd>create</kbd>.",
+       "apierror-csp-report": "Помилка при опрацюванні CSP-звіту: $1.",
+       "apierror-databaseerror": "[$1] Помилка запиту до бази даних.",
+       "apierror-deletedrevs-param-not-1-2": "Параметр <var>$1</var> не може використовуватись у режимах 1 або 2.",
+       "apierror-deletedrevs-param-not-3": "Параметр <var>$1</var> не може використовуватись у режимі 3.",
+       "apierror-emptynewsection": "Створення нових порожніх розділів неможливе.",
+       "apierror-emptypage": "Створення нових порожніх сторінок недозволене.",
+       "apierror-exceptioncaught": "[$1] Виявлено виняток: $2",
+       "apierror-filedoesnotexist": "Файл не існує.",
+       "apierror-fileexists-sharedrepo-perm": "Цільовий файл існує у загальному репозиторії. Використовуйте параметр <var>ignorewarnings</var>, щоб проігнорувати це.",
+       "apierror-filenopath": "Не вдалося отримати шлях до локального файлу.",
+       "apierror-filetypecannotberotated": "Тип файлу не можна повернути.",
+       "apierror-formatphp": "Цю відповідь не можна представити через <kbd>format=php</kbd>. Див. https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "Назва для <kbd>$1</kbd> має бути файлом.",
+       "apierror-import-unknownerror": "Невідома помилка при імпорті: $1.",
+       "apierror-integeroutofrange-abovebotmax": "<var>$1</var> не може мати значення понад $2 (встановлено як $3) для ботів чи адмінів.",
+       "apierror-integeroutofrange-abovemax": "<var>$1</var> не може мати значення понад $2 (встановлено як $3) для користувачів.",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var> не може мати значення менш як $2 (встановлено як $3).",
+       "apierror-invalidcategory": "Введена Вами назва категорії недійсна.",
+       "apierror-invalid-chunk": "Зміщення плюс поточний шматок мають більший розмір, аніж заявлений розмір файлу.",
+       "apierror-invalidexpiry": "Недійсний час завершення «$1».",
+       "apierror-invalid-file-key": "Недійсний ключ файлу.",
+       "apierror-invalidlang": "Недійсний код мови для параметра <var>$1</var>.",
+       "apierror-invalidoldimage": "Параметр «oldimage» має недійсний формат.",
+       "apierror-invalidparammix-cannotusewith": "Параметр <kbd>$1</kbd> не можна використовувати з <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "Параметр <kbd>$1</kbd> можна використовувати тільки з  <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> не можна поєднувати з параметрами <var>oldid</var>, <var>pageid</var> чи <var>page</var>. Будь ласка, використовуйте <var>title</var> і <var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|Ці параметри}} $1 не можна використовувати водночас.",
+       "apierror-invalidsection": "Параметр «section» має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "Поданий хеш SHA1Base36 недійсний.",
+       "apierror-invalidsha1hash": "Поданий хеш SHA1 недійсний.",
+       "apierror-invalidtitle": "Погана назва «$1».",
+       "apierror-invalidurlparam": "Недійсне значення для <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Недійсне ім'я користувача «$1».",
+       "apierror-invaliduserid": "Ідентифікатор <var>$1</var> недійсний.",
+       "apierror-maxlag-generic": "Очікування на сервер бази даних: затримка $1 {{PLURAL:$1|секунда|секунди|секунд}}.",
+       "apierror-maxlag": "Очікування на $2: затримка $1 {{PLURAL:$1|секунда|секунди|секунд}}.",
+       "apierror-mimesearchdisabled": "MIME-пошук вимкнений у скупому режимі.",
+       "apierror-missingcontent-pageid": "Відсутній вміст для сторінки з ідентифікатором $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Параметр|Щонайменше один параметрів}} $1 є обов'язковим.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|Параметр|Один з параметрів}} $1 є обов'язковим.",
+       "apierror-missingparam": "Параметр <var>$1</var> має бути заповнений.",
+       "apierror-missingrev-pageid": "Немає поточної версії сторінки з ідентифікатором $1.",
+       "apierror-missingtitle-createonly": "Відсутні назви можна захистити тільки через <kbd>create</kbd>.",
+       "apierror-missingtitle": "Вказана Вами сторінка не існує.",
+       "apierror-missingtitle-byname": "Сторінка $1 не існує.",
+       "apierror-moduledisabled": "Модуль <kbd>$1</kbd> було вимкнено.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Лише значення|Лише одне значення з}} $2 дозволене для параметра <var>$1</var>.",
+       "apierror-multival-only-one": "Лише одне значення дозволене для параметра <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> може використовуватись тільки з однією сторінкою.",
+       "apierror-mustbeloggedin-changeauth": "Вам треба увійти в систему, щоб змінити автентифікаційні дані.",
+       "apierror-mustbeloggedin-generic": "Ви повинні перебувати в системі.",
+       "apierror-mustbeloggedin-linkaccounts": "Щоб зв'язувати облікові записи Вам треба увійти в систему.",
+       "apierror-mustbeloggedin-removeauth": "Щоб вилучати автентифікаційні дані Вам треба увійти в систему.",
+       "apierror-mustbeloggedin-uploadstash": "Сховок завантажень доступний тільки для зареєстрованих користувачів.",
+       "apierror-mustbeloggedin": "Для $1 Вам треба увійти в систему.",
+       "apierror-mustbeposted": "Модуль <kbd>$1</kbd> потребує запиту POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Вказаний параметр було знайдено в рядку запиту, але має|Вказані параметри було знайдено в рядку запиту, але мають}} бути у тілі POST: $1.",
+       "apierror-noapiwrite": "Редагування цієї вікі через API вимкнено. Упевніться, що твердження <code>$wgEnableWriteAPI=true;</code> включено у файл <code>LocalSettings.php</code> цієї вікі.",
+       "apierror-nochanges": "На жодні зміни запиту не було.",
+       "apierror-nodeleteablefile": "Немає такої старої версії файлу.",
+       "apierror-no-direct-editing": "Пряме редагування через API не підтримується контентною моделлю $1, що використовується $2.",
+       "apierror-noedit-anon": "Анонімні користувачі не можуть редагувати сторінки.",
+       "apierror-noedit": "У Вас немає прав на редагування сторінок.",
+       "apierror-noimageredirect-anon": "Анонімні користувачі не можуть створювати перенаправлення на файли.",
+       "apierror-noimageredirect": "Ви не маєте прав на створення перенаправлень на файли.",
+       "apierror-nosuchlogid": "Немає журнального запису з ідентифікатором $1.",
+       "apierror-nosuchpageid": "Немає сторінки з ідентифікатором $1.",
+       "apierror-nosuchrcid": "Немає недавньої зміни з ідентифікатором $1.",
+       "apierror-nosuchrevid": "Немає версії з ідентифікатором $1.",
+       "apierror-nosuchsection": "Немає розділу $1.",
+       "apierror-nosuchsection-what": "Немає розділу $1 на сторінці $2.",
+       "apierror-nosuchuserid": "Немає користувача з ідентифікатором $1.",
+       "apierror-notarget": "Ви не вказали дійсної цілі для цієї дії.",
+       "apierror-notpatrollable": "Версія r$1 не може бути відпатрульована, оскільки вона надто стара.",
+       "apierror-nouploadmodule": "Не встановлено модуля завантаження.",
+       "apierror-opensearch-json-warnings": "Попередження не можуть бути представлені у форматі OpenSearch JSON.",
+       "apierror-pagecannotexist": "Простір назв не дозволяє фактичних сторінок.",
+       "apierror-pagedeleted": "Цю сторінку було вилучено після того, як Ви отримали її мітку часу.",
+       "apierror-pagelang-disabled": "Зміна мови сторінки заборонена в цій вікі.",
+       "apierror-paramempty": "Параметр <var>$1</var> не може бути порожнім.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> підтримується лише для вмісту у форматі вікірозмітки.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> підтримується лише для вмісту у форматі вікірозмітки. $1 використовує контентну модель $2.",
+       "apierror-pastexpiry": "Час закінчення «$1» — в минулому.",
+       "apierror-permissiondenied": "Ви не маєте прав на $1.",
+       "apierror-permissiondenied-generic": "Доступ заборонено.",
+       "apierror-permissiondenied-patrolflag": "Вам потрібне право <code>patrol</code> або <code>patrolmarks</code>, щоб подати запит на прапорець «відпатрульовано».",
+       "apierror-permissiondenied-unblock": "Ви не маєте прав на розблокування користувачів.",
+       "apierror-prefixsearchdisabled": "Пошук за префіксом вимкнено у скупому режимі.",
+       "apierror-promised-nonwrite-api": "HTTP-заголовок <code>Promise-Non-Write-API-Action</code> не можна надсилати до модулів API із режимом запису.",
+       "apierror-protect-invalidaction": "Недійсний тип захисту «$1».",
+       "apierror-protect-invalidlevel": "Недійсний рівень захисту «$1».",
+       "apierror-ratelimited": "Ви перевищили свій ліміт частоти. Будь ласка, почекайте деякий час і спробуйте знову.",
+       "apierror-readapidenied": "Вам потрібне право на читання, щоб використовувати цей модуль.",
+       "apierror-readonly": "Ця вікі наразі перебуває в режимі тільки для читання.",
+       "apierror-reauthenticate": "Ви останнім часом не проходили автентифікацію в цій сесії. Будь ласка, пройдіть автентифікацію ще раз.",
+       "apierror-redirect-appendonly": "Ви зробили спробу редагування з використанням режиму переходу за перенаправленням, який має використовуватись разом із <kbd>section=new</kbd>, <var>prependtext</var>, або <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "Одне й те ж поле не може використовуватись у <var>hide</var> і <var>show</var> водночас.",
+       "apierror-revdel-needtarget": "Для цього типу RevDel необхідна цільова назва.",
+       "apierror-revdel-paramneeded": "Щонайменше одне значення необхідне для <var>hide</var> та/або <var>show</var>.",
+       "apierror-revisions-norevids": "Параметр <var>revids</var> не можна використовувати з опціями списку (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, і <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Було використано <var>titles</var>, <var>pageids</var> або генератор для постачання декількох сторінок, але параметри <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, і <var>$1end</var> можуть використовуватися тільки на одній сторінці.",
+       "apierror-revwrongpage": "r$1 не є версією сторінки $2.",
+       "apierror-searchdisabled": "<var>$1</var> пошук вимкнено.",
+       "apierror-sectionreplacefailed": "Не вдалося об'єднати оновлений розділ.",
+       "apierror-sectionsnotsupported": "Розділи не підтримуються для контентної моделі $1.",
+       "apierror-sectionsnotsupported-what": "Розділи не підтримуються $1.",
+       "apierror-show": "Неправильний параметр — не можна надавати взаємовиключні значення.",
+       "apierror-siteinfo-includealldenied": "Не можна переглядати інформацію щодо всіх серверів, якщо тільки <var>$wgShowHostNames</var> не вказано як «true».",
+       "apierror-sizediffdisabled": "Різниця у розмірах вимкнена в скупому режимі.",
+       "apierror-spamdetected": "Ваше редагування було відхилено, оскільки воно містило фрагмент спаму: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "Ви не маєте прав на перегляд результатів цієї спеціальної сторінки.",
+       "apierror-stashedfilenotfound": "Не вдалося знайти файл у сховку: $1.",
+       "apierror-stashedit-missingtext": "У сховку не знайдено збереженого тексту із заданим хешем.",
+       "apierror-stashfailed-complete": "Завантаження по шматках вже завершилося, перегляньте статус, щоб дізнатися подробиці.",
+       "apierror-stashfailed-nosession": "Немає сесії завантажень по шматках із цим ключем.",
+       "apierror-stashfilestorage": "Не вдалося зберегти завантаження у сховку: $1",
+       "apierror-stashinvalidfile": "Недійсний файл у сховку.",
+       "apierror-stashnosuchfilekey": "Немає такого filekey: $1.",
+       "apierror-stashpathinvalid": "Ключ файлу має неправильний формат або є недійсним з іншої причини: $1.",
+       "apierror-stashwrongowner": "Неправильний власник: $1",
+       "apierror-stashzerolength": "Довжина файлу дорівнює нулю, і його не можна зберегти у сховку: $1.",
+       "apierror-systemblocked": "Вас автоматично заблоковано MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Розширення шаблонів підтримується лише для вмісту у форматі вікірозмітки. $1 використовує контентну модель $2.",
+       "apierror-toofewexpiries": "$1 {{PLURAL:$1|мітка часу завершення була надана|мітки часу завершення були надані|міток часу завершення було надано}}, тоді як {{PLURAL:$2|потрібна була $2 така мітка|потрібні були $2 таких мітки|потрібно було $2 таких міток}}.",
+       "apierror-unknownaction": "Вказана дія, <kbd>$1</kbd>, нерозпізнана.",
+       "apierror-unknownerror-editpage": "Невідома помилка EditPage: $1.",
+       "apierror-unknownerror-nocode": "Невідома помилка.",
+       "apierror-unknownerror": "Невідома помилка: «$1».",
+       "apierror-unknownformat": "Невідомий формат «$1».",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|Нерозпізнаний параметр|Нерозпізнані параметри}}: $1.",
+       "apierror-unrecognizedvalue": "Нерозпізнане значення для параметра <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "Місцевий репозиторій файлів не підтримує запитів щодо всіх зображень.",
+       "apierror-upload-filekeyneeded": "Треба вказати <var>filekey</var>, коли <var>offset</var> є ненульовим.",
+       "apierror-upload-filekeynotallowed": "Не можна вказувати <var>filekey</var>, коли <var>offset</var> дорівнює 0.",
+       "apierror-upload-inprogress": "Завантаження зі сховку вже в процесі.",
+       "apierror-upload-missingresult": "Немає результатів у даних статусу.",
+       "apierror-urlparamnormal": "Не вдалося нормалізувати параметри зображення для $1.",
+       "apierror-writeapidenied": "Ви не маєте дозволу на редагування цієї вікі через API.",
+       "apiwarn-alldeletedrevisions-performance": "Для підвищення продуктивності при генеруванні назв, встановіть <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "Не вдалося парсити <var>$1urlparam</var> для $2. Використовується лише ширина і висота.",
+       "apiwarn-badutf8": "Значення, вказане для <var>$1</var>, містить недійсні або ненормалізовані дані. Текстові дані мають бути дійсними, NFC-нормалізований Unicode без контрольних символів C0, окрім HT (\\t), LF (\\n), і CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Перевірте, чи символи, такі як «+» у токені, пройшли правильне процентне кодування в URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> є застарілим. Будь ласка, використовуйте замість нього <kbd>prop=deletedrevisions</kbd> або <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-expandtemplates-prop": "Оскільки не задано жодних значень для параметра <var>prop</var>, як вихідні дані було використано старий формат. Цей формат є застарілим, і в майбутньому параметру <var>prop</var> буде задано стандартне значення, наслідком чого стане те, що завжди використовуватиметься новий формат.",
+       "apiwarn-deprecation-httpsexpected": "Використано HTTP, тоді як очікувалося використання HTTPS.",
+       "apiwarn-deprecation-login-botpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб продовжити вхід у систему через <kbd>action=login</kbd>, див. [[Special:BotPasswords]]. Щоб безпечно продовжити, використовуючи вхід в основний обліковий запис, див. <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "Вхід в основний обліковий запис через <kbd>action=login</kbd> є застарілим, і може припинити працювати, без попередження. Щоб безпечно увійти в систему, див. <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "Отримання токена через <kbd>action=login</kbd> є застарілим. Використовуйте натомість <kbd>action=query&meta=tokens&type=login</kbd>.",
+       "apiwarn-deprecation-parameter": "Параметр <var>$1</var> — застарілий.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> є застарілим, починаючи з MediaWiki 1.28. Використовуйте <kbd>prop=headhtml</kbd> при створенні нових документів HTML, або <kbd>prop=modules|jsconfigvars</kbd> при оновленні документа з боку клієнта.",
+       "apiwarn-deprecation-purge-get": "Використання <kbd>action=purge</kbd> через GET є застарілим. Використовуйте POST замість цього.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> є застарілим. Будь ласка, використовуйте натомість <kbd>$2</kbd>.",
+       "apiwarn-difftohidden": "Не вдалося відкрити версію r$1: вміст приховано.",
+       "apiwarn-errorprinterfailed": "Невдача через помилку принтера. Буде здійснено повторну спробу без параметрів.",
+       "apiwarn-errorprinterfailed-ex": "Невдача через помилку принтера (буде здійснено повторну спробу без параметрів): $1",
+       "apiwarn-invalidcategory": "«$1» не є категорією.",
+       "apiwarn-invalidtitle": "«$1» не є коректною назвою.",
+       "apiwarn-invalidxmlstylesheetext": "Таблиця стилів повинна мати розширення <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "Вказана таблиця стилів є недійсною або не існує.",
+       "apiwarn-invalidxmlstylesheetns": "Таблиця стилів має перебувати в просторі назв {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "Задано властивість <kbd>modules</kbd>, але не задано <kbd>jsconfigvars</kbd> або <kbd>encodedjsconfigvars</kbd>. Змінні конфігурації необхідні для коректного використання модуля.",
+       "apiwarn-notfile": "«$1» не є файлом.",
+       "apiwarn-nothumb-noimagehandler": "Не вдалося створити мініатюру, оскільки $1 не має пов'язаного обробника зображень.",
+       "apiwarn-parse-nocontentmodel": "Не задано <var>title</var> або <var>contentmodel</var>, буде використано $1.",
+       "apiwarn-parse-titlewithouttext": "<var>title</var> використано без <var>text</var>, і надіслано запит на оброблені властивості сторінки. Може \nВи хотіли використати <var>page</var> замість <var>title</var>?",
+       "apiwarn-redirectsandrevids": "Вирішення перенаправлень не може використовуватись разом з параметром <var>revids</var>. Усі перенаправлення, на які вказує <var>revids</var>, не було вирішено.",
+       "apiwarn-tokennotallowed": "Дія «$1» недозволена для поточного користувача.",
+       "apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
+       "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
+       "apiwarn-truncatedresult": "Цей результат було скорочено, оскільки інакше він перевищив би ліміт у $1 байтів.",
+       "apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now<kbd>.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нерозпізнане|Нерозпізнані}} значення для параметра <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "Параметр <var>$1</var> використовує непідтримуваний синтаксис PHP-масиву.",
+       "apiwarn-urlparamwidth": "Ігнорування значення ширини, встановленого в <var>$1urlparam</var> ($2) на користь значення ширини, запозиченого із <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "недійсні символи у ключі (лише <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code>, і <code>-</code> дозволені).",
+       "apiwarn-validationfailed-badpref": "недійсне налаштування.",
+       "apiwarn-validationfailed-cannotset": "не може бути встановлено цим модулем.",
+       "apiwarn-validationfailed-keytoolong": "ключ надто довгий (дозволено не більш як $1 байтів).",
+       "apiwarn-validationfailed": "Помилка перевірки для <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>Попередження щодо безпеки</strong>: увімкнено <var>$wgDebugAPI</var>.",
+       "api-feed-error-title": "Помилка ($1)",
+       "api-usage-docref": "Див. $1 щодо використання API.",
+       "api-exception-trace": "$1 у $2($3)\n$4",
        "api-credits-header": "Автор(и)",
        "api-credits": "Розробники API:\n* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/."
 }
index 60295aa..b88e72f 100644 (file)
        "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
+       "apihelp-main-param-responselanginfo": "包含在结果中用于<var>uselang</var>和<var>errorlang</var>的语言。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配<code>Origin</code>标头中的原点之一,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置<code>Access-Control-Allow-Origin</code>和<code>Access-Control-Allow-Credentials</code>开头。\n\n对于未验证的请求,会指定值<kbd>*</kbd>。这将导致<code>Access-Control-Allow-Origin</code>标头被设置,但<code>Access-Control-Allow-Credentials</code>将为<code>false</code>,且所有用户特定数据将受限制。",
        "apihelp-main-param-uselang": "用于消息翻译的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>与<kbd>siprop=languages</kbd>可返回语言代码列表,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
+       "apihelp-main-param-errorformat": "用于警告和错误文本输出的格式。\n; plaintext:已移除HTML标签,并被替换实体的Wiki文本。\n; wikitext:未解析的wiki文本。\n; html:HTML。\n; raw:消息关键词和参数。\n; none:无文本输出,仅包含错误代码。\n; bc:在MediaWiki 1.29以前版本使用的格式。<var>errorlang</var>和<var>errorsuselocal</var>会被忽略。",
+       "apihelp-main-param-errorlang": "用于警告和错误的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>带<kbd>siprop=languages</kbd>返回语言代码的列表,或指定<kbd>content</kbd>以使用此wiki的内容语言,或指定<kbd>uselang</kbd>以使用与<var>uselang</var>参数相同的值。",
+       "apihelp-main-param-errorsuselocal": "如果指定,错误文本将使用来自{{ns:MediaWiki}}名字空间的本地自定义消息。",
        "apihelp-block-description": "封禁一位用户。",
-       "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
+       "apihelp-block-param-user": "要封禁的用户、IP地址或IP地址段。不能与<var>$1userid</var>一起使用",
+       "apihelp-block-param-userid": "要封禁的用户ID。不能与<var>$1user</var>一起使用。",
        "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对时间(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果设置为<kbd>infinite</kbd>、<kbd>indefinite</kbd>或<kbd>never</kbd>,封禁将无限期。",
        "apihelp-block-param-reason": "封禁的原因。",
        "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此 IP 地址的匿名编辑)。",
@@ -50,6 +55,7 @@
        "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
+       "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-block-example-ip-simple": "封禁IP地址<kbd>192.0.2.5</kbd>三天,原因<kbd>First strike</kbd>。",
        "apihelp-block-example-user-complex": "无限期封禁用户<kbd>Vandal</kbd>,原因<kbd>Vandalism</kbd>,并阻止新账户创建和电子邮件发送。",
        "apihelp-changeauthenticationdata-description": "更改当前用户的身份验证数据。",
        "apihelp-help-example-query": "两个查询子模块的帮助。",
        "apihelp-imagerotate-description": "旋转一幅或多幅图像。",
        "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。",
+       "apihelp-imagerotate-param-tags": "要在上传日志中应用到实体的标签。",
        "apihelp-imagerotate-example-simple": "<kbd>90</kbd>度旋转<kbd>File:Example.png</kbd>。",
        "apihelp-imagerotate-example-generator": "将<kbd>Category:Flip</kbd>之中的所有图像旋转<kbd>180</kbd>度。",
        "apihelp-import-description": "从另一个wiki或从一个XML文件导入页面。\n\n注意当发送一个用于<var>xml</var>参数的文件时,HTTP POST必须作为一次文件上传完成(也就是使用multipart/form-data)。",
        "apihelp-import-param-templates": "用于跨wiki导入:连带导入所有包含的模板。",
        "apihelp-import-param-namespace": "导入至此名字空间。不能与<var>$1rootpage</var>一起使用。",
        "apihelp-import-param-rootpage": "作为此页面的子页面导入。不能与<var>$1namespace</var>一起使用。",
+       "apihelp-import-param-tags": "要在导入日志,以及在导入页面的空修订版本中应用到实体的更改标签。",
        "apihelp-import-example-import": "将页面[[meta:Help:ParserFunctions]]连带完整历史导入至100名字空间。",
        "apihelp-linkaccount-description": "将来自第三方提供商的账户链接至当前用户。",
        "apihelp-linkaccount-example-link": "开始从<kbd>Example</kbd>链接至账户的过程。",
        "apihelp-managetags-param-tag": "要创建、删除、激活或取消激活的标签。要创建标签,标签必须不存在。要删除标签,标签必须存在。要激活标签,标签必须存在,且不被任何扩展使用。要取消激活标签,标签必须当前处于激活状态,且被手动定义。",
        "apihelp-managetags-param-reason": "一个创建、删除、激活或停用标签时的原因,可选。",
        "apihelp-managetags-param-ignorewarnings": "是否忽略操作期间发生的任何警告。",
+       "apihelp-managetags-param-tags": "要在标签管理日志中应用到实体的更改标签。",
        "apihelp-managetags-example-create": "创建一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "删除<kbd>vandlaism</kbd>标签,原因<kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "激活一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "从当前用户的监视列表中移除页面及重定向。",
        "apihelp-move-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
+       "apihelp-move-param-tags": "要在移动日志,以及在目标页面的空修订版本中应用到实体的更改标签。",
        "apihelp-move-example-move": "移动<kbd>Badtitle</kbd>到<kbd>Goodtitle</kbd>,不保留重定向。",
        "apihelp-opensearch-description": "使用OpenSearch协议搜索wiki。",
        "apihelp-opensearch-param-search": "搜索字符串。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
        "apihelp-query+allmessages-param-enableparser": "设置以启用解析器,将处理消息的wiki文本(替代魔术字、处理模板等)。",
        "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
-       "apihelp-query+allmessages-param-includelocal": "也包括本地消息,也就是不存在于软件但作为MediaWiki:页面存在的消息。\n这会列举所有MediaWiki:页面,因此它也将列举那些不是真消息的消息,例如[[MediaWiki:Common.js|Common.js]]。",
+       "apihelp-query+allmessages-param-includelocal": "也包括本地消息,也就是不存在于软件但存在于{{ns:MediaWiki}}名字空间的消息。\n这会列举所有{{ns:MediaWiki}}名字空间页面,因此它也将列举那些不是真消息的消息,例如[[MediaWiki:Common.js|Common.js]]。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allmessages-param-customised": "只返回在此定制情形下的消息。",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "添加用于非最新修订的存档修订的文件名。",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "添加修订的字节深度。",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "由Special:Upload所使用,以获取关于现有文件的信息。不适用于MediaWiki核心以外代码。",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "无论文件是否在[[MediaWiki:Bad image list]]都添加",
        "apihelp-query+imageinfo-param-limit": "每个文件返回多少文件修订。",
        "apihelp-query+imageinfo-param-start": "开始列举的时间戳。",
        "apihelp-query+imageinfo-param-end": "列举的结束时间戳。",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "如果用于extmetadata属性的翻译可用,则全部取得。",
        "apihelp-query+imageinfo-param-extmetadatafilter": "如果指定且非空,则只为$1prop=extmetadata返回这些键。",
        "apihelp-query+imageinfo-param-urlparam": "处理器特定的参数字符串。例如PDF可能使用<kbd>page15-100px</kbd>。<var>$1urlwidth</var>必须被使用,并与<var>$1urlparam</var>一致。",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "如果<kbd>$2prop=badfile</kbd>被设置,这会是在评估[[MediaWiki:Bad image list]]时使用的页面标题",
        "apihelp-query+imageinfo-param-localonly": "只看本地存储库的文件。",
        "apihelp-query+imageinfo-example-simple": "取得有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息。",
        "apihelp-query+imageinfo-example-dated": "取得有关[[:File:Test.jpg]]自2008年以来版本的信息。",
        "apihelp-query+usercontribs-param-limit": "返回贡献的最大数量。",
        "apihelp-query+usercontribs-param-start": "返回的起始时间戳。",
        "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
-       "apihelp-query+usercontribs-param-user": "要检索贡献的用户。",
-       "apihelp-query+usercontribs-param-userprefix": "取得所有用户名以这个值开头的用户的贡献。覆盖$1user。",
+       "apihelp-query+usercontribs-param-user": "要检索贡献的用户。不能与<var>$1userids</var>或<var>$1userprefix</var>一起使用。",
+       "apihelp-query+usercontribs-param-userprefix": "取得所有用户名以这个值开头的用户的贡献。不能与<var>$1user</var>或<var>$1userids</var>一起使用。",
+       "apihelp-query+usercontribs-param-userids": "要检索贡献的用户ID。不能与<var>$1user</var>或<var>$1userprefix</var>一起使用。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
        "apihelp-query+usercontribs-param-prop": "包含额外的信息束:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "添加页面ID和修订ID。",
        "apihelp-query+users-paramvalue-prop-cancreate": "表明是否可以为有效但尚未注册的用户名创建一个账户。",
        "apihelp-query+users-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+users-param-users": "要获取信息的用户列表。",
+       "apihelp-query+users-param-userids": "要获得信息的用户ID列表。",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。",
        "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
        "apihelp-revisiondelete-param-suppress": "是否对管理员及其他人禁止数据。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
+       "apihelp-revisiondelete-param-tags": "要在删除日志中应用到实体的标签。",
        "apihelp-revisiondelete-example-revision": "隐藏<kbd>首页</kbd>的修订版本<kbd>12345</kbd>的内容。",
        "apihelp-revisiondelete-example-log": "隐藏日志记录<kbd>67890</kbd>上的所有数据,原因<kbd>BLP violation</kbd>。",
        "apihelp-rollback-description": "撤销对页面的最近编辑。\n\n如果最近编辑页面的用户在一行中进行多次编辑,所有编辑将被回退。",
        "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
+       "apihelp-setpagelanguage-description": "更改页面的语言。",
+       "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用<var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>以使用此操作。",
+       "apihelp-setpagelanguage-param-title": "您希望更改语言的页面标题。不能与<var>$1pageid</var>一起使用。",
+       "apihelp-setpagelanguage-param-pageid": "您希望更改语言的页面ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-setpagelanguage-param-lang": "更改页面的目标语言的语言代码。使用<kbd>default</kbd>以重置页面为wiki的默认内容语言。",
+       "apihelp-setpagelanguage-param-reason": "更改原因。",
+       "apihelp-setpagelanguage-param-tags": "要应用到此操作导致的日志记录的更改标签。",
+       "apihelp-setpagelanguage-example-language": "更改<kbd>Main Page</kbd>的语言为巴斯克语。",
+       "apihelp-setpagelanguage-example-default": "更改ID为123的页面的语言为wiki的默认内容语言。",
        "apihelp-stashedit-description": "在分享的缓存中准备一次编辑。\n\n这是为了从编辑表单中通过AJAX使用,以改进页面保存的性能。",
        "apihelp-stashedit-param-title": "已开始编辑的页面标题。",
        "apihelp-stashedit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
        "apihelp-tag-param-add": "要添加的标签。只有手动定义的标签可以添加。",
        "apihelp-tag-param-remove": "要移除的标签。只有手动定义或完全不明确的标签可以被移除。",
        "apihelp-tag-param-reason": "更改原因。",
+       "apihelp-tag-param-tags": "要应用到将被创建为此操作结果的日志实体的标签。",
        "apihelp-tag-example-rev": "将<kbd>vandalism</kbd>标签添加至修订ID 123,而不指定原因",
        "apihelp-tag-example-log": "从日志记录ID 123移除<kbd>spam</kbd>标签,原因为<kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "获取可修改数据的操作的令牌。\n\n此模块被弃用以有利于[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-tokens-example-edit": "检索一个编辑令牌(默认)。",
        "apihelp-tokens-example-emailmove": "检索一个电子邮件令牌和一个移动令牌。",
        "apihelp-unblock-description": "解封一位用户。",
-       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>一起使用。",
-       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与<var>$1id</var>一起使用。",
+       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>或<var>$1userid</var>一起使用。",
+       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP地址段。不能与<var>$1id</var>或<var>$1userid</var>一起使用。",
+       "apihelp-unblock-param-userid": "要封禁的用户ID。不能与<var>$1id</var>或<var>$1user</var>一起使用。",
        "apihelp-unblock-param-reason": "解封的原因。",
        "apihelp-unblock-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-unblock-example-id": "解封封禁ID #<kbd>105</kbd>。",
        "apihelp-userrights-param-add": "将用户加入至这些组中。",
        "apihelp-userrights-param-remove": "将用户从这些组中移除。",
        "apihelp-userrights-param-reason": "更改原因。",
+       "apihelp-userrights-param-tags": "要在用户权限日志中应用到实体的更改标签。",
        "apihelp-userrights-example-user": "将用户<kbd>FooBot</kbd>添加至<kbd>bot</kbd>用户组,并从<kbd>sysop</kbd>和<kbd>bureaucrat</kbd>组移除。",
        "apihelp-userrights-example-userid": "将ID为<kbd>123</kbd>的用户加入至<kbd>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
+       "apihelp-validatepassword-description": "验证密码是否符合wiki的密码方针。\n\n如果密码可以接受,就报告有效性为<samp>Good</samp>,如果密码可用于登录但必须更改,则报告为<samp>Change</samp>,或如果密码不可使用,则报告为<samp>Invalid</samp>。",
+       "apihelp-validatepassword-param-password": "要验证的密码。",
+       "apihelp-validatepassword-param-user": "用户名,供测试账户创建时使用。命名的用户必须不存在。",
+       "apihelp-validatepassword-param-email": "电子邮件,供测试账户创建时使用。",
+       "apihelp-validatepassword-param-realname": "真实姓名,供测试账户创建时使用。",
+       "apihelp-validatepassword-example-1": "验证当前用户的密码<kbd>foobar</kbd>。",
+       "apihelp-validatepassword-example-2": "为创建用户<kbd>Example</kbd>验证密码<kbd>qwerty</kbd>。",
        "apihelp-watch-description": "从当前用户的监视列表中添加或移除页面。",
        "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
        "apihelp-watch-param-unwatch": "如果设置页面将被取消监视而不是被监视。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
        "apihelp-format-example-generic": "返回查询结果为$1格式。",
-       "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回渲染好的HTML和关联的ResouceLoader模块。",
+       "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回优质打印的HTML和关联的ResouceLoader模块。",
        "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
-       "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
+       "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:MediaWiki}}名字空间以<code>.xsl</code>为结尾的标题。",
        "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
-       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "api-help-authmanagerhelper-returnurl": "为第三方身份验证流返回URL,必须为绝对值。需要此值或<var>$1continue</var>两者之一。\n\nUpon receiving a <samp>REDIRECT</samp> response, you will typically open a browser or web view to the specified <samp>redirecttarget</samp> URL for a third-party authentication flow. When that completes, the third party will send the browser or web view to this URL. You should extract any query or POST parameters from the URL and pass them as a <var>$1continue</var> request to this API module.",
        "api-help-authmanagerhelper-continue": "此请求是在早先的<samp>UI</samp>或<samp>REDIRECT</samp>响应之后的附加请求。必需此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。",
+       "apierror-allimages-redirect": "当使用<kbd>allimages</kbd>作为发生器时,请使用<kbd>gaifilterredir=nonredirects</kbd>而不是<var>redirects</var>。",
+       "apierror-allpages-generator-redirects": "当使用<kbd>allpages</kbd>作为发生器时,请使用<kbd>gapfilterredir=nonredirects</kbd>而不是<var>redirects</var>。",
+       "apierror-appendnotsupported": "不能使用内容模型$1附加在页面上。",
+       "apierror-articleexists": "您尝试创建的条目已刚刚被创建。",
+       "apierror-assertbotfailed": "主张用户有<code>bot</code>权限失败。",
+       "apierror-assertnameduserfailed": "主张用户为“$1”失败。",
+       "apierror-assertuserfailed": "主张用户已登录失败。",
+       "apierror-autoblocked": "您的IP地址已被自动封禁,因为它曾被一位已封禁用户使用。",
+       "apierror-badconfig-resulttoosmall": "此wiki上<code>$wgAPIMaxResultSize</code>的值太小,不能获得基础结果信息。",
+       "apierror-badcontinue": "无效继续参数。您应该传递由之前查询返回的原始值。",
+       "apierror-baddiff": "不能取得差异。一个或多个修订版本不存在,或您没有权限查看它们。",
+       "apierror-baddiffto": "<var>$1diffto</var>必须设置为非负数、<kbd>prev</kbd>、<kbd>next</kbd>或<kbd>cur</kbd>。",
+       "apierror-badformat-generic": "内容模型$2尚不支持请求的内容格式$1。",
+       "apierror-badformat": "由$3使用的内容模型$2尚不支持请求的内容格式$1。",
+       "apierror-badgenerator-notgenerator": "模块<kbd>$1</kbd>不能用作发生器。",
+       "apierror-badgenerator-unknown": "未知<kbd>generator=$1</kbd>。",
+       "apierror-badip": "IP参数无效。",
+       "apierror-badmd5": "提供的MD5哈希不正确。",
+       "apierror-badmodule-badsubmodule": "模块<kbd>$1</kbd>不包含子模块“$2”。",
+       "apierror-badmodule-nosubmodules": "模块<kbd>$1</kbd>没有子模块。",
+       "apierror-badparameter": "用于参数<var>$1</var>的值无效。",
+       "apierror-badquery": "无效的查询。",
+       "apierror-badtimestamp": "用于时间戳参数<var>$1</var>的值“$2”无效。",
+       "apierror-badtoken": "无效的CSRF令牌。",
+       "apierror-badupload": "文件上传参数<var>$1</var>不是文件上传;确保为您的POST使用<code>multipart/form-data</code>,并在<code>Content-Disposition</code>标头中包含文件名。",
+       "apierror-badurl": "用于URL参数<var>$1</var>的值“$2”无效。",
+       "apierror-baduser": "用于用户参数<var>$1</var>的值“$2”无效。",
+       "apierror-badvalue-notmultivalue": "U+001F多值分隔符只可以用于多值参数。",
+       "apierror-bad-watchlist-token": "提供了不正确的监视列表令牌。请在[[Special:Preferences]]设置正确的令牌。",
+       "apierror-blockedfrommail": "您已被封禁,不能发送电子邮件。",
+       "apierror-blocked": "您已被封禁,不能编辑。",
+       "apierror-botsnotsupported": "此界面不支持机器人。",
+       "apierror-cannotreauthenticate": "由于您的身份不能被验证,此操作不可用。",
+       "apierror-cannotviewtitle": "您不被允许查看$1。",
+       "apierror-cantblock-email": "您没有权限封禁用户通过wiki发送电子邮件。",
+       "apierror-cantblock": "您没有权限封禁用户。",
+       "apierror-cantchangecontentmodel": "您没有权限更改页面的内容模型。",
+       "apierror-canthide": "您没有权限从封禁日志中隐藏用户名。",
+       "apierror-cantimport-upload": "您没有权限导入上传的页面。",
+       "apierror-cantimport": "您没有权限导入页面。",
+       "apierror-cantoverwrite-sharedfile": "目标文件存在于分享存储库,并且您没有权限覆盖它。",
+       "apierror-cantsend": "您没有登录,您没有已确认的电子邮件地址,或者您未被允许向其他用户发送电子邮件,所以您不能发送电子邮件。",
+       "apierror-cantundelete": "不能还原:请求的修订版本可能不存在,或可能已被还原。",
+       "apierror-changeauth-norequest": "创建更改请求失败。",
+       "apierror-chunk-too-small": "对于非最终块,最小块大小为$1{{PLURAL:$1|字节}}。",
+       "apierror-cidrtoobroad": "比/$2更宽的$1 CIDR地址段不被接受。",
+       "apierror-compare-inputneeded": "需要标题、页面ID或修订版本号以用于<var>from</var>和<var>to</var>参数。",
+       "apierror-contentserializationexception": "内容序列化失败:$1",
+       "apierror-contenttoobig": "您提供的内容超过了$1{{PLURAL:$1|千字节}}的条目大小限制。",
+       "apierror-copyuploadbaddomain": "不允许从此域名通过URL上传。",
+       "apierror-copyuploadbadurl": "不允许从此URL上传。",
+       "apierror-create-titleexists": "现有标题不能通过<kbd>create</kbd>保护。",
+       "apierror-csp-report": "处理CSP报告时出错:$1。",
+       "apierror-databaseerror": "[$1]数据库查询错误。",
+       "apierror-deletedrevs-param-not-1-2": "<var>$1</var>参数不能用于模式1或2。",
+       "apierror-deletedrevs-param-not-3": "<var>$1</var>参数不能用于模式3。",
+       "apierror-emptynewsection": "无法创建空白新章节。",
+       "apierror-emptypage": "不允许创建新的,空白的页面。",
+       "apierror-exceptioncaught": "[$1]捕获异常:$2",
+       "apierror-filedoesnotexist": "文件不存在。",
+       "apierror-fileexists-sharedrepo-perm": "目标文件存在于共享存储库。使用<var>ignorewarnings</var>参数覆盖它。",
+       "apierror-filenopath": "不能获取本地文件路径。",
+       "apierror-filetypecannotberotated": "文件类型不能旋转。",
+       "apierror-formatphp": "此响应不能使用<kbd>format=php</kbd>代表。请参见https://phabricator.wikimedia.org/T68776。",
+       "apierror-imageusage-badtitle": "<kbd>$1</kbd>的标题必须是文件。",
+       "apierror-import-unknownerror": "导入时的未知错误:$1。",
+       "apierror-integeroutofrange-abovebotmax": "对于机器人和管理员,<var>$1</var>不能超过$2(设置为$3)。",
+       "apierror-integeroutofrange-abovemax": "对于用户,<var>$1</var>不能超过$2(设置为$3)。",
+       "apierror-integeroutofrange-belowminimum": "<var>$1</var>不能小于$2(设置为$3)。",
+       "apierror-invalidcategory": "您输入的分类名称无效。",
+       "apierror-invalid-chunk": "偏移值与当前数据块之和大于声称的文件大小。",
+       "apierror-invalidexpiry": "无效的过期时间“$1”。",
+       "apierror-invalid-file-key": "不是有效的文件关键词。",
+       "apierror-invalidlang": "用于参数<var>$1</var>的语言值无效。",
+       "apierror-invalidoldimage": "旧图片参数有无效格式。",
+       "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd>参数不能与<kbd>$2</kbd>一起使用。",
+       "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd>参数只能与<kbd>$2</kbd>一起使用。",
+       "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd>不能连同<var>oldid</var>、<var>pageid</var>或<var>page</var>参数使用。请使用<var>title</var>和<var>text</var>。",
+       "apierror-invalidparammix": "{{PLURAL:$2|参数}}$1不能一起使用。",
+       "apierror-invalidsection": "章节参数必须为有效的章节ID或<kbd>new</kbd>。",
+       "apierror-invalidsha1base36hash": "提供的SHA1Base36哈希无效。",
+       "apierror-invalidsha1hash": "提供的SHA1哈希无效。",
+       "apierror-invalidtitle": "错误标题“$1”。",
+       "apierror-invalidurlparam": "<var>$1urlparam</var>的值无效(<kbd>$2=$3</kbd>)。",
+       "apierror-invaliduser": "无效用户名“$1”。",
+       "apierror-invaliduserid": "用户ID<var>$1</var>无效。",
+       "apierror-maxlag-generic": "正在等待数据库服务器:已延迟$1{{PLURAL:$1|秒}}。",
+       "apierror-maxlag": "正在等待$2:已延迟$1{{PLURAL:$1|秒}}。",
+       "apierror-mimesearchdisabled": "MIME搜索在Miser模式中被禁用。",
+       "apierror-missingcontent-pageid": "丢失ID为$1的页面的内容。",
+       "apierror-missingparam-at-least-one-of": "需要{{PLURAL:$2|参数$1|$1中的至少一个参数}}。",
+       "apierror-missingparam-one-of": "需要{{PLURAL:$2|参数$1|$1中的一个参数}}。",
+       "apierror-missingparam": "<var>$1</var>参数必须被设置。",
+       "apierror-missingrev-pageid": "没有ID为$1的页面的当前修订版本。",
+       "apierror-missingtitle-createonly": "丢失标题只可以通过<kbd>create</kbd>保护。",
+       "apierror-missingtitle": "您指定的页面不存在。",
+       "apierror-missingtitle-byname": "页面$1不存在。",
+       "apierror-moduledisabled": "<kbd>$1</kbd>模块已被禁用。",
+       "apierror-multival-only-one-of": "参数<var>$1</var>只允许$2{{PLURAL:$3||之一}}。",
+       "apierror-multival-only-one": "参数<var>$1</var>只允许一个值。",
+       "apierror-multpages": "<var>$1</var>只可以在单一页面使用。",
+       "apierror-mustbeloggedin-changeauth": "您必须登录以更改身份验证数据。",
+       "apierror-mustbeloggedin-generic": "您必须登录。",
+       "apierror-mustbeloggedin-linkaccounts": "您必须登录以链接账户。",
+       "apierror-mustbeloggedin-removeauth": "您必须登录以移除身份验证数据。",
+       "apierror-mustbeloggedin-uploadstash": "上传暂存功能只对已登录用户可用。",
+       "apierror-mustbeloggedin": "您必须登录至$1。",
+       "apierror-mustbeposted": "<kbd>$1</kbd>模块需要POST请求。",
+       "apierror-mustpostparams": "以下{{PLURAL:$2|参数}}在查询字符串中被找到,但必须在POST正文中:$1。",
+       "apierror-noapiwrite": "通过API编辑此wiki已禁用。请确保<code>$wgEnableWriteAPI=true;</code>声明包含在wiki的<code>LocalSettings.php</code>文件中。",
+       "apierror-nochanges": "没有请求的更改。",
+       "apierror-nodeleteablefile": "没有该文件的旧版本。",
+       "apierror-no-direct-editing": "$2使用的内容模型$1不支持通过API直接编辑。",
+       "apierror-noedit-anon": "匿名用户不能编辑页面。",
+       "apierror-noedit": "您没有权限编辑页面。",
+       "apierror-noimageredirect-anon": "匿名用户不能创建图片重定向。",
+       "apierror-noimageredirect": "您没有权限创建图片重定向。",
+       "apierror-nosuchlogid": "没有ID为$1的日志记录。",
+       "apierror-nosuchpageid": "没有ID为$1的页面。",
+       "apierror-nosuchrcid": "没有ID为$1的最近更改。",
+       "apierror-nosuchrevid": "没有ID为$1的修订版本。",
+       "apierror-nosuchsection": "没有章节$1。",
+       "apierror-nosuchsection-what": "在$2中没有章节$1。",
+       "apierror-nosuchuserid": "没有ID为$1的用户。",
+       "apierror-notarget": "您没有为此章节指定有效目标。",
+       "apierror-notpatrollable": "修订版本r$1不能巡查,因为它太旧了。",
+       "apierror-nouploadmodule": "未设置上传模块。",
+       "apierror-opensearch-json-warnings": "警告不能以OpenSearch JSON格式表示。",
+       "apierror-pagecannotexist": "名字空间不允许实际页面。",
+       "apierror-pagedeleted": "在您取得页面时间戳以来,页面已被删除。",
+       "apierror-pagelang-disabled": "此wiki不允许更改页面的语言。",
+       "apierror-paramempty": "参数<var>$1</var>不能为空。",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd>只支持wiki文本内容。",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd>只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-pastexpiry": "终止时间“$1”已过去。",
+       "apierror-permissiondenied": "您没有权限$1。",
+       "apierror-permissiondenied-generic": "权限被拒绝。",
+       "apierror-permissiondenied-patrolflag": "您需要<code>patrol</code>或<code>patrolmarks</code>权限来请求巡查标记。",
+       "apierror-permissiondenied-unblock": "您没有权限解封用户。",
+       "apierror-prefixsearchdisabled": "前缀搜索在Miser模式中被禁用。",
+       "apierror-promised-nonwrite-api": "<code>Promise-Non-Write-API-Action</code> HTTP标头不能发送至写模式API模块。",
+       "apierror-protect-invalidaction": "无效的保护类型“$1”。",
+       "apierror-protect-invalidlevel": "无效的保护级别“$1”。",
+       "apierror-ratelimited": "您已超过您的速率限制。请等待一段时间再试。",
+       "apierror-readapidenied": "您需要读取权限以使用此模块。",
+       "apierror-readonly": "此wiki目前为只读模式。",
+       "apierror-reauthenticate": "您在该会话中尚未经过验证,请重新验证。",
+       "apierror-redirect-appendonly": "您试图使用重定向跟随模式编辑,而这必须与<kbd>section=new</kbd>、<var>prependtext</var>或<var>appendtext</var>共同使用。",
+       "apierror-revdel-mutuallyexclusive": "同一字段不能同时用于<var>hide</var>和<var>show</var>。",
+       "apierror-revdel-needtarget": "此修订版本删除类型需要目标标题。",
+       "apierror-revdel-paramneeded": "需要<var>hide</var>和/或<var>show</var>的至少一个值。",
+       "apierror-revisions-norevids": "<var>revids</var>参数不能与列表选项(<var>$1limit</var>、<var>$1startid</var>、<var>$1endid</var>、<kbd>$1dir=newer</kbd>、<var>$1user</var>、<var>$1excludeuser</var>、<var>$1start</var>和<var>$1end</var>)一起使用",
+       "apierror-revisions-singlepage": "<var>titles</var>、<var>pageids</var>或发生器用于提供多个页面,但<var>$1limit</var>、<var>$1startid</var>、<var>$1endid</var>、<kbd>$1dir=newer</kbd>、<var>$1user</var>、<var>$1excludeuser</var>、<var>$1start</var>和<var>$1end</var>参数只能在一个页面上使用。",
+       "apierror-revwrongpage": "r$1不是$2的修订版本。",
+       "apierror-searchdisabled": "<var>$1</var>搜索已禁用。",
+       "apierror-sectionreplacefailed": "不能合并更新的章节。",
+       "apierror-sectionsnotsupported": "内容模型$1不支持章节。",
+       "apierror-sectionsnotsupported-what": "章节不被$1所支持。",
+       "apierror-show": "不正确的参数——不可提供互斥值。",
+       "apierror-siteinfo-includealldenied": "除非<var>$wgShowHostNames</var>为真,否则不能查看所有服务器的信息。",
+       "apierror-sizediffdisabled": "大小差异在Miser模式中被禁用。",
+       "apierror-spamdetected": "您的编辑被拒绝,因为它包含垃圾部分:<code>$1</code>。",
+       "apierror-specialpage-cantexecute": "您没有权限查看此特殊页面的结果。",
+       "apierror-stashedfilenotfound": "无法在暂存处找到文件:$1。",
+       "apierror-stashedit-missingtext": "提供的哈希中找不到暂存文本。",
+       "apierror-stashfailed-complete": "大块上传已经完成,检查状态以获取详情。",
+       "apierror-stashfailed-nosession": "没有带此关键词的大块上传会话。",
+       "apierror-stashfilestorage": "不能在暂存处存储上传:$1",
+       "apierror-stashinvalidfile": "无效暂存文件。",
+       "apierror-stashnosuchfilekey": "没有这个filekey:$1。",
+       "apierror-stashwrongowner": "错误所有者:$1",
+       "apierror-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。",
+       "apierror-systemblocked": "您已被MediaWiki自动封禁。",
+       "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-unknownaction": "指定的操作<kbd>$1</kbd>不被承认。",
+       "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。",
+       "apierror-unknownerror-nocode": "未知错误。",
+       "apierror-unknownerror": "未知错误:“$1”。",
+       "apierror-unknownformat": "无法识别的格式“$1”。",
+       "apierror-unrecognizedparams": "无法识别的{{PLURAL:$2|参数}}:$1。",
+       "apierror-unrecognizedvalue": "无法识别的参数<var>$1</var>的值:$2。",
+       "apierror-unsupportedrepo": "本地文件存储库不支持查询所有图片。",
+       "apierror-upload-filekeyneeded": "当<var>offset</var>不为0时,必须提供<var>filekey</var>。",
+       "apierror-upload-filekeynotallowed": "当<var>offset</var>为0时,不能提供<var>filekey</var>。",
+       "apierror-upload-inprogress": "从暂存处上传已在进行中。",
+       "apierror-upload-missingresult": "状态数据中没有结果。",
+       "apierror-urlparamnormal": "不能为$1标准化图片参数。",
+       "apierror-writeapidenied": "您不被允许通过API编辑此wiki。",
+       "apiwarn-alldeletedrevisions-performance": "当生成标题时,为获得更好性能,请设置<kbd>$1dir=newer</kbd>。",
+       "apiwarn-badurlparam": "不能为$2解析<var>$1urlparam</var>。请只使用宽和高。",
+       "apiwarn-badutf8": "<var>$1</var>通过的值包含无效或非标准化数据。正文数据应为有效的NFC标准化Unicode,没有除HT(\\t)、LF(\\n)和CR(\\r)以外的C0控制字符。",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd>已被弃用。请改用<kbd>prop=deletedrevisions</kbd>或<kbd>list=alldeletedrevisions</kbd>。",
+       "apiwarn-deprecation-httpsexpected": "当应为HTTPS时,HTTP被使用。",
+       "apiwarn-deprecation-login-botpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要继续通过<kbd>action=login</kbd>登录,请参见[[Special:BotPasswords]]。要安全继续使用主账户登录,请参见<kbd>action=clientlogin</kbd>。",
+       "apiwarn-deprecation-login-nobotpw": "通过<kbd>action=login</kbd>的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要安全登录,请参见<kbd>action=clientlogin</kbd>。",
+       "apiwarn-deprecation-login-token": "通过<kbd>action=login</kbd>取得令牌已弃用。请改用<kbd>action=query&meta=tokens&type=login</kbd>。",
+       "apiwarn-deprecation-parameter": "参数<var>$1</var>已被弃用。",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd>从MediaWiki 1.28版开始已弃用。在创建新HTML文档时请使用<kbd>prop=headhtml</kbd>,或当更新文档客户端时请使用<kbd>prop=modules|jsconfigvars</kbd>。",
+       "apiwarn-deprecation-purge-get": "通过GET使用<kbd>action=purge</kbd>已被弃用。请改用POST。",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd>已弃用。请改用<kbd>$2</kbd>。",
+       "apiwarn-difftohidden": "不能与r$1做差异比较:内容被隐藏。",
+       "apiwarn-errorprinterfailed": "错误打印失败。将在没有参数的前提下重试。",
+       "apiwarn-errorprinterfailed-ex": "错误打印失败(将在没有参数的前提下重试):$1",
+       "apiwarn-invalidcategory": "“$1”不是一个分类。",
+       "apiwarn-invalidtitle": "“$1”不是一个有效的标题。",
+       "apiwarn-invalidxmlstylesheetext": "样式表应拥有<code>.xsl</code>扩展名。",
+       "apiwarn-invalidxmlstylesheet": "指定了无效或不存在的样式表。",
+       "apiwarn-invalidxmlstylesheetns": "样式表应位于{{ns:MediaWiki}}名字空间。",
+       "apiwarn-moduleswithoutvars": "属性<kbd>modules</kbd>被设置,但不是<kbd>jsconfigvars</kbd>或<kbd>encodedjsconfigvars</kbd>。需要配置变量以获得适当的模块使用。",
+       "apiwarn-notfile": "“$1”不是文件。",
+       "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。",
+       "apiwarn-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
+       "apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
+       "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
+       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值:上限为$2。",
+       "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now<kbd>。",
+       "apiwarn-unrecognizedvalues": "参数<var>$1</var>有无法识别的{{PLURAL:$3|值}}:$2。",
+       "apiwarn-unsupportedarray": "参数<var>$1</var>使用未受支持的PHP数组语法。",
+       "apiwarn-validationfailed-badchars": "关键词中的字符无效(只允许<code>a-z</code>、<code>A-Z</code>、<code>0-9</code>、<code>_</code>和<code>-</code>)。",
+       "apiwarn-validationfailed-badpref": "不是有效的偏好。",
+       "apiwarn-validationfailed-cannotset": "不能通过此模块设置。",
+       "apiwarn-validationfailed-keytoolong": "关键词太长(不允许超过$1字节)。",
+       "apiwarn-validationfailed": "<kbd>$1</kbd>的合法性错误:$2",
+       "apiwarn-wgDebugAPI": "<strong>安全警告</strong>:<var>$wgDebugAPI</var>已启用。",
+       "api-feed-error-title": "错误($1)",
+       "api-usage-docref": "参见$1以获取API用法。",
+       "api-exception-trace": "$1在$2($3)\n$4",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求至https://phabricator.wikimedia.org/。"
 }
index 54e476f..86ddc4c 100644 (file)
@@ -7,12 +7,21 @@
                        "EagerLin",
                        "Zhxy 519",
                        "Macofe",
-                       "Jasonzhuocn"
+                       "Jasonzhuocn",
+                       "Winstonyin"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug與請求]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是 API 仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤請求:</strong>當 API 收到錯誤請求時, HTTP header 將會返回一個包含「MediaWiki-API-Error」的值,隨後 header 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤的請求:</strong>當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
        "apihelp-main-param-action": "要執行的動作。",
        "apihelp-main-param-format": "輸出的格式。",
+       "apihelp-main-param-smaxage": "將HTTP緩存控制頭欄位設為<code>s-maxage</code>秒。錯誤不會做緩存。",
+       "apihelp-main-param-maxage": "將HTTP緩存控制頭欄位設為<code>max-age</code>秒。錯誤不會做緩存。",
+       "apihelp-main-param-assert": "若設為<kbd>user</kbd>,會確認使用者是否已登入;若設為<kbd>bot</kbd>,會確認是否擁有機械人權限。",
+       "apihelp-main-param-assertuser": "確認目前使用者就是指定的使用者。",
+       "apihelp-main-param-requestid": "在此處提供的任何值都將包括在響應之中。可用於區分請求。",
+       "apihelp-main-param-servedby": "在結果中包括提出請求的主機名。",
+       "apihelp-main-param-curtimestamp": "在結果中包括目前的時間戳。",
+       "apihelp-main-param-responselanginfo": "在結果中包括<var>uselang</var>和<var>errorlang</var>所用的語言。",
        "apihelp-block-description": "封鎖使用者。",
        "apihelp-block-param-user": "您要封鎖的使用者名稱、IP 位址或 IP 範圍。",
        "apihelp-block-param-reason": "封鎖原因。",
        "apihelp-login-example-login": "登入",
        "apihelp-logout-description": "登出並清除 session 資料。",
        "apihelp-logout-example-logout": "登出當前使用者",
+       "apihelp-mergehistory-description": "合併頁面歷史",
+       "apihelp-mergehistory-param-reason": "合併歷史的原因。",
+       "apihelp-mergehistory-example-merge": "將<kbd>Oldpage</kbd>的整個歷史合併至<kbd>Newpage</kbd>。",
+       "apihelp-mergehistory-example-merge-timestamp": "將<kbd>Oldpage</kbd>直至<kbd>2015-12-31T04:37:41Z</kbd>的頁面修訂版本合併至<kbd>Newpage</kbd>。",
        "apihelp-move-description": "移動頁面。",
        "apihelp-move-param-from": "重新命名本頁面的標題。不能與 <var>$1fromid</var> 一起出現。",
        "apihelp-move-param-fromid": "重新命名本頁面的 ID 。不能與 <var>$1fromid</var> 一起出現。",
        "apihelp-move-param-to": "將本頁面的標題重新命名為",
        "apihelp-move-param-reason": "重新命名的原因。",
+       "apihelp-move-param-movetalk": "如果討論頁存在,變更討論頁名稱。",
        "apihelp-move-param-movesubpages": "如果適用,則重新命名子頁面。",
        "apihelp-move-param-noredirect": "不要建立重新導向。",
+       "apihelp-move-param-watch": "將頁面和重定向加入目前使用者的監視清單。",
+       "apihelp-move-param-unwatch": "從目前使用者的監視清單中移除頁面和重定向。",
+       "apihelp-move-param-watchlist": "在目前使用者的監視清單中無條件地加入或移除頁面,或使用設定,或不變更監視清單。",
        "apihelp-move-param-ignorewarnings": "忽略所有警告。",
+       "apihelp-move-example-move": "將<kbd>Badtitle</kbd>移動至<kbd>Goodtitle</kbd>,不留下重定向。",
        "apihelp-opensearch-description": "使用 OpenSearch 協定搜尋本 wiki。",
        "apihelp-opensearch-param-search": "搜尋字串。",
        "apihelp-opensearch-param-limit": "回傳的結果數量上限。",
        "apihelp-opensearch-param-namespace": "搜尋的命名空間。",
+       "apihelp-opensearch-param-suggest": "若<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>設定為false,則不做任何事。",
+       "apihelp-opensearch-param-redirects": "如何處理重定向:\n;return:傳回重定向本身。\n;resolve:傳回目標頁面,傳回的結果數目可能少於$1limit。\n由於歷史原因,$1format=json的預設值為「return」,其他格式則為「resolve」。",
        "apihelp-opensearch-param-format": "輸出的格式。",
        "apihelp-options-param-reset": "重設偏好設定為網站預設值。",
        "apihelp-options-example-reset": "重設所有偏好設定",
index e25f882..6d5f8c3 100644 (file)
@@ -154,7 +154,7 @@ abstract class FileCacheBase {
        /**
         * Save and compress text to the cache
         * @param string $text
-        * @return string Compressed text
+        * @return string|false Compressed text
         */
        public function saveText( $text ) {
                if ( $this->useGzip() ) {
index 4e6b2fd..352a94c 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * MediaWiki message cache structure version.
@@ -52,6 +53,11 @@ class MessageCache {
         */
        protected $mCache;
 
+       /**
+        * @var bool[] Map of (language code => boolean)
+        */
+       protected $mCacheVolatile = [];
+
        /**
         * Should mean that database cannot be used, but check
         * @var bool $mDisable
@@ -65,10 +71,12 @@ class MessageCache {
        protected $mExpiry;
 
        /**
-        * Message cache has its own parser which it uses to transform
-        * messages.
+        * Message cache has its own parser which it uses to transform messages
+        * @var ParserOptions
         */
-       protected $mParserOptions, $mParser;
+       protected $mParserOptions;
+       /** @var Parser */
+       protected $mParser;
 
        /**
         * Variable for tracking which variables are already loaded
@@ -129,6 +137,7 @@ class MessageCache {
         */
        public static function normalizeKey( $key ) {
                global $wgContLang;
+
                $lckey = strtr( $key, ' ', '_' );
                if ( ord( $lckey ) < 128 ) {
                        $lckey[0] = strtolower( $lckey[0] );
@@ -258,6 +267,7 @@ class MessageCache {
                # Hash of the contents is stored in memcache, to detect if data-center cache
                # or local cache goes out of date (e.g. due to replace() on some other server)
                list( $hash, $hashVolatile ) = $this->getValidationHash( $code );
+               $this->mCacheVolatile[$code] = $hashVolatile;
 
                # Try the local cache and check against the cluster hash key...
                $cache = $this->getLocalCache( $code );
@@ -473,9 +483,16 @@ class MessageCache {
                $bigConds[] = 'page_len > ' . intval( $wgMaxMsgCacheEntrySize );
 
                # Load titles for all oversized pages in the MediaWiki namespace
-               $res = $dbr->select( 'page', 'page_title', $bigConds, __METHOD__ . "($code)-big" );
+               $res = $dbr->select(
+                       'page',
+                       [ 'page_title', 'page_latest' ],
+                       $bigConds,
+                       __METHOD__ . "($code)-big"
+               );
                foreach ( $res as $row ) {
                        $cache[$row->page_title] = '!TOO BIG';
+                       // At least include revision ID so page changes are reflected in the hash
+                       $cache['EXCESSIVE'][$row->page_title] = $row->page_latest;
                }
 
                # Conditions to load the remaining pages with their contents
@@ -525,7 +542,7 @@ class MessageCache {
         * Updates cache as necessary when message page is changed
         *
         * @param string|bool $title Name of the page changed (false if deleted)
-        * @param mixed $text New contents of the page.
+        * @param string|bool $text New contents of the page (false if deleted)
         */
        public function replace( $title, $text ) {
                global $wgMaxMsgCacheEntrySize, $wgContLang, $wgLanguageCode;
@@ -545,31 +562,32 @@ class MessageCache {
                // a self-deadlock. This is safe as no reads happen *directly* in this
                // method between getReentrantScopedLock() and load() below. There is
                // no risk of data "changing under our feet" for replace().
-               $cacheKey = wfMemcKey( 'messages', $code );
-               $scopedLock = $this->getReentrantScopedLock( $cacheKey );
+               $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) );
+               // Load the messages from the master DB to avoid race conditions
                $this->load( $code, self::FOR_UPDATE );
 
-               $titleKey = wfMemcKey( 'messages', 'individual', $title );
+               // Load the new value into the process cache...
                if ( $text === false ) {
-                       // Article was deleted
                        $this->mCache[$code][$title] = '!NONEXISTENT';
-                       $this->wanCache->delete( $titleKey );
                } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
-                       // Check for size
                        $this->mCache[$code][$title] = '!TOO BIG';
-                       $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry );
+                       // Pre-fill the individual key cache with the known latest message text
+                       $key = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title );
+                       $this->wanCache->set( $key, " $text", $this->mExpiry );
                } else {
                        $this->mCache[$code][$title] = ' ' . $text;
-                       $this->wanCache->delete( $titleKey );
                }
-
-               // Mark this cache as definitely "latest" (non-volatile) so
-               // load() calls do try to refresh the cache with replica DB data
+               // Mark this cache as definitely being "latest" (non-volatile) so
+               // load() calls do not try to refresh the cache with replica DB data
                $this->mCache[$code]['LATEST'] = time();
 
                // Update caches if the lock was acquired
                if ( $scopedLock ) {
                        $this->saveToCaches( $this->mCache[$code], 'all', $code );
+               } else {
+                       LoggerFactory::getInstance( 'MessageCache' )->error(
+                               __METHOD__ . ': could not acquire lock to update {title} ({code})',
+                               [ 'title' => $title, 'code' => $code ] );
                }
 
                ScopedCallback::consume( $scopedLock );
@@ -650,24 +668,26 @@ class MessageCache {
        protected function getValidationHash( $code ) {
                $curTTL = null;
                $value = $this->wanCache->get(
-                       wfMemcKey( 'messages', $code, 'hash', 'v1' ),
+                       $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        $curTTL,
                        [ wfMemcKey( 'messages', $code ) ]
                );
 
-               if ( !$value ) {
-                       // No hash found at all; cache must regenerate to be safe
-                       $hash = false;
-                       $expired = true;
-               } else {
+               if ( $value ) {
                        $hash = $value['hash'];
-                       if ( ( time() - $value['latest'] ) < WANObjectCache::HOLDOFF_TTL ) {
-                               // Cache was recently updated via replace() and should be up-to-date
+                       if ( ( time() - $value['latest'] ) < WANObjectCache::TTL_MINUTE ) {
+                               // Cache was recently updated via replace() and should be up-to-date.
+                               // That method is only called in the primary datacenter and uses FOR_UPDATE.
+                               // Also, it is unlikely that the current datacenter is *now* secondary one.
                                $expired = false;
                        } else {
                                // See if the "check" key was bumped after the hash was generated
                                $expired = ( $curTTL < 0 );
                        }
+               } else {
+                       // No hash found at all; cache must regenerate to be safe
+                       $hash = false;
+                       $expired = true;
                }
 
                return [ $hash, $expired ];
@@ -677,14 +697,15 @@ class MessageCache {
         * Set the md5 used to validate the local disk cache
         *
         * If $cache has a 'LATEST' UNIX timestamp key, then the hash will not
-        * be treated as "volatile" by getValidationHash() for the next few seconds
+        * be treated as "volatile" by getValidationHash() for the next few seconds.
+        * This is triggered when $cache is generated using FOR_UPDATE mode.
         *
         * @param string $code
         * @param array $cache Cached messages with a version
         */
        protected function setValidationHash( $code, array $cache ) {
                $this->wanCache->set(
-                       wfMemcKey( 'messages', $code, 'hash', 'v1' ),
+                       $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        [
                                'hash' => $cache['HASH'],
                                'latest' => isset( $cache['LATEST'] ) ? $cache['LATEST'] : 0
@@ -847,6 +868,7 @@ class MessageCache {
         */
        private function getMessageForLang( $lang, $lckey, $useDB, &$alreadyTried ) {
                global $wgContLang;
+
                $langcode = $lang->getCode();
 
                // Try checking the database for the requested language
@@ -905,6 +927,7 @@ class MessageCache {
         */
        private function getMessagePageName( $langcode, $uckey ) {
                global $wgLanguageCode;
+
                if ( $langcode === $wgLanguageCode ) {
                        // Messages created in the content language will not have the /lang extension
                        return $uckey;
@@ -930,8 +953,7 @@ class MessageCache {
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
-                               // The message exists, so make sure a string
-                               // is returned.
+                               // The message exists, so make sure a string is returned.
                                return (string)substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                return false;
@@ -941,7 +963,7 @@ class MessageCache {
                } else {
                        // XXX: This is not cached in process cache, should it?
                        $message = false;
-                       Hooks::run( 'MessagesPreLoad', [ $title, &$message ] );
+                       Hooks::run( 'MessagesPreLoad', [ $title, &$message, $code ] );
                        if ( $message !== false ) {
                                return $message;
                        }
@@ -950,17 +972,19 @@ class MessageCache {
                }
 
                // Try the individual message cache
-               $titleKey = wfMemcKey( 'messages', 'individual', $title );
-
-               $curTTL = null;
-               $entry = $this->wanCache->get(
-                       $titleKey,
-                       $curTTL,
-                       [ wfMemcKey( 'messages', $code ) ]
-               );
-               $entry = ( $curTTL >= 0 ) ? $entry : false;
+               $titleKey = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title );
+
+               if ( $this->mCacheVolatile[$code] ) {
+                       $entry = false;
+                       // Make sure that individual keys respect the WAN cache holdoff period too
+                       LoggerFactory::getInstance( 'MessageCache' )->debug(
+                               __METHOD__ . ': loading volatile key \'{titleKey}\'',
+                               [ 'titleKey' => $titleKey, 'code' => $code ] );
+               } else {
+                       $entry = $this->wanCache->get( $titleKey );
+               }
 
-               if ( $entry ) {
+               if ( $entry !== false ) {
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
                                $this->mCache[$code][$title] = $entry;
                                // The message exists, so make sure a string is returned
@@ -975,7 +999,7 @@ class MessageCache {
                        }
                }
 
-               // Try loading it from the database
+               // Try loading the message from the database
                $dbr = wfGetDB( DB_REPLICA );
                $cacheOpts = Database::getCacheSetOptions( $dbr );
                // Use newKnownCurrent() to avoid querying revision/user tables
@@ -992,32 +1016,18 @@ class MessageCache {
 
                if ( $revision ) {
                        $content = $revision->getContent();
-                       if ( !$content ) {
-                               // A possibly temporary loading failure.
-                               wfDebugLog(
-                                       'MessageCache',
-                                       __METHOD__ . ": failed to load message page text for {$title} ($code)"
-                               );
-                               $message = null; // no negative caching
-                       } else {
-                               // XXX: Is this the right way to turn a Content object into a message?
-                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or
-                               //       CssContent. MessageContent is *not* used for storing messages, it's
-                               //       only used for wrapping them when needed.
-                               $message = $content->getWikitextForTransclusion();
-
-                               if ( $message === false || $message === null ) {
-                                       wfDebugLog(
-                                               'MessageCache',
-                                               __METHOD__ . ": message content doesn't provide wikitext "
-                                                       . "(content model: " . $content->getModel() . ")"
-                                       );
-
-                                       $message = false; // negative caching
-                               } else {
+                       if ( $content ) {
+                               $message = $this->getMessageTextFromContent( $content );
+                               if ( is_string( $message ) ) {
                                        $this->mCache[$code][$title] = ' ' . $message;
                                        $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry, $cacheOpts );
                                }
+                       } else {
+                               // A possibly temporary loading failure
+                               LoggerFactory::getInstance( 'MessageCache' )->warning(
+                                       __METHOD__ . ': failed to load message page text for \'{titleKey}\'',
+                                       [ 'titleKey' => $titleKey, 'code' => $code ] );
+                               $message = null; // no negative caching
                        }
                } else {
                        $message = false; // negative caching
@@ -1069,6 +1079,7 @@ class MessageCache {
         */
        function getParser() {
                global $wgParser, $wgParserConf;
+
                if ( !$this->mParser && isset( $wgParser ) ) {
                        # Do some initialisation so that we don't have to do it twice
                        $wgParser->firstCallInit();
@@ -1096,6 +1107,8 @@ class MessageCache {
        public function parse( $text, $title = null, $linestart = true,
                $interface = false, $language = null
        ) {
+               global $wgTitle;
+
                if ( $this->mInParser ) {
                        return htmlspecialchars( $text );
                }
@@ -1110,7 +1123,6 @@ class MessageCache {
                $popts->setTargetLanguage( $language );
 
                if ( !$title || !$title instanceof Title ) {
-                       global $wgTitle;
                        wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' .
                                wfGetAllCallers( 6 ) . ' with no title set.' );
                        $title = $wgTitle;
@@ -1198,6 +1210,7 @@ class MessageCache {
         */
        public function getAllMessageKeys( $code ) {
                global $wgContLang;
+
                $this->load( $code );
                if ( !isset( $this->mCache[$code] ) ) {
                        // Apparently load() failed
@@ -1207,10 +1220,61 @@ class MessageCache {
                $cache = $this->mCache[$code];
                unset( $cache['VERSION'] );
                unset( $cache['EXPIRY'] );
+               unset( $cache['EXCESSIVE'] );
                // Remove any !NONEXISTENT keys
                $cache = array_diff( $cache, [ '!NONEXISTENT' ] );
 
                // Keys may appear with a capital first letter. lcfirst them.
                return array_map( [ $wgContLang, 'lcfirst' ], array_keys( $cache ) );
        }
+
+       /**
+        * Purge message caches when a MediaWiki: page is created, updated, or deleted
+        *
+        * @param Title $title Message page title
+        * @param Content|null $content New content for edit/create, null on deletion
+        * @since 1.29
+        */
+       public function updateMessageOverride( Title $title, Content $content = null ) {
+               global $wgContLang;
+
+               $msgText = $this->getMessageTextFromContent( $content );
+               if ( $msgText === null ) {
+                       $msgText = false; // treat as not existing
+               }
+
+               $this->replace( $title->getDBkey(), $msgText );
+
+               if ( $wgContLang->hasVariants() ) {
+                       $wgContLang->updateConversionTable( $title );
+               }
+       }
+
+       /**
+        * @param Content|null $content Content or null if the message page does not exist
+        * @return string|bool|null Returns false if $content is null and null on error
+        */
+       private function getMessageTextFromContent( Content $content = null ) {
+               // @TODO: could skip pseudo-messages like js/css here, based on content model
+               if ( $content ) {
+                       // Message page exists...
+                       // XXX: Is this the right way to turn a Content object into a message?
+                       // NOTE: $content is typically either WikitextContent, JavaScriptContent or
+                       //       CssContent. MessageContent is *not* used for storing messages, it's
+                       //       only used for wrapping them when needed.
+                       $msgText = $content->getWikitextForTransclusion();
+                       if ( $msgText === false || $msgText === null ) {
+                               // This might be due to some kind of misconfiguration...
+                               $msgText = null;
+                               LoggerFactory::getInstance( 'MessageCache' )->warning(
+                                       __METHOD__ . ": message content doesn't provide wikitext "
+                                       . "(content model: " . $content->getModel() . ")" );
+                       }
+               } else {
+                       // Message page does not exist...
+                       $msgText = false;
+               }
+
+               return $msgText;
+       }
 }
index 4b6362f..90b3de1 100644 (file)
@@ -313,7 +313,7 @@ class LocalisationCache {
         * array.
         * @param string $code
         * @param string $key
-        * @return bool|null|string
+        * @return bool|null|string|string[]
         */
        public function getSubitemList( $code, $key ) {
                if ( in_array( $key, self::$splitKeys ) ) {
index 515ab05..5d19961 100644 (file)
@@ -129,7 +129,7 @@ class CategoryMembershipChange {
                        $this->getUser(),
                        $this->getChangeMessageText(
                                $type,
-                               [ 'prefixedText' => $this->pageTitle->getPrefixedText() ],
+                               $this->pageTitle->getPrefixedText(),
                                $this->numTemplateLinks
                        ),
                        $this->pageTitle,
@@ -245,13 +245,12 @@ class CategoryMembershipChange {
         *
         * @param int $type may be CategoryMembershipChange::CATEGORY_ADDITION
         * or CategoryMembershipChange::CATEGORY_REMOVAL
-        * @param array $params
-        * - prefixedText: result of Title::->getPrefixedText()
+        * @param string $prefixedText result of Title::->getPrefixedText()
         * @param int $numTemplateLinks
         *
         * @return string
         */
-       private function getChangeMessageText( $type, array $params, $numTemplateLinks ) {
+       private function getChangeMessageText( $type, $prefixedText, $numTemplateLinks ) {
                $array = [
                        self::CATEGORY_ADDITION => 'recentchanges-page-added-to-category',
                        self::CATEGORY_REMOVAL => 'recentchanges-page-removed-from-category',
@@ -263,7 +262,7 @@ class CategoryMembershipChange {
                        $msgKey .= '-bundled';
                }
 
-               return wfMessage( $msgKey, $params )->inContentLanguage()->text();
+               return wfMessage( $msgKey, $prefixedText )->inContentLanguage()->text();
        }
 
        /**
index bfabd51..d2239eb 100644 (file)
@@ -757,11 +757,13 @@ class ChangeTags {
         * @param User $user Who to attribute the action to
         * @param int $tagCount For deletion only, how many usages the tag had before
         * it was deleted.
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return int ID of the inserted log entry
         * @since 1.25
         */
        protected static function logTagManagementAction( $action, $tag, $reason,
-               User $user, $tagCount = null ) {
+               User $user, $tagCount = null, array $logEntryTags = [] ) {
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -778,6 +780,7 @@ class ChangeTags {
                }
                $logEntry->setParameters( $params );
                $logEntry->setRelations( [ 'Tag' => $tag ] );
+               $logEntry->setTags( $logEntryTags );
 
                $logId = $logEntry->insert( $dbw );
                $logEntry->publish( $logId );
@@ -830,12 +833,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function activateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canActivateTag( $tag, $user );
@@ -848,7 +853,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'activate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -889,12 +896,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deactivateTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeactivateTag( $tag, $user );
@@ -907,7 +916,9 @@ class ChangeTags {
                self::undefineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'deactivate', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -968,12 +979,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function createTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canCreateTag( $tag, $user );
@@ -986,7 +999,9 @@ class ChangeTags {
                self::defineTag( $tag );
 
                // log it
-               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user );
+               $logId = self::logTagManagementAction( 'create', $tag, $reason, $user,
+                       null, $logEntryTags );
+
                return Status::newGood( $logId );
        }
 
@@ -1095,12 +1110,14 @@ class ChangeTags {
         * @param string $reason
         * @param User $user Who to give credit for the action
         * @param bool $ignoreWarnings Can be used for API interaction, default false
+        * @param array $logEntryTags Change tags to apply to the entry
+        * that will be created in the tag management log
         * @return Status If successful, the Status contains the ID of the added log
         * entry as its value
         * @since 1.25
         */
        public static function deleteTagWithChecks( $tag, $reason, User $user,
-               $ignoreWarnings = false ) {
+               $ignoreWarnings = false, array $logEntryTags = [] ) {
 
                // are we allowed to do this?
                $result = self::canDeleteTag( $tag, $user );
@@ -1120,7 +1137,9 @@ class ChangeTags {
                }
 
                // log it
-               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user, $hitcount );
+               $logId = self::logTagManagementAction( 'delete', $tag, $reason, $user,
+                       $hitcount, $logEntryTags );
+
                $deleteResult->value = $logId;
                return $deleteResult;
        }
index 9950a11..7659d6c 100644 (file)
@@ -63,6 +63,8 @@ abstract class Collation {
                                return new CollationCkb;
                        case 'xx-uca-et':
                                return new CollationEt;
+                       case 'xx-uca-fa':
+                               return new CollationFa;
                        default:
                                $match = [];
                                if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
diff --git a/includes/collation/CollationFa.php b/includes/collation/CollationFa.php
new file mode 100644 (file)
index 0000000..9cce087
--- /dev/null
@@ -0,0 +1,50 @@
+<?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
+ */
+
+/**
+ * Temporary workaround for incorrect collation of Persian language ('fa') in ICU 52 (bug T139110).
+ *
+ * All of the following will be considered separate letters for category headings in Persian:
+ *  - Characters 'و' 'ا' (often appear at the beginning of words)
+ *  - Characters 'ٲ' 'ٳ' (may appear at the beginning of words in loanwords)
+ *  - Characters 'ء' 'ئ' (don't appear at the beginning of words, but it's easier to implement)
+ *
+ * @since 1.29
+ */
+class CollationFa extends IcuCollation {
+       private $tertiaryCollator;
+
+       public function __construct() {
+               parent::__construct( 'fa' );
+               $this->tertiaryCollator = Collator::create( 'fa' );
+       }
+
+       public function getPrimarySortKey( $string ) {
+               $primary = parent::getPrimarySortKey( $string );
+               // We have to use a tertiary sortkey for everything with the primary sortkey of 2627.
+               // Otherwise, the "Remove duplicate prefixes" logic in IcuCollation would remove them.
+               // This matches sortkeys for the following characters: ء ئ ا و ٲ ٳ
+               if ( substr( $primary, 0, 2 ) === "\x26\x27" ) {
+                       wfDebug( "Using tertiary sortkey for '$string'\n" );
+                       return $this->tertiaryCollator->getSortKey( $string );
+               }
+               return $primary;
+       }
+}
index 7b4fce6..bc5a209 100644 (file)
@@ -330,6 +330,7 @@ class IcuCollation extends Collation {
                        $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $cacheKey = $cache->makeKey(
                                'first-letters',
+                               get_class( $this ),
                                $this->locale,
                                $this->digitTransformLanguage->getCode(),
                                self::getICUVersion(),
index 931128f..6a0a63b 100644 (file)
@@ -381,7 +381,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'). The ID "0" retrieves the section before the first heading, "1" the
         * text between the first heading (included) and the second heading (excluded), etc.
         *
@@ -396,7 +396,7 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $with New content of the section
index 3389a00..5862bf1 100644 (file)
@@ -27,41 +27,6 @@ use MediaWiki\Search\ParserOutputSearchDataExtractor;
  *
  * @author Daniel Kinzler
  */
-
-/**
- * Exception representing a failure to serialize or unserialize a content object.
- *
- * @ingroup Content
- */
-class MWContentSerializationException extends MWException {
-}
-
-/**
- * Exception thrown when an unregistered content model is requested. This error
- * can be triggered by user input, so a separate exception class is provided so
- * callers can substitute a context-specific, internationalised error message.
- *
- * @ingroup Content
- * @since 1.27
- */
-class MWUnknownContentModelException extends MWException {
-       /** @var string The name of the unknown content model */
-       private $modelId;
-
-       /** @param string $modelId */
-       function __construct( $modelId ) {
-               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
-                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
-                       'handle this content model.' );
-               $this->modelId = $modelId;
-       }
-
-       /** @return string */
-       public function getModelId() {
-               return $this->modelId;
-       }
-}
-
 /**
  * A content handler knows how do deal with a specific type of content on a wiki
  * page. Content is stored in the database in a serialized form (using a
@@ -233,9 +198,6 @@ abstract class ContentHandler {
                        $ext = $m[1];
                }
 
-               // Hook can force JS/CSS
-               Hooks::run( 'TitleIsCssOrJsPage', [ $title, &$isCodePage ], '1.21' );
-
                // Is this a user subpage containing code?
                $isCodeSubpage = NS_USER == $ns
                        && !$isCodePage
@@ -248,9 +210,6 @@ abstract class ContentHandler {
                $isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
                $isWikitext = $isWikitext && !$isCodePage && !$isCodeSubpage;
 
-               // Hook can override $isWikitext
-               Hooks::run( 'TitleIsWikitextPage', [ $title, &$isWikitext ], '1.21' );
-
                if ( !$isWikitext ) {
                        switch ( $ext ) {
                                case 'js':
@@ -1130,65 +1089,6 @@ abstract class ContentHandler {
                return $this->supportsDirectEditing();
        }
 
-       /**
-        * Call a legacy hook that uses text instead of Content objects.
-        * Will log a warning when a matching hook function is registered.
-        * If the textual representation of the content is changed by the
-        * hook function, a new Content object is constructed from the new
-        * text.
-        *
-        * @param string $event Event name
-        * @param array $args Parameters passed to hook functions
-        * @param string|null $deprecatedVersion Emit a deprecation notice
-        *   when the hook is run for the provided version
-        *
-        * @return bool True if no handler aborted the hook
-        */
-       public static function runLegacyHooks( $event, $args = [],
-               $deprecatedVersion = null
-       ) {
-
-               if ( !Hooks::isRegistered( $event ) ) {
-                       return true; // nothing to do here
-               }
-
-               // convert Content objects to text
-               $contentObjects = [];
-               $contentTexts = [];
-
-               foreach ( $args as $k => $v ) {
-                       if ( $v instanceof Content ) {
-                               /* @var Content $v */
-
-                               $contentObjects[$k] = $v;
-
-                               $v = $v->serialize();
-                               $contentTexts[$k] = $v;
-                               $args[$k] = $v;
-                       }
-               }
-
-               // call the hook functions
-               $ok = Hooks::run( $event, $args, $deprecatedVersion );
-
-               // see if the hook changed the text
-               foreach ( $contentTexts as $k => $orig ) {
-                       /* @var Content $content */
-
-                       $modified = $args[$k];
-                       $content = $contentObjects[$k];
-
-                       if ( $modified !== $orig ) {
-                               // text was changed, create updated Content object
-                               $content = $content->getContentHandler()->unserializeContent( $modified );
-                       }
-
-                       $args[$k] = $content;
-               }
-
-               return $ok;
-       }
-
        /**
         * Get fields definition for search index
         *
index 9296728..d649baf 100644 (file)
@@ -38,7 +38,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string|number $sectionId
+        * @param string|int $sectionId
         *
         * @return Content|bool|null
         *
@@ -58,7 +58,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string|number|null|bool $sectionId
+        * @param string|int|null|bool $sectionId
         * @param Content $with
         * @param string $sectionTitle
         *
index f1ccd2a..2b394b6 100644 (file)
@@ -41,19 +41,19 @@ class CloneDatabase {
        /** @var bool Whether to use temporary tables or not */
        private $useTemporaryTables = true;
 
-       /** @var Database */
+       /** @var IMaintainableDatabase */
        private $db;
 
        /**
         * Constructor
         *
-        * @param Database $db A database subclass
+        * @param IMaintainableDatabase $db A database subclass
         * @param array $tablesToClone An array of tables to clone, unprefixed
         * @param string $newTablePrefix Prefix to assign to the tables
         * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
         * @param bool $dropCurrentTables
         */
-       public function __construct( Database $db, array $tablesToClone,
+       public function __construct( IMaintainableDatabase $db, array $tablesToClone,
                $newTablePrefix, $oldTablePrefix = '', $dropCurrentTables = true
        ) {
                $this->db = $db;
@@ -107,7 +107,8 @@ class CloneDatabase {
 
                        # Create new table
                        wfDebug( __METHOD__ . " duplicating $oldTableName to $newTableName\n" );
-                       $this->db->duplicateTableStructure( $oldTableName, $newTableName, $this->useTemporaryTables );
+                       $this->db->duplicateTableStructure(
+                               $oldTableName, $newTableName, $this->useTemporaryTables );
                }
        }
 
index 2f9f809..7c4bb3b 100644 (file)
@@ -332,7 +332,7 @@ class DatabaseMssql extends Database {
        }
 
        /**
-        * @return string
+        * @return string|int
         */
        public function lastErrno() {
                $err = sqlsrv_errors( SQLSRV_ERR_ALL );
index 9258506..c3502f6 100644 (file)
@@ -993,7 +993,7 @@ class DatabaseOracle extends Database {
         *
         * @param array|string $table
         * @param string $field
-        * @return ORAField|ORAResult
+        * @return ORAField|ORAResult|false
         */
        private function fieldInfoMulti( $table, $field ) {
                $field = strtoupper( $field );
index dde678f..87656f2 100644 (file)
@@ -147,8 +147,6 @@ class MWDebug {
         * @param string $log 'production' will always trigger a php error, 'auto'
         *    will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
         *    will only write to the debug log(s).
-        *
-        * @return mixed
         */
        public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
                global $wgDevelopmentWarnings;
index 4614c46..baf4637 100644 (file)
@@ -378,7 +378,7 @@ class LegacyLogger extends AbstractLogger {
                        if ( is_nan( $item ) ) {
                                return 'NaN';
                        }
-                       return $item;
+                       return (string)$item;
                }
 
                if ( is_scalar( $item ) ) {
index 6aa3831..7215696 100644 (file)
@@ -24,7 +24,7 @@ use Wikimedia\ScopedCallback;
 
 /**
  * Update object handling the cleanup of links tables after a page was deleted.
- **/
+ */
 class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
        /** @var WikiPage */
        protected $page;
index d38319e..a08bd9e 100644 (file)
@@ -67,7 +67,7 @@ abstract class DiffOp {
 
        /**
         * @param int $i
-        * @return string|null
+        * @return string[]|string|null
         */
        public function getClosing( $i = null ) {
                if ( $i === null ) {
index babd00b..25d50d3 100644 (file)
@@ -182,7 +182,7 @@ class DiffEngine {
                        }
 
                        while ( $i < $len && !$changed[$i] ) {
-                               assert( $j < $other_len && ! $other_changed[$j] );
+                               assert( $j < $other_len && !$other_changed[$j] );
                                $i++;
                                $j++;
                                while ( $j < $other_len && $other_changed[$j] ) {
@@ -247,7 +247,7 @@ class DiffEngine {
                                                $i++;
                                        }
 
-                                       assert( $j < $other_len && ! $other_changed[$j] );
+                                       assert( $j < $other_len && !$other_changed[$j] );
                                        $j++;
                                        if ( $j < $other_len && $other_changed[$j] ) {
                                                $corresponding = $i;
index bd65fb4..559a5ec 100644 (file)
@@ -210,7 +210,7 @@ class DifferenceEngine extends ContextSource {
                if ( $link ) {
                        return "[$link $id]";
                } else {
-                       return $id;
+                       return (string)$id;
                }
        }
 
@@ -247,8 +247,9 @@ class DifferenceEngine extends ContextSource {
                Hooks::run( 'DifferenceEngineShowDiffPage', [ $out ] );
 
                if ( !$this->loadRevisionData() ) {
-                       $this->showMissingRevision();
-
+                       if ( Hooks::run( 'DifferenceEngineShowDiffPageMaybeShowMissingRevision', [ $this ] ) ) {
+                               $this->showMissingRevision();
+                       }
                        return;
                }
 
@@ -481,7 +482,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return string HTML or empty string
         */
-       protected function markPatrolledLink() {
+       public function markPatrolledLink() {
                if ( $this->mMarkPatrolledLink === null ) {
                        $linkInfo = $this->getMarkPatrolledLinkInfo();
                        // If false, there is no patrol link needed/allowed
@@ -1064,7 +1065,7 @@ class DifferenceEngine extends ContextSource {
         *
         * @return string HTML fragment
         */
-       protected function getRevisionHeader( Revision $rev, $complete = '' ) {
+       public function getRevisionHeader( Revision $rev, $complete = '' ) {
                $lang = $this->getLanguage();
                $user = $this->getUser();
                $revtimestamp = $rev->getTimestamp();
@@ -1369,6 +1370,7 @@ class DifferenceEngine extends ContextSource {
 
                if ( $this->mNewRev ) {
                        $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       Hooks::run( 'DifferenceEngineLoadTextAfterNewContentIsLoaded', [ $this ] );
                        if ( $this->mNewContent === null ) {
                                return false;
                        }
@@ -1395,6 +1397,8 @@ class DifferenceEngine extends ContextSource {
 
                $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
+               Hooks::run( 'DifferenceEngineAfterLoadNewText', [ $this ] );
+
                return true;
        }
 
index 2f502d8..9b5a268 100644 (file)
@@ -24,7 +24,7 @@
  * @since 1.7
  * @ingroup Exception
  */
-class ErrorPageError extends MWException {
+class ErrorPageError extends MWException implements ILocalizedException {
        public $title, $msg, $params;
 
        /**
@@ -43,15 +43,23 @@ class ErrorPageError extends MWException {
                // customized by the local wiki. So get the default English version for
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
-               if ( $msg instanceof Message ) {
-                       $enMsg = clone $msg;
-               } else {
-                       $enMsg = wfMessage( $msg, $params );
-               }
+               $enMsg = $this->getMessageObject();
                $enMsg->inLanguage( 'en' )->useDatabase( false );
                parent::__construct( $enMsg->text() );
        }
 
+       /**
+        * Return a Message object for this exception
+        * @since 1.29
+        * @return Message
+        */
+       public function getMessageObject() {
+               if ( $this->msg instanceof Message ) {
+                       return clone $this->msg;
+               }
+               return wfMessage( $this->msg, $this->params );
+       }
+
        public function report() {
                global $wgOut;
 
diff --git a/includes/exception/LocalizedException.php b/includes/exception/LocalizedException.php
new file mode 100644 (file)
index 0000000..cbdb53e
--- /dev/null
@@ -0,0 +1,66 @@
+<?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
+ */
+
+/**
+ * Interface for MediaWiki-localized exceptions
+ *
+ * @since 1.29
+ * @ingroup Exception
+ */
+interface ILocalizedException {
+       /**
+        * Return a Message object for this exception
+        * @return Message
+        */
+       public function getMessageObject();
+}
+
+/**
+ * Basic localized exception.
+ *
+ * @since 1.29
+ * @ingroup Exception
+ * @note Don't use this in a situation where MessageCache is not functional.
+ */
+class LocalizedException extends Exception implements ILocalizedException {
+       /** @var string|array|MessageSpecifier */
+       protected $messageSpec;
+
+       /**
+        * @param string|array|MessageSpecifier $messageSpec See Message::newFromSpecifier
+        * @param int $code Exception code
+        * @param Exception|Throwable $previous The previous exception used for the exception chaining.
+        */
+       public function __construct( $messageSpec, $code = 0, $previous = null ) {
+               $this->messageSpec = $messageSpec;
+
+               // Exception->getMessage() should be in plain English, not localized.
+               // So fetch the English version of the message, without local
+               // customizations, and make a basic attempt to turn markup into text.
+               $msg = $this->getMessageObject()->inLanguage( 'en' )->useDatabase( false )->text();
+               $msg = preg_replace( '!</?(var|kbd|samp|code)>!', '"', $msg );
+               $msg = html_entity_decode( strip_tags( $msg ), ENT_QUOTES | ENT_HTML5 );
+               parent::__construct( $msg, $code, $previous );
+       }
+
+       public function getMessageObject() {
+               return Message::newFromSpecifier( $this->messageSpec );
+       }
+}
diff --git a/includes/exception/MWContentSerializationException.php b/includes/exception/MWContentSerializationException.php
new file mode 100644 (file)
index 0000000..500cf7c
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Exception representing a failure to serialize or unserialize a content object.
+ *
+ * @ingroup Content
+ */
+class MWContentSerializationException extends MWException {
+}
index 3d8ddb8..bef379e 100644 (file)
@@ -26,6 +26,8 @@ use MediaWiki\MediaWikiServices;
  * @ingroup Exception
  */
 class MWExceptionHandler {
+       const CAUGHT_BY_HANDLER = 'mwe_handler'; // error reported by this exception handler
+       const CAUGHT_BY_OTHER = 'other'; // error reported by direct logException() call
 
        /**
         * @var string $reservedMemory
@@ -130,10 +132,10 @@ class MWExceptionHandler {
                        // which would result in an exception loop. PHP may escalate such
                        // errors to "Exception thrown without a stack frame" fatals, but
                        // it's better to be explicit here.
-                       self::logException( $e2 );
+                       self::logException( $e2, self::CAUGHT_BY_HANDLER );
                }
 
-               self::logException( $e );
+               self::logException( $e, self::CAUGHT_BY_HANDLER );
                self::report( $e );
 
                // Exit value should be nonzero for the benefit of shell jobs
@@ -293,6 +295,7 @@ TXT;
                                'trace' => static::redactTrace( $trace ),
                        ],
                        'exception_id' => wfRandomString( 8 ),
+                       'caught_by' => self::CAUGHT_BY_HANDLER
                ] );
 
                // Remember call so we don't double process via HHVM's fatal
@@ -464,12 +467,14 @@ TXT;
         * logger.
         *
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return array
         */
-       public static function getLogContext( $e ) {
+       public static function getLogContext( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                return [
                        'exception' => $e,
                        'exception_id' => WebRequest::getRequestId(),
+                       'caught_by' => $catcher
                ];
        }
 
@@ -481,11 +486,13 @@ TXT;
         * will be redacted as per getRedactedTraceAsArray().
         *
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return array
         * @since 1.26
         */
-       public static function getStructuredExceptionData( $e ) {
+       public static function getStructuredExceptionData( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                global $wgLogExceptionBacktrace;
+
                $data = [
                        'id' => WebRequest::getRequestId(),
                        'type' => get_class( $e ),
@@ -494,6 +501,7 @@ TXT;
                        'message' => $e->getMessage(),
                        'code' => $e->getCode(),
                        'url' => self::getURL() ?: null,
+                       'caught_by' => $catcher
                ];
 
                if ( $e instanceof ErrorException &&
@@ -509,7 +517,7 @@ TXT;
 
                $previous = $e->getPrevious();
                if ( $previous !== null ) {
-                       $data['previous'] = self::getStructuredExceptionData( $previous );
+                       $data['previous'] = self::getStructuredExceptionData( $previous, $catcher );
                }
 
                return $data;
@@ -566,11 +574,17 @@ TXT;
         * @param Exception|Throwable $e
         * @param bool $pretty Add non-significant whitespace to improve readability (default: false).
         * @param int $escaping Bitfield consisting of FormatJson::.*_OK class constants.
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         * @return string|false JSON string if successful; false upon failure
         */
-       public static function jsonSerializeException( $e, $pretty = false, $escaping = 0 ) {
-               $data = self::getStructuredExceptionData( $e );
-               return FormatJson::encode( $data, $pretty, $escaping );
+       public static function jsonSerializeException(
+               $e, $pretty = false, $escaping = 0, $catcher = self::CAUGHT_BY_OTHER
+       ) {
+               return FormatJson::encode(
+                       self::getStructuredExceptionData( $e, $catcher ),
+                       $pretty,
+                       $escaping
+               );
        }
 
        /**
@@ -581,16 +595,17 @@ TXT;
         *
         * @since 1.22
         * @param Exception|Throwable $e
+        * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
         */
-       public static function logException( $e ) {
+       public static function logException( $e, $catcher = self::CAUGHT_BY_OTHER ) {
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $logger = LoggerFactory::getInstance( 'exception' );
                        $logger->error(
                                self::getLogMessage( $e ),
-                               self::getLogContext( $e )
+                               self::getLogContext( $e, $catcher )
                        );
 
-                       $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+                       $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
                        if ( $json !== false ) {
                                $logger = LoggerFactory::getInstance( 'exception-json' );
                                $logger->error( $json, [ 'private' => true ] );
@@ -608,6 +623,7 @@ TXT;
         * @param string $channel
        */
        protected static function logError( ErrorException $e, $channel ) {
+               $catcher = self::CAUGHT_BY_HANDLER;
                // The set_error_handler callback is independent from error_reporting.
                // Filter out unwanted errors manually (e.g. when
                // MediaWiki\suppressWarnings is active).
@@ -616,12 +632,12 @@ TXT;
                        $logger = LoggerFactory::getInstance( $channel );
                        $logger->error(
                                self::getLogMessage( $e ),
-                               self::getLogContext( $e )
+                               self::getLogContext( $e, $catcher )
                        );
                }
 
                // Include all errors in the json log (surpressed errors will be flagged)
-               $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
+               $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
                if ( $json !== false ) {
                        $logger = LoggerFactory::getInstance( "{$channel}-json" );
                        $logger->error( $json, [ 'private' => true ] );
index b600f42..a569bcd 100644 (file)
@@ -207,14 +207,14 @@ class MWExceptionRenderer {
         */
        public static function getHTML( $e ) {
                if ( self::showBackTrace( $e ) ) {
-                       $html = "<div class=\"errorbox\"><p>" .
+                       $html = "<div class=\"errorbox mw-content-ltr\"><p>" .
                                nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $e ) ) ) .
                                '</p><p>Backtrace:</p><p>' .
                                nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $e ) ) ) .
                                "</p></div>\n";
                } else {
                        $logId = WebRequest::getRequestId();
-                       $html = "<div class=\"errorbox\">" .
+                       $html = "<div class=\"errorbox mw-content-ltr\">" .
                                '[' . $logId . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) . ": " .
                                self::msg( "internalerror-fatal-exception",
diff --git a/includes/exception/MWUnknownContentModelException.php b/includes/exception/MWUnknownContentModelException.php
new file mode 100644 (file)
index 0000000..df7111a
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Exception thrown when an unregistered content model is requested. This error
+ * can be triggered by user input, so a separate exception class is provided so
+ * callers can substitute a context-specific, internationalised error message.
+ *
+ * @ingroup Content
+ * @since 1.27
+ */
+class MWUnknownContentModelException extends MWException {
+       /** @var string The name of the unknown content model */
+       private $modelId;
+
+       /** @param string $modelId */
+       function __construct( $modelId ) {
+               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
+                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
+                       'handle this content model.' );
+               $this->modelId = $modelId;
+       }
+       /** @return string */
+       public function getModelId() {
+               return $this->modelId;
+       }
+}
index e31374c..5ecd237 100644 (file)
@@ -58,6 +58,9 @@ class PermissionsError extends ErrorPageError {
                }
 
                $this->errors = $errors;
+
+               // Give the parent class something to work with
+               parent::__construct( 'permissionserrors', Message::newFromSpecifier( $errors[0] ) );
        }
 
        public function report() {
index ab26803..5be166b 100644 (file)
@@ -38,7 +38,7 @@ class XmlDumpWriter {
         * @return string
         */
        function openStream() {
-               global $wgLanguageCode;
+               global $wgContLang;
                $ver = WikiExporter::schemaVersion();
                return Xml::element( 'mediawiki', [
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
@@ -56,7 +56,7 @@ class XmlDumpWriter {
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
                                "http://www.mediawiki.org/xml/export-$ver.xsd",
                        'version'            => $ver,
-                       'xml:lang'           => $wgLanguageCode ],
+                       'xml:lang'           => $wgContLang->getHtmlCode() ],
                        null ) .
                        "\n" .
                        $this->siteInfo();
index 7e93299..52c1a4c 100644 (file)
@@ -105,7 +105,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param string $cluster Cluster name
         * @return LoadBalancer
         */
-       function getLoadBalancer( $cluster ) {
+       private function getLoadBalancer( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
 
                return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
@@ -115,9 +115,9 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get a replica DB connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return IDatabase
+        * @return DBConnRef
         */
-       function getSlave( $cluster ) {
+       public function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
 
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
@@ -140,13 +140,13 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get a master database connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return IDatabase
+        * @return MaintainableDBConnRef
         */
-       function getMaster( $cluster ) {
+       public function getMaster( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
                $lb = $this->getLoadBalancer( $cluster );
 
-               $db = $lb->getConnectionRef( DB_MASTER, [], $wiki );
+               $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki );
                $db->clearFlag( DBO_TRX ); // sanity
 
                return $db;
@@ -158,7 +158,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param IDatabase $db
         * @return string Table name ('blobs' by default)
         */
-       function getTable( $db ) {
+       public function getTable( $db ) {
                $table = $db->getLBInfo( 'blobs table' );
                if ( is_null( $table ) ) {
                        $table = 'blobs';
@@ -175,9 +175,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param string $id
         * @param string $itemID
         * @return HistoryBlob|bool Returns false if missing
-        * @private
         */
-       function fetchBlob( $cluster, $id, $itemID ) {
+       private function fetchBlob( $cluster, $id, $itemID ) {
                /**
                 * One-step cache variable to hold base blobs; operations that
                 * pull multiple revisions may often pull multiple times from
@@ -230,7 +229,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return array A map from the blob_id's requested to their content.
         *   Unlocated ids are not represented
         */
-       function batchFetchBlobs( $cluster, array $ids ) {
+       private function batchFetchBlobs( $cluster, array $ids ) {
                $dbr = $this->getSlave( $cluster );
                $res = $dbr->select( $this->getTable( $dbr ),
                        [ 'blob_id', 'blob_text' ], [ 'blob_id' => array_keys( $ids ) ], __METHOD__ );
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
deleted file mode 100644 (file)
index d06acf2..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * A repository for files accessible via the local filesystem.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileRepo
- */
-
-/**
- * A repository for files accessible via the local filesystem.
- * Does not support database access or registration.
- *
- * This is a mostly a legacy class. New uses should not be added.
- *
- * @ingroup FileRepo
- * @deprecated since 1.19
- */
-class FSRepo extends FileRepo {
-       /**
-        * @param array $info
-        * @throws MWException
-        */
-       function __construct( array $info ) {
-               if ( !isset( $info['backend'] ) ) {
-                       // B/C settings...
-                       $directory = $info['directory'];
-                       $deletedDir = isset( $info['deletedDir'] )
-                               ? $info['deletedDir']
-                               : false;
-                       $thumbDir = isset( $info['thumbDir'] )
-                               ? $info['thumbDir']
-                               : "{$directory}/thumb";
-                       $transcodedDir = isset( $info['transcodedDir'] )
-                               ? $info['transcodedDir']
-                               : "{$directory}/transcoded";
-                       $fileMode = isset( $info['fileMode'] )
-                               ? $info['fileMode']
-                               : 0644;
-
-                       $repoName = $info['name'];
-                       // Get the FS backend configuration
-                       $backend = new FSFileBackend( [
-                               'name' => $info['name'] . '-backend',
-                               'wikiId' => wfWikiID(),
-                               'lockManager' => LockManagerGroup::singleton( wfWikiID() )->get( 'fsLockManager' ),
-                               'containerPaths' => [
-                                       "{$repoName}-public" => "{$directory}",
-                                       "{$repoName}-temp" => "{$directory}/temp",
-                                       "{$repoName}-thumb" => $thumbDir,
-                                       "{$repoName}-transcoded" => $transcodedDir,
-                                       "{$repoName}-deleted" => $deletedDir
-                               ],
-                               'fileMode' => $fileMode,
-                               'tmpDirectory' => wfTempDir()
-                       ] );
-                       // Update repo config to use this backend
-                       $info['backend'] = $backend;
-               }
-
-               parent::__construct( $info );
-
-               if ( !( $this->backend instanceof FSFileBackend ) ) {
-                       throw new MWException( "FSRepo only supports FSFileBackend." );
-               }
-       }
-}
index 66dab99..0e4b2f0 100644 (file)
@@ -99,7 +99,7 @@ class FileRepo {
         */
        protected $pathDisclosureProtection = 'simple';
 
-       /** @var bool Public zone URL. */
+       /** @var string|false Public zone URL. */
        protected $url;
 
        /** @var string The base thumbnail URL. Defaults to "<url>/thumb". */
@@ -309,7 +309,7 @@ class FileRepo {
         * @return bool Whether non-ASCII path characters are allowed
         */
        public function backendSupportsUnicodePaths() {
-               return ( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
+               return (bool)( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
        }
 
        /**
@@ -737,7 +737,7 @@ class FileRepo {
         * constructor, whereas local repositories use the local Title functions.
         *
         * @param string $name
-        * @return string
+        * @return string|false
         */
        public function getDescriptionUrl( $name ) {
                $encName = wfUrlencode( $name );
@@ -771,7 +771,7 @@ class FileRepo {
         *
         * @param string $name Name of image to fetch
         * @param string $lang Language to fetch it in, if any.
-        * @return string
+        * @return string|false
         */
        public function getDescriptionRenderUrl( $name, $lang = null ) {
                $query = 'action=render';
@@ -1059,7 +1059,7 @@ class FileRepo {
 
        /**
         * Pick a random name in the temp zone and store a file to it.
-        * Returns a FileRepoStatus object with the file Virtual URL in the value,
+        * Returns a Status object with the file Virtual URL in the value,
         * file can later be disposed using FileRepo::freeTemp().
         *
         * @param string $originalName The base name of the file as specified
@@ -1143,7 +1143,7 @@ class FileRepo {
         * Copy or move a file either from a storage path, virtual URL,
         * or file system path, into this repository at the specified destination location.
         *
-        * Returns a FileRepoStatus object. On success, the value contains "new" or
+        * Returns a Status object. On success, the value contains "new" or
         * "archived", to indicate whether the file was new with that name.
         *
         * Options to $options include:
@@ -1924,12 +1924,3 @@ class FileRepo {
                return $this->supportsSha1URLs;
        }
 }
-
-/**
- * FileRepo for temporary files created via FileRepo::getTempRepo()
- */
-class TempFileRepo extends FileRepo {
-       public function getTempRepo() {
-               throw new MWException( "Cannot get a temp repo from a temp repo." );
-       }
-}
index 4176c82..ca41718 100644 (file)
@@ -109,7 +109,7 @@ class ForeignAPIRepo extends FileRepo {
         *
         * @param Title $title
         * @param string|bool $time
-        * @return File
+        * @return File|false
         */
        function newFile( $title, $time = false ) {
                if ( $time ) {
index d47624f..2edd6d0 100644 (file)
@@ -334,7 +334,7 @@ class RepoGroup {
        /**
         * Get the repo instance by its name
         * @param string $name
-        * @return bool
+        * @return FileRepo|bool
         */
        function getRepoByName( $name ) {
                if ( !$this->reposInitialised ) {
diff --git a/includes/filerepo/TempFileRepo.php b/includes/filerepo/TempFileRepo.php
new file mode 100644 (file)
index 0000000..c9a6b59
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+/**
+ * FileRepo for temporary files created via FileRepo::getTempRepo()
+ */
+class TempFileRepo extends FileRepo {
+       public function getTempRepo() {
+               throw new MWException( "Cannot get a temp repo from a temp repo." );
+       }
+}
index 921e129..9a7a55b 100644 (file)
@@ -81,7 +81,7 @@ class ArchivedFile {
        /** @var string SHA-1 hash of file content */
        private $sha1;
 
-       /** @var string Number of pages of a multipage document, or false for
+       /** @var int|false Number of pages of a multipage document, or false for
         * documents which aren't multipage documents
         */
        private $pageCount;
@@ -496,7 +496,7 @@ class ArchivedFile {
         * Return the user name of the uploader.
         *
         * @deprecated since 1.23 Use getUser( 'text' ) instead.
-        * @return string
+        * @return string|int
         */
        public function getUserText() {
                wfDeprecated( __METHOD__, '1.23' );
@@ -511,7 +511,7 @@ class ArchivedFile {
        /**
         * Return upload description.
         *
-        * @return string
+        * @return string|int
         */
        public function getDescription() {
                $this->load();
index 9188cd9..be78462 100644 (file)
@@ -127,7 +127,7 @@ abstract class File implements IDBAccessObject {
        /** @var string Relative path including trailing slash */
        protected $hashPath;
 
-       /** @var string Number of pages of a multipage document, or false for
+       /** @var string|false Number of pages of a multipage document, or false for
         *    documents which aren't multipage documents
         */
        protected $pageCount;
@@ -535,7 +535,7 @@ abstract class File implements IDBAccessObject {
        /**
         * Get the duration of a media file in seconds
         *
-        * @return int
+        * @return float|int
         */
        public function getLength() {
                $handler = $this->getHandler();
@@ -909,7 +909,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param array $handlerParams
         *
-        * @return string
+        * @return ThumbnailImage|MediaTransformOutput|bool False on failure
         */
        function getUnscaledThumb( $handlerParams = [] ) {
                $hp =& $handlerParams;
@@ -1792,7 +1792,7 @@ abstract class File implements IDBAccessObject {
 
        /**
         * Move or copy a file to its public location. If a file exists at the
-        * destination, move it to an archive. Returns a FileRepoStatus object with
+        * destination, move it to an archive. Returns a Status object with
         * the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -1963,7 +1963,7 @@ abstract class File implements IDBAccessObject {
         * Returns the number of pages of a multipage document, or false for
         * documents which aren't multipage documents
         *
-        * @return bool|int
+        * @return string|bool|int
         */
        function pageCount() {
                if ( !isset( $this->pageCount ) ) {
@@ -1991,7 +1991,7 @@ abstract class File implements IDBAccessObject {
                if ( $srcWidth == 0 ) {
                        return 0;
                } else {
-                       return round( $srcHeight * $dstWidth / $srcWidth );
+                       return (int)round( $srcHeight * $dstWidth / $srcWidth );
                }
        }
 
@@ -2003,7 +2003,7 @@ abstract class File implements IDBAccessObject {
         *  a good reason. This method skips all caches.
         *
         * @param string $filePath The path to the file (e.g. From getLocalPathRef() )
-        * @return array The width, followed by height, with optionally more things after
+        * @return array|false The width, followed by height, with optionally more things after
         */
        function getImageSize( $filePath ) {
                if ( !$this->getHandler() ) {
@@ -2031,7 +2031,7 @@ abstract class File implements IDBAccessObject {
         * Get the HTML text of the description page, if available
         *
         * @param bool|Language $lang Optional language to fetch description in
-        * @return string
+        * @return string|false
         */
        function getDescriptionText( $lang = false ) {
                global $wgLang;
@@ -2122,7 +2122,7 @@ abstract class File implements IDBAccessObject {
        /**
         * Get the deletion archive key, "<sha1>.<ext>"
         *
-        * @return string
+        * @return string|false
         */
        function getStorageKey() {
                $hash = $this->getSha1();
index df50a67..c6c49b4 100644 (file)
@@ -121,7 +121,7 @@ class ForeignDBFile extends LocalFile {
 
        /**
         * @param bool|Language $lang Optional language to fetch description in.
-        * @return string
+        * @return string|false
         */
        function getDescriptionText( $lang = false ) {
                global $wgLang;
index 011ba87..16fe72d 100644 (file)
@@ -1572,7 +1572,7 @@ class LocalFile extends File {
 
        /**
         * Move or copy a file to its public location. If a file exists at the
-        * destination, move it to an archive. Returns a FileRepoStatus object with
+        * destination, move it to an archive. Returns a Status object with
         * the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -1590,7 +1590,7 @@ class LocalFile extends File {
        }
 
        /**
-        * Move or copy a file to a specified location. Returns a FileRepoStatus
+        * Move or copy a file to a specified location. Returns a Status
         * object with the archive name in the "value" member on success.
         *
         * The archive name should be passed through to recordUpload for database
@@ -2086,7 +2086,7 @@ class LocalFileDeleteBatch {
        /** @var bool Whether to suppress all suppressable fields when deleting */
        private $suppress;
 
-       /** @var FileRepoStatus */
+       /** @var Status */
        private $status;
 
        /** @var User */
@@ -2993,7 +2993,7 @@ class LocalFileMoveBatch {
        }
 
        /**
-        * Verify the database updates and return a new FileRepoStatus indicating how
+        * Verify the database updates and return a new Status indicating how
         * many rows would be updated.
         *
         * @return Status
@@ -3036,7 +3036,7 @@ class LocalFileMoveBatch {
        }
 
        /**
-        * Do the database updates and return a new FileRepoStatus indicating how
+        * Do the database updates and return a new Status indicating how
         * many rows where updated.
         */
        protected function doDBUpdates() {
index 3f0c932..f29c565 100644 (file)
@@ -34,4 +34,8 @@ class SlideshowImageGallery extends TraditionalImageGallery {
        protected function getModules() {
                return [ 'mediawiki.page.gallery.slideshow' ];
        }
+
+       public function setAdditionalOptions( $params ) {
+               $this->mAttribs['data-showthumbnails'] = isset( $params['showthumbnails'] );
+       }
 }
index 0f889da..1fd7b0a 100644 (file)
@@ -348,17 +348,3 @@ class TraditionalImageGallery extends ImageGalleryBase {
        protected function adjustImageParameters( $thumb, &$imageParameters ) {
        }
 }
-
-/**
- * Backwards compatibility. This always uses traditional mode
- * if called the old way, for extensions that may expect traditional
- * mode.
- *
- * @deprecated since 1.22 Use ImageGalleryBase::factory instead.
- */
-class ImageGallery extends TraditionalImageGallery {
-       function __construct( $mode = 'traditional' ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               parent::__construct( $mode );
-       }
-}
index 71ccaa3..e627cfd 100644 (file)
@@ -1047,6 +1047,7 @@ class HTMLForm extends ContextSource {
                        : 'application/x-www-form-urlencoded';
                # Attributes
                $attribs = [
+                       'class' => 'mw-htmlform',
                        'action' => $this->getAction(),
                        'method' => $this->getMethod(),
                        'enctype' => $encType,
@@ -1060,6 +1061,9 @@ class HTMLForm extends ContextSource {
                if ( $this->mName ) {
                        $attribs['name'] = $this->mName;
                }
+               if ( $this->needsJSForHtml5FormValidation() ) {
+                       $attribs['novalidate'] = true;
+               }
                return $attribs;
        }
 
@@ -1079,7 +1083,7 @@ class HTMLForm extends ContextSource {
 
                return Html::rawElement(
                        'form',
-                       $this->getFormAttributes() + [ 'class' => 'visualClear' ],
+                       $this->getFormAttributes(),
                        $html
                );
        }
@@ -1875,4 +1879,22 @@ class HTMLForm extends ContextSource {
        protected function getMessage( $value ) {
                return Message::newFromSpecifier( $value )->setContext( $this );
        }
+
+       /**
+        * Whether this form, with its current fields, requires the user agent to have JavaScript enabled
+        * for the client-side HTML5 form validation to work correctly. If this function returns true, a
+        * 'novalidate' attribute will be added on the `<form>` element. It will be removed if the user
+        * agent has JavaScript support, in htmlform.js.
+        *
+        * @return boolean
+        * @since 1.29
+        */
+       public function needsJSForHtml5FormValidation() {
+               foreach ( $this->mFlatFields as $fieldname => $field ) {
+                       if ( $field->needsJSForHtml5FormValidation() ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
 }
index 71aa275..487d6f6 100644 (file)
@@ -1034,7 +1034,7 @@ abstract class HTMLFormField {
         * with integer 0 as a value.
         *
         * @param array $array
-        * @return array
+        * @return array|string
         */
        public static function forceToStringRecursive( $array ) {
                if ( is_array( $array ) ) {
@@ -1194,4 +1194,19 @@ abstract class HTMLFormField {
        public function skipLoadData( $request ) {
                return !empty( $this->mParams['nodata'] );
        }
+
+       /**
+        * Whether this field requires the user agent to have JavaScript enabled for the client-side HTML5
+        * form validation to work correctly.
+        *
+        * @return boolean
+        * @since 1.29
+        */
+       public function needsJSForHtml5FormValidation() {
+               if ( $this->mHideIf ) {
+                       // This is probably more restrictive than it needs to be, but better safe than sorry
+                       return true;
+               }
+               return false;
+       }
 }
index 46b570d..54bdf04 100644 (file)
@@ -275,7 +275,7 @@ class OOUIHTMLForm extends HTMLForm {
 
        public function wrapForm( $html ) {
                $form = new OOUI\FormLayout( $this->getFormAttributes() + [
-                       'classes' => [ 'mw-htmlform-ooui' ],
+                       'classes' => [ 'mw-htmlform', 'mw-htmlform-ooui' ],
                        'content' => new OOUI\HtmlSnippet( $html ),
                ] );
 
index 5d9f7a0..325526b 100644 (file)
@@ -67,7 +67,7 @@ class VFormHTMLForm extends HTMLForm {
 
        protected function getFormAttributes() {
                $attribs = parent::getFormAttributes();
-               $attribs['class'] = [ 'mw-ui-vform', 'mw-ui-container', 'visualClear' ];
+               $attribs['class'] = [ 'mw-htmlform', 'mw-ui-vform', 'mw-ui-container' ];
                return $attribs;
        }
 
index 285490b..a19bd5a 100644 (file)
@@ -13,6 +13,9 @@
  *   of the value from 'default'. Overrides 'buttonlabel-raw'.
  * - buttonlabel-raw: HTMLto display for the button display text, instead
  *   of the value from 'default'.
+ * - formnovalidate: Set to true if clicking this button should suppress
+ *   client-side form validation. Used in HTMLFormFieldCloner for add/remove
+ *   buttons.
  *
  * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
  * bugs in those browsers. If detected, they will be served buttons using the
@@ -27,12 +30,18 @@ class HTMLButtonField extends HTMLFormField {
        /** @var array $mFlags Flags to add to OOUI Button widget */
        protected $mFlags = [];
 
+       protected $mFormnovalidate = false;
+
        public function __construct( $info ) {
                $info['nodata'] = true;
                if ( isset( $info['flags'] ) ) {
                        $this->mFlags = $info['flags'];
                }
 
+               if ( isset( $info['formnovalidate'] ) ) {
+                       $this->mFormnovalidate = $info['formnovalidate'];
+               }
+
                # Generate the label from a message, if possible
                if ( isset( $info['buttonlabel-message'] ) ) {
                        $this->buttonLabel = $this->getMessage( $info['buttonlabel-message'] )->parse();
@@ -71,6 +80,7 @@ class HTMLButtonField extends HTMLFormField {
                        'type' => $this->buttonType,
                        'name' => $this->mName,
                        'value' => $this->getDefault(),
+                       'formnovalidate' => $this->mFormnovalidate,
                ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
 
                if ( $this->isBadIE() ) {
@@ -127,6 +137,6 @@ class HTMLButtonField extends HTMLFormField {
                $request = $this->mParent
                        ? $this->mParent->getRequest()
                        : RequestContext::getMain()->getRequest();
-               return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
+               return (bool)preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
        }
 }
index b43080c..7b59a1d 100644 (file)
@@ -52,22 +52,16 @@ class HTMLDateTimeField extends HTMLTextField {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min ) {
                                $ret['min'] = $this->formatDate( $min );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-min'] = $ret['min'];
                        }
                }
                if ( in_array( 'max', $list ) && isset( $this->mParams['max'] ) ) {
                        $max = $this->parseDate( $this->mParams['max'] );
                        if ( $max ) {
                                $ret['max'] = $this->formatDate( $max );
-                               // Because Html::expandAttributes filters it out
-                               $ret['data-max'] = $ret['max'];
                        }
                }
 
                $ret['step'] = 1;
-               // Because Html::expandAttributes filters it out
-               $ret['data-step'] = 1;
 
                $ret['type'] = $this->mType;
                $ret['pattern'] = static::$patterns[$this->mType];
index a871584..8fb840a 100644 (file)
@@ -57,6 +57,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                if ( isset( $this->mParams['fields']['delete'] ) ) {
                        $class = 'mw-htmlform-cloner-delete-button';
                        $info = $this->mParams['fields']['delete'] + [
+                               'formnovalidate' => true,
                                'cssclass' => $class
                        ];
                        unset( $info['name'], $info['class'] );
@@ -96,6 +97,17 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        } else {
                                $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
                        }
+                       // Copy the hide-if rules to "child" fields, so that the JavaScript code handling them
+                       // (resources/src/mediawiki/htmlform/hide-if.js) doesn't have to handle nested fields.
+                       if ( $this->mHideIf ) {
+                               if ( isset( $info['hide-if'] ) ) {
+                                       // Hide child field if either its rules say it's hidden, or parent's rules say it's hidden
+                                       $info['hide-if'] = [ 'OR', $info['hide-if'], $this->mHideIf ];
+                               } else {
+                                       // Hide child field if parent's rules say it's hidden
+                                       $info['hide-if'] = $this->mHideIf;
+                               }
+                       }
                        $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
                        $fields[$fieldname] = $field;
                }
@@ -299,6 +311,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                : 'htmlform-cloner-delete';
                        $field = HTMLForm::loadInputFromParameters( $name, [
                                'type' => 'submit',
+                               'formnovalidate' => true,
                                'name' => $name,
                                'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
                                'cssclass' => 'mw-htmlform-cloner-delete-button',
@@ -371,6 +384,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        : 'htmlform-cloner-create';
                $field = HTMLForm::loadInputFromParameters( $name, [
                        'type' => 'submit',
+                       'formnovalidate' => true,
                        'name' => $name,
                        'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
                        'cssclass' => 'mw-htmlform-cloner-create-button',
index 05a2ba6..23044bd 100644 (file)
@@ -149,7 +149,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return string|array
         */
        public function loadDataFromRequest( $request ) {
                if ( $this->isSubmitAttempt( $request ) ) {
index d94eb8d..5ad7ee3 100644 (file)
@@ -49,7 +49,7 @@ class HTMLSizeFilterField extends HTMLIntField {
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return string|int
         */
        public function loadDataFromRequest( $request ) {
                $size = $request->getInt( $this->mName );
index e24541c..f58acbe 100644 (file)
@@ -6,7 +6,8 @@ class HTMLTagFilter extends HTMLFormField {
        protected $tagFilter;
 
        public function getTableRow( $value ) {
-               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               $this->tagFilter = ChangeTags::buildTagFilterSelector(
+                       $value, false, $this->mParent->getContext() );
                if ( $this->tagFilter ) {
                        return parent::getTableRow( $value );
                }
@@ -14,7 +15,8 @@ class HTMLTagFilter extends HTMLFormField {
        }
 
        public function getDiv( $value ) {
-               $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+               $this->tagFilter = ChangeTags::buildTagFilterSelector(
+                       $value, false, $this->mParent->getContext() );
                if ( $this->tagFilter ) {
                        return parent::getDiv( $value );
                }
index c3da746..b0b66ca 100644 (file)
@@ -187,6 +187,7 @@ class HTMLTextField extends HTMLFormField {
                        'name' => $this->mName,
                        'value' => $value,
                        'type' => $type,
+                       'dir' => $this->mDir,
                ] + $attribs );
        }
 
index 7fd3e83..f958ff6 100644 (file)
@@ -37,6 +37,12 @@ class CurlHttpRequest extends MWHttpRequest {
                return strlen( $content );
        }
 
+       /**
+        * @see MWHttpRequest::execute
+        *
+        * @throws MWException
+        * @return Status
+        */
        public function execute() {
                $this->prepare();
 
index 8255bb3..779d606 100644 (file)
@@ -142,7 +142,7 @@ class Http {
         * @return bool
         */
        public static function isValidURI( $uri ) {
-               return preg_match(
+               return (bool)preg_match(
                        '/^https?:\/\/[^\/\s]\S*$/D',
                        $uri
                );
index d8a9949..3f3803b 100644 (file)
@@ -94,6 +94,11 @@ class PhpHttpRequest extends MWHttpRequest {
                $this->fopenErrors += [ "errno$n" => $errno, "errstr$n" => $errstr ];
        }
 
+       /**
+        * @see MWHttpRequest::execute
+        *
+        * @return Status
+        */
        public function execute() {
                $this->prepare();
 
index e2e8dd5..8034400 100644 (file)
@@ -23,6 +23,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Imports a XML dump from a file (either from file upload, files on disk, or HTTP)
@@ -104,12 +105,21 @@ class ImportStreamSource implements ImportSource {
         * @return Status
         */
        static function newFromURL( $url, $method = 'GET' ) {
+               global $wgHTTPImportTimeout;
                wfDebug( __METHOD__ . ": opening $url\n" );
                # Use the standard HTTP fetch function; it times out
                # quicker and sorts out user-agent problems which might
                # otherwise prevent importing from large sites, such
                # as the Wikimedia cluster, etc.
-               $data = Http::request( $method, $url, [ 'followRedirects' => true ], __METHOD__ );
+               $data = Http::request(
+                       $method,
+                       $url,
+                       [
+                               'followRedirects' => true,
+                               'timeout' => $wgHTTPImportTimeout
+                       ],
+                       __METHOD__
+               );
                if ( $data !== false ) {
                        $file = tmpfile();
                        fwrite( $file, $data );
@@ -139,7 +149,8 @@ class ImportStreamSource implements ImportSource {
                # Look up the first interwiki prefix, and let the foreign site handle
                # subsequent interwiki prefixes
                $firstIwPrefix = strtok( $interwiki, ':' );
-               $firstIw = Interwiki::fetch( $firstIwPrefix );
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+               $firstIw = $interwikiLookup->fetch( $firstIwPrefix );
                if ( !$firstIw ) {
                        return Status::newFatal( 'importbadinterwiki' );
                }
index 328cdad..1769924 100644 (file)
@@ -45,6 +45,8 @@ class WikiImporter {
        private $importTitleFactory;
        /** @var array */
        private $countableCache = [];
+       /** @var bool */
+       private $disableStatisticsUpdate = false;
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
@@ -303,6 +305,14 @@ class WikiImporter {
                $this->mImportUploads = $import;
        }
 
+       /**
+        * Statistics update can cause a lot of time
+        * @since 1.29
+        */
+       public function disableStatisticsUpdate() {
+               $this->disableStatisticsUpdate = true;
+       }
+
        /**
         * Default per-page callback. Sets up some things related to site statistics
         * @param array $titleAndForeignTitle Two-element array, with Title object at
@@ -381,21 +391,23 @@ class WikiImporter {
                // suffers from issues of replica DB lag. We let WikiPage handle the total page
                // and revision count, and we implement our own custom logic for the
                // article (content page) count.
-               $page = WikiPage::factory( $title );
-               $page->loadPageData( 'fromdbmaster' );
-               $content = $page->getContent();
-               if ( $content === null ) {
-                       wfDebug( __METHOD__ . ': Skipping article count adjustment for ' . $title .
-                               ' because WikiPage::getContent() returned null' );
-               } else {
-                       $editInfo = $page->prepareContentForEdit( $content );
-                       $countKey = 'title_' . $title->getPrefixedText();
-                       $countable = $page->isCountable( $editInfo );
-                       if ( array_key_exists( $countKey, $this->countableCache ) &&
-                               $countable != $this->countableCache[$countKey] ) {
-                               DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [
-                                       'articles' => ( (int)$countable - (int)$this->countableCache[$countKey] )
-                               ] ) );
+               if ( !$this->disableStatisticsUpdate ) {
+                       $page = WikiPage::factory( $title );
+                       $page->loadPageData( 'fromdbmaster' );
+                       $content = $page->getContent();
+                       if ( $content === null ) {
+                               wfDebug( __METHOD__ . ': Skipping article count adjustment for ' . $title .
+                                       ' because WikiPage::getContent() returned null' );
+                       } else {
+                               $editInfo = $page->prepareContentForEdit( $content );
+                               $countKey = 'title_' . $title->getPrefixedText();
+                               $countable = $page->isCountable( $editInfo );
+                               if ( array_key_exists( $countKey, $this->countableCache ) &&
+                                       $countable != $this->countableCache[$countKey] ) {
+                                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [
+                                               'articles' => ( (int)$countable - (int)$this->countableCache[$countKey] )
+                                       ] ) );
+                               }
                        }
                }
 
index 1e866f3..23db3e2 100644 (file)
@@ -315,12 +315,8 @@ class WikiRevision {
 
        /**
         * @return string
-        *
-        * @deprecated Since 1.21, use getContent() instead.
         */
        function getText() {
-               wfDeprecated( __METHOD__, '1.21' );
-
                return $this->text;
        }
 
index 03f9974..9c87cf0 100644 (file)
@@ -567,7 +567,7 @@ abstract class Installer {
        /**
         * Determine if LocalSettings.php exists. If it does, return its variables.
         *
-        * @return array
+        * @return array|false
         */
        public static function getExistingLocalSettings() {
                global $IP;
@@ -1080,7 +1080,7 @@ abstract class Installer {
        /**
         * Convert a hex string representing a Unicode code point to that code point.
         * @param string $c
-        * @return string
+        * @return string|false
         */
        protected function unicodeChar( $c ) {
                $c = hexdec( $c );
@@ -1421,6 +1421,7 @@ abstract class Installer {
                $wgAutoloadClasses += $data['autoload'];
 
                $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
+                       /** @suppress PhanUndeclaredVariable $wgHooks is set by DefaultSettings */
                        $wgHooks['LoadExtensionSchemaUpdates'] : [];
 
                if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
@@ -1655,8 +1656,13 @@ abstract class Installer {
         */
        protected function createMainpage( DatabaseInstaller $installer ) {
                $status = Status::newGood();
+               $title = Title::newMainPage();
+               if ( $title->exists() ) {
+                       $status->warning( 'config-install-mainpage-exists' );
+                       return $status;
+               }
                try {
-                       $page = WikiPage::factory( Title::newMainPage() );
+                       $page = WikiPage::factory( $title );
                        $content = new WikitextContent(
                                wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
                                wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
index a9e3e85..697188e 100644 (file)
@@ -109,7 +109,7 @@ class LocalSettingsGenerator {
         *
         * @param string $string
         *
-        * @return string
+        * @return string|false
         */
        public static function escapePhpString( $string ) {
                if ( is_array( $string ) || is_object( $string ) ) {
index 1175e9e..968ee15 100644 (file)
@@ -94,6 +94,9 @@ class MssqlUpdater extends DatabaseUpdater {
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                ];
        }
 
index 5ff47e9..7269773 100644 (file)
@@ -312,7 +312,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                'IS_GRANTABLE' => 1,
                        ], __METHOD__ );
                foreach ( $res as $row ) {
-                       $regex = $conn->likeToRegex( $row->TABLE_SCHEMA );
+                       $regex = $this->likeToRegex( $row->TABLE_SCHEMA );
                        if ( preg_match( $regex, $this->getVar( 'wgDBname' ) ) ) {
                                unset( $grantOptions[$row->PRIVILEGE_TYPE] );
                        }
@@ -325,6 +325,19 @@ class MysqlInstaller extends DatabaseInstaller {
                return true;
        }
 
+       /**
+        * Convert a wildcard (as used in LIKE) to a regex
+        * Slashes are escaped, slash terminators included
+        */
+       protected function likeToRegex( $wildcard ) {
+               $r = preg_quote( $wildcard, '/' );
+               $r = strtr( $r, [
+                       '%' => '.*',
+                       '_' => '.'
+               ] );
+               return "/$r/s";
+       }
+
        /**
         * @return string
         */
index a637ce0..d95222c 100644 (file)
@@ -291,6 +291,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
                        [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                ];
        }
 
index e1e0d0f..1f0e411 100644 (file)
@@ -119,6 +119,9 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
 
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
 
index 790fbe7..1eb3f41 100644 (file)
@@ -443,6 +443,11 @@ class PostgresUpdater extends DatabaseUpdater {
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('change_tag_ct_id_seq')" ],
                        [ 'addPgField', 'tag_summary', 'ts_id',
                                "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('tag_summary_ts_id_seq')" ],
+
+                       // 1.29
+                       [ 'addPgField', 'externallinks', 'el_index_60', "BYTEA NOT NULL DEFAULT ''" ],
+                       [ 'addPgIndex', 'externallinks', 'el_index_60', '( el_index_60, el_id )' ],
+                       [ 'addPgIndex', 'externallinks', 'el_from_index_60', '( el_from, el_index_60, el_id )' ],
                ];
        }
 
index 388c034..32068e6 100644 (file)
@@ -158,6 +158,9 @@ class SqliteUpdater extends DatabaseUpdater {
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
+
+                       // 1.29
+                       [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                ];
        }
 
index 6fb8927..84c580f 100644 (file)
@@ -10,7 +10,8 @@
                        "محمد أحمد عبد الفتاح",
                        "Maroen1990",
                        "Super ninja2",
-                       "Zpizza"
+                       "Zpizza",
+                       "ديفيد"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-env-hhvm": "نصبت HHVM $1.",
+       "config-outdated-sqlite": "<strong>تحذير:</strong> لديك SQLite $1, which وهو أقل من الحد الأدنى المطلوب للنسخة $2. SQLite سوف يكون غير متوفر.",
+       "config-xcache": "تثبيت [http://xcache.lighttpd.net/ XCache]",
+       "config-apc": "تثبيت [http://www.php.net/apc APC]",
+       "config-apcu": "تثبيت [http://www.php.net/apcu APCu]",
+       "config-wincache": "تثبيت [http://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-diff3-bad": "جنو diff3 غير موجود.",
+       "config-imagemagick": "تم العثور على ImageMagick: <code>$1</code>.\nسيتم تمكين تصغير الصور إذا قمت بتمكين التحميل.",
+       "config-no-scaling": "لا يمكن أن تجد مكتبة GD أو ImageMagick; سيتم تعطيل تصغير الصور.",
+       "config-no-uri": "<strong>خطأ:</strong>  لا يمكن أن تحدد URI الحالي.تم  إحباط التثبيت.",
+       "config-using-server": "باستخدام اسم الخادم \"<nowiki>$1</nowiki\".",
+       "config-using-uri": "باستخدام URL الخادم \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "نوع قاعدة البيانات:",
        "config-db-host": "مضيف قاعدة البيانات:",
+       "config-db-host-oracle": "قاعدة بيانات TNS:",
        "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-name": "اسم قاعدة البيانات",
+       "config-db-name-help": "اختر الاسم الذي يعرف الويكي الخاص بك. لا يجب أن يحتوي على مسافات. إذا كنت تستخدم استضافة المواقع المشتركة، مزود الاستضافة إما سيعطيك اسم قاعدة بيانات محددة لاستخدامها أو سيتيح لك إنشاء قواعد بيانات عن طريق لوحة التحكم.",
        "config-db-name-oracle": "سكيما قاعدة البيانات:",
        "config-db-install-account": "حساب المستخدم للتنصيب",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
+       "config-db-install-username": "أدخل اسم المستخدم الذي سيتم استخدامه للاتصال بقاعدة البيانات أثناء عملية التثبيت. هذا ليس اسم مستخدم لحساب ميدياويكي. هذا اسم مستخدم لقاعدة البيانات الخاصة بك.",
+       "config-db-install-password": "أدخل كلمة المرور التي سيتم استخدامها للاتصال بقاعدة البيانات أثناء عملية التثبيت. ليست هذه كلمة مرور لحساب ميدياويكي. هذه كلمة مرور لقاعدة البيانات الخاصة بك.",
+       "config-db-install-help": "أدخل اسم المستخدم وكلمة المرور الذين سيتم استخدامهما للاتصال بقاعدة البيانات أثناء عملية التثبيت.",
+       "config-db-account-lock": "استخدم نفس اسم المستخدم وكلمة المرور أثناء التشغيل العادي",
+       "config-db-wiki-account": "حساب المستخدم للتشغيل العادي",
+       "config-db-wiki-help": "أدخل اسم المستخدم وكلمة المرور التي سيتم استخدامهما للاتصال بقاعدة البيانات أثناء عملية الويكي العادية. في حالة عدم وجود حساب وتثبيت الحساب لديه امتيازات كافية، سيتم إنشاء حساب المستخدم هذا مع الحد الأدنى من الامتيازات المطلوبة لتشغيل الويكي.",
        "config-db-prefix": "بادئة جدول قاعدة البيانات:",
+       "config-db-prefix-help": "إذا كنت بحاجة إلى مشاركة قاعدة بيانات واحدة بين ويكيات متعددة، أو بين ميدياويكي وتطبيق آخر على شبكة الإنترنت، يمكنك الاختيار لإضافة بادئة لجميع أسماء الجداول لتجنب النزاعات. لا تستخدم مسافات. وعادة ما يتم ترك هذا الحقل فارغا.",
+       "config-mysql-old": "MySQL $1 أو لاحق مطلوب.لديك $2.",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-db-schema": "سكيما لميدياويكي",
+       "config-db-schema-help": "هذا المخطط عادة يكون على ما يرام. غيره إذا كنت تعرف أنك في حاجة إلى هذا فقط.",
+       "config-pg-test-error": "لا يمكن الاتصال بقاعدة البيانات <strong>$1</strong>: $2",
+       "config-sqlite-dir": "دليل بيانات SQLite:",
+       "config-oracle-def-ts": "جدولية افتراضية:",
+       "config-oracle-temp-ts": "جدولية مؤقتة:",
        "config-type-mysql": "MySQL (أو متوافق)",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
        "config-type-mssql": "خادم SQL لميكروسوفت",
+       "config-support-info": "ميدياويكي يدعم نظم قواعد البيانات التالية: $1 إذا كنت لا ترى نظام قاعدة البيانات الذي تحاول استخدامه مدرجًا أدناه، اتبع الإرشادات المرتبطة فوق لتمكين الدعم.",
        "config-header-mysql": "إعدادات MySQL",
        "config-header-postgres": "إعدادات PostgreSQL",
        "config-header-sqlite": "إعدادات SQLite",
        "config-header-oracle": "إعدادات أوراكل",
+       "config-header-mssql": "إعدادات خادم Microsoft SQL",
        "config-invalid-db-type": "نوع قاعدة بيانات غير صحيح",
+       "config-missing-db-name": "يجب عليك إدخال قيمة ل\"{{int:config-db-name}}\".",
+       "config-missing-db-server-oracle": "يجب عليك إدخال قيمة ل\"{{int:config-db-host-oracle}}\".",
+       "config-connection-error": "$1.\nتحقق من المضيف، واسم المستخدم وكلمة المرور وحاول مرة أخرى.",
+       "config-db-sys-create-oracle": "المثبت يعتمد باستخدام حساب SYSDBA فقط لإنشاء حساب جديد.",
+       "config-db-sys-user-exists-oracle": "حساب المستخدم \"$1\" موجود بالفعل; يمكن استخدام SYSDBA لإنشاء حساب جديد فقط!",
+       "config-postgres-old": "PostgreSQL $1 أو لاحق مطلوب. لديك $2.",
+       "config-mssql-old": "خادم Microsoft SQL $1 أو لاحق مطلوب. لديك $2.",
+       "config-sqlite-mkdir-error": "خطأ في إنشاء دليل البيانات \"$1\". تحقق من الموقع وحاول مرة أخرى.",
+       "config-sqlite-connection-error": "1$.\nتحقق من اسم دليل البيانات وقواعد البيانات أدناه وحاول مرة أخرى.",
+       "config-sqlite-readonly": "الملف <code>$1</code> غير قابل للكتابة.",
+       "config-sqlite-cant-create-db": "لا يمكن إنشاء ملف قاعدة البيانات <code>$1</code>.",
+       "config-can-upgrade": "هناك جداول ميدياويكي في قاعدة البيانات هذه. للارتقاء بها إلى ميدياويكي $1; انقر على <strong>متابعة</strong>.",
+       "config-regenerate": "إعادة تكوين LocalSettings.php ←",
+       "config-show-table-status": "<code> إظهار جدول الحالة </code> فشل الاستعلام!",
+       "config-unknown-collation": "<strong>تحذير:</strong> قاعدة بيانات يستخدم ترتيبا غير معروف.",
        "config-db-web-account": "حساب قاعدة البيانات للوصول عبر الوب",
+       "config-db-web-help": "حدد اسم المستخدم وكلمة المرور التي سيستخدمهما خادم الويب للاتصال بخادم قاعدة البيانات، أثناء عملية الويكي العادية.",
        "config-db-web-account-same": "استعمل نفس الحساب للتنصيب",
        "config-db-web-create": "إنشئ حساب إذا لم يكن موجودا بالفعل",
        "config-db-web-no-create-privs": "الحساب الذي حددته لتركيب ليس لديه امتيازات كافية لإنشاء حساب.\nالحساب الذي حددته هنا موجود بالفعل.",
        "config-mysql-binary": "ثنائي",
        "config-mysql-utf8": "يو تي إف-8",
        "config-mssql-auth": "نوع الاستيثاق:",
+       "config-mssql-sqlauth": "مصادقة خادم SQL",
+       "config-mssql-windowsauth": "مصادقة ويندوز",
        "config-site-name": "اسم الويكي:",
        "config-site-name-blank": "أدخل اسم موقع.",
        "config-project-namespace": "نطاق المشروع:",
        "config-ns-site-name": "مثل اسم الويكي: $1",
        "config-ns-other": "أخرى (حدد)",
        "config-ns-other-default": "ماي ويكي",
+       "config-ns-invalid": "النطاق المحدد \"<nowiki>$1</nowiki>\" غير صالح.\nحدد نطاق مشروع مختلف.",
+       "config-ns-conflict": "النطاق المحدد \"<nowiki>$1</ nowiki>\" يتعارض مع نطاق ميدياويكي الافتراضي. حدد نطاق مشروع مختلف.",
        "config-admin-box": "حساب إداري",
        "config-admin-name": "اسم المستخدم:",
        "config-admin-password": "كلمة السر:",
        "config-admin-password-confirm": "كلمة المرور مرة أخرى:",
+       "config-admin-help": "أدخل اسم المستخدم المفضل لديك هنا، على سبيل المثال \"جو أشرف فاروق\". هذا هو الاسم الذي ستستخدمه لتسجيل الدخول إلى الويكي.",
        "config-admin-name-blank": "أدخل اسم مستخدم لإداري.",
+       "config-admin-name-invalid": "اسم المستخدم المحدد \"<nowiki>$1</ nowiki>\" غير صالح. حدد اسم مستخدم مختلفا.",
+       "config-admin-password-blank": "أدخل كلمة مرور حساب الإداري.",
        "config-admin-password-mismatch": "كلمات السر اثنين التي أدخلتها لا تتطابق.",
        "config-admin-email": "عنوان البريد الإلكتروني:",
        "config-admin-email-help": "إدخال عنوان البريد الإلكتروني هنا ليسمح لك لتلقي البريد الإلكتروني من المستخدمين الآخرين على ويكي، إعادة تعيين كلمة المرور الخاصة بك، ويتم إخطار من التغييرات للصفحات في قائمة مراقبتك. يمكنك ترك هذا الحقل فارغا.",
+       "config-admin-error-user": "خطأ داخلي عند إنشاء إداري باسم \"<nowiki>$1</ nowiki>\".",
+       "config-admin-error-password": "خطأ داخلي عند عند وضع كلمة مرور للإداري \"<nowiki>$1</nowiki>\": <pre>$2</pre>.",
        "config-admin-error-bademail": "لقد قمت بإدخال عنوان البريد الإلكتروني غير صالح.",
+       "config-subscribe": "اشترك في [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce نشر إعلانات القائمة البريدية].",
+       "config-subscribe-noemail": "حاولت الاشتراك في القائمة البريدية الخاصة بإصدار إعلانات دون تقديم عنوان بريد إلكتروني. يُرجَى إدخال عنوان بريد إلكتروني إذا كنت ترغب في الاشتراك في القائمة البريدية.",
+       "config-pingback": "تبادل البيانات حول هذا التثبيت مع مطوري ميدياويكي.",
+       "config-almost-done": "لقد شارفت على الانتهاء! يمكنك الآن تخطي التكوين المتبقي وتثبيت الويكي الآن.",
        "config-optional-continue": "اسألني المزيد من الأسئلة",
        "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي",
        "config-profile": "ملف صلاحيات المستخدم:",
        "config-license-cc-by-sa": "المشاع الإبداعي النسبة للمؤلف المشاركة بالمثل",
        "config-license-cc-by": "المشاع الإبداعي النسبة للمؤلف",
        "config-license-cc-by-nc-sa": "المشاع الإبداعي النسبة للمؤلف غير تجاري المشاركة بالمثل",
+       "config-license-cc-0": "المشاع الإبداعي صفر (ملكية عامة)",
+       "config-license-gfdl": "رخصة جنو للوثائق الحرة 1.3 أو لاحقة",
        "config-license-pd": "ملكية عامة",
        "config-license-cc-choose": "اختر ترخيص مشاع إبداعي مخصص",
        "config-email-settings": "إعدادات البريد الإلكتروني",
        "config-enable-email": "تمكين البريد الإلكتروني الصادرة",
+       "config-enable-email-help": "إذا كنت تريد إرسال بريد إلكتروني إلى العمل، [http://www.php.net/manual/en/mail.configuration.php إعدات بريد PHP's] تحتاج لأن يتم تكوينها بشكل صحيح. إذا كنت لا تريد أيا من ميزات البريد الإلكتروني، يمكنك تعطيلها هنا.",
        "config-email-user": "تفعيل البريد الإلكتروني من المستخدم إلى مستخدم آخر",
        "config-email-user-help": "يتيح لكل المستخدمين إرسال رسائل بريد إلكتروني إلى بعضهم البعض إذا فعَّلوا هذا الخيار في تفضيلاتهم.",
        "config-email-usertalk": "فعل إخطارات صفحات نقاش المستخدمين",
+       "config-email-usertalk-help": "السماح للمستخدمين بتلقي الإخطارات بشأن تغييرات صفحة نقاش المستخدم، إذا كانوا قد مكنوها في تفضيلاتهم.",
        "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-email-watchlist-help": "السماح للمستخدمين بالحصول على إشعارات حول صفحاتهم المراقبة إذا كانوا قد مكنوها في تفضيلاتهم.",
        "config-email-auth": "تمكين مصادقة البريد الإلكتروني",
        "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
        "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-deleted": "المجلد للملفات المحذوفة:",
        "config-logo": "مسار الشعار:",
        "config-instantcommons": "تمكين الاستخدام الفوري لويكيميديا كومنز InstantCommons",
+       "config-cc-error": "لم يعطِ منتقي رخصة المشاع الإبداعي أية نتيجة; أدخل اسم الترخيص يدويا.",
        "config-cc-again": "اختر مجددًا",
+       "config-cc-not-chosen": "اختر أي ترخيص تريده ثم اضغط على \"متابعة\".",
        "config-advanced-settings": "ضبط متقدم",
        "config-cache-options": "إعدادات التخزين المؤقت الكائن:",
+       "config-cache-none": "لا يوجد تخزين مؤقت (لم تتم إزالة أية وظيفة، لكن قد تتأثر السرعة على مواقع ويكي أكبر)",
+       "config-cache-accel": "كائن التخزين المؤقت PHP (APC أو APCu أو  XCache أو WinCache)",
        "config-extensions": "امتدادات",
+       "config-extensions-help": "تم الكشف عن الملحقات المذكورة أعلاه في دليل <code>./ملحقاتك</code>، ويمكن أن يتطلب تكوينا إضافيا، ولكن يمكنك تمكينها الآن.",
        "config-skins": "الواجهات",
        "config-skins-use-as-default": "استخدم هذه الواجهة كافتراضية",
+       "config-install-alreadydone": "<strong>تحذير:</strong> يبدو أنك قد قمت بالفعل بتثبيت ميدياويكي وتحاول تثبيته مرة أخرى. الرجاء التوجه إلى الصفحة التالية.",
+       "config-install-begin": "عن طريق الضغط على \"{{int:config-continue}}\"، سوف تبدأ تثبيت ميدياويكي. إذا كنت لا تزال ترغب في إجراء تغييرات، اضغط على \"{{int:config-back}}\".",
        "config-install-step-done": "نفذ",
        "config-install-step-failed": "فشل",
        "config-install-extensions": "متضمنا الامتدادات",
        "config-install-database": "إنشاء قاعدة البيانات",
        "config-install-schema": "إنشاء السكيما",
+       "config-install-pg-schema-not-exist": "مخطط PostgreSQL غير موجود.",
        "config-install-pg-commit": "تنفيذ التغييرات",
+       "config-install-pg-plpgsql": "التحقق من لغة PL/pgSQL",
+       "config-pg-no-plpgsql": "تحتاج إلى تثبيت لغة PL/pgSQL في قاعدة البيانات $1",
+       "config-pg-no-create-privs": "الحساب الذي حددته للتنزيل ليست لديه امتيازات كافية لإنشاء حساب.",
        "config-install-user": "إنشاء مستخدم قاعدة البيانات",
        "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
        "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
+       "config-install-user-grant-failed": "منح الصلاحية للمستخدم \"$1\" فشل: $2",
        "config-install-user-missing": "المستخدم المحدد \"$1\" غير موجود",
+       "config-install-user-missing-create": "المستخدم المحدد \"$1\" غير موجود. يُرجَى النقر على مربع \"إنشاء حساب\" أدناه إذا كنت تريد إنشاءه.",
        "config-install-tables": "إنشاء الجداول",
+       "config-install-tables-exist": "<strong>تحذير:</strong> يبدو أن جداول ميدياويكي موجودة بالفعل; تخطي الإنشاء.",
+       "config-install-tables-failed": "<strong>خطأ:</strong> فشل إنشاء الجدول بسبب الخطأ التالي: $1",
+       "config-install-interwiki": "ملء جدول الإنترويكي الإفتراضي",
+       "config-install-interwiki-list": "لا يمكن قراءة الملف <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>تحذير:</strong> يبدو أن جدول الإنترويكي به إدخالات بالفعل. تخطي القائمة الافتراضي.",
        "config-install-stats": "بدء الإحصاءات",
        "config-install-keys": "توليد المفاتيح السرية",
+       "config-insecure-keys": "<strong>تحذير:</strong> {{PLURAL:$2|مفتاح الأمان|مفاتيح الأمان}} ($1) التي تم إنشاؤها أثناء التثبيت ليست آمنة تماما; جرب تغيير{{PLURAL:$2|ه|هم}} يدويا.",
        "config-install-updates": "منع تشغيل التحديثات غير الضرورية",
+       "config-install-updates-failed": "<strong>خطأ:</strong> إدخال مفاتيح التحديث إلى الجداول فشلت بسبب الخطأ التالي: $1",
        "config-install-sysop": "إنشاء حساب مستخدم إداري",
+       "config-install-subscribe-fail": "غير قادر على الاشتراك في ميدياويكي-إعلان: $1",
+       "config-install-subscribe-notpossible": "لم يتم تثبيت cURL و <code>allow_url_fopen</code> غير متوفر.",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
        "config-install-extension-tables": "إنشاء جداول للامتدادات المفعلة",
        "config-install-mainpage-failed": "لم يتمكن من إدراج الصفحة الرئيسية: $1",
index 8e1442a..a455879 100644 (file)
@@ -17,5 +17,5 @@
        "config-page-options": "Настройкі",
        "config-upload-settings": "Загрузка выяў і файлаў",
        "mainpagetext": "<strong>MediaWiki паспяхова ўсталяваная.</strong>",
-       "mainpagedocfooter": "Гл. [https://meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]"
+       "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 ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на Вашу мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца са спамам у Вашай вікі]"
 }
index 5cdb83f..4a1ed65 100644 (file)
@@ -4,7 +4,8 @@
                        "DCLXVI",
                        "아라",
                        "StanProg",
-                       "Vodnokon4e"
+                       "Vodnokon4e",
+                       "Seb35"
                ]
        },
        "config-desc": "Инсталатор на МедияУики",
@@ -53,7 +54,7 @@
        "config-unicode-using-intl": "Използване на разширението [http://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
        "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
        "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
-       "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysql</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php5-mysql</code>.",
+       "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysqli</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Предупреждение:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
        "config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
        "config-type-mssql": "Microsoft SQL сървър",
        "config-support-info": "МедияУики поддържа следните системи за бази от данни:\n\n$1\n\nАко не виждате желаната за използване система в списъка по-долу, следвайте инструкциите за активиране на поддръжка по-горе.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е най-важна за МедияУики и се поддържа най-добре. МедияУики работи също така с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], които са съвместими с MySQL.\n([http://www.php.net/manual/bg/mysqli.installation.php Как се компилира PHP с поддръжка на MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популярна система за управление на бази от данни, алтернатива на MySQL. Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.([http://www.php.net/manual/bg/pgsql.installation.php Как се компилира PHP с поддръжка на PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популярна система за управление на бази от данни, алтернатива на MySQL. ([http://www.php.net/manual/bg/pgsql.installation.php Как се компилира PHP с поддръжка на PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е олекотена система за бази от данни, която е много добре поддържана. ([http://www.php.net/manual/bg/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] е комерсиална корпоративна база от данни за Windows. ([http://www.php.net/manual/bg/sqlsrv.installation.php Как да се компилира PHP с поддръжка на SQLSRV])",
        "config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
        "config-extension-link": "Знаете ли, че това уики поддържа [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [https://www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
        "mainpagetext": "<strong>МедияУики беше успешно инсталирано.</strong>",
-       "mainpagedocfooter": "Разгледайте [https://meta.wikimedia.org/wiki/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/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
+       "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/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
 }
index 316ed3f..9f24ec6 100644 (file)
@@ -8,7 +8,8 @@
                        "Matěj Grabovský",
                        "Paxt",
                        "Matěj Suchánek",
-                       "LordMsz"
+                       "LordMsz",
+                       "Seb35"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].",
        "config-unicode-pure-php-warning": "<strong>Upozornění:</strong> Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v čistém PHP.\nPokud provozujete wiki s velkou návštěvností, měli byste si přečíst něco o [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizaci Unicode].",
        "config-unicode-update-warning": "<strong>Upozornění:</strong> Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ji aktualizovat].",
-       "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php5-mysql</code>.",
+       "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysqli</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Upozornění:</strong> Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
        "config-no-fts3": "<strong>Upozornění:</strong> SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
        "config-pcre-old": "<strong>Kritická chyba:</strong> Je vyžadováno PCRE verze $1 nebo novější.\nVaše binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]",
index c80d54e..68b4720 100644 (file)
@@ -4,7 +4,8 @@
                        "Erdemaslancan",
                        "Mirzali",
                        "Marmase",
-                       "Kumkumuk"
+                       "Kumkumuk",
+                       "Gambollar"
                ]
        },
        "config-desc": "Qandé MediaWiki sazi",
@@ -26,7 +27,7 @@
        "config-page-install": "Bar ke",
        "config-page-complete": "Temamyayo",
        "config-page-restart": "Barkerdışi fına ser kı",
-       "config-page-readme": "Mı bıwane",
+       "config-page-readme": "Mı bıwan",
        "config-page-releasenotes": "Notë versiyoni",
        "config-page-copying": "Kopyayeno",
        "config-page-upgradedoc": "Berzkerdış",
index 95d2ba3..db92652 100644 (file)
        "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
        "config-install-mainpage": "Creating main page with default content",
+       "config-install-mainpage-exists": "Main page already exists, skipping",
        "config-install-extension-tables": "Creating tables for enabled extensions",
        "config-install-mainpage-failed": "Could not insert main page: $1",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
index 4398492..c401832 100644 (file)
@@ -32,7 +32,8 @@
                        "Indiralena",
                        "Peter Bowman",
                        "Dgstranz",
-                       "Irus"
+                       "Irus",
+                       "Tinss"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki es compatible con los siguientes sistemas de bases de datos:\n\n$1\n\nSi no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones enlazadas arriba para activar la compatibilidad.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad. MediaWiki también funciona con [{{int:version-db-mariadb-url}} MariaDB] y [{{int:version-db-percona-url}} Percona Server], que son compatibles con MySQL. ([http://www.php.net/manual/es/mysql.installation.php Cómo compilar PHP con compatibilidad MySQL])",
-       "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. Pueden haber algunos fallos menores destacables, y no es recomendable para su uso en un entorno de producción. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
+       "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es una base de datos comercial a nivel empresarial para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con soporte para SQLSRV])",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [https://www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "<strong>MediaWiki se ha instalado.</strong>",
-       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende cómo combatir el spam en tu wiki]"
+       "mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki a tu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende a combatir el spam en tu wiki]"
 }
index f812471..7690b01 100644 (file)
        "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
        "config-help": "Laguntza",
        "config-help-tooltip": "sakatu zabaltzeko",
-       "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
+       "mainpagetext": "<strong>MediaWiki instalatu da.</strong>",
        "mainpagedocfooter": "Ikus [https://meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
 }
index d1ba15a..5275548 100644 (file)
@@ -14,7 +14,8 @@
                        "Macofe",
                        "درفش کاویانی",
                        "Hamisun",
-                       "Alifakoor"
+                       "Alifakoor",
+                       "Seb35"
                ]
        },
        "config-desc": "نصب کنندهٔ مدیاویکی",
@@ -54,7 +55,7 @@
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
        "config-restart": "بله، دوباره شروع کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
-       "config-copyright": "=== حق رونوشت و شرایط ===\n\n$1\n\nاین برنامه، نرم‌افزاری آزاد است. می‌توانید تحت شرایط نگارش ۲ یا (بنا به نظر خود) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، بازنشرش کرده و/یا تغییرش دهید.\n\n\nاین برنامه با این امید توزیع شده که مفید باشد، ولی <strong>بدون هیچ ضمانتی</strong>، حتا ضمانت ضمنی <strong>معامله‌پذیری</strong> یا <strong>تناسب برای کاربردی خاص </strong>.\n\nبرای جزئیات بیشتر، پروانهٔ جامع همگانی گنو را ببینید.\n\n\nباید همراه این برنامه، <doclink href=Copying>نگارشی از پروانهٔ جامع همگانی گنو</doclink> را گرفته باشید. اگر چنین نیست، با بنیاد نرم‌افزار آزاد به نشانی 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA مکاتبه کرده یا [http://www.gnu.org/copyleft/gpl.html پروانه را برخط بخوانید].",
+       "config-copyright": "=== حق رونوشت و شرایط ===\n\n$1\n\nاین برنامه، نرم‌افزاری آزاد است. می‌توانید تحت شرایط نگارش ۲ یا (بنا به نظر خود) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، بازنشرش کرده و/یا تغییرش دهید.\n\n\nاین برنامه با این امید توزیع شده که مفید باشد، ولی <strong>بدون هیچ ضمانتی</strong>، حتا ضمانت ضمنی <strong>معامله‌پذیری</strong> یا <strong>تناسب برای کاربردی خاص </strong>.\n\nبرای جزئیات بیشتر، پروانهٔ جامع همگانی گنو را ببینید.\n\n\nباید همراه این برنامه، <doclink href=Copying>نگارشی از پروانهٔ جامع همگانی گنو</doclink> را گرفته باشید. اگر چنین نیست، با بنیاد نرم‌افزار آزاد به نشانی 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA مکاتبه کرده یا [http://www.gnu.org/copyleft/gpl.html پروانه را برخط بخوانید].",
        "config-sidebar": "* [https://www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
@@ -63,7 +64,7 @@
        "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl افزونهٔ intl برای PECL] استفاده کنید.",
        "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\n\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
        "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\n\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
-       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysqli</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
        "config-imagemagick": "ایمیج‌مجیک پیدا شد: <code>$1</code>.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.",
        "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.",
        "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.",
-       "config-no-uri": "'''خطا:''' یوآرآی فعلی را نتوانست مشخص کند.\nنصب نافرجام ماند.",
+       "config-no-uri": "'''خطا:''' یوآرآی فعلی را نتوانست مشخص کند.\nنصب شکست خورد.",
        "config-no-cli-uri": "<strong>هشدار:</strong> هیچ اسکریپت‌پتی تعیین نشده، از پیش‌فرض استفاده کنید:\n<code>$1</code>.",
        "config-using-server": "از اسم سرور \"<nowiki>$1</nowiki>\" استفاده کنید.",
        "config-using-uri": "از اسم سرور \"<nowiki>$1$2</nowiki>\" استفاده کنید.",
        "config-uploads-not-safe": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های <code>$1</code> شما برای اجرای متون دلخواه آسیب‌پذیر است.\nاگرچه مدیاویکی همهٔ پوشه‌های ارسال‌ شده را برای خطرات امنیتی بررسی می‌کند، پیش از فعال‌سازی ارسال‌ها، بسیار به [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security close this security vulnerability] توصیه شده‌است.",
        "config-no-cli-uploads-check": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های شما (<code>$1</code>) برای آسیب‌پذیری اجرای متن دلخواه در طول نصب سی‌ال آی بررسی نشده‌است.",
-       "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب نافرجام ماند.",
+       "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب شکست خورد ماند.",
        "config-suhosin-max-value-length": "سوهُسین نصب شده‌است و پارامتر جت <code>length</code> را به $1 بایت محدود می‌کند.\n قسمت بارکنندهٔ منبع مدیاویکی پیرامون این محدوده کار خواهد‌کرد، اما عملکرد آن را پایین می‌آورد. اگر به هیچ وجه ممکن نیست، باید <code>suhosin.get.max_value_length</code> را به ۱۰۲۴ یا بالاتر در <code>php.ini</code> تنظیم کنید، و \n<code>$wgResourceLoaderMaxQueryLength</code> را به مقدار مشابه در <code>LocalSettings.php</code> تنظیم کنید.",
        "config-db-type": "نوع پایگاه اطلاعات:",
        "config-db-host": "میزبان پایگاه اطلاعات:",
index 6257691..882ab92 100644 (file)
@@ -27,7 +27,8 @@
                        "Cl3m3n7",
                        "C13m3n7",
                        "The RedBurn",
-                       "Trial"
+                       "Trial",
+                       "Tinss"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
        "config-extension-link": "Saviez-vous que votre wiki prend en charge [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie] ou la [https://www.mediawiki.org/wiki/Extension_Matrix matrice des extensions] pour voir la liste complète des extensions.",
        "mainpagetext": "<strong>MediaWiki a été installé.</strong>",
-       "mainpagedocfooter": "Consultez le [https://meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur du contenu] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
+       "mainpagedocfooter": "Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur du contenu] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
 }
index a2466c3..ab1fd7d 100644 (file)
@@ -6,7 +6,8 @@
                        "아라",
                        "Vivaelcelta",
                        "Macofe",
-                       "Banjo"
+                       "Banjo",
+                       "Seb35"
                ]
        },
        "config-desc": "O programa de instalación de MediaWiki",
@@ -55,7 +56,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensión intl PECL] para a normalización Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atención:</strong> A [http://pecl.php.net/intl extensión intl PECL] non está dispoñible para manexar a normalización Unicode; volvendo á execución lenta de PHP puro.\nSe o seu sitio posúe un alto tráfico de visitantes, debería ler un chisco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
        "config-unicode-update-warning": "<strong>Atención:</strong> A versión instalada da envoltura de normalización Unicode emprega unha versión vella da biblioteca [http://site.icu-project.org/ do proxecto ICU].\nDebería [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
-       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
+       "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Atención:</strong> Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
        "config-no-fts3": "<strong>Atención:</strong> O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
        "config-pcre-old": "<strong>Erro fatal:</strong> Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].",
index 069bf68..1c5c2ee 100644 (file)
@@ -9,7 +9,8 @@
                        "Tacsipacsi",
                        "Dorgan",
                        "Macofe",
-                       "Máté"
+                       "Máté",
+                       "Seb35"
                ]
        },
        "config-desc": "A MediaWiki telepítője",
@@ -58,7 +59,7 @@
        "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
        "config-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP-alapú implementáció lesz használatban.\nHa nagy látogatottságú oldalt üzemeltetsz, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations itt] találhatsz további információkat a témáról.",
        "config-unicode-update-warning": "<strong>Figyelmeztetés:</strong> Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].",
-       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
+       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysqli</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
        "config-outdated-sqlite": "<strong>Figyelmeztetés:</strong> SQLite $1 verziód van, ami alacsonyabb a legalább szükséges $2 verziónál. Az SQLite nem lesz elérhető.",
        "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
        "config-pcre-old": "<strong>Kritikus hiba:</strong> PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].",
@@ -67,6 +68,7 @@
        "config-memory-bad": "'''Figyelmeztetés:''' A PHP <code>memory_limit</code> beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
        "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van",
        "config-apc": "Az [http://www.php.net/apc APC] telepítve van",
+       "config-apcu": "Az [http://www.php.net/apcu APCu] telepítve van",
        "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van",
        "config-diff3-bad": "GNU diff3 nem található.",
        "config-git": "Megtaláltam a Git verziókezelő szoftvert: <code>$1</code>.",
index 296ddbd..3717258 100644 (file)
@@ -13,7 +13,8 @@
                        "Bennylin",
                        "WongKentir",
                        "Macofe",
-                       "Rachmat.Wahidi"
+                       "Rachmat.Wahidi",
+                       "Gombang"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -62,7 +63,7 @@
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
        "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
        "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
-       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket <code>php5-mysql</code>.",
+       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysqli</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].",
        "config-subscribe": "Berlangganan ke [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce milis pengumuman rilis].",
        "config-subscribe-help": "Ini adalah milis bervolume rendah yang digunakan untuk pengumuman rilis, termasuk pengumuman keamanan penting.\nAnda sebaiknya berlangganan dan memperbarui instalasi MediaWiki saat versi baru keluar.",
        "config-subscribe-noemail": "Anda mencoba untuk berlangganan milis pengumuman rilis tanpa menyediakan alamat email.\nHarap berikan alamat surel jika Anda ingin berlangganan ke milis.",
+       "config-pingback": "Bagikan data tentang instalasi ini dengan pengembang MediaWiki",
        "config-almost-done": "Anda hampir selesai!\nAnda sekarang dapat melewati sisa konfigurasi dan menginstal wiki sekarang.",
        "config-optional-continue": "Berikan saya pertanyaan lagi.",
        "config-optional-skip": "Saya sudah bosan, instal saja wikinya.",
        "config-profile-no-anon": "Pembuatan akun diperlukan",
        "config-profile-fishbowl": "Khusus penyunting terdaftar",
        "config-profile-private": "Wiki pribadi",
-       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mencegah kontributor biasa.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights/id entri manual terkait].",
+       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk log.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mengurangi semangat kontributor sambil lalu.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights/id entri manual terkait].",
        "config-license": "Hak cipta dan lisensi:",
        "config-license-none": "Tidak ada lisensi",
        "config-license-cc-by-sa": "Creative Commons Atribusi Berbagi Serupa",
index cedccd1..b3b7850 100644 (file)
        "config-profile": "Profilo dei diritti utente:",
        "config-profile-wiki": "Wiki aperto",
        "config-profile-no-anon": "Creazione utenza obbligatoria",
-       "config-profile-fishbowl": "Solo editori autorizzati",
+       "config-profile-fishbowl": "Solo utenti autorizzati",
        "config-profile-private": "Wiki privato",
        "config-profile-help": "I wiki funzionano meglio se si permette a molte persone di poterli modificare.\nIn MediaWiki, è semplice controllare le ultime modifiche, e ripristinare i danni causati da utenti inesperti o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti dei vantaggi della modalità wiki.\nPerciò, fa' la tua scelta.\n\nIl modello <strong>{{int:config-profile-wiki}}</strong> consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con <strong>{{int:config-profile-no-anon}}</strong> offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario <strong>{{int:config-profile-fishbowl}}</strong> consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn <strong>{{int:config-profile-private}}</strong> consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].",
        "config-license": "Copyright e licenza:",
index ce3ae88..18acff0 100644 (file)
@@ -60,7 +60,7 @@
        "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
        "config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
-       "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
+       "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을}} 지원합니다: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysqli</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 패키지도 설치해야 합니다.",
        "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $2 보다 낮은 SQLite $1이(가) 있습니다. SQLite를 사용할 수 없습니다.",
        "config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
        "config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
        "config-install-schema": "스키마를 만드는 중",
        "config-install-pg-schema-not-exist": "PostgreSQL 스키마가 존재하지 않습니다.",
        "config-install-pg-schema-failed": "테이블을 만드는 데 실패했습니다.\n\"$2\" 스키마에 쓸 수 있는 \"$1\" 사용자가 있는지 확인하세요.",
-       "config-install-pg-commit": "ë°\94ë\80\90 사항을 적용하는 중",
+       "config-install-pg-commit": "ë³\80ê²½사항을 적용하는 중",
        "config-install-pg-plpgsql": "PL/pgSQL 언어에 대해 확인하는 중",
        "config-pg-no-plpgsql": "$1 데이터베이스에 PL/pgSQL 언어를 설치해야 합니다",
        "config-pg-no-create-privs": "설치를 위한 지정한 계정에 계정을 만드는 데 충분한 권한이 없습니다,",
-       "config-pg-not-in-role": "웹 사용자로 지정한 계정이 이미 존재합니다.\n설치를 위해 지정한 사용자는 슈퍼 사용자와 웹 사용자의 역할 구성원이 아니므로 웹 사용자가 소유한 개체를 만들 수 없습니다.\n\n현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 \"뒤로\"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.",
+       "config-pg-not-in-role": "웹 사용자로 지정한 계정이 이미 존재합니다.\n설치를 위해 지정한 사용자는 슈퍼 사용자와 웹 사용자의 역할 원이 아니므로 웹 사용자가 소유한 개체를 만들 수 없습니다.\n\n현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 \"뒤로\"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.",
        "config-install-user": "데이터베이스 사용자를 만드는 중",
        "config-install-user-alreadyexists": "\"$1\" 사용자가 이미 존재합니다",
        "config-install-user-create-failed": "\"$1\" 사용자 만드는 데 실패: $2",
index 3343db7..9a33d5b 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Mormegil",
                        "Purodha",
-                       "Reedy"
+                       "Reedy",
+                       "Seb35"
                ]
        },
        "config-desc": "Et Projramm för Mediwiki opzesäze.",
@@ -52,7 +53,7 @@
        "config-unicode-using-intl": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] nämme.",
        "config-unicode-pure-php-warning": "'''Opjepaß:''' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] för et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i>-Nommalisehre nit fenge. Dröm nämme mer dat eijfache, ävver ärsch lahme, <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"PHP Hypertext Preprocessor\">PHP</i>-Projrammschtök doför.\nFör jruuße Wikis met vill Metmaachere doht Üsch di Sigg övver et [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i>-Nommaliseere] (es op Änglesch) aanloore.",
        "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
-       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
+       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysqli</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
        "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
        "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
        "config-pcre-old": "<strong>Fähler:</strong> PCRE $1 udder neuer es nüüdesch.\nPHP es jäz ävver met PCRE $2 zesamme jebonge.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mieh dohzoh].",
index d1b1a9b..10de248 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Robby",
                        "Soued031",
-                       "아라"
+                       "아라",
+                       "Seb35"
                ]
        },
        "config-desc": "Den Installatiounsprogramm vu MediaWiki",
@@ -45,7 +46,7 @@
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
        "config-env-hhvm": "HHVM $1 ass installéiert.",
-       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+       "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysqli</code> benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
        "config-memory-bad": "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert",
index 1df843a..45f1331 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Hosseinblue",
                        "Arash71",
-                       "Lakzon"
+                       "Lakzon",
+                       "Seb35"
                ]
        },
        "config-desc": "نۀصب کۀر ویکی‌مدیا",
@@ -52,7 +53,7 @@
        "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
        "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
        "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
-       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysqli</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
        "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
index 649d9ce..b0b78db 100644 (file)
@@ -97,7 +97,7 @@
        "config-db-install-help": "Внесете го корисничкото име и лозинката што ќе се користи за поврзување со базата на податоци во текот на воспоставката.",
        "config-db-account-lock": "Користи го истото корисничко име и лозинка за редовна работа",
        "config-db-wiki-account": "Корисничко име за редовна работа",
-       "config-db-wiki-help": "Ð\92неÑ\81еÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\88Ñ\82о Ñ\9cе Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе Ñ\81о Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ñ\80едовнаÑ\82а Ñ\80абоÑ\82а Ñ\81о Ð²Ð¸ÐºÐ¸Ñ\82о.\nÐ\90ко Ñ\81меÑ\82каÑ\82а Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82ои, Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86ионаÑ\82а Ñ\81меÑ\82ка Ð¸Ð¼Ð° Ð´Ð¾Ð²Ð¾Ð»Ð½Ð¾ Ð¿Ñ\80ивилегии, Ñ\82огаÑ\88 Ð¾Ð²Ð°Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82ка Ñ\9cе Ð±Ð¸Ð´Ðµ Ñ\81оздадена Ñ\81о Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ð½ите привилегии потребни за работа со викито.",
+       "config-db-wiki-help": "Ð\92неÑ\81еÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\88Ñ\82о Ñ\9cе Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82аÑ\82 Ð·Ð° Ð¿Ð¾Ð²Ñ\80зÑ\83ваÑ\9aе Ñ\81о Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ð²Ð¾ Ñ\82екоÑ\82 Ð½Ð° Ñ\80едовнаÑ\82а Ñ\80абоÑ\82а Ñ\81о Ð²Ð¸ÐºÐ¸Ñ\82о.\nÐ\90ко Ñ\81меÑ\82каÑ\82а Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82ои, Ð° Ð¸Ð½Ñ\81Ñ\82алаÑ\86ионаÑ\82а Ñ\81меÑ\82ка Ð¸Ð¼Ð° Ð´Ð¾Ð²Ð¾Ð»Ð½Ð¾ Ð¿Ñ\80ивилегии, Ñ\82огаÑ\88 Ð¾Ð²Ð°Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ка Ñ\81меÑ\82ка Ñ\9cе Ð±Ð¸Ð´Ðµ Ñ\81оздадена Ñ\81о Ð½Ð°Ñ\98малите привилегии потребни за работа со викито.",
        "config-db-prefix": "Претставка на табелата на базата:",
        "config-db-prefix-help": "Ако треба да делите една база на податоци со повеќе викија, или со МедијаВики и друг мрежен програм, тогаш можете да додадете претставка на сите називи на табелите за да спречите проблематични ситуации.\nНе користете празни простори.\n\nОва поле обично се остава празно.",
        "config-mysql-old": "Се бара MySQL $1 или поново, а вие имате $2.",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "МедијаВики ги поддржува следниве системи на бази на податоци:\n\n$1\n\nАко системот што сакате да го користите не е наведен подолу, тогаш проследете ја горенаведената врска со инструкции за да овозможите поддршка за тој систем.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е главната цел на МедијаВики и најдобро е поддржан. МедијаВики работи и со [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona], кои се складни со MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Како да срочите PHP со поддршка за MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина. ([http://www.php.net/manual/en/pgsql.installation.php Како да срочите PHP со поддршка за PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). ([http://www.php.net/manual/en/pgsql.installation.php Како да срочите PHP со поддршка за PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]  е база на податоци на комерцијално претпријатиe за Windows ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV поддршка])",
        "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
        "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категории]",
        "mainpagetext": "<strong>МедијаВики е успешно воспоставен.</strong>",
-       "mainpagedocfooter": "Погледнете го [https://meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [https://meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [https://meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дознајте како да се борите против спам на вашето вики]"
+       "mainpagedocfooter": "Погледнете го [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Упатството за корисници] за подетални информации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [https://meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [https://meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дознајте како да се борите против спам на вашето вики]"
 }
index 0fc0e9f..a37336e 100644 (file)
@@ -5,5 +5,6 @@
                        "Ninjastrikers"
                ]
        },
+       "config-help": "အကူအညီ",
        "mainpagetext": "<strong>မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။</strong>"
 }
index 1fcb1cb..46156b9 100644 (file)
@@ -8,7 +8,8 @@
                        "Jeblad",
                        "Macofe",
                        "SuperPotato",
-                       "Jon Harald Søby"
+                       "Jon Harald Søby",
+                       "Seb35"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
        "config-unicode-pure-php-warning": "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "<strong>Advarsel:</strong> Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
-       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
+       "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysqli</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
        "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
index 87a176c..ac05471 100644 (file)
@@ -17,7 +17,8 @@
                        "Esketti",
                        "JaapDeKleine",
                        "Macofe",
-                       "Hex"
+                       "Hex",
+                       "Mainframe98"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
        "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
        "config-no-fts3": "<strong>Waarschuwing:</strong> SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
-       "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
+       "config-pcre-no-utf8": "<strong>Onherstelbare fout:</strong> de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
        "config-memory-bad": "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.\nDit is waarschijnlijk te laag.\nDe installatie kan mislukken!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd",
        "config-apc": "[http://www.php.net/apc APC] is op dit moment geïnstalleerd",
+       "config-apcu": "[http://www.php.net/apcu APCu] is geïnstalleerd",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd",
        "config-no-cache-apcu": "<strong>Waarschuwing:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] of [http://www.iis.net/download/WinCacheForPhp WinCache] is niet aangetroffen.\nHet cachen van objecten is niet ingeschakeld.",
-       "config-mod-security": "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
+       "config-mod-security": "<strong>Waarschuwing:</strong> Uw webserver heeft de module [http://modsecurity.org/ mod_security]/mod_security2 ingeschakeld. Veel standaard instellingen hiervan zorgen voor problemen in combinatie met MediaWiki en andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nIndien mogelijk, zou deze moeten worden uitgeschakeld. Lees anders de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
        "config-diff3-bad": "GNU diff3 niet aangetroffen.",
        "config-git": "Versiecontrolesoftware git is aangetroffen: <code>$1</code>",
        "config-git-bad": "Geen git versiecontrolesoftware aangetroffen.",
        "config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.",
        "config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
        "config-pingback": "Gegevens over deze installatie delen met MediaWiki-ontwikkelaars.",
+       "config-pingback-help": "Wanneer deze optie is geselecteerd, zal MediaWiki periodiek https://www.mediawiki.org pingen met informatie over deze MediaWiki instantie. Deze gegevens bevatten bijvoorbeeld het type systeem, de PHP versie, en de gekozen database. De WikiMedia Foundation deelt deze informatie met MediaWiki ontwikkelaars om toekomstige ontwikkeling te ondersteunen. De volgende gegevens zullen worden verstuurd voor uw systeem: \n<pre>$1</pre>",
        "config-almost-done": "U bent bijna klaar!\nAls u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.",
        "config-optional-continue": "Stel me meer vragen.",
        "config-optional-skip": "Laat maar zitten, installeer gewoon de wiki.",
        "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud",
        "config-install-extension-tables": "Tabellen voor ingeschakelde uitbreidingen worden aangemaakt",
        "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
-       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsen, in dezelfde map als index.php.\nDe download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
+       "config-install-done-path": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in <code>$4</code> plaatsen. De download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> Als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
        "config-help-tooltip": "klik om uit te vouwen",
index e332690..3573c3e 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Cedric31",
                        "Jfblanc",
-                       "Seb35"
+                       "Seb35",
+                       "Nicolas Eynaud"
                ]
        },
        "config-desc": "Lo programa d’installacion de MediaWiki",
        "config-install-user-grant-failed": "Fracàs al moment de l'apondon de permissions a l'utilizaire « $1 » : $2",
        "config-install-user-missing": "L'utilizaire «$1» existís pas.",
        "config-install-tables": "Creacion de las taulas",
+       "config-install-interwiki-list": "Impossible de legir lo fichier <code>interwiki.list</code>.",
        "config-install-stats": "Inicializacion de las estatisticas",
        "config-install-keys": "Generacion de la clau secreta",
        "config-install-updates": "Empachar l’execucion de las mesas a jorn inutilas",
index 0747672..e97db42 100644 (file)
@@ -6,7 +6,8 @@
                        "Krinkle",
                        "아라",
                        "Amire80",
-                       "Macofe"
+                       "Macofe",
+                       "Seb35"
                ]
        },
        "config-desc": "L'instalador për mediaWiki",
@@ -55,7 +56,7 @@
        "config-unicode-using-intl": "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
        "config-unicode-pure-php-warning": "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.\nS'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisassion Unicode].",
        "config-unicode-update-warning": "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].\nA dovrìa fé n'[https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
-       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
+       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysqli</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
        "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
        "config-pcre-no-utf8": "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.\nMediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.",
index 8cf22e2..fd8a263 100644 (file)
@@ -19,7 +19,8 @@
                        "Dianakc",
                        "Walesson",
                        "Almondega",
-                       "Luk3"
+                       "Luk3",
+                       "Eduardo Addad de Oliveira"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -77,6 +78,7 @@
        "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
+       "config-apcu": "[http://www.php.net/apcu APCu] está instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
        "config-no-cache-apcu": "<strong>Aviso:</strong> Não se pode encontrar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO caching de objetos não foi ativado.",
        "config-mod-security": "<strong>Aviso:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
        "config-missing-db-host": "Você deve inserir um valor para \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Você deve inserir um valor para \"{{int:config-db-host-oracle}}\".",
        "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
+       "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.",
        "config-db-sys-user-exists-oracle": "A conta de usuário $1 já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!",
        "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.",
        "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; revertendo o esquema das tabelas para versão anterior",
+       "config-upgrade-done-no-regenerate": "Atualização completa.\n\nAgora pode [$1 começar a usar a sua wiki].",
        "config-regenerate": "Regenerar arquivo LocalSettings.php →",
        "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
        "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
        "config-admin-error-user": "Erro interno ao criar um administrador com o nome \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Erro interno ao configurar uma senha para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Você digitou um endereço de email inválido.",
+       "config-pingback": "Compartilhe dados sobre esta instalação com desenvolvedores do MediaWiki.",
        "config-almost-done": "Você está quase terminando!\nVocê agora pode pular as configurações restantes e instalar a wiki agora mesmo.",
        "config-optional-continue": "Faça-me mais perguntas.",
        "config-optional-skip": "Já estou aborrecido, apenas instale a wiki.",
        "config-profile-private": "Wiki privada",
        "config-license": "Direitos autorais e licenças:",
        "config-license-none": "Sem rodapé com a licença",
+       "config-license-cc-by-sa": "Creative Commons - Atribuição - Compartilha nos Mesmos Termos",
        "config-license-cc-by": "Atribuição Creative Commons",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior",
        "config-license-pd": "Domínio público",
        "config-license-cc-choose": "Selecionar uma licença personalizada da organização Creative Commons",
        "config-email-settings": "Configurações de email",
+       "config-enable-email": "Ativar mensagens eletrónicas de saída",
        "config-enable-email-help": "Se você quer que o email funcione, estas  [http://www.php.net/manual/en/mail.configuration.php configurações de email PHP] precisam ser configuradas corretamente. \nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.",
        "config-email-user": "Ativar emails entre usuários",
        "config-email-user-help": "Permitir que todos os usuários enviem email entre si se eles tiverem habilitado este recurso em suas preferências.",
        "config-advanced-settings": "Configuração avançada",
        "config-cache-options": "Configuração da cache de objetos:",
        "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.",
+       "config-cache-accel": "Cache de objetos PHP (APC, APCu, XCache ou WinCache)",
+       "config-cache-memcached": "Usar Memcached (requer instalação e configurações adicionais)",
+       "config-memcached-servers": "Servidores Memcached:",
+       "config-memcached-help": "Lista de endereços IP a serem usados para Memcached.\nDeve especificar um por linha e especificar a porta a ser utilizada. Por exemplo:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "Você selecionou Memcached como seu tipo de cache, mas não especificou nenhum servidor.",
+       "config-memcache-badip": "Introduziu um endereço IP inválido para Memcached: $1.",
+       "config-memcache-noport": "Você não especificou uma porta para usar no servidor Memcached: $1.\nSe você não souber a porta, o padrão é 11211.",
+       "config-memcache-badport": "Os números de porta Memcached devem estar entre $1 e $2.",
        "config-extensions": "Extensões",
+       "config-skins": "Peles",
+       "config-skins-use-as-default": "Utilize esta skin como predefinição",
+       "config-skins-missing": "Não foram encontradas peles; MediaWiki usará uma pele de fallback até que você instale algumas adequadas.",
+       "config-skins-must-enable-some": "Você deve escolher pelo menos um skin para habilitar.",
+       "config-skins-must-enable-default": "A pele escolhida como padrão deve ser ativada.",
        "config-install-step-done": "feito",
        "config-install-step-failed": "falhou",
        "config-install-extensions": "Incluindo extensões",
        "config-install-pg-commit": "Enviando alterações",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
+       "config-install-user-missing": "O usuário especificado, \"$1\", não existe.",
        "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
        "config-install-tables": "Criando tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
+       "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
+       "config-install-interwiki": "Preenchendo a tabela padrão de interwiki",
+       "config-install-interwiki-list": "Não foi possível ler o arquivo <code>interwiki.list</code>.",
+       "config-install-stats": "Inicializando estatísticas",
        "config-install-keys": "Gerando senhas secretas",
+       "config-install-updates": "Impedir a execução de atualizações desnecessárias",
        "config-install-sysop": "Criando conta de usuário administrador",
+       "config-install-subscribe-fail": "Não foi possível subscrever o mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalada e <code>allow_url_fopen</code> não está disponível.",
        "config-install-mainpage": "Criando página principal com o conteúdo padrão",
        "config-install-extension-tables": "Criando tabelas para extensões habilitadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
-       "config-install-done": "<strong>Parabéns!</strong>\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
+       "config-install-done": "<strong>Parabéns!</strong>\nVocê instalou do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
        "config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
        "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as  [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
-       "mainpagetext": "<strong>O MediaWiki foi instalado com sucesso.</strong>",
+       "mainpagetext": "<strong>O MediaWiki foi instalado.</strong>",
        "mainpagedocfooter": "Consulte o [https://meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
 }
index f9a1fef..cc8f993 100644 (file)
@@ -17,7 +17,8 @@
                        "Vitorvicentevalente",
                        "Macofe",
                        "Diniscoelho",
-                       "Ruila"
+                       "Ruila",
+                       "Seb35"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -66,7 +67,7 @@
        "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
        "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
-       "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
+       "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
index d7e86be..8d10b51 100644 (file)
@@ -17,7 +17,8 @@
                        "Siebrand",
                        "Umherirrender",
                        "Waldir",
-                       "Jdforrester"
+                       "Jdforrester",
+                       "Liuxinyu970226"
                ]
        },
        "config-desc": "Short description of the installer.",
        "config-install-subscribe-fail": "{{doc-important|\"[[m:mail:mediawiki-announce|mediawiki-announce]]\" is the name of a mailing list and should not be translated.}}\nA message displayed if the MediaWiki installer encounters an error making a request to lists.wikimedia.org which hosts the mailing list.\n* $1 - the HTTP error encountered, reproduced as is (English string)",
        "config-install-subscribe-notpossible": "Error shown when automatically subscribing to the MediaWiki announcements mailing list fails.",
        "config-install-mainpage": "*{{msg-mw|Config-install-database}}\n*{{msg-mw|Config-install-tables}}\n*{{msg-mw|Config-install-schema}}\n*{{msg-mw|Config-install-user}}\n*{{msg-mw|Config-install-interwiki}}\n*{{msg-mw|Config-install-stats}}\n*{{msg-mw|Config-install-keys}}\n*{{msg-mw|Config-install-sysop}}\n*{{msg-mw|Config-install-mainpage}}",
+       "config-install-mainpage-exists": "Warning shown when installer attempts to create main page but it already exists.",
        "config-install-extension-tables": "Notice shown to the user during the install about progress.",
        "config-install-mainpage-failed": "Used as error message. Parameters:\n* $1 - detailed error message",
        "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
        "config-help": "This is used in help boxes.\n{{Identical|Help}}",
        "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page",
        "config-nofile": "Used as failure message. Parameters:\n* $1 - filename",
-       "config-extension-link": "Shown on last page of installation to inform about possible extensions.",
+       "config-extension-link": "Shown on last page of installation to inform about possible extensions.\n{{Identical|Did you know}}",
        "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.",
        "mainpagedocfooter": "Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.\nThis might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example."
 }
index c285e73..15d54b7 100644 (file)
@@ -22,7 +22,8 @@
                        "Ильнар",
                        "Macofe",
                        "StasR",
-                       "Irus"
+                       "Irus",
+                       "Mailman"
                ]
        },
        "config-desc": "Инсталлятор MediaWiki",
@@ -31,7 +32,7 @@
        "config-localsettings-upgrade": "Обнаружен файл <code>LocalSettings.php</code>.\nДля обновления этой установки, пожалуйста, введите значение <code>$wgUpgradeKey</code>.\nЕго можно найти в файле <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Обнаружен файл <code>LocalSettings.php</code>.\nДля обновления этой установки, пожалуйста, запустите <code>update.php</code>",
        "config-localsettings-key": "Ключ обновления:",
-       "config-localsettings-badkey": "Ð\92Ñ\8b Ñ\83казали Ð½ÐµÐ¿Ñ\80авилÑ\8cнÑ\8bй ÐºÐ»Ñ\8eÑ\87 Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f",
+       "config-localsettings-badkey": "Ð\92Ñ\8b Ñ\83казали Ð½ÐµÐ²ÐµÑ\80нÑ\8bй ÐºÐ»Ñ\8eÑ\87 Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ\8f.",
        "config-upgrade-key-missing": "Обнаружена существующая установленная копия MediaWiki.\nЧтобы обновить обнаруженную установку, пожалуйста, добавьте следующую строку в конец вашего файла <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Похоже, что существующий файл <code>LocalSettings.php</code> неполон.\nНе установлена переменная $1.\nПожалуйста, измените <code>LocalSettings.php</code> так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с использованием настроек, указанных в <code>LocalSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
index 5c4b1c3..6dab088 100644 (file)
@@ -21,7 +21,7 @@
        "config-page-welcome": "ذريعات‌وڪي تي ڀلي ڪري آيا!",
        "config-page-dbconnect": "اعدادخاني سان جُڙو",
        "config-page-upgrade": "هاڻوڪي تنصيبڪاريءَ کي سڌاريو",
-       "config-page-dbsettings": "اعدادخاÙ\86Ù\8a Ø¬Ù\88Ù\86 Ø³Ù\8aٽڱس",
+       "config-page-dbsettings": "اعدادخاÙ\86Ù\8a Ø¬Ù\88Ù\86 ØªØ±ØªÙ\8aبÙ\88Ù\86",
        "config-page-name": "نالو",
        "config-page-options": "آپشنس",
        "config-page-install": "تنصيبيو",
index 3a96701..2cc0d1a 100644 (file)
        "config-license-pd": "Җәмгыять мирасы",
        "config-logo": "Логотип URL:",
        "config-cc-again": "Кабат сайлагыз...",
+       "config-advanced-settings": "Өстәмә көйләнмәләр",
        "config-extensions": "Киңәйтүләр",
        "config-skins": "Бизәлеш",
        "config-install-step-done": "әзер",
        "config-install-step-failed": "булмады",
        "config-help": "ярдәм",
        "mainpagetext": "<strong>«MediaWiki» куелды.</strong>",
-       "mainpagedocfooter": "Бу вики турында мәгълүматны [https://meta.wikimedia.org/wiki/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]"
+       "mainpagedocfooter": "Бу вики турында мәгълүматны [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]"
 }
index a3c3d24..ef7694a 100644 (file)
        "config-information": "Impormasyon",
        "config-localsettings-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan.  Basi ma-upgrade ini nga pag-installar, alayon pagbutáng han value han <code>$wgUpgradeKey</code> ha kahon ha ubós. Mabibilngan mo ini ha <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Mayda <code>LocalSettings.php</code> nga paypay nga nabilngan. Basi ma-upgrade ini nga pag-installar, alayon pagpadalagan lugod han <code>update.php</code>",
-       "config-localsettings-badkey": "An key nga imo ginhatag in diri asya.",
+       "config-localsettings-key": "Upgrade nga yabi:",
+       "config-localsettings-badkey": "Sayop an upgrade nga yabi nga imo ginhátag",
        "config-upgrade-key-missing": "Mayda daan na ng gin-installar nga MediaWiki nga nabilngan.\nBasi ma-upgrade ini nga pag-instalar, alayon pagbutang han nahasunod nga linya ha ubós han imo <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "An yana nga <code>LocalSettings.php</code> in baga diri kompleto.\nAn $1 variable in diri naka-set.\nAlayon igsaliwan an <code>LocalSettings.php</code> para ini nga variable in mai-set, ngan pidlita an \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "May-ada pagsayop an nahitabo han pagpapakabit ngada ha database nga gingagamitan hin mga kamumutangan nga dapat unta ginpapatuman han <code>LocalSettings.php</code>. Alayon ayda ini nga mga kamumutangan ngan utrohon nala.\n\n$1",
        "config-session-error": "Pakyas an pagtikang han session: $1",
+       "config-session-expired": "An imo sesyon nga data baga na hin naglahós na hin panahón\nIt mga sesyon gin-configure hin pagkaiha nga $1\nPuyde mo ini paiha-on ha pagset hit <code>session.gc_maxlifetime</code> ha php.ini.\nIgtikang hin utro an pag-instalar nga proseso.",
+       "config-no-session": "¡Nawarâ an imo sesyon nga data!\nKitaa an imo php.ini ngan siguroa nga an  <code>session.save_path</code> ginkadâ hin naangay nga direktory.",
        "config-your-language": "Imo pinulongán",
+       "config-your-language-help": "Pili-a in yinaknan nga gagamiton dida han proseso han pag-instalar.",
        "config-wiki-language": "Pinulongán han wiki",
        "config-wiki-language-help": "Pilía an pinulongán nga kauróg igsúsurat hit wiki",
        "config-back": "Bálik",
        "config-page-language": "Pinulongán",
        "config-page-welcome": "Maupay nga pag-abot ha MediaWiki!",
        "config-page-dbconnect": "Igsumpay ha database",
+       "config-page-upgrade": "Ig-upgrade it aada nga na-instalar",
+       "config-page-dbsettings": "Mga setting ha database",
        "config-page-name": "Ngaran",
+       "config-page-options": "Mga pagpipilian",
+       "config-page-install": "Ig-instalar",
        "config-page-complete": "Nakompleto!",
+       "config-page-restart": "Igbalik hin utro in pag-instalar",
        "config-page-readme": "Basaha ako",
+       "config-page-releasenotes": "Mga nota han ginpagawás",
        "config-page-copying": "Nagkokopya",
+       "config-page-upgradedoc": "Pag-upgrade",
+       "config-page-existingwiki": "Aada nga wiki",
+       "config-help-restart": "¿Karúyag mo ba ighawan an tanan nga gin-save nga data nga imo gin-enter ngan igbalik hin utro an proseso hin pag-instalar?",
        "config-restart": "Oo, utroha patikanga",
        "config-welcome": "=== Mga pagpanginano panlibong ===\nMagkakamay-ada yano nga panginano para masabtan kun ini nga libong in naaangay para hiton pagtataod hiton MediaWiki. Hinumdomi iton paglakip hinin nga impormasyon kun karuyag mo mangaro hin suporta kun paunan-on humanon an pagtataod.",
        "config-env-php": "Gin-install an PHP $1.",
index 25d8c7c..b6afa04 100644 (file)
@@ -80,7 +80,7 @@
        "config-memory-bad": "<strong>警告:</strong>PHP的内存使用上限<code>memory_limit</code>为$1。\n该设定可能过低,并导致安装失败!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装",
        "config-apc": "[http://www.php.net/apc APC]已安装",
-       "config-apcu": "[http://www.php.net/apcu APCu]已安装",
+       "config-apcu": "已安装[http://www.php.net/apcu APCu]",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安装",
        "config-no-cache-apcu": "<strong>警告:</strong>找不到[http://www.php.net/apcu APCu]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache]。\n对象缓存未启用。",
        "config-mod-security": "<strong>警告:</strong>您的web服务器已启用[http://modsecurity.org/ mod_security]/mod_security2。它的很多常见配置可能导致MediaWiki及其他软件允许用户发布任意内容的问题。如果可能,这应当被禁用。否则,当您遭遇随机错误时,请参考[http://modsecurity.org/documentation/ mod_security 文档]或联络您的主机支持。",
        "config-profile-help": "如果您允许尽量多的人编写wiki,网站上的内容会更加丰富。在MediaWiki中,您可以轻松地审查最近更改,并轻易回退掉新手或破坏者造成的损害。\n\n然而,许多人觉得让MediaWiki存在多种角色将更加好用;同时,要说服所有人都愿以wiki的方式作贡献并非一件易事。因此,您可以有以下选择:\n\n<strong>{{int:config-profile-wiki}}</strong>模式允许包括未登录用户在内的所有人编辑。<strong>{{int:config-profile-no-anon}}</strong>的wiki需要额外的注册流程,这有可能会阻碍随意贡献者。\n\n<strong>{{int:config-profile-fishbowl}}</strong>方案只允许获批准的用户编辑,但对公众开放页面浏览(包括历史记录)。<strong>{{int:config-profile-private}}</strong>则只允许获批准的用户浏览、编辑页面。\n\n安装完成后,您还可以对用户权限进行更多、更复杂的配置,参见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相关的使用手册]。",
        "config-license": "版权和许可证:",
        "config-license-none": "页脚无许可证",
-       "config-license-cc-by-sa": "知识共享“署名-相同方式共享”",
+       "config-license-cc-by-sa": "知识共享署名-相同方式共享",
        "config-license-cc-by": "知识共享署名",
        "config-license-cc-by-nc-sa": "知识共享署名-非商业性使用-相同方式共享",
        "config-license-cc-0": "知识共享Zero(公有领域)",
index 2f2e934..167d6cc 100644 (file)
@@ -16,7 +16,8 @@
                        "NigelSoft",
                        "Macofe",
                        "Reke",
-                       "Suchichi02"
+                       "Suchichi02",
+                       "Winstonyin"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
@@ -74,7 +75,9 @@
        "config-memory-bad": "<strong>警告:</strong>PHP 的記憶體使用上限 <code>memory_limit</code> 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝",
        "config-apc": "[http://www.php.net/apc APC] 已安裝",
+       "config-apcu": "已安裝[http://www.php.net/apcu APCu]",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝",
+       "config-no-cache-apcu": "<strong>警告:</strong>找不到[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache]。未開啟物件緩存。",
        "config-mod-security": "<strong>警告:</strong>您的網頁伺服器已開啟 [http://modsecurity.org/ mod_security] 模組,如果設定不恰當會導致使用者可在 MediaWiki 或其他應用程式發佈任意的內容。\n若您遇到任何問題,請參考 [http://modsecurity.org/documentation/ mod_security 文件] 或聯繫您的伺服器技術支援人員。",
        "config-diff3-bad": "找不到 GNU diff3。",
        "config-git": "找到 Git 版本控制軟體:<code>$1</code>。",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki 支援以下資料庫系統:\n\n$1\n\n如果您下方沒有看到您要使用的資料庫系統,請根據上方連結指示開啟資料庫的支援。",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] 是 MediaWiki 主要支援的資料庫系統。MediaWiki 也同時可運作與於 [{{int:version-db-mariadb-url}} MariaDB] 和[{{int:version-db-percona-url}} Percona 伺服器],上述這些與 MySQL 相容的資料庫系統。([http://www.php.net/manual/en/mysqli.installation.php 如何編譯支援 MySQL 的 PHP])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] 是一套受歡迎的開源資料庫系統,在開源方案當中,可用來替代 MySQL。目前仍有一些次要的問題需要解決,較不建議使用在上線環境當中。 ([http://www.php.net/manual/en/pgsql.installation.php 如何編譯支援 PostgreSQL 的 PHP])。",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一套受歡迎的開源資料庫系統,可用來替代 MySQL。([http://www.php.net/manual/en/pgsql.installation.php 如何編譯支援PostgreSQL的PHP])。",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] 是一套輕量級的資料庫系統,MediaWiki 可在此資料庫系統上良好的運作。([http://www.php.net/manual/en/pdo.installation.php 如何編譯支援 SQLite 的 PHP],須透過 PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] 是一套商用企業級的資料庫。([http://www.php.net/manual/en/oci8.installation.php 如何編譯支援 OCI8 的 PHP])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] 是一套 Windows 專用的商用企業級的資料庫。 ([http://www.php.net/manual/en/sqlsrv.installation.php 如何編譯支援 SQLSRV 的 PHP])",
        "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
        "config-admin-email": "電子郵件地址:",
        "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所傳送的訊息、重設您的密碼與通知監視清單中頁面更動。您可將此欄位留空。",
-       "config-admin-error-user": "建立管理員帳號 \"<nowiki>$1</nowiki>\" 時發內部錯誤。",
-       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發內部錯誤:<pre>$2</pre>",
+       "config-admin-error-user": "建立管理員帳號 \"<nowiki>$1</nowiki>\" 時發內部錯誤。",
+       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發內部錯誤:<pre>$2</pre>",
        "config-admin-error-bademail": "您輸入了不正確的電子郵件地址。",
        "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
        "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
        "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
+       "config-pingback": "與MediaWiki開發人員分享此安裝過程的數據。",
+       "config-pingback-help": "如果您選擇此項設定,MediaWiki將會定期把有關本MediaWiki實例的基本數據傳送給https://www.mediawiki.org。數據包括系統類型、PHP版本、所選的資料庫後端等等。維基媒體基金會會向MediaWiki的開發人員分享這組數據,以幫助將來的開發計劃。將會傳送以下有關您系統的數據:\n<pre>$1</pre>",
        "config-almost-done": "您快要完成了!\n您現在可以跳過其餘的設定項目並且立即安裝 Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
        "config-optional-skip": "我已經不耐煩了,請趕緊安裝 Wiki。",
        "config-profile-help": "Wiki 最佳的運作方式是盡可能讓大家都可以編輯文件。\n在 MediaWiki,可以很輕易的審查最近做的所有變更動作,並且可以還原由新手或惡意使用者造成的損害。\n\n不論如何,很多人發現 MediaWiki 可以廣泛的運用在各種地方,但並不是很容易可以說服每個人都遵守對 Wiki 有益的方式。\n所以您必須做出以下選擇。\n\n使用 <strong>{{int:config-profile-wiki}}</strong> 模式,允許所有人編輯文章,包含未匿名使用者。\n使用 <strong>{{int:config-profile-no-anon}}</strong> 模式,允許所有人編輯文章,不包含未登入的使用者。此模式較能管理所有使用者的言論,但會扼殺臨時使用者的貢獻機會。\n\n使用 <strong>{{int:config-profile-fishbowl}}</strong> 模式,僅經核准的使用者可以編輯,所有人可以檢視頁面,包含修訂的記錄。\n使用 <strong>{{int:config-profile-private}}</strong> 模式,僅經核准的使用者可以編輯、檢視頁面。\n\n有關更多複雜的使用者權限設定可在安裝程序結束後設定,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相關文件說明]。",
        "config-license": "版權聲明與授權條款:",
        "config-license-none": "無授權條款頁腳",
-       "config-license-cc-by-sa": "創作共用 姓名標示-相同方式分享",
-       "config-license-cc-by": "創作共用 Attribution",
+       "config-license-cc-by-sa": "創用 CC 姓名標示-相同方式分享",
+       "config-license-cc-by": "創用 CC 姓名標示",
        "config-license-cc-by-nc-sa": "創作共用 Attribution-NonCommercial-ShareAlike",
        "config-license-cc-0": "創作共用 Zero (公有領域)",
        "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
        "config-install-mainpage": "正在使用預設的內容建立首頁",
        "config-install-extension-tables": "正在建立已啟動的擴充套件的資料表",
        "config-install-mainpage-failed": "無法插入首頁: $1",
-       "config-install-done": "<strong>恭喜!</strong>\n您已經成功地安裝了 MediaWiki。\n\n安裝程式已自動產生 <code>LocalSettings.php</code> 檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的 Wiki 的根目錄 (index.php 所在的目錄) 中,下載稍後會自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>若您現在未下載檔案,稍後結束安裝程式之後將無法下載設定檔。\n\n當您完成本步驟後,您可以 <strong>[$2 進入您的 Wiki]</strong>。",
+       "config-install-done": "<strong>恭喜!</strong>\n您已經成功安裝MediaWiki。\n\n安裝程式已自動產生<code>LocalSettings.php</code>檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的Wiki的根目錄(index.php所在的目錄)中,下載應已自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>如果您現在不下載此檔案,稍後結束安裝程式之後將無法再下載設定檔。\n\n當您完成本步驟後,您可以<strong>[$2 進入您的Wiki]</strong>。",
+       "config-install-done-path": "<strong>恭喜!</strong>\n您已經成功安裝MediaWiki。\n\n安裝程式已自動產生<code>LocalSettings.php</code>檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在<code>$4</code>中,下載應已自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>如果您現在不下載此檔案,稍後結束安裝程式之後將無法再下載設定檔。\n\n當您完成本步驟後,您可以<strong>[$2 進入您的Wiki]</strong>。",
        "config-download-localsettings": "下載 <code>LocalSettings.php</code>",
        "config-help": "說明",
        "config-help-tooltip": "點選以展開",
        "config-nofile": "查無檔案 \"$1\",是否已被刪除?",
        "config-extension-link": "您是否了解您的 Wiki 支援 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 擴充套件分類] 或 [https://www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
        "mainpagetext": "<strong>已安裝 MediaWiki。</strong>",
-       "mainpagedocfooter": "請參閱 [https://meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 系統設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki 介面在地化]"
+       "mainpagedocfooter": "有關使用wiki的訊息,請參閱[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 MediaWiki常見問題]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 將MediaWiki翻譯至您的語言]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上防禦破壞]"
 }
index 0e107b3..4ccca97 100644 (file)
@@ -187,7 +187,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
         * @note More logic is explained in DefaultSettings.
         *
         * @param string $prefix Interwiki prefix
-        * @return Interwiki
+        * @return Interwiki|false
         */
        private function getInterwikiCached( $prefix ) {
                $value = $this->getInterwikiCacheEntry( $prefix );
index 990f112..cacccbe 100644 (file)
@@ -46,6 +46,7 @@ class JobRunner implements LoggerAwareInterface {
        const MAX_ALLOWED_LAG = 3; // abort if more than this much DB lag is present
        const LAG_CHECK_PERIOD = 1.0; // check replica DB lag this many seconds
        const ERROR_BACKOFF_TTL = 1; // seconds to back off a queue due to errors
+       const READONLY_BACKOFF_TTL = 30; // seconds to back off a queue due to read-only errors
 
        /**
         * @param callable $debug Optional debug output handler
@@ -190,7 +191,7 @@ class JobRunner implements LoggerAwareInterface {
 
                                // Back off of certain jobs for a while (for throttling and for errors)
                                if ( $info['status'] === false && mt_rand( 0, 49 ) == 0 ) {
-                                       $ttw = max( $ttw, self::ERROR_BACKOFF_TTL ); // too many errors
+                                       $ttw = max( $ttw, $this->getErrorBackoffTTL( $info['error'] ) );
                                        $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
                                                ? $backoffDeltas[$jType] + $ttw
                                                : $ttw;
@@ -253,6 +254,16 @@ class JobRunner implements LoggerAwareInterface {
                return $response;
        }
 
+       /**
+        * @param string $error
+        * @return int TTL in seconds
+        */
+       private function getErrorBackoffTTL( $error ) {
+               return strpos( $error, 'DBReadOnlyError' ) !== false
+                       ? self::READONLY_BACKOFF_TTL
+                       : self::ERROR_BACKOFF_TTL;
+       }
+
        /**
         * @param Job $job
         * @param LBFactory $lbFactory
index 6ae8837..d9457c6 100644 (file)
@@ -126,7 +126,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
 
        /**
         * @param string $name
-        * @return string
+        * @return string[]
         */
        private function decodeQueueName( $name ) {
                list( $type, $wiki ) = explode( '/', $name, 2 );
index 5f33ae0..651a332 100644 (file)
@@ -247,6 +247,11 @@ class RefreshLinksJob extends Job {
                        $parserOutput
                );
 
+               // For legacy hook handlers doing updates via LinksUpdateConstructed, make sure
+               // any pending writes they made get flushed before the doUpdate() calls below.
+               // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock().
+               $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+
                foreach ( $updates as $key => $update ) {
                        // FIXME: This code probably shouldn't be here?
                        // Needed by things like Echo notifications which need
index 41541ef..0c77a7b 100644 (file)
@@ -216,7 +216,7 @@ class FormatJson {
                        $count = 0;
                        $value =
                                preg_replace( '/,([ \t]*[}\]][^"\r\n]*([\r\n]|$)|[ \t]*[\r\n][ \t\r\n]*[}\]])/', '$1',
-                                       $value, - 1, $count );
+                                       $value, -1, $count );
                        if ( $count > 0 ) {
                                $result = json_decode( $value, $assoc );
                                if ( JSON_ERROR_NONE === json_last_error() ) {
index 3b34d9b..d4abdc8 100644 (file)
@@ -40,7 +40,7 @@ class ExplodeIterator implements Iterator {
        // The position after the end of the next delimiter
        private $endPos;
 
-       // The current token
+       /** @var string|false The current token */
        private $current;
 
        /**
index 70ce31d..4ddb813 100644 (file)
@@ -32,7 +32,7 @@ class HashRing {
        /** @var Array (location => (start, end)) */
        protected $ring = [];
 
-       /** @var Array (location => (start, end)) */
+       /** @var HashRing|null */
        protected $liveRing;
        /** @var Array (location => UNIX timestamp) */
        protected $ejectionExpiries = [];
index 4ba1bc3..1c141ab 100644 (file)
 class HtmlArmor {
 
        /**
-        * @var string
+        * @var string|null
         */
        private $value;
 
        /**
-        * @param string $value
+        * @param string|null $value
         */
        public function __construct( $value ) {
                $this->value = $value;
@@ -44,7 +44,8 @@ class HtmlArmor {
         * and get safe HTML back
         *
         * @param string|HtmlArmor $input
-        * @return string safe for usage in HTML
+        * @return string|null safe for usage in HTML, or null
+        *         if the HtmlArmor instance was wrapping null.
         */
        public static function getHtml( $input ) {
                if ( $input instanceof HtmlArmor ) {
index 16163fb..4a6e3fb 100644 (file)
@@ -253,7 +253,6 @@ class IEUrlExtension {
         *
         * @param $serverSoftware
         * @return bool
-        *
         */
        public static function haveUndecodedRequestUri( $serverSoftware ) {
                static $whitelist = [
index 2f5a454..db6869b 100644 (file)
@@ -58,7 +58,7 @@ class MapCacheLRU {
         * @return void
         */
        public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
+               if ( $this->has( $key ) ) {
                        $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
@@ -75,6 +75,9 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
+               if ( !is_int( $key ) && !is_string( $key ) ) {
+                       throw new MWException( __METHOD__ . ' called with invalid key. Must be string or integer.' );
+               }
                return array_key_exists( $key, $this->cache );
        }
 
@@ -87,7 +90,7 @@ class MapCacheLRU {
         * @return mixed Returns null if the key was not found
         */
        public function get( $key ) {
-               if ( !array_key_exists( $key, $this->cache ) ) {
+               if ( !$this->has( $key ) ) {
                        return null;
                }
 
index 6b10c09..cffb5a3 100644 (file)
@@ -54,6 +54,59 @@ class StringUtils {
                        ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
        }
 
+       /**
+        * Explode a string, but ignore any instances of the separator inside
+        * the given start and end delimiters, which may optionally nest.
+        * The delimiters are literal strings, not regular expressions.
+        * @param string $startDelim Start delimiter
+        * @param string $endDelim End delimiter
+        * @param string $separator Separator string for the explode.
+        * @param string $subject Subject string to explode.
+        * @param bool $nested True iff the delimiters are allowed to nest.
+        * @return ArrayIterator
+        */
+       static function delimiterExplode( $startDelim, $endDelim, $separator,
+               $subject, $nested = false ) {
+               $inputPos = 0;
+               $lastPos = 0;
+               $depth = 0;
+               $encStart = preg_quote( $startDelim, '!' );
+               $encEnd = preg_quote( $endDelim, '!' );
+               $encSep = preg_quote( $separator, '!' );
+               $len = strlen( $subject );
+               $m = [];
+               $exploded = [];
+               while (
+                       $inputPos < $len &&
+                       preg_match(
+                               "!$encStart|$encEnd|$encSep!S", $subject, $m,
+                               PREG_OFFSET_CAPTURE, $inputPos
+                       )
+               ) {
+                       $match = $m[0][0];
+                       $matchPos = $m[0][1];
+                       $inputPos = $matchPos + strlen( $match );
+                       if ( $match === $separator ) {
+                               if ( $depth === 0 ) {
+                                       $exploded[] = substr(
+                                               $subject, $lastPos, $matchPos - $lastPos
+                                       );
+                                       $lastPos = $inputPos;
+                               }
+                       } elseif ( $match === $startDelim ) {
+                               if ( $depth === 0 || $nested ) {
+                                       $depth++;
+                               }
+                       } else {
+                               $depth--;
+                       }
+               }
+               $exploded[] = substr( $subject, $lastPos );
+               // This method could be rewritten in the future to avoid creating an
+               // intermediate array, since the return type is just an iterator.
+               return new ArrayIterator( $exploded );
+       }
+
        /**
         * Perform an operation equivalent to `preg_replace()`
         *
@@ -115,6 +168,7 @@ class StringUtils {
        ) {
                $inputPos = 0;
                $outputPos = 0;
+               $contentPos = 0;
                $output = '';
                $foundStart = false;
                $encStart = preg_quote( $startDelim, '!' );
index 9c1ec8e..016c9b1 100644 (file)
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
  * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0.
  *
+ * This also supports using the Tideways profiler
+ * <https://github.com/tideways/php-profiler-extension>, which additionally
+ * has support for PHP7.
+ *
  * @since 1.28
  */
 class Xhprof {
@@ -43,10 +47,16 @@ class Xhprof {
         */
        public static function enable( $flags = 0, $options = [] ) {
                if ( self::isEnabled() ) {
-                       throw new Exception( 'Xhprof profiling is already enabled.' );
+                       throw new Exception( 'Profiling is already enabled.' );
                }
                self::$enabled = true;
-               xhprof_enable( $flags, $options );
+               if ( function_exists( 'xhprof_enable' ) ) {
+                       xhprof_enable( $flags, $options );
+               } elseif ( function_exists( 'tideways_enable' ) ) {
+                       tideways_enable( $flags, $options );
+               } else {
+                       throw new Exception( "Neither xhprof nor tideways are installed" );
+               }
        }
 
        /**
@@ -57,7 +67,12 @@ class Xhprof {
        public static function disable() {
                if ( self::isEnabled() ) {
                        self::$enabled = false;
-                       return xhprof_disable();
+                       if ( function_exists( 'xhprof_disable' ) ) {
+                               return xhprof_disable();
+                       } else {
+                               // tideways
+                               return tideways_disable();
+                       }
                }
        }
 }
index b0cd413..304f6c1 100644 (file)
@@ -65,4 +65,3 @@ abstract class EventRelayer implements LoggerAwareInterface {
         */
        abstract protected function doNotify( $channel, array $events );
 }
-
index bd2ce5d..a7ceab2 100644 (file)
@@ -729,7 +729,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackendStore::getFileXAttributes()
         * @param array $params
-        * @return bool|string
+        * @return array[][]
         */
        protected function doGetFileXAttributes( array $params ) {
                return [ 'headers' => [], 'metadata' => [] ]; // not supported
index 08cb388..d40e896 100644 (file)
@@ -1701,7 +1701,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param array $creds From getAuthentication()
         * @param string $container
         * @param string $object
-        * @return array
+        * @return string
         */
        protected function storageUrl( array $creds, $container = null, $object = null ) {
                $parts = [ $creds['storage_url'] ];
index bee34dc..c629e7d 100644 (file)
@@ -34,7 +34,7 @@ use Wikimedia\WaitConditionLoop;
  *
  * Locks on resource keys can either be shared or exclusive.
  *
- * Implementations must keep track of what is locked by this proccess
+ * Implementations must keep track of what is locked by this process
  * in-memory and support nested locking calls (using reference counting).
  * At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
  * Locks should either be non-blocking or have low wait timeouts.
@@ -170,7 +170,7 @@ abstract class LockManager {
        /**
         * Get the base 36 SHA-1 of a string, padded to 31 digits.
         * Before hashing, the path will be prefixed with the domain ID.
-        * This should be used interally for lock key or file names.
+        * This should be used internally for lock key or file names.
         *
         * @param string $path
         * @return string
@@ -182,7 +182,7 @@ abstract class LockManager {
        /**
         * Get the base 16 SHA-1 of a string, padded to 31 digits.
         * Before hashing, the path will be prefixed with the domain ID.
-        * This should be used interally for lock key or file names.
+        * This should be used internally for lock key or file names.
         *
         * @param string $path
         * @return string
index e42d1a9..6ea3c21 100644 (file)
@@ -83,7 +83,7 @@ class MimeAnalyzer implements LoggerAwareInterface {
         * what will break? In practice this probably isn't a problem anyway -- Bryan)
         */
        protected static $wellKnownTypes = <<<EOT
-application/ogg ogx ogg ogm ogv oga spx
+application/ogg ogx ogg ogm ogv oga spx opus
 application/pdf pdf
 application/vnd.oasis.opendocument.chart odc
 application/vnd.oasis.opendocument.chart-template otc
@@ -108,7 +108,8 @@ audio/midi mid midi kar
 audio/mpeg mpga mpa mp2 mp3
 audio/x-aiff aif aiff aifc
 audio/x-wav wav
-audio/ogg oga spx ogg
+audio/ogg oga spx ogg opus
+audio/opus opus ogg oga ogg spx
 image/x-bmp bmp
 image/gif gif
 image/jpeg jpeg jpg jpe
@@ -526,7 +527,7 @@ EOT;
                        'xbm',
 
                        // Formats we recognize magic numbers for
-                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx',
+                       'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx', 'opus',
                        'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
                        'webp',
 
@@ -1054,6 +1055,8 @@ EOT;
                                return MEDIATYPE_AUDIO;
                        } elseif ( strpos( $head, 'speex' ) !== false ) {
                                return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'opus' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
                        } else {
                                return MEDIATYPE_MULTIMEDIA;
                        }
index 3958f8c..7f2bf5e 100644 (file)
@@ -291,8 +291,6 @@ class XmlTypeCheck {
                $this->stackDepth++;
        }
 
-       /**
-        */
        private function elementClose() {
                list( $name, $attribs ) = array_pop( $this->elementDataContext );
                $data = array_pop( $this->elementData );
index b04d3c6..5edd889 100644 (file)
@@ -35,6 +35,7 @@ audio/wav audio/x-wav audio/wave      [AUDIO]
 audio/midi audio/mid   [AUDIO]
 audio/basic            [AUDIO]
 audio/ogg              [AUDIO]
+audio/opus             [AUDIO]
 audio/x-aiff           [AUDIO]
 audio/x-pn-realaudio   [AUDIO]
 audio/x-realaudio      [AUDIO]
index b4f515a..f1cd59d 100644 (file)
@@ -72,6 +72,7 @@ audio/basic au snd
 audio/midi mid midi kar
 audio/mpeg mpga mp2 mp3
 audio/ogg oga ogg spx opus
+audio/opus opus oga ogg
 video/webm webm
 audio/webm webm
 audio/x-aiff aif aiff aifc
index 02b3c92..6e6a3ad 100644 (file)
@@ -72,7 +72,7 @@ class APCUBagOStuff extends APCBagOStuff {
                if ( apcu_exists( $key . self::KEY_SUFFIX ) ) {
                        return apcu_inc( $key . self::KEY_SUFFIX, $value );
                } else {
-                       return apcu_set( $key . self::KEY_SUFFIX, $value );
+                       return false;
                }
        }
 
@@ -85,7 +85,7 @@ class APCUBagOStuff extends APCBagOStuff {
                if ( apcu_exists( $key . self::KEY_SUFFIX ) ) {
                        return apcu_dec( $key . self::KEY_SUFFIX, $value );
                } else {
-                       return apcu_set( $key . self::KEY_SUFFIX, -$value );
+                       return false;
                }
        }
 }
index 8d3c6d9..171c291 100644 (file)
@@ -275,8 +275,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $checkKeysForAll = [];
                $checkKeysByKey = [];
                $checkKeysFlat = [];
-               foreach ( $checkKeys as $i => $keys ) {
-                       $prefixed = self::prefixCacheKeys( (array)$keys, self::TIME_KEY_PREFIX );
+               foreach ( $checkKeys as $i => $checkKeyGroup ) {
+                       $prefixed = self::prefixCacheKeys( (array)$checkKeyGroup, self::TIME_KEY_PREFIX );
                        $checkKeysFlat = array_merge( $checkKeysFlat, $prefixed );
                        // Is this check keys for a specific cache key, or for all keys being fetched?
                        if ( is_int( $i ) ) {
@@ -448,7 +448,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                $wrapExtra[self::FLD_FLAGS] = self::FLG_STALE; // mark as stale
                        // Case B: any long-running transaction; ignore this set()
                        } elseif ( $age > self::MAX_READ_LAG ) {
-                               $this->logger->warning( "Rejected set() for $key due to snapshot lag." );
+                               $this->logger->info( "Rejected set() for $key due to snapshot lag." );
 
                                return true; // no-op the write for being unsafe
                        // Case C: high replication lag; lower TTL instead of ignoring all set()s
@@ -457,7 +457,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                $this->logger->warning( "Lowered set() TTL for $key due to replication lag." );
                        // Case D: medium length request with medium replication lag; ignore this set()
                        } else {
-                               $this->logger->warning( "Rejected set() for $key due to high read lag." );
+                               $this->logger->info( "Rejected set() for $key due to high read lag." );
 
                                return true; // no-op the write for being unsafe
                        }
@@ -1358,7 +1358,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        return false;
                }
 
-               // Lifecycle is: new, ramp-up refresh chance, full refresh chance
+               // Lifecycle is: new, ramp-up refresh chance, full refresh chance.
+               // Note that the "expected # of refreshes" for the ramp-up time range is half of what it
+               // would be if P(refresh) was at its full value during that time range.
                $refreshWindowSec = max( $timeTillRefresh - $ageNew - self::RAMPUP_TTL / 2, 1 );
                // P(refresh) * (# hits in $refreshWindowSec) = (expected # of refreshes)
                // P(refresh) * ($refreshWindowSec * $popularHitsPerSec) = 1
index 20198bf..b268b9f 100644 (file)
 class DBConnRef implements IDatabase {
        /** @var ILoadBalancer */
        private $lb;
-
-       /** @var IDatabase|null Live connection handle */
+       /** @var Database|null Live connection handle */
        private $conn;
-
        /** @var array|null N-tuple of (server index, group, DatabaseDomain|string) */
        private $params;
 
@@ -22,12 +20,12 @@ class DBConnRef implements IDatabase {
        const FLD_DOMAIN = 2;
 
        /**
-        * @param ILoadBalancer $lb
-        * @param IDatabase|array $conn Connection or (server index, group, DatabaseDomain|string)
+        * @param ILoadBalancer $lb Connection manager for $conn
+        * @param Database|array $conn New connection handle or (server index, query groups, domain)
         */
        public function __construct( ILoadBalancer $lb, $conn ) {
                $this->lb = $lb;
-               if ( $conn instanceof IDatabase ) {
+               if ( $conn instanceof Database ) {
                        $this->conn = $conn; // live handle
                } elseif ( count( $conn ) >= 3 && $conn[self::FLD_DOMAIN] !== false ) {
                        $this->params = $conn;
@@ -595,7 +593,7 @@ class DBConnRef implements IDatabase {
         * Clean up the connection when out of scope
         */
        function __destruct() {
-               if ( $this->conn !== null ) {
+               if ( $this->conn ) {
                        $this->lb->reuseConnection( $this->conn );
                }
        }
index 3d35d76..69cf1ac 100644 (file)
@@ -1419,9 +1419,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                $table = $this->tableName( $table );
-               $old = $this->ignoreErrors( true );
-               $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname );
-               $this->ignoreErrors( $old );
+               $ignoreErrors = true;
+               $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname, $ignoreErrors );
 
                return (bool)$res;
        }
@@ -2862,23 +2861,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $this->mTrxLevel && ( $this->mTrxAtomicLevels || !$this->mTrxAutomatic );
        }
 
-       /**
-        * Creates a new table with structure copied from existing table
-        * Note that unlike most database abstraction functions, this function does not
-        * automatically append database prefix, because it works at a lower
-        * abstraction level.
-        * The table names passed to this function shall not be quoted (this
-        * function calls addIdentifierQuotes when needed).
-        *
-        * @param string $oldName Name of table whose structure should be copied
-        * @param string $newName Name of table to be created
-        * @param bool $temporary Whether the new table should be temporary
-        * @param string $fname Calling function name
-        * @throws RuntimeException
-        * @return bool True if operation was successful
-        */
-       public function duplicateTableStructure( $oldName, $newName, $temporary = false,
-               $fname = __METHOD__
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
        ) {
                throw new RuntimeException( __METHOD__ . ' is not implemented in descendant class' );
        }
index 668443b..ceed7da 100644 (file)
@@ -756,14 +756,20 @@ abstract class DatabaseMysqlBase extends Database {
         * @see https://www.percona.com/doc/percona-toolkit/2.1/pt-heartbeat.html
         */
        protected function getHeartbeatData( array $conds ) {
-               $whereSQL = $this->makeList( $conds, self::LIST_AND );
-               // Use ORDER BY for channel based queries since that field might not be UNIQUE.
-               // Note: this would use "TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6))" but the
-               // percision field is not supported in MySQL <= 5.5.
-               $res = $this->query(
-                       "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1"
-               );
-               $row = $res ? $res->fetchObject() : false;
+               // Do not bother starting implicit transactions here
+               $this->clearFlag( self::DBO_TRX, self::REMEMBER_PRIOR );
+               try {
+                       $whereSQL = $this->makeList( $conds, self::LIST_AND );
+                       // Use ORDER BY for channel based queries since that field might not be UNIQUE.
+                       // Note: this would use "TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6))" but the
+                       // percision field is not supported in MySQL <= 5.5.
+                       $res = $this->query(
+                               "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1"
+                       );
+                       $row = $res ? $res->fetchObject() : false;
+               } finally {
+                       $this->restoreFlags();
+               }
 
                return [ $row ? $row->ts : null, microtime( true ) ];
        }
@@ -1325,4 +1331,3 @@ abstract class DatabaseMysqlBase extends Database {
                return in_array( $name, $this->listViews( $prefix ) );
        }
 }
-
index cd02177..42113b0 100644 (file)
@@ -243,9 +243,7 @@ class DatabasePostgres extends Database {
                }
                /* Transaction stays in the ERROR state until rolled back */
                if ( $this->mTrxLevel ) {
-                       $ignore = $this->ignoreErrors( true );
                        $this->rollback( __METHOD__ );
-                       $this->ignoreErrors( $ignore );
                }
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
index 7317d54..a4b2df0 100644 (file)
@@ -41,7 +41,7 @@ class DatabaseSqlite extends Database {
        /** @var resource */
        protected $mLastResult;
 
-       /** @var $mConn PDO */
+       /** @var PDO */
        protected $mConn;
 
        /** @var FSLockManager (hopefully on the same server as the DB) */
@@ -665,7 +665,7 @@ class DatabaseSqlite extends Database {
        }
 
        /**
-        * @param string $sqls
+        * @param string[] $sqls
         * @param bool $all Whether to "UNION ALL" or not
         * @return string
         */
index 8395359..43cec28 100644 (file)
@@ -186,4 +186,23 @@ interface IMaintainableDatabase extends IDatabase {
         * @return array
         */
        public function listViews( $prefix = null, $fname = __METHOD__ );
+
+       /**
+        * Creates a new table with structure copied from existing table
+        *
+        * Note that unlike most database abstraction functions, this function does not
+        * automatically append database prefix, because it works at a lower abstraction level.
+        * The table names passed to this function shall not be quoted (this function calls
+        * addIdentifierQuotes() when needed).
+        *
+        * @param string $oldName Name of table whose structure should be copied
+        * @param string $newName Name of table to be created
+        * @param bool $temporary Whether the new table should be temporary
+        * @param string $fname Calling function name
+        * @return bool True if operation was successful
+        * @throws RuntimeException
+        */
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
+       );
 }
diff --git a/includes/libs/rdbms/database/MaintainableDBConnRef.php b/includes/libs/rdbms/database/MaintainableDBConnRef.php
new file mode 100644 (file)
index 0000000..fa3ddf9
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Helper class to handle automatically marking connections as reusable (via RAII pattern)
+ * as well handling deferring the actual network connection until the handle is used
+ *
+ * @note: proxy methods are defined explicity to avoid interface errors
+ * @ingroup Database
+ * @since 1.29
+ */
+class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase {
+       public function tableName( $name, $format = 'quoted' ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tableNames() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function tableNamesN() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function sourceFile(
+               $filename,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = false,
+               callable $inputCallback = null
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function sourceStream(
+               $fp,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = __METHOD__,
+               callable $inputCallback = null
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function deadlockLoop() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function listViews( $prefix = null, $fname = __METHOD__ ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function textFieldSize( $table, $field ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function streamStatementEnd( &$sql, &$newLine ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function duplicateTableStructure(
+               $oldName, $newName, $temporary = false, $fname = __METHOD__
+       ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+}
index 9e10884..7d303b1 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup Database
  * @since 1.23
  */
-class DBExpectedError extends DBError implements MessageSpecifier {
+class DBExpectedError extends DBError implements MessageSpecifier, ILocalizedException {
        /** @var string[] Message parameters */
        protected $params;
 
@@ -42,4 +42,12 @@ class DBExpectedError extends DBError implements MessageSpecifier {
        public function getParams() {
                return $this->params;
        }
+
+       /**
+        * @inheritdoc
+        * @since 1.29
+        */
+       public function getMessageObject() {
+               return Message::newFromSpecifier( $this );
+       }
 }
index 80e1924..500b2ef 100644 (file)
@@ -35,4 +35,3 @@ class MssqlField implements Field {
                return $this->type;
        }
 }
-
index 8cf964c..02d3589 100644 (file)
@@ -103,4 +103,3 @@ class MySQLField implements Field {
                return $this->is_zerofill;
        }
 }
-
index 15a5c0d..77d4aa9 100644 (file)
@@ -100,7 +100,7 @@ abstract class LBFactory implements ILBFactory {
                                trigger_error( E_USER_WARNING, get_class( $e ) . ': ' . $e->getMessage() );
                        };
 
-               $this->profiler = isset( $params['profiler'] ) ? $params['profiler'] : null;
+               $this->profiler = isset( $conf['profiler'] ) ? $conf['profiler'] : null;
                $this->trxProfiler = isset( $conf['trxProfiler'] )
                        ? $conf['trxProfiler']
                        : new TransactionProfiler();
@@ -111,9 +111,9 @@ abstract class LBFactory implements ILBFactory {
                        'ChronologyProtection' => 'true'
                ];
 
-               $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli';
+               $this->cliMode = isset( $conf['cliMode'] ) ? $conf['cliMode'] : PHP_SAPI === 'cli';
                $this->hostname = isset( $conf['hostname'] ) ? $conf['hostname'] : gethostname();
-               $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+               $this->agent = isset( $conf['agent'] ) ? $conf['agent'] : '';
 
                $this->ticket = mt_rand();
        }
index 1d22873..4158e61 100644 (file)
@@ -260,7 +260,7 @@ class LBFactoryMulti extends LBFactory {
                        throw new InvalidArgumentException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
                }
                $template = $this->serverTemplate;
-               if ( isset( $this->externalTemplateOverrides ) ) {
+               if ( $this->externalTemplateOverrides ) {
                        $template = $this->externalTemplateOverrides + $template;
                }
                if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
@@ -348,7 +348,7 @@ class LBFactoryMulti extends LBFactory {
                        $serverInfo = $template;
                        if ( $master ) {
                                $serverInfo['master'] = true;
-                               if ( isset( $this->masterTemplateOverrides ) ) {
+                               if ( $this->masterTemplateOverrides ) {
                                        $serverInfo = $this->masterTemplateOverrides + $serverInfo;
                                }
                                $master = false;
index 8854479..fc306b4 100644 (file)
@@ -108,8 +108,9 @@ interface ILoadBalancer {
 
        /**
         * Get the index of the reader connection, which may be a replica DB
+        *
         * This takes into account load ratios and lag times. It should
-        * always return a consistent index during a given invocation
+        * always return a consistent index during a given invocation.
         *
         * Side effect: opens connections to databases
         * @param string|bool $group Query group, or false for the generic reader
@@ -121,8 +122,10 @@ interface ILoadBalancer {
 
        /**
         * Set the master wait position
-        * If a DB_REPLICA connection has been opened already, waits
-        * Otherwise sets a variable telling it to wait if such a connection is opened
+        *
+        * If a DB_REPLICA connection has been opened already, then wait immediately.
+        * Otherwise sets a variable telling it to wait if such a connection is opened.
+        *
         * @param DBMasterPos $pos
         */
        public function waitFor( $pos );
@@ -140,6 +143,7 @@ interface ILoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL replica DBs to catch up to it
+        *
         * @param DBMasterPos $pos
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
@@ -148,30 +152,29 @@ interface ILoadBalancer {
 
        /**
         * Get any open connection to a given server index, local or foreign
-        * Returns false if there is no connection open
         *
-        * @param int $i Server index
-        * @return IDatabase|bool False on failure
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
+        * @return Database|bool False if no such connection is open
         */
        public function getAnyOpenConnection( $i );
 
        /**
         * Get a connection by index
-        * This is the main entry point for this class.
         *
-        * @param int $i Server index
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         *
         * @throws DBError
-        * @return IDatabase
+        * @return Database
         */
        public function getConnection( $i, $groups = [], $domain = false );
 
        /**
-        * Mark a foreign connection as being available for reuse under a different
-        * DB name or prefix. This mechanism is reference-counted, and must be called
-        * the same number of times as getConnection() to work.
+        * Mark a foreign connection as being available for reuse under a different DB domain
+        *
+        * This mechanism is reference-counted, and must be called the same number of times
+        * as getConnection() to work.
         *
         * @param IDatabase $conn
         * @throws InvalidArgumentException
@@ -181,30 +184,44 @@ interface ILoadBalancer {
        /**
         * Get a database connection handle reference
         *
-        * The handle's methods wrap simply wrap those of a IDatabase handle
+        * The handle's methods simply wrap those of a Database handle
         *
-        * @see LoadBalancer::getConnection() for parameter information
+        * @see ILoadBalancer::getConnection() for parameter information
         *
-        * @param int $db
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @return DBConnRef
         */
-       public function getConnectionRef( $db, $groups = [], $domain = false );
+       public function getConnectionRef( $i, $groups = [], $domain = false );
 
        /**
         * Get a database connection handle reference without connecting yet
         *
-        * The handle's methods wrap simply wrap those of a IDatabase handle
+        * The handle's methods simply wrap those of a Database handle
         *
-        * @see LoadBalancer::getConnection() for parameter information
+        * @see ILoadBalancer::getConnection() for parameter information
         *
-        * @param int $db
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @return DBConnRef
         */
-       public function getLazyConnectionRef( $db, $groups = [], $domain = false );
+       public function getLazyConnectionRef( $i, $groups = [], $domain = false );
+
+       /**
+        * Get a maintenance database connection handle reference for migrations and schema changes
+        *
+        * The handle's methods simply wrap those of a Database handle
+        *
+        * @see ILoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db Server index or DB_MASTER/DB_REPLICA
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $domain Domain ID, or false for the current domain
+        * @return MaintainableDBConnRef
+        */
+       public function getMaintenanceConnectionRef( $db, $groups = [], $domain = false );
 
        /**
         * Open a connection to the server given by the specified index
@@ -216,9 +233,9 @@ interface ILoadBalancer {
         *
         * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
         *
-        * @param int $i Server index
+        * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @return IDatabase|bool Returns false on errors
+        * @return Database|bool Returns false on errors
         * @throws DBAccessError
         */
        public function openConnection( $i, $domain = false );
index d42fed9..95f55b6 100644 (file)
@@ -31,7 +31,7 @@ use Wikimedia\ScopedCallback;
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => IDatabase array) */
+       /** @var IDatabase[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
        private $mConns;
        /** @var float[] Map of (server index => weight) */
        private $mLoads;
@@ -241,10 +241,14 @@ class LoadBalancer implements ILoadBalancer {
 
                                $host = $this->getServerName( $i );
                                if ( $lag === false && !is_infinite( $maxServerLag ) ) {
-                                       $this->replLogger->error( "Server $host (#$i) is not replicating?" );
+                                       $this->replLogger->error(
+                                               "Server {host} (#$i) is not replicating?", [ 'host' => $host ] );
                                        unset( $loads[$i] );
                                } elseif ( $lag > $maxServerLag ) {
-                                       $this->replLogger->warning( "Server $host (#$i) has >= $lag seconds of lag" );
+                                       $this->replLogger->warning(
+                                               "Server {host} (#$i) has {lag} seconds of lag (>= {maxlag})",
+                                               [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ]
+                                       );
                                        unset( $loads[$i] );
                                }
                        }
@@ -390,6 +394,9 @@ class LoadBalancer implements ILoadBalancer {
                return $i;
        }
 
+       /**
+        * @param DBMasterPos|false $pos
+        */
        public function waitFor( $pos ) {
                $this->mWaitForPos = $pos;
                $i = $this->mReadIndex;
@@ -436,10 +443,17 @@ class LoadBalancer implements ILoadBalancer {
                return $ok;
        }
 
+       /**
+        * @param int $i
+        * @return IDatabase|bool
+        */
        public function getAnyOpenConnection( $i ) {
                foreach ( $this->mConns as $connsByServer ) {
                        if ( !empty( $connsByServer[$i] ) ) {
-                               return reset( $connsByServer[$i] );
+                               /** @var $serverConns IDatabase[] */
+                               $serverConns = $connsByServer[$i];
+
+                               return reset( $serverConns );
                        }
                }
 
@@ -493,8 +507,10 @@ class LoadBalancer implements ILoadBalancer {
 
                if ( $result == -1 || is_null( $result ) ) {
                        // Timed out waiting for replica DB, use master instead
-                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
-                       $this->replLogger->warning( "$msg" );
+                       $this->replLogger->warning(
+                               __METHOD__ . ": Timed out waiting on {host} pos {$this->mWaitForPos}",
+                               [ 'host' => $server ]
+                       );
                        $ok = false;
                } else {
                        $this->replLogger->info( __METHOD__ . ": Done" );
@@ -650,6 +666,12 @@ class LoadBalancer implements ILoadBalancer {
                return new DBConnRef( $this, [ $db, $groups, $domain ] );
        }
 
+       public function getMaintenanceConnectionRef( $db, $groups = [], $domain = false ) {
+               $domain = ( $domain !== false ) ? $domain : $this->localDomain;
+
+               return new MaintainableDBConnRef( $this, $this->getConnection( $db, $groups, $domain ) );
+       }
+
        /**
         * @see ILoadBalancer::openConnection()
         *
@@ -1447,6 +1469,11 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
+       /**
+        * @param IDatabase $conn
+        * @param DBMasterPos|false $pos
+        * @param int $timeout
+        */
        public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 ) {
                if ( $this->getServerCount() <= 1 || !$conn->getLBInfo( 'replica' ) ) {
                        return true; // server is not a replica DB
index 49d09a9..7f43436 100644 (file)
@@ -319,21 +319,6 @@ class RedisConnectionPool implements LoggerAwareInterface {
                }
        }
 
-       /**
-        * The redis extension throws an exception in response to various read, write
-        * and protocol errors. Sometimes it also closes the connection, sometimes
-        * not. The safest response for us is to explicitly destroy the connection
-        * object and let it be reopened during the next request.
-        *
-        * @param string $server
-        * @param RedisConnRef $cref
-        * @param RedisException $e
-        * @deprecated since 1.23
-        */
-       public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
-               $this->handleError( $cref, $e );
-       }
-
        /**
         * The redis extension throws an exception in response to various read, write
         * and protocol errors. Sometimes it also closes the connection, sometimes
index 3b272e2..fee792f 100644 (file)
@@ -15,7 +15,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *
         * @param string|array $key The metric(s) to set.
         * @param float $time The elapsed time (ms) to log
-        **/
+        */
        public function timing( $key, $time ) {
        }
 
@@ -24,7 +24,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *
         * @param string|array $key The metric(s) to set.
         * @param float $value The value for the stats.
-        **/
+        */
        public function gauge( $key, $value ) {
        }
 
@@ -44,7 +44,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param  float $value The value for the stats.
         *
         * @return array
-        **/
+        */
        public function set( $key, $value ) {
                return [];
        }
@@ -56,7 +56,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param float|1      $sampleRate The rate (0-1) for sampling.
         *
         * @return array
-        **/
+        */
        public function increment( $key ) {
                return [];
        }
@@ -69,7 +69,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param float|1      $sampleRate The rate (0-1) for sampling.
         *
         * @return mixed
-        **/
+        */
        public function decrement( $key ) {
                return [];
        }
@@ -81,7 +81,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         * @param integer $delta The delta to add to the each metric
         *
         * @return mixed
-        **/
+        */
        public function updateCount( $key, $delta ) {
                return [];
        }
@@ -95,7 +95,7 @@ class NullStatsdDataFactory implements StatsdDataFactoryInterface {
         *                      ("c" for count, "ms" for timing, "g" for gauge, "s" for set)
         *
         * @return StatsdDataInterface
-        **/
+        */
        public function produceStatsdData(
                $key,
                $value = 1,
index 29bbf40..0d171f5 100644 (file)
@@ -49,7 +49,6 @@ use Wikimedia\ScopedCallback;
  * Note XMP kind of looks like rdf. They are not the same thing - XMP is
  * encoded as a specific subset of rdf. This class can read XMP. It cannot
  * read rdf.
- *
  */
 class XMPReader implements LoggerAwareInterface {
        /** @var array XMP item configuration array */
@@ -492,7 +491,7 @@ class XMPReader implements LoggerAwareInterface {
         * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
         * and are processing the 0/10 bit.
         *
-        * @param XMLParser $parser XMLParser reference to the xml parser
+        * @param resource $parser XMLParser reference to the xml parser
         * @param string $data Character data
         * @throws RuntimeException On invalid data
         */
@@ -777,7 +776,7 @@ class XMPReader implements LoggerAwareInterface {
         * Ignores the outer wrapping elements that are optional in
         * xmp and have no meaning.
         *
-        * @param XMLParser $parser
+        * @param resource $parser
         * @param string $elm Namespace . ' ' . element name
         * @throws RuntimeException
         */
@@ -980,7 +979,6 @@ class XMPReader implements LoggerAwareInterface {
         * Called when processing the <rdf:value> or <foo:someQualifier>.
         *
         * @param string $elm Namespace and tag name separated by a space.
-        *
         */
        private function startElementModeQDesc( $elm ) {
                if ( $elm === self::NS_RDF . ' value' ) {
@@ -1088,7 +1086,7 @@ class XMPReader implements LoggerAwareInterface {
                                }
                        } else {
                                array_unshift( $this->mode, self::MODE_IGNORE );
-                               array_unshift( $this->curItem, $elm );
+                               array_unshift( $this->curItem, $ns . ' ' . $tag );
 
                                return;
                        }
@@ -1190,7 +1188,7 @@ class XMPReader implements LoggerAwareInterface {
         * Generally just calls a helper based on what MODE we're in.
         * Also does some initial set up for the wrapper element
         *
-        * @param XMLParser $parser
+        * @param resource $parser
         * @param string $elm Namespace "<space>" element
         * @param array $attribs Attribute name => value
         * @throws RuntimeException
index c390232..a0bfb59 100644 (file)
@@ -59,9 +59,15 @@ class BlockLogFormatter extends LogFormatter {
                        // The lrm is needed to make sure that the number
                        // is shown on the correct side of the tooltip text.
                        $durationTooltip = '&lrm;' . htmlspecialchars( $params[4] );
-                       $params[4] = Message::rawParam( "<span class='blockExpiry' title='$durationTooltip'>" .
-                               $this->context->getLanguage()->translateBlockExpiry( $params[4],
-                                       $this->context->getUser() ) . '</span>' );
+                       $params[4] = Message::rawParam(
+                               "<span class='blockExpiry' title='$durationTooltip'>" .
+                               $this->context->getLanguage()->translateBlockExpiry(
+                                       $params[4],
+                                       $this->context->getUser(),
+                                       wfTimestamp( TS_UNIX, $this->entry->getTimestamp() )
+                               ) .
+                               '</span>'
+                       );
                        $params[5] = isset( $params[5] ) ?
                                self::formatBlockFlags( $params[5], $this->context->getLanguage() ) : '';
                }
index 21864ee..c9f1345 100644 (file)
@@ -428,7 +428,7 @@ class ManualLogEntry extends LogEntryBase {
        /** @var int ID of the log entry */
        protected $id;
 
-       /** @var Can this log entry be patrolled? */
+       /** @var bool Can this log entry be patrolled? */
        protected $isPatrollable = false;
 
        /** @var bool Whether this is a legacy log entry */
index 57a7597..6665336 100644 (file)
@@ -93,7 +93,7 @@ class LogEventsList extends ContextSource {
                // For B/C, we take strings, but make sure they are converted...
                $types = ( $types === '' ) ? [] : (array)$types;
 
-               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
+               $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter, false, $this->getContext() );
 
                $html = Html::hidden( 'title', $title->getPrefixedDBkey() );
 
index a64fee1..b5af783 100644 (file)
@@ -353,7 +353,11 @@ class LogFormatter {
                                                        $rawDuration = $parameters['5::duration'];
                                                        $rawFlags = $parameters['6::flags'];
                                                }
-                                               $duration = $wgContLang->translateBlockExpiry( $rawDuration );
+                                               $duration = $wgContLang->translateBlockExpiry(
+                                                       $rawDuration,
+                                                       null,
+                                                       wfTimestamp( TS_UNIX, $entry->getTimestamp() )
+                                               );
                                                $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $wgContLang );
                                                $text = wfMessage( 'blocklogentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
@@ -363,7 +367,11 @@ class LogFormatter {
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'reblock':
-                                               $duration = $wgContLang->translateBlockExpiry( $parameters['5::duration'] );
+                                               $duration = $wgContLang->translateBlockExpiry(
+                                                       $parameters['5::duration'],
+                                                       null,
+                                                       wfTimestamp( TS_UNIX, $entry->getTimestamp() )
+                                               );
                                                $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang );
                                                $text = wfMessage( 'reblock-logentry' )
                                                        ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
index daaff07..64102b7 100644 (file)
@@ -27,7 +27,6 @@
  * Class to simplify the use of log pages.
  * The logs are now kept in a table which is easier to manage and trim
  * than ever-growing wiki pages.
- *
  */
 class LogPage {
        const DELETED_ACTION = 1;
index 7a228bd..ce1df0d 100644 (file)
  * header format when requested.
  */
 class MailAddress {
+
+       /**
+        * @var string
+        */
+       public $name;
+
+       /**
+        * @var string
+        */
+       public $realName;
+
+       /**
+        * @var string
+        */
+       public $address;
+
        /**
         * @param string $address String with an email address, or a User object
         * @param string $name Human-readable name if a string address is given
index c8e9999..21effa0 100644 (file)
@@ -268,7 +268,14 @@ class UserMailer {
                // Add the envelope sender address using the -f command line option when PHP mail() is used.
                // Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
                // generated VERP address when the hook runs effectively.
-               $extraParams .= ' -f ' . $returnPath;
+
+               // PHP runs this through escapeshellcmd(). However that's not sufficient
+               // escaping (e.g. due to spaces). MediaWiki's email sanitizer should generally
+               // be good enough, but just in case, put in double quotes, and remove any
+               // double quotes present (" is not allowed in emails, so should have no
+               // effect, although this might cause apostrophees to be double escaped)
+               $returnPathCLI = '"' . str_replace( '"', '', $returnPath ) . '"';
+               $extraParams .= ' -f ' . $returnPathCLI;
 
                $headers['Return-Path'] = $returnPath;
 
index 47dae78..de49fc3 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use \MediaWiki\MediaWikiServices;
+use \Wikimedia\WaitConditionLoop;
 
 /**
  * Class to store objects in the database
index cc3ef26..34ff63c 100644 (file)
@@ -197,24 +197,6 @@ class Article implements Page {
                $this->mPage->clear();
        }
 
-       /**
-        * Note that getContent does not follow redirects anymore.
-        * If you need to fetch redirectable content easily, try
-        * the shortcut in WikiPage::getRedirectTarget()
-        *
-        * This function has side effects! Do not use this function if you
-        * only want the real revision text if any.
-        *
-        * @deprecated since 1.21; use WikiPage::getContent() instead
-        *
-        * @return string Return the text of this revision
-        */
-       public function getContent() {
-               wfDeprecated( __METHOD__, '1.21' );
-               $content = $this->getContentObject();
-               return ContentHandler::getContentText( $content );
-       }
-
        /**
         * Returns a Content object representing the pages effective display content,
         * not necessarily the revision's content!
@@ -316,46 +298,6 @@ class Article implements Page {
                return $oldid;
        }
 
-       /**
-        * Get text of an article from database
-        * Does *NOT* follow redirects.
-        *
-        * @protected
-        * @note This is really internal functionality that should really NOT be
-        * used by other functions. For accessing article content, use the WikiPage
-        * class, especially WikiBase::getContent(). However, a lot of legacy code
-        * uses this method to retrieve page text from the database, so the function
-        * has to remain public for now.
-        *
-        * @return string|bool String containing article contents, or false if null
-        * @deprecated since 1.21, use WikiPage::getContent() instead
-        */
-       function fetchContent() {
-               // BC cruft!
-
-               wfDeprecated( __METHOD__, '1.21' );
-
-               if ( $this->mContentLoaded && $this->mContent ) {
-                       return $this->mContent;
-               }
-
-               $content = $this->fetchContentObject();
-
-               if ( !$content ) {
-                       return false;
-               }
-
-               // @todo Get rid of mContent everywhere!
-               $this->mContent = ContentHandler::getContentText( $content );
-               ContentHandler::runLegacyHooks(
-                       'ArticleAfterFetchContent',
-                       [ &$this, &$this->mContent ],
-                       '1.21'
-               );
-
-               return $this->mContent;
-       }
-
        /**
         * Get text content object
         * Does *NOT* follow redirects.
@@ -428,10 +370,12 @@ class Article implements Page {
                $this->mContentObject = $content;
                $this->mRevIdFetched = $this->mRevision->getId();
 
-               ContentHandler::runLegacyHooks(
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $articlePage = $this;
+
+               Hooks::run(
                        'ArticleAfterFetchContentObject',
-                       [ &$this, &$this->mContentObject ],
-                       '1.21'
+                       [ &$articlePage, &$this->mContentObject ]
                );
 
                return $this->mContentObject;
@@ -565,7 +509,9 @@ class Article implements Page {
                while ( !$outputDone && ++$pass ) {
                        switch ( $pass ) {
                                case 1:
-                                       Hooks::run( 'ArticleViewHeader', [ &$this, &$outputDone, &$useParserCache ] );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $articlePage = $this;
+                                       Hooks::run( 'ArticleViewHeader', [ &$articlePage, &$outputDone, &$useParserCache ] );
                                        break;
                                case 2:
                                        # Early abort if the page doesn't exist
@@ -724,7 +670,6 @@ class Article implements Page {
        /**
         * Show a diff page according to current request variables. For use within
         * Article::view() only, other callers should use the DifferenceEngine class.
-        *
         */
        protected function showDiffPage() {
                $request = $this->getContext()->getRequest();
@@ -904,9 +849,12 @@ class Article implements Page {
                $redirectTargetUrl = $this->getTitle()->getLinkURL( $query );
 
                if ( isset( $this->mRedirectedFrom ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $articlePage = $this;
+
                        // This is an internally redirected page view.
                        // We'll need a backlink to the source page for navigation.
-                       if ( Hooks::run( 'ArticleViewRedirect', [ &$this ] ) ) {
+                       if ( Hooks::run( 'ArticleViewRedirect', [ &$articlePage ] ) ) {
                                $redir = Linker::linkKnown(
                                        $this->mRedirectedFrom,
                                        null,
@@ -1336,7 +1284,10 @@ class Article implements Page {
         * @param int $oldid Revision ID of this article revision
         */
        public function setOldSubtitle( $oldid = 0 ) {
-               if ( !Hooks::run( 'DisplayOldSubtitle', [ &$this, &$oldid ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $articlePage = $this;
+
+               if ( !Hooks::run( 'DisplayOldSubtitle', [ &$articlePage, &$oldid ] ) ) {
                        return;
                }
 
@@ -1717,7 +1668,6 @@ class Article implements Page {
                Hooks::run( 'ArticleConfirmDelete', [ $this, $outputPage, &$reason ] );
 
                $user = $this->getContext()->getUser();
-
                if ( $user->isAllowed( 'suppressrevision' ) ) {
                        $suppress = Html::openElement( 'div', [ 'id' => 'wpDeleteSuppressRow' ] ) .
                                Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
@@ -1727,7 +1677,6 @@ class Article implements Page {
                        $suppress = '';
                }
                $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $title );
-
                $form = Html::openElement( 'form', [ 'method' => 'post',
                        'action' => $title->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ] ) .
                        Html::openElement( 'fieldset', [ 'id' => 'mw-delete-table' ] ) .
@@ -1899,7 +1848,9 @@ class Article implements Page {
                                && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
                        // Extension may have reason to disable file caching on some pages.
                        if ( $cacheable ) {
-                               $cacheable = Hooks::run( 'IsFileCacheable', [ &$this ] );
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $articlePage = $this;
+                               $cacheable = Hooks::run( 'IsFileCacheable', [ &$articlePage ] );
                        }
                }
 
@@ -2065,22 +2016,13 @@ class Article implements Page {
 
        /**
         * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::doEdit
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               return $this->mPage->doEdit( $text, $summary, $flags, $baseRevId, $user );
-       }
-
-       /**
-        * Call to WikiPage function for backwards compatibility.
+        * @deprecated since 1.29. Use WikiPage::doEditContent() directly instead
         * @see WikiPage::doEditContent
         */
        public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
                User $user = null, $serialFormat = null
        ) {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->doEditContent( $content, $summary, $flags, $baseRevId,
                        $user, $serialFormat
                );
index 6d2be51..ccc50f7 100644 (file)
@@ -54,7 +54,10 @@ class CategoryPage extends Article {
                        return;
                }
 
-               if ( !Hooks::run( 'CategoryPageView', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $categoryPage = $this;
+
+               if ( !Hooks::run( 'CategoryPageView', [ &$categoryPage ] ) ) {
                        return;
                }
 
index f4880d1..58f1666 100644 (file)
@@ -45,7 +45,9 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
 
                // Only display 10 revisions at once by default, otherwise the list is overwhelming
                $this->mLimitsShown = array_merge( [ 10 ], $this->mLimitsShown );
-               $this->setLimit( 10 );
+               $this->mDefaultLimit = 10;
+               list( $this->mLimit, /* $offset */ ) =
+                       $this->mRequest->getLimitOffset( $this->mDefaultLimit, '' );
        }
 
        /**
index db3ec14..b60b010 100644 (file)
@@ -69,6 +69,7 @@ class ImagePage extends Article {
                $this->fileLoaded = true;
 
                $this->displayImg = $img = false;
+
                Hooks::run( 'ImagePageFindFile', [ $this, &$img, &$this->displayImg ] );
                if ( !$img ) { // not set by hook?
                        $img = wfFindFile( $this->getTitle() );
@@ -335,7 +336,10 @@ class ImagePage extends Article {
                        $filename = wfEscapeWikiText( $this->displayImg->getName() );
                        $linktext = $filename;
 
-                       Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$this, &$out ] );
+                       // Use of &$this in hooks triggers warnings in PHP 7.1
+                       $imagePage = $this;
+
+                       Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$imagePage, &$out ] );
 
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
index 74566cb..1fa4bfa 100644 (file)
@@ -224,4 +224,20 @@ class WikiFilePage extends WikiPage {
 
                return TitleArray::newFromResult( $res );
        }
+
+       /**
+        * @since 1.28
+        * @return string
+        */
+       public function getWikiDisplayName() {
+               return $this->getFile()->getRepo()->getDisplayName();
+       }
+
+       /**
+        * @since 1.28
+        * @return string
+        */
+       public function getSourceURL() {
+               return $this->getFile()->getDescriptionUrl();
+       }
 }
index 284a343..f760cd1 100644 (file)
@@ -316,7 +316,10 @@ class WikiPage implements Page, IDBAccessObject {
        protected function pageData( $dbr, $conditions, $options = [] ) {
                $fields = self::selectFields();
 
-               Hooks::run( 'ArticlePageDataBefore', [ &$this, &$fields ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
+               Hooks::run( 'ArticlePageDataBefore', [ &$wikiPage, &$fields ] );
 
                $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
@@ -685,28 +688,6 @@ class WikiPage implements Page, IDBAccessObject {
                return null;
        }
 
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string|bool The text of the current revision
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getText( $audience, $user );
-               }
-               return false;
-       }
-
        /**
         * @return string MW timestamp of last article revision
         */
@@ -1143,7 +1124,10 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function doPurge( $flags = self::PURGE_ALL ) {
-               if ( !Hooks::run( 'ArticlePurge', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
+               if ( !Hooks::run( 'ArticlePurge', [ &$wikiPage ] ) ) {
                        return false;
                }
 
@@ -1173,22 +1157,8 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // @todo move this logic to MessageCache
-                       if ( $this->exists() ) {
-                               // NOTE: use transclusion text for messages.
-                               //       This is consistent with  MessageCache::getMsgFromNamespace()
-
-                               $content = $this->getContent();
-                               $text = $content === null ? null : $content->getWikitextForTransclusion();
-
-                               if ( $text === null ) {
-                                       $text = false;
-                               }
-                       } else {
-                               $text = false;
-                       }
-
-                       MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
+                       $messageCache = MessageCache::singleton();
+                       $messageCache->updateMessageOverride( $this->mTitle, $this->getContent() );
                }
 
                return true;
@@ -1427,7 +1397,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $sectionContent New content of the section.
@@ -1467,7 +1437,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * @param string|int|null|bool $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
         * or 'new' for a new section.
         * @param Content $sectionContent New content of the section.
@@ -1534,68 +1504,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $flags;
        }
 
-       /**
-        * Change an existing article or create a new article. Updates RC and all necessary caches,
-        * optionally via the deferred update array.
-        *
-        * @param string $text New text
-        * @param string $summary Edit summary
-        * @param int $flags Bitfield:
-        *      EDIT_NEW
-        *          Article is known or assumed to be non-existent, create a new one
-        *      EDIT_UPDATE
-        *          Article is known or assumed to be pre-existing, update it
-        *      EDIT_MINOR
-        *          Mark this edit minor, if the user is allowed to do so
-        *      EDIT_SUPPRESS_RC
-        *          Do not log the change in recentchanges
-        *      EDIT_FORCE_BOT
-        *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_AUTOSUMMARY
-        *          Fill in blank summaries with generated text where possible
-        *      EDIT_INTERNAL
-        *          Signal that the page retrieve/save cycle happened entirely in this request.
-        *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
-        * article will be detected. If EDIT_UPDATE is specified and the article
-        * doesn't exist, the function will return an edit-gone-missing error. If
-        * EDIT_NEW is specified and the article does exist, an edit-already-exists
-        * error will be returned. These two conditions are also possible with
-        * auto-detection due to MediaWiki's performance-optimised locking strategy.
-        *
-        * @param bool|int $baseRevId The revision ID this edit was based off, if any.
-        *   This is not the parent revision ID, rather the revision ID for older
-        *   content used as the source for a rollback, for example.
-        * @param User $user The user doing the edit
-        *
-        * @throws MWException
-        * @return Status Possible errors:
-        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
-        *     set the fatal flag of $status
-        *   edit-gone-missing: In update mode, but the article didn't exist.
-        *   edit-conflict: In update mode, the article changed unexpectedly.
-        *   edit-no-change: Warning that the text was the same as before.
-        *   edit-already-exists: In creation mode, but the article already exists.
-        *
-        * Extensions may define additional errors.
-        *
-        * $return->value will contain an associative array with members as follows:
-        *     new: Boolean indicating if the function attempted to create a new article.
-        *     revision: The revision object for the inserted revision, or null.
-        *
-        * Compatibility note: this function previously returned a boolean value
-        * indicating success/failure
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-
-               return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
-       }
-
        /**
         * Change an existing article or create a new article. Updates RC and all necessary caches,
         * optionally via the deferred update array.
@@ -1634,6 +1542,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array|null $tags Change tags to apply to this edit
         * Callers are responsible for permission checks
         * (with ChangeTags::canAddTagsAccompanyingChange)
+        * @param Int $undidRevId Id of revision that was undone or 0
         *
         * @throws MWException
         * @return Status Possible errors:
@@ -1655,7 +1564,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function doEditContent(
                Content $content, $summary, $flags = 0, $baseRevId = false,
-               User $user = null, $serialFormat = null, $tags = []
+               User $user = null, $serialFormat = null, $tags = [], $undidRevId = 0
        ) {
                global $wgUser, $wgUseAutomaticEditSummaries;
 
@@ -1684,14 +1593,15 @@ class WikiPage implements Page, IDBAccessObject {
                $user = $user ?: $wgUser;
                $flags = $this->checkFlags( $flags );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
                // Trigger pre-save hook (using provided edit summary)
                $hookStatus = Status::newGood( [] );
-               $hook_args = [ &$this, &$user, &$content, &$summary,
+               $hook_args = [ &$wikiPage, &$user, &$content, &$summary,
                                                        $flags & EDIT_MINOR, null, null, &$flags, &$hookStatus ];
                // Check if the hook rejected the attempted save
-               if ( !Hooks::run( 'PageContentSave', $hook_args )
-                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args, '1.21' )
-               ) {
+               if ( !Hooks::run( 'PageContentSave', $hook_args ) ) {
                        if ( $hookStatus->isOK() ) {
                                // Hook returned false but didn't call fatal(); use generic message
                                $hookStatus->fatal( 'edit-hook-aborted' );
@@ -1734,7 +1644,8 @@ class WikiPage implements Page, IDBAccessObject {
                        'oldId' => $this->getLatest(),
                        'oldIsRedirect' => $this->isRedirect(),
                        'oldCountable' => $this->isCountable(),
-                       'tags' => ( $tags !== null ) ? (array)$tags : []
+                       'tags' => ( $tags !== null ) ? (array)$tags : [],
+                       'undidRevId' => $undidRevId
                ];
 
                // Actually create the revision and create/update the page
@@ -1912,10 +1823,12 @@ class WikiPage implements Page, IDBAccessObject {
                                                        'oldrevision' => $meta['oldRevision']
                                                ]
                                        );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $wikiPage = $this;
                                        // Trigger post-save hook
-                                       $params = [ &$this, &$user, $content, $summary, $flags & EDIT_MINOR,
-                                               null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
-                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+                                       $params = [ &$wikiPage, &$user, $content, $summary, $flags & EDIT_MINOR,
+                                               null, null, &$flags, $revision, &$status, $meta['baseRevId'],
+                                               $meta['undidRevId'] ];
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
                        ),
@@ -2032,16 +1945,15 @@ class WikiPage implements Page, IDBAccessObject {
                                ) {
                                        // Update links, etc.
                                        $this->doEditUpdates( $revision, $user, [ 'created' => true ] );
+                                       // Avoid PHP 7.1 warning of passing $this by reference
+                                       $wikiPage = $this;
                                        // Trigger post-create hook
-                                       $params = [ &$this, &$user, $content, $summary,
+                                       $params = [ &$wikiPage, &$user, $content, $summary,
                                                $flags & EDIT_MINOR, null, null, &$flags, $revision ];
-                                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params, '1.21' );
                                        Hooks::run( 'PageContentInsertComplete', $params );
                                        // Trigger post-save hook
                                        $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
-                                       ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params, '1.21' );
                                        Hooks::run( 'PageContentSaveComplete', $params );
-
                                }
                        ),
                        DeferredUpdates::PRESEND
@@ -2076,22 +1988,6 @@ class WikiPage implements Page, IDBAccessObject {
                return $options;
        }
 
-       /**
-        * Prepare text which is about to be saved.
-        * Returns a stdClass with source, pst and output members
-        *
-        * @param string $text
-        * @param int|null $revid
-        * @param User|null $user
-        * @deprecated since 1.21: use prepareContentForEdit instead.
-        * @return object
-        */
-       public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               return $this->prepareContentForEdit( $content, $revid, $user );
-       }
-
        /**
         * Prepare content which is about to be saved.
         * Returns a stdClass with source, pst and output members
@@ -2250,7 +2146,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = [] ) {
-               global $wgRCWatchCategoryMembership, $wgContLang;
+               global $wgRCWatchCategoryMembership;
 
                $options += [
                        'changed' => true,
@@ -2326,9 +2222,12 @@ class WikiPage implements Page, IDBAccessObject {
                        }
                }
 
-               Hooks::run( 'ArticleEditUpdates', [ &$this, &$editInfo, $options['changed'] ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
 
-               if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', [ &$this ] ) ) {
+               Hooks::run( 'ArticleEditUpdates', [ &$wikiPage, &$editInfo, $options['changed'] ] );
+
+               if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', [ &$wikiPage ] ) ) {
                        // Flush old entries from the `recentchanges` table
                        if ( mt_rand( 0, 9 ) == 0 ) {
                                JobQueueGroup::singleton()->lazyPush( RecentChangesUpdateJob::newPurgeJob() );
@@ -2372,9 +2271,12 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( !$recipient ) {
                                wfDebug( __METHOD__ . ": invalid username\n" );
                        } else {
+                               // Avoid PHP 7.1 warning of passing $this by reference
+                               $wikiPage = $this;
+
                                // Allow extensions to prevent user notification
                                // when a new message is added to their talk page
-                               if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$this, $recipient ] ) ) {
+                               if ( Hooks::run( 'ArticleEditUpdateNewTalk', [ &$wikiPage, $recipient ] ) ) {
                                        if ( User::isIP( $shortTitle ) ) {
                                                // An anonymous user
                                                $recipient->setNewtalk( true, $revision );
@@ -2388,17 +2290,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // XXX: could skip pseudo-messages like js/css here, based on content model.
-                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
-                       if ( $msgtext === false || $msgtext === null ) {
-                               $msgtext = '';
-                       }
-
-                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
-
-                       if ( $wgContLang->hasVariants() ) {
-                               $wgContLang->updateConversionTable( $this->mTitle );
-                       }
+                       MessageCache::singleton()->updateMessageOverride( $this->mTitle, $content );
                }
 
                if ( $options['created'] ) {
@@ -2513,7 +2405,10 @@ class WikiPage implements Page, IDBAccessObject {
                $nullRevision = null;
 
                if ( $id ) { // Protection of existing page
-                       if ( !Hooks::run( 'ArticleProtect', [ &$this, &$user, $limit, $reason ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $wikiPage = $this;
+
+                       if ( !Hooks::run( 'ArticleProtect', [ &$wikiPage, &$user, $limit, $reason ] ) ) {
                                return Status::newGood();
                        }
 
@@ -2600,9 +2495,12 @@ class WikiPage implements Page, IDBAccessObject {
                                __METHOD__
                        );
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $wikiPage = $this;
+
                        Hooks::run( 'NewRevisionFromEditComplete',
                                [ $this, $nullRevision, $latest, $user ] );
-                       Hooks::run( 'ArticleProtectComplete', [ &$this, &$user, $limit, $reason ] );
+                       Hooks::run( 'ArticleProtectComplete', [ &$wikiPage, &$user, $limit, $reason ] );
                } else { // Protection of non-existing page (also known as "title protection")
                        // Cascade protection is meaningless in this case
                        $cascade = false;
@@ -2882,9 +2780,12 @@ class WikiPage implements Page, IDBAccessObject {
                        return $status;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $wikiPage = $this;
+
                $user = is_null( $user ) ? $wgUser : $user;
                if ( !Hooks::run( 'ArticleDelete',
-                       [ &$this, &$user, &$reason, &$error, &$status, $suppress ]
+                       [ &$wikiPage, &$user, &$reason, &$error, &$status, $suppress ]
                ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
@@ -3396,8 +3297,6 @@ class WikiPage implements Page, IDBAccessObject {
         * @param Title $title
         */
        public static function onArticleDelete( Title $title ) {
-               global $wgContLang;
-
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
 
@@ -3414,11 +3313,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
-                       MessageCache::singleton()->replace( $title->getDBkey(), false );
-
-                       if ( $wgContLang->hasVariants() ) {
-                               $wgContLang->updateConversionTable( $title );
-                       }
+                       MessageCache::singleton()->updateMessageOverride( $title, null );
                }
 
                // Images
@@ -3727,4 +3622,30 @@ class WikiPage implements Page, IDBAccessObject {
        public function isLocal() {
                return true;
        }
+
+       /**
+        * The display name for the site this content
+        * come from. If a subclass overrides isLocal(),
+        * this could return something other than the
+        * current site name
+        *
+        * @since 1.28
+        * @return string
+        */
+       public function getWikiDisplayName() {
+               global $wgSitename;
+               return $wgSitename;
+       }
+
+       /**
+        * Get the source URL for the content on this page,
+        * typically the canonical URL, but may be a remote
+        * link if the content comes from another site
+        *
+        * @since 1.28
+        * @return string
+        */
+       public function getSourceURL() {
+               return $this->getTitle()->getCanonicalURL();
+       }
 }
index f2fca68..770c1c6 100644 (file)
@@ -336,7 +336,7 @@ abstract class TablePager extends IndexPager {
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
-        * @param string $attribs Extra attributes to set
+        * @param string[] $attribs Extra attributes to set
         * @return string HTML fragment
         */
        public function getLimitSelect( $attribs = [] ) {
index 4c82dda..6aa3acc 100644 (file)
@@ -276,7 +276,7 @@ class CoreParserFunctions {
                }
                if ( !is_null( $title ) ) {
                        # Convert NS_MEDIA -> NS_FILE
-                       if ( $title->getNamespace() == NS_MEDIA ) {
+                       if ( $title->inNamespace( NS_MEDIA ) ) {
                                $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
                        }
                        if ( !is_null( $arg ) ) {
@@ -341,7 +341,7 @@ class CoreParserFunctions {
                // allow prefix.
                $title = Title::newFromText( $username );
 
-               if ( $title && $title->getNamespace() == NS_USER ) {
+               if ( $title && $title->inNamespace( NS_USER ) ) {
                        $username = $title->getText();
                }
 
@@ -489,40 +489,66 @@ class CoreParserFunctions {
                return $mwObject->matchStartToEnd( $value );
        }
 
-       public static function formatRaw( $num, $raw ) {
+       /**
+        * Formats a number according to a language.
+        *
+        * @param int|float $num
+        * @param string $raw
+        * @param Language|StubUserLang $language
+        * @return string
+        */
+       public static function formatRaw( $num, $raw, $language ) {
                if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
                        return $num;
                } else {
-                       global $wgContLang;
-                       return $wgContLang->formatNum( $num );
+                       return $language->formatNum( $num );
                }
        }
+
        public static function numberofpages( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::pages(), $raw );
+               return self::formatRaw( SiteStats::pages(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::users(), $raw );
+               return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
        }
        public static function numberofactiveusers( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::activeUsers(), $raw );
+               return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofarticles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::articles(), $raw );
+               return self::formatRaw( SiteStats::articles(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberoffiles( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::images(), $raw );
+               return self::formatRaw( SiteStats::images(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofadmins( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw );
+               return self::formatRaw(
+                       SiteStats::numberingroup( 'sysop' ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
+
        public static function numberofedits( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::edits(), $raw );
+               return self::formatRaw( SiteStats::edits(), $raw, $parser->getFunctionLang() );
        }
+
        public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
-               return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
+               return self::formatRaw(
+                       SiteStats::pagesInNs( intval( $namespace ) ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
        public static function numberingroup( $parser, $name = '', $raw = null ) {
-               return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
+               return self::formatRaw(
+                       SiteStats::numberingroup( strtolower( $name ) ),
+                       $raw,
+                       $parser->getFunctionLang()
+               );
        }
 
        /**
@@ -729,7 +755,7 @@ class CoreParserFunctions {
 
                $title = Title::makeTitleSafe( NS_CATEGORY, $name );
                if ( !$title ) { # invalid title
-                       return self::formatRaw( 0, $raw );
+                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
                }
                $wgContLang->findVariantLink( $name, $title, true );
 
@@ -755,7 +781,7 @@ class CoreParserFunctions {
                }
 
                $count = $cache[$name][$type];
-               return self::formatRaw( $count, $raw );
+               return self::formatRaw( $count, $raw, $parser->getFunctionLang() );
        }
 
        /**
@@ -771,7 +797,7 @@ class CoreParserFunctions {
                $title = Title::newFromText( $page );
 
                if ( !is_object( $title ) ) {
-                       return self::formatRaw( 0, $raw );
+                       return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
                }
 
                // fetch revision from cache/database and return the value
@@ -781,7 +807,7 @@ class CoreParserFunctions {
                        // We've had bugs where rev_len was not being recorded for empty pages, see T135414
                        $length = 0;
                }
-               return self::formatRaw( $length, $raw );
+               return self::formatRaw( $length, $raw, $parser->getFunctionLang() );
        }
 
        /**
index 40da368..08e3c77 100644 (file)
  * @ingroup Parser
  */
 class DateFormatter {
-       public $mSource, $mTarget;
-       public $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
+       private $mSource, $mTarget;
+       private $monthNames = '';
 
-       public $regexes, $pDays, $pMonths, $pYears;
-       public $rules, $xMonths, $preferences;
+       private $regexes;
+       private $rules, $xMonths, $preferences;
 
-       protected $lang, $mLinked;
+       private $lang, $mLinked;
+
+       /** @var string[] */
+       private $keys;
+
+       /** @var string[] */
+       private $targets;
 
        const ALL = -1;
        const NONE = 0;
@@ -198,10 +204,12 @@ class DateFormatter {
        }
 
        /**
+        * Regexp replacement callback
+        *
         * @param array $matches
         * @return string
         */
-       public function replace( $matches ) {
+       private function replace( $matches ) {
                # Extract information from $matches
                $linked = true;
                if ( isset( $this->mLinked ) ) {
@@ -217,15 +225,17 @@ class DateFormatter {
                        }
                }
 
-               return $this->formatDate( $bits, $linked );
+               return $this->formatDate( $bits, $matches[0], $linked );
        }
 
        /**
         * @param array $bits
+        * @param string $orig Original input string, to be returned
+        *  on formatting failure.
         * @param bool $link
         * @return string
         */
-       public function formatDate( $bits, $link = true ) {
+       private function formatDate( $bits, $orig, $link = true ) {
                $format = $this->targets[$this->mTarget];
 
                if ( !$link ) {
@@ -300,8 +310,9 @@ class DateFormatter {
                        }
                }
                if ( $fail ) {
-                       /** @todo FIXME: $matches doesn't exist here, what's expected? */
-                       $text = $matches[0];
+                       // This occurs when parsing a date with day or month outside the bounds
+                       // of possibilities.
+                       $text = $orig;
                }
 
                $isoBits = [];
@@ -323,7 +334,7 @@ class DateFormatter {
         * Return a regex that can be used to find month names in string
         * @return string regex to find the months with
         */
-       public function getMonthRegex() {
+       private function getMonthRegex() {
                $names = [];
                for ( $i = 1; $i <= 12; $i++ ) {
                        $names[] = $this->lang->getMonthName( $i );
@@ -337,7 +348,7 @@ class DateFormatter {
         * @param string $monthName Month name
         * @return string ISO month name
         */
-       public function makeIsoMonth( $monthName ) {
+       private function makeIsoMonth( $monthName ) {
                $n = $this->xMonths[$this->lang->lc( $monthName )];
                return sprintf( '%02d', $n );
        }
@@ -347,7 +358,7 @@ class DateFormatter {
         * @param string $year Year name
         * @return string ISO year name
         */
-       public function makeIsoYear( $year ) {
+       private function makeIsoYear( $year ) {
                # Assumes the year is in a nice format, as enforced by the regex
                if ( substr( $year, -2 ) == 'BC' ) {
                        $num = intval( substr( $year, 0, -3 ) ) - 1;
@@ -366,7 +377,7 @@ class DateFormatter {
         * @return int|string int representing year number in case of AD dates, or string containing
         *   year number and 'BC' at the end otherwise.
         */
-       public function makeNormalYear( $iso ) {
+       private function makeNormalYear( $iso ) {
                if ( $iso[0] == '-' ) {
                        $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
                } else {
index 10dfd26..3ec0596 100644 (file)
@@ -88,7 +88,7 @@ class Parser {
        # Constants needed for external link processing
        # Everything except bracket, space, or control characters
        # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
-       # as well as U+3000 is IDEOGRAPHIC SPACE for bug 19052
+       # as well as U+3000 is IDEOGRAPHIC SPACE for T21052
        const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
        # Simplified expression to match an IPv4 or IPv6 address, or
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
@@ -224,7 +224,7 @@ class Parser {
        /**
         * @var string Deprecated accessor for the strip marker prefix.
         * @deprecated since 1.26; use Parser::MARKER_PREFIX instead.
-        **/
+        */
        public $mUniqPrefix = Parser::MARKER_PREFIX;
 
        /**
@@ -271,7 +271,7 @@ class Parser {
                        # Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
                        $this->mPreprocessorClass = 'Preprocessor_Hash';
                } elseif ( extension_loaded( 'domxml' ) ) {
-                       # PECL extension that conflicts with the core DOM extension (bug 13770)
+                       # PECL extension that conflicts with the core DOM extension (T15770)
                        wfDebug( "Warning: you have the obsolete domxml extension for PHP. Please remove it!\n" );
                        $this->mPreprocessorClass = 'Preprocessor_Hash';
                } elseif ( extension_loaded( 'dom' ) ) {
@@ -300,7 +300,7 @@ class Parser {
        public function __clone() {
                $this->mInParse = false;
 
-               // Bug 56226: When you create a reference "to" an object field, that
+               // T58226: When you create a reference "to" an object field, that
                // makes the object field itself be a reference too (until the other
                // reference goes out of scope). When cloning, any field that's a
                // reference is copied as a reference in the new object. Both of these
@@ -357,7 +357,7 @@ class Parser {
 
                $this->mStripState = new StripState;
 
-               # Clear these on every parse, bug 4549
+               # Clear these on every parse, T6549
                $this->mTplRedirCache = $this->mTplDomCache = [];
 
                $this->mShowToc = true;
@@ -547,18 +547,32 @@ class Parser {
                        $limitReport = str_replace( [ '-', '&' ], [ '‐', '&amp;' ], $limitReport );
                        $text .= "\n<!-- \n$limitReport-->\n";
 
-                       // Add on template profiling data
+                       // Add on template profiling data in human/machine readable way
                        $dataByFunc = $this->mProfiler->getFunctionStats();
                        uasort( $dataByFunc, function ( $a, $b ) {
                                return $a['real'] < $b['real']; // descending order
                        } );
-                       $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
+                       $profileReport = [];
                        foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
-                               $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
+                               $profileReport[] = sprintf( "%6.2f%% %8.3f %6d %s",
                                        $item['%real'], $item['real'], $item['calls'],
                                        htmlspecialchars( $item['name'] ) );
                        }
-                       $text .= "\n<!-- \n$profileReport-->\n";
+                       $text .= "<!--\nTransclusion expansion time report (%,ms,calls,template)\n";
+                       $text .= implode( "\n", $profileReport ) . "\n-->\n";
+
+                       $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
+
+                       // Add other cache related metadata
+                       if ( $wgShowHostnames ) {
+                               $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
+                       }
+                       $this->mOutput->setLimitReportData( 'cachereport-timestamp',
+                               $this->mOutput->getCacheTime() );
+                       $this->mOutput->setLimitReportData( 'cachereport-ttl',
+                               $this->mOutput->getCacheExpiry() );
+                       $this->mOutput->setLimitReportData( 'cachereport-transientcontent',
+                               $this->mOutput->hasDynamicContent() );
 
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
@@ -672,7 +686,7 @@ class Parser {
        }
 
        /**
-        * Process the wikitext for the "?preload=" feature. (bug 5210)
+        * Process the wikitext for the "?preload=" feature. (T7210)
         *
         * "<noinclude>", "<includeonly>" etc. are parsed as for template
         * transclusion, comments, templates, arguments, tags hooks and parser
@@ -1181,9 +1195,10 @@ class Parser {
                                        # A cell could contain both parameters and data
                                        $cell_data = explode( '|', $cell, 2 );
 
-                                       # Bug 553: Note that a '|' inside an invalid link should not
+                                       # T2553: Note that a '|' inside an invalid link should not
                                        # be mistaken as delimiting cell parameters
-                                       if ( strpos( $cell_data[0], '[[' ) !== false ) {
+                                       # Bug T153140: Neither should language converter markup.
+                                       if ( preg_match( '/\[\[|-\{/', $cell_data[0] ) === 1 ) {
                                                $cell = "{$previous}<{$last_tag}>{$cell}";
                                        } elseif ( count( $cell_data ) == 1 ) {
                                                $cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
@@ -1319,12 +1334,12 @@ class Parser {
 
                # Clean up special characters, only run once, next-to-last before doBlockLevels
                $fixtags = [
-                       # french spaces, last one Guillemet-left
+                       # French spaces, last one Guillemet-left
                        # only if there is something before the space
                        '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
                        # french spaces, Guillemet-right
                        '/(\\302\\253) /' => '\\1&#160;',
-                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
+                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, T13874.
                ];
                $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
 
@@ -1367,14 +1382,14 @@ class Parser {
                        }
                } else {
                        # attempt to sanitize at least some nesting problems
-                       # (bug #2702 and quite a few others)
+                       # (T4702 and quite a few others)
                        $tidyregs = [
                                # ''Something [http://www.cool.com cool''] -->
                                # <i>Something</i><a href="http://www.cool.com"..><i>cool></i></a>
                                '/(<([bi])>)(<([bi])>)?([^<]*)(<\/?a[^<]*>)([^<]*)(<\/\\4>)?(<\/\\2>)/' =>
                                '\\1\\3\\5\\8\\9\\6\\1\\3\\7\\8\\9',
                                # fix up an anchor inside another anchor, only
-                               # at least for a single single nested link (bug 3695)
+                               # at least for a single single nested link (T5695)
                                '/(<a[^>]+>)([^<]*)(<a[^>]+>[^<]*)<\/a>(.*)<\/a>/' =>
                                '\\1\\2</a>\\3</a>\\1\\4</a>',
                                # fix div inside inline elements- doBlockLevels won't wrap a line which
@@ -1639,7 +1654,7 @@ class Parser {
                        $thislen = strlen( $arr[$i] );
                        // If there are ever four apostrophes, assume the first is supposed to
                        // be text, and the remaining three constitute mark-up for bold text.
-                       // (bug 13227: ''''foo'''' turns into ' ''' foo ' ''')
+                       // (T15227: ''''foo'''' turns into ' ''' foo ' ''')
                        if ( $thislen == 4 ) {
                                $arr[$i - 1] .= "'";
                                $arr[$i] = "'''";
@@ -1647,7 +1662,7 @@ class Parser {
                        } elseif ( $thislen > 5 ) {
                                // If there are more than 5 apostrophes in a row, assume they're all
                                // text except for the last 5.
-                               // (bug 13227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
+                               // (T15227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
                                $arr[$i - 1] .= str_repeat( "'", $thislen - 5 );
                                $arr[$i] = "'''''";
                                $thislen = 5;
@@ -1932,18 +1947,6 @@ class Parser {
                return $attribs;
        }
 
-       /**
-        * Replace unusual escape codes in a URL with their equivalent characters
-        *
-        * @deprecated since 1.24, use normalizeLinkUrl
-        * @param string $url
-        * @return string
-        */
-       public static function replaceUnusualEscapes( $url ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return self::normalizeLinkUrl( $url );
-       }
-
        /**
         * Replace unusual escape codes in a URL with their equivalent characters
         *
@@ -2169,9 +2172,9 @@ class Parser {
                                # If we get a ] at the beginning of $m[3] that means we have a link that's something like:
                                # [[Image:Foo.jpg|[http://example.com desc]]] <- having three ] in a row fucks up,
                                # the real problem is with the $e1 regex
-                               # See bug 1300.
+                               # See T1500.
                                # Still some problems for cases where the ] is meant to be outside punctuation,
-                               # and no image is in sight. See bug 2095.
+                               # and no image is in sight. See T4095.
                                if ( $text !== ''
                                        && substr( $m[3], 0, 1 ) === ']'
                                        && strpos( $text, '[' ) !== false
@@ -2198,7 +2201,7 @@ class Parser {
                                continue;
                        }
 
-                       $origLink = $m[1];
+                       $origLink = ltrim( $m[1], ' ' );
 
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
@@ -2276,7 +2279,7 @@ class Parser {
                        if ( $wasblank ) {
                                $text = $link;
                        } else {
-                               # Bug 4598 madness. Handle the quotes only if they come from the alternate part
+                               # T6598 madness. Handle the quotes only if they come from the alternate part
                                # [[Lista d''e paise d''o munno]] -> <a href="...">Lista d''e paise d''o munno</a>
                                # [[Criticism of Harry Potter|Criticism of ''Harry Potter'']]
                                #    -> <a href="Criticism of Harry Potter">Criticism of <i>Harry Potter</i></a>
@@ -2292,7 +2295,7 @@ class Parser {
                                                in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
                                        )
                                ) {
-                                       # Bug 24502: filter duplicates
+                                       # T26502: filter duplicates
                                        if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
                                                $this->mLangLinkLanguages[$iw] = true;
                                                $this->mOutput->addLanguageLink( $nt->getFullText() );
@@ -2324,7 +2327,7 @@ class Parser {
                                                continue;
                                        }
                                } elseif ( $ns == NS_CATEGORY ) {
-                                       $s = rtrim( $s . "\n" ); # bug 87
+                                       $s = rtrim( $s . "\n" ); # T2087
 
                                        if ( $wasblank ) {
                                                $sortkey = $this->getDefaultSort();
@@ -2337,7 +2340,7 @@ class Parser {
                                        $this->mOutput->addCategory( $nt->getDBkey(), $sortkey );
 
                                        /**
-                                        * Strip the whitespace Category links produce, see bug 87
+                                        * Strip the whitespace Category links produce, see T2087
                                         */
                                        $s .= trim( $prefix . $trail, "\n" ) == '' ? '' : $prefix . $trail;
 
@@ -2606,7 +2609,7 @@ class Parser {
                                $subjPage = $this->mTitle->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
                                break;
-                       case 'pageid': // requested in bug 23427
+                       case 'pageid': // requested in T25427
                                $pageid = $this->getTitle()->getArticleID();
                                if ( $pageid == 0 ) {
                                        # 0 means the page doesn't exist in the database,
@@ -2717,7 +2720,7 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'H' ), true );
                                break;
                        case 'currentweek':
-                               # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+                               # @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to
                                # int to remove the padding
                                $value = $pageLang->formatNum( (int)MWTimestamp::getInstance( $ts )->format( 'W' ) );
                                break;
@@ -2743,7 +2746,7 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
                                break;
                        case 'localweek':
-                               # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
+                               # @bug T6594 PHP5 has it zero padded, PHP4 does not, cast to
                                # int to remove the padding
                                $value = $pageLang->formatNum( (int)MWTimestamp::getLocalInstance( $ts )->format( 'W' ) );
                                break;
@@ -2797,6 +2800,9 @@ class Parser {
                        case 'contentlanguage':
                                global $wgLanguageCode;
                                return $wgLanguageCode;
+                       case 'pagelanguage':
+                               $value = $pageLang->getCode();
+                               break;
                        case 'cascadingsources':
                                $value = CoreParserFunctions::cascadingsources( $this );
                                break;
@@ -2840,7 +2846,7 @@ class Parser {
         *     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
@@ -3275,7 +3281,7 @@ class Parser {
                        && !$piece['lineStart']
                        && preg_match( '/^(?:{\\||:|;|#|\*)/', $text )
                ) {
-                       # Bug 529: if the template begins with a table or block-level
+                       # T2529: if the template begins with a table or block-level
                        # element, it should be treated as beginning a new line.
                        # This behavior is somewhat controversial.
                        $text = "\n" . $text;
@@ -3284,7 +3290,7 @@ class Parser {
                if ( is_string( $text ) && !$this->incrementIncludeSize( 'post-expand', strlen( $text ) ) ) {
                        # Error, oversize inclusion
                        if ( $titleText !== false ) {
-                               # Make a working, properly escaped link if possible (bug 23588)
+                               # Make a working, properly escaped link if possible (T25588)
                                $text = "[[:$titleText]]";
                        } else {
                                # This will probably not be a working link, but at least it may
@@ -3968,9 +3974,8 @@ class Parser {
                ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
-               # (bug 8068) Allow control over whether robots index a page.
-               # @todo FIXME: Bug 14899: __INDEX__ always overrides __NOINDEX__ here!  This
-               # is not desirable, the last one on the page should win.
+               # (T10068) Allow control over whether robots index a page.
+               # __INDEX__ always overrides __NOINDEX__, see T16899
                if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
                        $this->mOutput->setIndexPolicy( 'noindex' );
                        $this->addTrackingCategory( 'noindex-category' );
@@ -4177,11 +4182,11 @@ class Parser {
 
                        # Strip out HTML (first regex removes any tag not allowed)
                        # Allowed tags are:
-                       # * <sup> and <sub> (bug 8393)
-                       # * <i> (bug 26375)
+                       # * <sup> and <sub> (T10393)
+                       # * <i> (T28375)
                        # * <b> (r105284)
-                       # * <bdi> (bug 72884)
-                       # * <span dir="rtl"> and <span dir="ltr"> (bug 35167)
+                       # * <bdi> (T74884)
+                       # * <span dir="rtl"> and <span dir="ltr"> (T37167)
                        # * <s> and <strike> (T35715)
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
@@ -4232,7 +4237,7 @@ class Parser {
                                        'noninitial' );
                        }
 
-                       # HTML names must be case-insensitively unique (bug 10721).
+                       # HTML names must be case-insensitively unique (T12721).
                        # This does not apply to Unicode characters per
                        # https://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison
                        # @todo FIXME: We may be changing them depending on the current locale.
@@ -4463,7 +4468,7 @@ class Parser {
                # the database, we use $wgContLang here in order to give
                # everyone the same signature and use the default one rather
                # than the one selected in each user's preferences.
-               # (see also bug 12815)
+               # (see also T14815)
                $ts = $this->mOptions->getTimestamp();
                $timestamp = MWTimestamp::getLocalInstance( $ts );
                $ts = $timestamp->format( 'YmdHis' );
@@ -4990,7 +4995,7 @@ class Parser {
                        $descQuery = false;
                        Hooks::run( 'BeforeParserFetchFileAndTitle',
                                [ $this, $title, &$options, &$descQuery ] );
-                       # Don't register it now, as ImageGallery does that later.
+                       # Don't register it now, as TraditionalImageGallery does that later.
                        $file = $this->fetchFileNoRegister( $title, $options );
                        $handler = $file ? $file->getHandler() : false;
 
@@ -5019,7 +5024,10 @@ class Parser {
                                // FIXME: Doing recursiveTagParse at this stage, and the trim before
                                // splitting on '|' is a bit odd, and different from makeImage.
                                $matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
-                               $parameterMatches = StringUtils::explode( '|', $matches[3] );
+                               // Protect LanguageConverter markup
+                               $parameterMatches = StringUtils::delimiterExplode(
+                                       '-{', '}-', '|', $matches[3], true /* nested */
+                               );
 
                                foreach ( $parameterMatches as $parameterMatch ) {
                                        list( $magicName, $match ) = $mwArray->matchVariableStartToEnd( $parameterMatch );
@@ -5036,6 +5044,11 @@ class Parser {
                                                        $addr = self::EXT_LINK_ADDR;
                                                        $prots = $this->mUrlProtocols;
                                                        // check to see if link matches an absolute url, if not then it must be a wiki link.
+                                                       if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
+                                                               // Result of LanguageConverter::markNoConversion
+                                                               // invoked on an external link.
+                                                               $linkValue = substr( $linkValue, 4, -2 );
+                                                       }
                                                        if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
                                                                $link = $linkValue;
                                                        } else {
@@ -5151,7 +5164,10 @@ class Parser {
                #  * bottom
                #  * text-bottom
 
-               $parts = StringUtils::explode( "|", $options );
+               # Protect LanguageConverter markup when splitting into parts
+               $parts = StringUtils::delimiterExplode(
+                       '-{', '}-', '|', $options, true /* allow nesting */
+               );
 
                # Give extensions a chance to select the file revision for us
                $options = [];
@@ -5199,7 +5215,7 @@ class Parser {
                                                        $validated = true;
                                                }
                                        }
-                                       # else no validation -- bug 13436
+                                       # else no validation -- T15436
                                } else {
                                        if ( $type === 'handler' ) {
                                                # Validate handler parameter
@@ -5247,7 +5263,7 @@ class Parser {
                                                case 'framed':
                                                case 'thumbnail':
                                                        // use first appearing option, discard others.
-                                                       $validated = ! $seenformat;
+                                                       $validated = !$seenformat;
                                                        $seenformat = true;
                                                        break;
                                                default:
@@ -5438,14 +5454,14 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string|number $sectionId A section identifier string of the form:
+        * @param string|int $sectionId A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
         * was derived during a template inclusion parse, in other words this is a template
         * section edit link. If no flags are given, it was an ordinary section edit link.
         * This flag is required to avoid a section numbering mismatch when a section is
-        * enclosed by "<includeonly>" (bug 6563).
+        * enclosed by "<includeonly>" (T8563).
         *
         * The section number 0 pulls the text before the first heading; other numbers will
         * pull the given section along with its lower-level subsections. If the section is
@@ -5579,7 +5595,7 @@ class Parser {
         * If a section contains subsections, these are also returned.
         *
         * @param string $text Text to look in
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1').
         * @param string $defaultText Default to return if section is not found
         *
@@ -5595,7 +5611,7 @@ class Parser {
         * section does not exist, $oldtext is returned unchanged.
         *
         * @param string $oldText Former text of the article
-        * @param string|number $sectionId Section identifier as a number or string
+        * @param string|int $sectionId Section identifier as a number or string
         * (e.g. 0, 1 or 'T-1').
         * @param string $newText Replacing text
         *
@@ -5986,7 +6002,7 @@ class Parser {
                        return $parsedWidthParam;
                }
                $m = [];
-               # (bug 13500) In both cases (width/height and width only),
+               # (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 ) ) {
                        $width = intval( $m[1] );
index d2ef5e3..7bf848f 100644 (file)
@@ -193,6 +193,9 @@ class ParserOutput extends CacheTime {
         */
        private $mLimitReportData = [];
 
+       /** @var array Parser limit report data for JSON */
+       private $mLimitReportJSData = [];
+
        /**
         * @var array $mParseStartTime Timestamps for getTimeSinceStart().
         */
@@ -215,7 +218,7 @@ class ParserOutput extends CacheTime {
        private $mMaxAdaptiveExpiry = INF;
 
        const EDITSECTION_REGEX =
-               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
+               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#s';
 
        // finalizeAdaptiveCacheExpiry() uses TTL = MAX( m * PARSE_TIME + b, MIN_AR_TTL)
        // Current values imply that m=3933.333333 and b=-333.333333
@@ -411,6 +414,10 @@ class ParserOutput extends CacheTime {
                return $this->mLimitReportData;
        }
 
+       public function getLimitReportJSData() {
+               return $this->mLimitReportJSData;
+       }
+
        public function getTOCEnabled() {
                return $this->mTOCEnabled;
        }
@@ -823,7 +830,6 @@ class ParserOutput extends CacheTime {
         * @code
         *    $parser->getOutput()->my_ext_foo = '...';
         * @endcode
-        *
         */
        public function setProperty( $name, $value ) {
                $this->mProperties[$name] = $value;
@@ -1011,6 +1017,26 @@ class ParserOutput extends CacheTime {
         */
        public function setLimitReportData( $key, $value ) {
                $this->mLimitReportData[$key] = $value;
+
+               if ( is_array( $value ) ) {
+                       if ( array_keys( $value ) === [ 0, 1 ]
+                               && is_numeric( $value[0] )
+                               && is_numeric( $value[1] )
+                       ) {
+                               $data = [ 'value' => $value[0], 'limit' => $value[1] ];
+                       } else {
+                               $data = $value;
+                       }
+               } else {
+                       $data = $value;
+               }
+
+               if ( strpos( $key, '-' ) ) {
+                       list( $ns, $name ) = explode( '-', $key, 2 );
+                       $this->mLimitReportJSData[$ns][$name] = $data;
+               } else {
+                       $this->mLimitReportJSData[$key] = $data;
+               }
        }
 
        /**
index cc98abd..426b550 100644 (file)
@@ -48,7 +48,13 @@ abstract class Preprocessor {
                        'names' => [ 2 => null ],
                        'min' => 2,
                        'max' => 2,
-               ]
+               ],
+               '-{' => [
+                       'end' => '}-',
+                       'names' => [ 1 => null ],
+                       'min' => 1,
+                       'max' => 1,
+               ],
        ];
 
        /**
index 5da7cd7..661318b 100644 (file)
@@ -193,6 +193,8 @@ class Preprocessor_DOM extends Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
+               global $wgDisableLangConversion;
+
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -220,6 +222,11 @@ class Preprocessor_DOM extends Preprocessor {
                $stack = new PPDStack;
 
                $searchBase = "[{<\n"; # }
+               if ( !$wgDisableLangConversion ) {
+                       // FIXME: disabled due to T153761
+                       // $searchBase .= '-';
+               }
+
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -298,7 +305,10 @@ class Preprocessor_DOM extends Preprocessor {
                                                break;
                                        }
                                } else {
-                                       $curChar = $text[$i];
+                                       $curChar = $curTwoChar = $text[$i];
+                                       if ( ( $i + 1 ) < $lengthText ) {
+                                               $curTwoChar .= $text[$i + 1];
+                                       }
                                        if ( $curChar == '|' ) {
                                                $found = 'pipe';
                                        } elseif ( $curChar == '=' ) {
@@ -311,11 +321,20 @@ class Preprocessor_DOM extends Preprocessor {
                                                } else {
                                                        $found = 'line-start';
                                                }
+                                       } elseif ( $curTwoChar == $currentClosing ) {
+                                               $found = 'close';
+                                               $curChar = $curTwoChar;
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
+                                       } elseif ( isset( $this->rules[$curTwoChar] ) ) {
+                                               $curChar = $curTwoChar;
+                                               $found = 'open';
+                                               $rule = $this->rules[$curChar];
                                        } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
                                                $rule = $this->rules[$curChar];
+                                       } elseif ( $curChar == '-' ) {
+                                               $found = 'dash';
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -595,7 +614,8 @@ class Preprocessor_DOM extends Preprocessor {
                                // input pointer.
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
-                               $count = strspn( $text, $curChar, $i );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
 
                                # we need to add to stack only if opening brace count is enough for one of the rules
                                if ( $count >= $rule['min'] ) {
@@ -615,12 +635,13 @@ class Preprocessor_DOM extends Preprocessor {
                                        # Add literal brace(s)
                                        $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
                                }
-                               $i += $count;
+                               $i += $curLen * $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
-                               $count = strspn( $text, $curChar, $i, $maxCount );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
@@ -643,7 +664,7 @@ class Preprocessor_DOM extends Preprocessor {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
                                        $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
-                                       $i += $count;
+                                       $i += $curLen * $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
@@ -682,7 +703,7 @@ class Preprocessor_DOM extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $matchingCount;
+                               $i += $curLen * $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -716,6 +737,9 @@ class Preprocessor_DOM extends Preprocessor {
                                $stack->getCurrentPart()->eqpos = strlen( $accum );
                                $accum .= '=';
                                ++$i;
+                       } elseif ( $found == 'dash' ) {
+                               $accum .= '-';
+                               ++$i;
                        }
                }
 
index 8a4637e..2666c93 100644 (file)
@@ -117,6 +117,8 @@ class Preprocessor_Hash extends Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
+               global $wgDisableLangConversion;
+
                $tree = $this->cacheGetTree( $text, $flags );
                if ( $tree !== false ) {
                        $store = json_decode( $tree );
@@ -152,6 +154,11 @@ class Preprocessor_Hash extends Preprocessor {
                $stack = new PPDStack_Hash;
 
                $searchBase = "[{<\n";
+               if ( !$wgDisableLangConversion ) {
+                       // FIXME: disabled due to T153761
+                       // $searchBase .= '-';
+               }
+
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -229,7 +236,10 @@ class Preprocessor_Hash extends Preprocessor {
                                                break;
                                        }
                                } else {
-                                       $curChar = $text[$i];
+                                       $curChar = $curTwoChar = $text[$i];
+                                       if ( ( $i + 1 ) < $lengthText ) {
+                                               $curTwoChar .= $text[$i + 1];
+                                       }
                                        if ( $curChar == '|' ) {
                                                $found = 'pipe';
                                        } elseif ( $curChar == '=' ) {
@@ -242,11 +252,20 @@ class Preprocessor_Hash extends Preprocessor {
                                                } else {
                                                        $found = 'line-start';
                                                }
+                                       } elseif ( $curTwoChar == $currentClosing ) {
+                                               $found = 'close';
+                                               $curChar = $curTwoChar;
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
+                                       } elseif ( isset( $this->rules[$curTwoChar] ) ) {
+                                               $curChar = $curTwoChar;
+                                               $found = 'open';
+                                               $rule = $this->rules[$curChar];
                                        } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
                                                $rule = $this->rules[$curChar];
+                                       } elseif ( $curChar == '-' ) {
+                                               $found = 'dash';
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -538,7 +557,8 @@ class Preprocessor_Hash extends Preprocessor {
                                // input pointer.
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
-                               $count = strspn( $text, $curChar, $i );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
 
                                # we need to add to stack only if opening brace count is enough for one of the rules
                                if ( $count >= $rule['min'] ) {
@@ -557,12 +577,13 @@ class Preprocessor_Hash extends Preprocessor {
                                        # Add literal brace(s)
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                }
-                               $i += $count;
+                               $i += $curLen * $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
-                               $count = strspn( $text, $curChar, $i, $maxCount );
+                               $curLen = strlen( $curChar );
+                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
@@ -585,7 +606,7 @@ class Preprocessor_Hash extends Preprocessor {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
-                                       $i += $count;
+                                       $i += $curLen * $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
@@ -627,7 +648,7 @@ class Preprocessor_Hash extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $matchingCount;
+                               $i += $curLen * $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -661,6 +682,9 @@ class Preprocessor_Hash extends Preprocessor {
                                $accum[] = [ 'equals', [ '=' ] ];
                                $stack->getCurrentPart()->eqpos = count( $accum ) - 1;
                                ++$i;
+                       } elseif ( $found == 'dash' ) {
+                               self::addLiteral( $accum, '-' );
+                               ++$i;
                        }
                }
 
index c929797..78d624c 100644 (file)
@@ -79,7 +79,7 @@ abstract class ParameterizedPassword extends Password {
        }
 
        public function needsUpdate() {
-               return parent::needsUpdate() || $this->params !== $this->getDefaultParams();
+               return $this->params !== $this->getDefaultParams();
        }
 
        public function toString() {
index 13d1e6d..c8a0267 100644 (file)
@@ -138,8 +138,7 @@ abstract class Password {
         *
         * @return bool True if needs update, false otherwise
         */
-       public function needsUpdate() {
-       }
+       abstract public function needsUpdate();
 
        /**
         * Compare one Password object to this object
index 29016a8..534e86b 100644 (file)
@@ -147,6 +147,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $logger->info( '{time} {title}', [
                                'time' => number_format( $time, 2 ),
                                'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                               'ns' => $this->page->getTitle()->getNamespace(),
                                'trigger' => 'view',
                        ] );
                }
index 8fc0b77..1bf4f54 100644 (file)
  * ($wgProfiler['exclude']) containing an array of function names.
  * Shell-style patterns are also accepted.
  *
+ * It is also possible to use the Tideways PHP extension, which is mostly
+ * a drop-in replacement for Xhprof. Just change the XHPROF_FLAGS_* constants
+ * to TIDEWAYS_FLAGS_*.
+ *
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
  * @ingroup Profiler
  * @see Xhprof
  * @see https://php.net/xhprof
  * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
+ * @see https://github.com/tideways/php-profiler-extension
  */
 class ProfilerXhprof extends Profiler {
        /**
diff --git a/includes/registration/CoreVersionChecker.php b/includes/registration/CoreVersionChecker.php
deleted file mode 100644 (file)
index f64d826..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<?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
- */
-
-use Composer\Semver\VersionParser;
-use Composer\Semver\Constraint\Constraint;
-
-/**
- * @since 1.26
- */
-class CoreVersionChecker {
-
-       /**
-        * @var Constraint|bool representing $wgVersion
-        */
-       private $coreVersion = false;
-
-       /**
-        * @var VersionParser
-        */
-       private $versionParser;
-
-       /**
-        * @param string $coreVersion Current version of core
-        */
-       public function __construct( $coreVersion ) {
-               $this->versionParser = new VersionParser();
-               try {
-                       $this->coreVersion = new Constraint(
-                               '==',
-                               $this->versionParser->normalize( $coreVersion )
-                       );
-               } catch ( UnexpectedValueException $e ) {
-                       // Non-parsable version, don't fatal.
-               }
-       }
-
-       /**
-        * Check that the provided constraint is compatible with the current version of core
-        *
-        * @param string $constraint Something like ">= 1.26"
-        * @return bool
-        */
-       public function check( $constraint ) {
-               if ( $this->coreVersion === false ) {
-                       // Couldn't parse the core version, so we can't check anything
-                       return true;
-               }
-
-               return $this->versionParser->parseConstraints( $constraint )
-                       ->matches( $this->coreVersion );
-       }
-}
diff --git a/includes/registration/ExtensionJsonValidationError.php b/includes/registration/ExtensionJsonValidationError.php
new file mode 100644 (file)
index 0000000..897d284
--- /dev/null
@@ -0,0 +1,22 @@
+<?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
+ */
+class ExtensionJsonValidationError extends Exception {
+}
diff --git a/includes/registration/ExtensionJsonValidator.php b/includes/registration/ExtensionJsonValidator.php
new file mode 100644 (file)
index 0000000..8142111
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use Composer\Spdx\SpdxLicenses;
+use JsonSchema\Validator;
+
+/**
+ * @since 1.29
+ */
+class ExtensionJsonValidator {
+
+       /**
+        * @var callable
+        */
+       private $missingDepCallback;
+
+       /**
+        * @param callable $missingDepCallback
+        */
+       public function __construct( callable $missingDepCallback ) {
+               $this->missingDepCallback = $missingDepCallback;
+       }
+
+       /**
+        * @return bool
+        */
+       public function checkDependencies() {
+               if ( !class_exists( Validator::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The JsonSchema library cannot be found, please install it through composer.'
+                       );
+                       return false;
+               } elseif ( !class_exists( SpdxLicenses::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The spdx-licenses library cannot be found, please install it through composer.'
+                       );
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @param string $path file to validate
+        * @return bool true if passes validation
+        * @throws ExtensionJsonValidationError on any failure
+        */
+       public function validate( $path ) {
+               $data = json_decode( file_get_contents( $path ) );
+               if ( !is_object( $data ) ) {
+                       throw new ExtensionJsonValidationError( "$path is not valid JSON" );
+               }
+
+               if ( !isset( $data->manifest_version ) ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path does not have manifest_version set." );
+               }
+
+               $version = $data->manifest_version;
+               $schemaPath = __DIR__ . "/../../docs/extension.schema.v$version.json";
+
+               // Not too old
+               if ( $version < ExtensionRegistry::OLDEST_MANIFEST_VERSION ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path is using a non-supported schema version"
+                       );
+               } elseif ( $version > ExtensionRegistry::MANIFEST_VERSION ) {
+                       throw new ExtensionJsonValidationError(
+                               "$path is using a non-supported schema version"
+                       );
+               }
+
+               $licenseError = false;
+               // Check if it's a string, if not, schema validation will display an error
+               if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) {
+                       $licenses = new SpdxLicenses();
+                       $valid = $licenses->validate( $data->{'license-name'} );
+                       if ( !$valid ) {
+                               $licenseError = '[license-name] Invalid SPDX license identifier, '
+                                       . 'see <https://spdx.org/licenses/>';
+                       }
+               }
+
+               $validator = new Validator;
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
+               if ( $validator->isValid() && !$licenseError ) {
+                       // All good.
+                       return true;
+               } else {
+                       $out = "$path did pass validation.\n";
+                       foreach ( $validator->getErrors() as $error ) {
+                               $out .= "[{$error['property']}] {$error['message']}\n";
+                       }
+                       if ( $licenseError ) {
+                               $out .= "$licenseError\n";
+                       }
+                       throw new ExtensionJsonValidationError( $out );
+               }
+       }
+}
index 207f884..1212f99 100644 (file)
@@ -141,6 +141,7 @@ class ExtensionProcessor implements Processor {
 
        /**
         * Things to be called once registration of these extensions are done
+        * keyed by the name of the extension that it belongs to
         *
         * @var callable[]
         */
@@ -180,11 +181,11 @@ class ExtensionProcessor implements Processor {
                $this->extractResourceLoaderModules( $dir, $info );
                $this->extractServiceWiringFiles( $dir, $info );
                $this->extractParserTestFiles( $dir, $info );
+               $name = $this->extractCredits( $path, $info );
                if ( isset( $info['callback'] ) ) {
-                       $this->callbacks[] = $info['callback'];
+                       $this->callbacks[$name] = $info['callback'];
                }
 
-               $this->extractCredits( $path, $info );
                foreach ( $info as $key => $val ) {
                        if ( in_array( $key, self::$globalSettings ) ) {
                                $this->storeToArray( $path, "wg$key", $val, $this->globals );
@@ -215,13 +216,7 @@ class ExtensionProcessor implements Processor {
        }
 
        public function getRequirements( array $info ) {
-               $requirements = [];
-               $key = ExtensionRegistry::MEDIAWIKI_CORE;
-               if ( isset( $info['requires'][$key] ) ) {
-                       $requirements[$key] = $info['requires'][$key];
-               }
-
-               return $requirements;
+               return isset( $info['requires'] ) ? $info['requires'] : [];
        }
 
        protected function extractHooks( array $info ) {
@@ -335,6 +330,7 @@ class ExtensionProcessor implements Processor {
        /**
         * @param string $path
         * @param array $info
+        * @return string Name of thing
         * @throws Exception
         */
        protected function extractCredits( $path, array $info ) {
@@ -360,6 +356,8 @@ class ExtensionProcessor implements Processor {
 
                $this->credits[$name] = $credits;
                $this->globals['wgExtensionCredits'][$credits['type']][] = $credits;
+
+               return $name;
        }
 
        /**
index b5c70e9..344dd8f 100644 (file)
@@ -31,7 +31,7 @@ class ExtensionRegistry {
        /**
         * Bump whenever the registration cache needs resetting
         */
-       const CACHE_VERSION = 3;
+       const CACHE_VERSION = 5;
 
        /**
         * Special key that defines the merge strategy
@@ -40,11 +40,6 @@ class ExtensionRegistry {
         */
        const MERGE_STRATEGY = '_merge_strategy';
 
-       /**
-        * @var BagOStuff
-        */
-       protected $cache;
-
        /**
         * Array of loaded things, keyed by name, values are credits information
         *
@@ -59,6 +54,13 @@ class ExtensionRegistry {
         */
        protected $queued = [];
 
+       /**
+        * Whether we are done loading things
+        *
+        * @var bool
+        */
+       private $finished = false;
+
        /**
         * Items in the JSON file that aren't being
         * set as globals
@@ -83,16 +85,6 @@ class ExtensionRegistry {
                return self::$instance;
        }
 
-       public function __construct() {
-               // We use a try/catch because we don't want to fail here
-               // if $wgObjectCaches is not configured properly for APC setup
-               try {
-                       $this->cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
-               } catch ( MWException $e ) {
-                       $this->cache = new EmptyBagOStuff();
-               }
-       }
-
        /**
         * @param string $path Absolute path to the JSON file
         */
@@ -114,24 +106,42 @@ class ExtensionRegistry {
                $this->queued[$path] = $mtime;
        }
 
+       /**
+        * @throws MWException If the queue is already marked as finished (no further things should
+        *  be loaded then).
+        */
        public function loadFromQueue() {
                global $wgVersion;
                if ( !$this->queued ) {
                        return;
                }
 
+               if ( $this->finished ) {
+                       throw new MWException(
+                               "The following paths tried to load late: "
+                               . implode( ', ', array_keys( $this->queued ) )
+                       );
+               }
+
                // A few more things to vary the cache on
                $versions = [
                        'registration' => self::CACHE_VERSION,
                        'mediawiki' => $wgVersion
                ];
 
+               // We use a try/catch because we don't want to fail here
+               // if $wgObjectCaches is not configured properly for APC setup
+               try {
+                       $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
+               } catch ( MWException $e ) {
+                       $cache = new EmptyBagOStuff();
+               }
                // See if this queue is in APC
                $key = wfMemcKey(
                        'registration',
                        md5( json_encode( $this->queued + $versions ) )
                );
-               $data = $this->cache->get( $key );
+               $data = $cache->get( $key );
                if ( $data ) {
                        $this->exportExtractedData( $data );
                } else {
@@ -141,7 +151,7 @@ class ExtensionRegistry {
                        // did that, but it should be cached
                        $data['globals']['wgAutoloadClasses'] += $data['autoload'];
                        unset( $data['autoload'] );
-                       $this->cache->set( $key, $data, 60 * 60 * 24 );
+                       $cache->set( $key, $data, 60 * 60 * 24 );
                }
                $this->queued = [];
        }
@@ -164,6 +174,15 @@ class ExtensionRegistry {
                $this->queued = [];
        }
 
+       /**
+        * After this is called, no more extensions can be loaded
+        *
+        * @since 1.29
+        */
+       public function finish() {
+               $this->finished = true;
+       }
+
        /**
         * Process a queue of extensions and return their extracted data
         *
@@ -176,8 +195,9 @@ class ExtensionRegistry {
                $autoloadClasses = [];
                $autoloaderPaths = [];
                $processor = new ExtensionProcessor();
+               $versionChecker = new VersionChecker( $wgVersion );
+               $extDependencies = [];
                $incompatible = [];
-               $coreVersionParser = new CoreVersionChecker( $wgVersion );
                foreach ( $queue as $path => $mtime ) {
                        $json = file_get_contents( $path );
                        if ( $json === false ) {
@@ -188,25 +208,13 @@ class ExtensionRegistry {
                                throw new Exception( "$path is not a valid JSON file." );
                        }
 
-                       // Check any constraints against MediaWiki core
-                       $requires = $processor->getRequirements( $info );
-                       if ( isset( $requires[self::MEDIAWIKI_CORE] )
-                               && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] )
-                       ) {
-                               // Doesn't match, mark it as incompatible.
-                               $incompatible[] = "{$info['name']} is not compatible with the current "
-                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
-                                       . '.';
-                               continue;
-                       }
-
                        if ( !isset( $info['manifest_version'] ) ) {
                                // For backwards-compatability, assume a version of 1
                                $info['manifest_version'] = 1;
                        }
                        $version = $info['manifest_version'];
                        if ( $version < self::OLDEST_MANIFEST_VERSION || $version > self::MANIFEST_VERSION ) {
-                               throw new Exception( "$path: unsupported manifest_version: {$version}" );
+                               $incompatible[] = "$path: unsupported manifest_version: {$version}";
                        }
 
                        $autoload = $this->processAutoLoader( dirname( $path ), $info );
@@ -214,12 +222,30 @@ class ExtensionRegistry {
                        $GLOBALS['wgAutoloadClasses'] += $autoload;
                        $autoloadClasses += $autoload;
 
+                       // get all requirements/dependencies for this extension
+                       $requires = $processor->getRequirements( $info );
+
+                       // validate the information needed and add the requirements
+                       if ( is_array( $requires ) && $requires && isset( $info['name'] ) ) {
+                               $extDependencies[$info['name']] = $requires;
+                       }
+
                        // Get extra paths for later inclusion
                        $autoloaderPaths = array_merge( $autoloaderPaths,
                                $processor->getExtraAutoloaderPaths( dirname( $path ), $info ) );
                        // Compatible, read and extract info
                        $processor->extractInfo( $path, $info, $version );
                }
+               $data = $processor->getExtractedInfo();
+
+               // check for incompatible extensions
+               $incompatible = array_merge(
+                       $incompatible,
+                       $versionChecker
+                               ->setLoadedExtensionsAndSkins( $data['credits'] )
+                               ->checkArray( $extDependencies )
+               );
+
                if ( $incompatible ) {
                        if ( count( $incompatible ) === 1 ) {
                                throw new Exception( $incompatible[0] );
@@ -227,7 +253,7 @@ class ExtensionRegistry {
                                throw new Exception( implode( "\n", $incompatible ) );
                        }
                }
-               $data = $processor->getExtractedInfo();
+
                // Need to set this so we can += to it later
                $data['globals']['wgAutoloadClasses'] = [];
                $data['autoload'] = $autoloadClasses;
@@ -285,9 +311,6 @@ class ExtensionRegistry {
                foreach ( $info['autoloaderPaths'] as $path ) {
                        require_once $path;
                }
-               foreach ( $info['callbacks'] as $cb ) {
-                       call_user_func( $cb );
-               }
 
                $this->loaded += $info['credits'];
                if ( $info['attributes'] ) {
@@ -297,6 +320,10 @@ class ExtensionRegistry {
                                $this->attributes = array_merge_recursive( $this->attributes, $info['attributes'] );
                        }
                }
+
+               foreach ( $info['callbacks'] as $name => $cb ) {
+                       call_user_func( $cb, $info['credits'][$name] );
+               }
        }
 
        /**
diff --git a/includes/registration/VersionChecker.php b/includes/registration/VersionChecker.php
new file mode 100644 (file)
index 0000000..5aaaa1b
--- /dev/null
@@ -0,0 +1,211 @@
+<?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
+ *
+ * @author Legoktm
+ * @author Florian Schmidt
+ */
+
+use Composer\Semver\VersionParser;
+use Composer\Semver\Constraint\Constraint;
+
+/**
+ * Provides functions to check a set of extensions with dependencies against
+ * a set of loaded extensions and given version information.
+ *
+ * @since 1.29
+ */
+class VersionChecker {
+       /**
+        * @var Constraint|bool representing $wgVersion
+        */
+       private $coreVersion = false;
+
+       /**
+        * @var array Loaded extensions
+        */
+       private $loaded = [];
+
+       /**
+        * @var VersionParser
+        */
+       private $versionParser;
+
+       /**
+        * @param string $coreVersion Current version of core
+        */
+       public function __construct( $coreVersion ) {
+               $this->versionParser = new VersionParser();
+               $this->setCoreVersion( $coreVersion );
+       }
+
+       /**
+        * Set an array with credits of all loaded extensions and skins.
+        *
+        * @param array $credits An array of installed extensions with credits of them
+        * @return VersionChecker $this
+        */
+       public function setLoadedExtensionsAndSkins( array $credits ) {
+               $this->loaded = $credits;
+
+               return $this;
+       }
+
+       /**
+        * Set MediaWiki core version.
+        *
+        * @param string $coreVersion Current version of core
+        */
+       private function setCoreVersion( $coreVersion ) {
+               try {
+                       $this->coreVersion = new Constraint(
+                               '==',
+                               $this->versionParser->normalize( $coreVersion )
+                       );
+                       $this->coreVersion->setPrettyString( $coreVersion );
+               } catch ( UnexpectedValueException $e ) {
+                       // Non-parsable version, don't fatal.
+               }
+       }
+
+       /**
+        * Check all given dependencies if they are compatible with the named
+        * installed extensions in the $credits array.
+        *
+        * Example $extDependencies:
+        *      {
+        *              'FooBar' => {
+        *                      'MediaWiki' => '>= 1.25.0',
+        *                      'extensions' => {
+        *                              'FooBaz' => '>= 1.25.0'
+        *                      },
+        *                      'skins' => {
+        *                              'BazBar' => '>= 1.0.0'
+        *                      }
+        *              }
+        *      }
+        *
+        * @param array $extDependencies All extensions that depend on other ones
+        * @return array
+        */
+       public function checkArray( array $extDependencies ) {
+               $errors = [];
+               foreach ( $extDependencies as $extension => $dependencies ) {
+                       foreach ( $dependencies as $dependencyType => $values ) {
+                               switch ( $dependencyType ) {
+                                       case ExtensionRegistry::MEDIAWIKI_CORE:
+                                               $mwError = $this->handleMediaWikiDependency( $values, $extension );
+                                               if ( $mwError !== false ) {
+                                                       $errors[] = $mwError;
+                                               }
+                                               break;
+                                       case 'extensions':
+                                       case 'skin':
+                                               foreach ( $values as $dependency => $constraint ) {
+                                                       $extError = $this->handleExtensionDependency( $dependency, $constraint, $extension );
+                                                       if ( $extError !== false ) {
+                                                               $errors[] = $extError;
+                                                       }
+                                               }
+                                               break;
+                                       default:
+                                               throw new UnexpectedValueException( 'Dependency type ' . $dependencyType .
+                                                       ' unknown in ' . $extension );
+                               }
+                       }
+               }
+
+               return $errors;
+       }
+
+       /**
+        * Handle a dependency to MediaWiki core. It will check, if a MediaWiki version constraint was
+        * set with self::setCoreVersion before this call (if not, it will return an empty array) and
+        * checks the version constraint given against it.
+        *
+        * @param string $constraint The required version constraint for this dependency
+        * @param string $checkedExt The Extension, which depends on this dependency
+        * @return bool|string false if no error, or a string with the message
+        */
+       private function handleMediaWikiDependency( $constraint, $checkedExt ) {
+               if ( $this->coreVersion === false ) {
+                       // Couldn't parse the core version, so we can't check anything
+                       return false;
+               }
+
+               // if the installed and required version are compatible, return an empty array
+               if ( $this->versionParser->parseConstraints( $constraint )
+                       ->matches( $this->coreVersion ) ) {
+                       return false;
+               }
+               // otherwise mark this as incompatible.
+               return "{$checkedExt} is not compatible with the current "
+                       . "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: "
+                       . "$constraint.";
+       }
+
+       /**
+        * Handle a dependency to another extension.
+        *
+        * @param string $dependencyName The name of the dependency
+        * @param string $constraint The required version constraint for this dependency
+        * @param string $checkedExt The Extension, which depends on this dependency
+        * @return bool|string false for no errors, or a string message
+        */
+       private function handleExtensionDependency( $dependencyName, $constraint, $checkedExt ) {
+               // Check if the dependency is even installed
+               if ( !isset( $this->loaded[$dependencyName] ) ) {
+                       return "{$checkedExt} requires {$dependencyName} to be installed.";
+               }
+               // Check if the dependency has specified a version
+               if ( !isset( $this->loaded[$dependencyName]['version'] ) ) {
+                       // If we depend upon any version, and none is set, that's fine.
+                       if ( $constraint === '*' ) {
+                               wfDebug( "{$dependencyName} does not expose it's version, but {$checkedExt}
+                                       mentions it with constraint '*'. Assume it's ok so." );
+                               return false;
+                       } else {
+                               // Otherwise, mark it as incompatible.
+                               return "{$dependencyName} does not expose it's version, but {$checkedExt}
+                                       requires: {$constraint}.";
+                       }
+               } else {
+                       // Try to get a constraint for the dependency version
+                       try {
+                               $installedVersion = new Constraint(
+                                       '==',
+                                       $this->versionParser->normalize( $this->loaded[$dependencyName]['version'] )
+                               );
+                       } catch ( UnexpectedValueException $e ) {
+                               // Non-parsable version, output an error message that the version
+                               // string is invalid
+                               return "$dependencyName does not have a valid version string.";
+                       }
+                       // Check if the constraint actually matches...
+                       if (
+                               !$this->versionParser->parseConstraints( $constraint )->matches( $installedVersion )
+                       ) {
+                               return "{$checkedExt} is not compatible with the current "
+                                       . "installed version of {$dependencyName} "
+                                       . "({$this->loaded[$dependencyName]['version']}), "
+                                       . "it requires: " . $constraint . '.';
+                       }
+               }
+
+               return false;
+       }
+}
index d624c7c..f0b48d5 100644 (file)
@@ -391,8 +391,6 @@ class ResourceLoader implements LoggerAwareInterface {
                }
        }
 
-       /**
-        */
        public function registerTestModules() {
                global $IP;
 
@@ -607,6 +605,25 @@ class ResourceLoader implements LoggerAwareInterface {
                return Wikimedia\base_convert( $hash, 16, 36, 7 );
        }
 
+       /**
+        * Add an error to the 'errors' array and log it.
+        *
+        * Should only be called from within respond().
+        *
+        * @since 1.29
+        * @param Exception $e
+        * @param string $msg
+        * @param array $context
+        */
+       protected function outputErrorAndLog( Exception $e, $msg, array $context = [] ) {
+               MWExceptionHandler::logException( $e );
+               $this->logger->warning(
+                       $msg,
+                       $context + [ 'exception' => $e ]
+               );
+               $this->errors[] = self::formatExceptionNoComment( $e );
+       }
+
        /**
         * Helper method to get and combine versions of multiple modules.
         *
@@ -620,7 +637,20 @@ class ResourceLoader implements LoggerAwareInterface {
                        return '';
                }
                $hashes = array_map( function ( $module ) use ( $context ) {
-                       return $this->getModule( $module )->getVersionHash( $context );
+                       try {
+                               return $this->getModule( $module )->getVersionHash( $context );
+                       } catch ( Exception $e ) {
+                               // If modules fail to compute a version, do still consider the versions
+                               // of other modules - don't set an empty string E-Tag for the whole request.
+                               // See also T152266 and StartupModule::getModuleRegistrations().
+                               $this->outputErrorAndLog( $e,
+                                       'Calculating version for "{module}" failed: {exception}',
+                                       [
+                                               'module' => $module,
+                                       ]
+                               );
+                               return '';
+                       }
                }, $moduleNames );
                return self::makeHash( implode( '', $hashes ) );
        }
@@ -695,11 +725,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        // Preload for getCombinedVersion() and for batch makeModuleResponse()
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
-                       MWExceptionHandler::logException( $e );
-                       $this->logger->warning( 'Preloading module info failed: {exception}', [
-                               'exception' => $e
-                       ] );
-                       $this->errors[] = self::formatExceptionNoComment( $e );
+                       $this->outputErrorAndLog( $e, 'Preloading module info failed: {exception}' );
                }
 
                // Combine versions to propagate cache invalidation
@@ -707,11 +733,7 @@ class ResourceLoader implements LoggerAwareInterface {
                try {
                        $versionHash = $this->getCombinedVersion( $context, array_keys( $modules ) );
                } catch ( Exception $e ) {
-                       MWExceptionHandler::logException( $e );
-                       $this->logger->warning( 'Calculating version hash failed: {exception}', [
-                               'exception' => $e
-                       ] );
-                       $this->errors[] = self::formatExceptionNoComment( $e );
+                       $this->outputErrorAndLog( $e, 'Calculating version hash failed: {exception}' );
                }
 
                // See RFC 2616 § 3.11 Entity Tags
@@ -960,7 +982,9 @@ class ResourceLoader implements LoggerAwareInterface {
                        return MWExceptionHandler::getPublicLogMessage( $e );
                }
 
-               return MWExceptionHandler::getLogMessage( $e );
+               return MWExceptionHandler::getLogMessage( $e ) .
+                       "\nBacktrace:\n" .
+                       MWExceptionHandler::getRedactedTraceAsString( $e );
        }
 
        /**
@@ -1061,11 +1085,7 @@ MESSAGE;
                                $out .= $strContent;
 
                        } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               $this->logger->warning( 'Generating module package failed: {exception}', [
-                                       'exception' => $e
-                               ] );
-                               $this->errors[] = self::formatExceptionNoComment( $e );
+                               $this->outputErrorAndLog( $e, 'Generating module package failed: {exception}' );
 
                                // Respond to client with error-state instead of module implementation
                                $states[$name] = 'error';
index 91e0b02..ef2827c 100644 (file)
@@ -56,7 +56,7 @@ class ResourceLoaderClientHtml {
 
        /**
         * @param ResourceLoaderContext $context
-        * @param aray $target [optional] Custom 'target' parameter for the startup module
+        * @param string|null $target [optional] Custom 'target' parameter for the startup module
         */
        public function __construct( ResourceLoaderContext $context, $target = null ) {
                $this->context = $context;
index 8970620..a99305c 100644 (file)
@@ -194,7 +194,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return string JavaScript code for registering all modules with the client loader
         */
        public function getModuleRegistrations( ResourceLoaderContext $context ) {
-
                $resourceLoader = $context->getResourceLoader();
                $target = $context->getRequest()->getVal( 'target', 'desktop' );
                // Bypass target filter if this request is Special:JavaScriptTest.
@@ -202,6 +201,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $byPassTargetFilter = $this->getConfig()->get( 'EnableJavaScriptTest' ) && $target === 'test';
 
                $out = '';
+               $states = [];
                $registryData = [];
 
                // Get registry data
@@ -219,8 +219,23 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                continue;
                        }
 
-                       $versionHash = $module->getVersionHash( $context );
-                       if ( strlen( $versionHash ) !== 7 ) {
+                       try {
+                               $versionHash = $module->getVersionHash( $context );
+                       } catch ( Exception $e ) {
+                               // See also T152266 and ResourceLoader::getCombinedVersion()
+                               MWExceptionHandler::logException( $e );
+                               $context->getLogger()->warning(
+                                       'Calculating version for "{module}" failed: {exception}',
+                                       [
+                                               'module' => $name,
+                                               'exception' => $e,
+                                       ]
+                               );
+                               $versionHash = '';
+                               $states[$name] = 'error';
+                       }
+
+                       if ( $versionHash !== '' && strlen( $versionHash ) !== 7 ) {
                                $context->getLogger()->warning(
                                        "Module '{module}' produced an invalid version hash: '{version}'.",
                                        [
@@ -270,6 +285,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                $out .= "\n" . ResourceLoader::makeLoaderRegisterScript( $registrations );
 
+               if ( $states ) {
+                       $out .= "\n" . ResourceLoader::makeLoaderStateScript( $states );
+               }
+
                return $out;
        }
 
index 2d0d690..ab74dbd 100644 (file)
@@ -68,14 +68,14 @@ class RevDelArchiveItem extends RevDelRevisionItem {
        }
 
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
 
-               return Linker::link(
+               return $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Undelete' ),
                        $date,
                        [],
@@ -91,9 +91,9 @@ class RevDelArchiveItem extends RevDelRevisionItem {
                        return $this->list->msg( 'diff' )->escaped();
                }
 
-               return Linker::link(
+               return $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Undelete' ),
-                       $this->list->msg( 'diff' )->escaped(),
+                       $this->list->msg( 'diff' )->text(),
                        [],
                        [
                                'target' => $this->list->title->getPrefixedText(),
index 52df2e3..32d4891 100644 (file)
@@ -69,16 +69,16 @@ class RevDelArchivedFileItem extends RevDelFileItem {
        }
 
        protected function getLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->file->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() );
 
                # Hidden files...
                if ( !$this->canViewContent() ) {
-                       $link = $date;
+                       $link = htmlspecialchars( $date );
                } else {
                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                        $key = $this->file->getKey();
-                       $link = Linker::link( $undelete, $date, [],
+                       $link = $this->getLinkRenderer()->makeLink( $undelete, $date, [],
                                [
                                        'target' => $this->list->title->getPrefixedText(),
                                        'file' => $key,
@@ -102,10 +102,10 @@ class RevDelArchivedFileItem extends RevDelFileItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
+                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'contenthidden' => (bool)$this->isDeleted(),
                ];
-               $ret += $file->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $this->isDeleted() ? [ 'contenthidden' => '' ] : [];
                if ( $this->canViewContent() ) {
                        $ret += [
                                'url' => SpecialPage::getTitleFor( 'Revisiondelete' )->getLinkURL(
index ff01cee..9beafc9 100644 (file)
@@ -116,19 +116,19 @@ class RevDelFileItem extends RevDelItem {
         * @return string
         */
        protected function getLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->file->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() );
 
                if ( !$this->isDeleted() ) {
                        # Regular files...
-                       return Html::rawElement( 'a', [ 'href' => $this->file->getUrl() ], $date );
+                       return Html::element( 'a', [ 'href' => $this->file->getUrl() ], $date );
                }
 
                # Hidden files...
                if ( !$this->canViewContent() ) {
-                       $link = $date;
+                       $link = htmlspecialchars( $date );
                } else {
-                       $link = Linker::link(
+                       $link = $this->getLinkRenderer()->makeLink(
                                SpecialPage::getTitleFor( 'Revisiondelete' ),
                                $date,
                                [],
@@ -202,10 +202,10 @@ class RevDelFileItem extends RevDelItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
+                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'contenthidden' => (bool)$this->isDeleted(),
                ];
-               $ret += $file->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $file->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $this->isDeleted() ? [ 'contenthidden' => '' ] : [];
                if ( !$this->isDeleted() ) {
                        $ret += [
                                'url' => $file->getUrl(),
index 674846d..833e38b 100644 (file)
@@ -97,8 +97,9 @@ abstract class RevDelList extends RevisionListBase {
         *
         * @param array $params Associative array of parameters. Members are:
         *     value:         ExtractBitParams() bitfield array
-        *     comment:       The log comment.
+        *     comment:       The log comment
         *     perItemStatus: Set if you want per-item status reports
+        *     tags:          The array of change tags to apply to the log entry
         * @return Status
         * @since 1.23 Added 'perItemStatus' param
         */
@@ -269,7 +270,8 @@ abstract class RevDelList extends RevisionListBase {
                                'comment' => $comment,
                                'ids' => $idsForLog,
                                'authorIds' => $authorIds,
-                               'authorIPs' => $authorIPs
+                               'authorIPs' => $authorIPs,
+                               'tags' => isset( $params['tags'] ) ? $params['tags'] : [],
                        ]
                );
 
@@ -327,6 +329,7 @@ abstract class RevDelList extends RevisionListBase {
         *     comment:         The log comment
         *     authorsIds:      The array of the user IDs of the offenders
         *     authorsIPs:      The array of the IP/anon user offenders
+        *     tags:            The array of change tags to apply to the log entry
         * @throws MWException
         */
        private function updateLog( $logType, $params ) {
@@ -349,6 +352,8 @@ abstract class RevDelList extends RevisionListBase {
                        'target_author_id' => $params['authorIds'],
                        'target_author_ip' => $params['authorIPs'],
                ] );
+               // Apply change tags to the log entry
+               $logEntry->setTags( $params['tags'] );
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
        }
index 1ea7271..047d6cf 100644 (file)
@@ -92,9 +92,9 @@ class RevDelLogItem extends RevDelItem {
                $formatter->setAudience( LogFormatter::FOR_THIS_USER );
 
                // Log link for this page
-               $loglink = Linker::link(
+               $loglink = $this->getLinkRenderer()->makeLink(
                        SpecialPage::getTitleFor( 'Log' ),
-                       $this->list->msg( 'log' )->escaped(),
+                       $this->list->msg( 'log' )->text(),
                        [],
                        [ 'page' => $title->getPrefixedText() ]
                );
@@ -119,16 +119,10 @@ class RevDelLogItem extends RevDelItem {
                        'id' => $logEntry->getId(),
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
+                       'userhidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_USER ),
+                       'commenthidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_COMMENT ),
+                       'actionhidden' => (bool)$logEntry->isDeleted( LogPage::DELETED_ACTION ),
                ];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
-                       ? [ 'userhidden' => '' ]
-                       : [];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
-                       ? [ 'commenthidden' => '' ]
-                       : [];
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
-                       ? [ 'actionhidden' => '' ]
-                       : [];
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        $ret['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi();
index d799113..a9753b4 100644 (file)
@@ -107,14 +107,14 @@ class RevDelRevisionItem extends RevDelItem {
         * @return string
         */
        protected function getRevisionLink() {
-               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
-                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+               $date = $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() );
 
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return $date;
+                       return htmlspecialchars( $date );
                }
 
-               return Linker::linkKnown(
+               return $this->getLinkRenderer()->makeKnownLink(
                        $this->list->title,
                        $date,
                        [],
@@ -134,9 +134,9 @@ class RevDelRevisionItem extends RevDelItem {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->list->msg( 'diff' )->escaped();
                } else {
-                       return Linker::linkKnown(
+                       return $this->getLinkRenderer()->makeKnownLink(
                                        $this->list->title,
-                                       $this->list->msg( 'diff' )->escaped(),
+                                       $this->list->msg( 'diff' )->text(),
                                        [],
                                        [
                                                'diff' => $this->revision->getId(),
@@ -188,10 +188,10 @@ class RevDelRevisionItem extends RevDelItem {
                $ret = [
                        'id' => $rev->getId(),
                        'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ),
+                       'userhidden' => (bool)$rev->isDeleted( Revision::DELETED_USER ),
+                       'commenthidden' => (bool)$rev->isDeleted( Revision::DELETED_COMMENT ),
+                       'texthidden' => (bool)$rev->isDeleted( Revision::DELETED_TEXT ),
                ];
-               $ret += $rev->isDeleted( Revision::DELETED_USER ) ? [ 'userhidden' => '' ] : [];
-               $ret += $rev->isDeleted( Revision::DELETED_COMMENT ) ? [ 'commenthidden' => '' ] : [];
-               $ret += $rev->isDeleted( Revision::DELETED_TEXT ) ? [ 'texthidden' => '' ] : [];
                if ( $rev->userCan( Revision::DELETED_USER, $user ) ) {
                        $ret += [
                                'userid' => $rev->getUser( Revision::FOR_THIS_USER ),
index a2a6760..3ee3ed5 100644 (file)
@@ -21,7 +21,7 @@ class DummySearchIndexFieldDefinition extends SearchIndexFieldDefinition {
                ];
 
                foreach ( $this->subfields as $subfield ) {
-                       $mapping['subfields'][] = $subfield->getMapping();
+                       $mapping['subfields'][] = $subfield->getMapping( $engine );
                }
 
                return $mapping;
index 350b780..df58e71 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * Augment search results.
- *
  */
 interface ResultAugmentor {
        /**
index 94710a8..e2d79a9 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * Augment search results.
- *
  */
 interface ResultSetAugmentor {
        /**
index 90bfebd..0bcb07a 100644 (file)
@@ -104,7 +104,6 @@ abstract class SearchEngine {
         * @since 1.18
         * @param string $feature
         * @param mixed $data
-        * @return bool
         */
        public function setFeatureData( $feature, $data ) {
                $this->features[$feature] = $data;
index dd41a6e..d0e3a24 100644 (file)
@@ -75,10 +75,10 @@ class SearchHighlighter {
                        if ( preg_match( $spat, $text, $matches, PREG_OFFSET_CAPTURE, $start ) ) {
                                $epat = '';
                                foreach ( $matches as $key => $val ) {
-                                       if ( $key > 0 && $val[1] != - 1 ) {
+                                       if ( $key > 0 && $val[1] != -1 ) {
                                                if ( $key == 2 ) {
                                                        // see if this is an image link
-                                                       $ns = substr( $val[0], 2, - 1 );
+                                                       $ns = substr( $val[0], 2, -1 );
                                                        if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
                                                                break;
                                                        }
@@ -252,10 +252,10 @@ class SearchHighlighter {
 
                // $snippets = array_map( 'htmlspecialchars', $extended );
                $snippets = $extended;
-               $last = - 1;
+               $last = -1;
                $extract = '';
                foreach ( $snippets as $index => $line ) {
-                       if ( $last == - 1 ) {
+                       if ( $last == -1 ) {
                                $extract .= $line; // first line
                        } elseif ( $last + 1 == $index
                                && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] )
index 80a437b..4e7c782 100644 (file)
  * 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
- *
  */
 
 /**
  * A search suggestion
- *
  */
 class SearchSuggestion {
        /**
index 5a24fd6..caad388 100644 (file)
@@ -17,7 +17,6 @@
  * 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
- *
  */
 
 /**
index 198d331..2c7965c 100644 (file)
@@ -37,7 +37,7 @@ class HashSiteStore implements SiteStore {
        private $sites = [];
 
        /**
-        * @param array $sites
+        * @param Site[] $sites
         */
        public function __construct( $sites = [] ) {
                $this->saveSites( $sites );
index e6763ca..bf260aa 100644 (file)
@@ -489,8 +489,10 @@ class SkinTemplate extends Skin {
                $tpl->set( 'debughtml', $this->generateDebugHTML() );
                $tpl->set( 'reporttime', wfReportTime() );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                // original version by hansm
-               if ( !Hooks::run( 'SkinTemplateOutputPageBeforeExec', [ &$this, &$tpl ] ) ) {
+               if ( !Hooks::run( 'SkinTemplateOutputPageBeforeExec', [ &$skinTemplate, &$tpl ] ) ) {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
@@ -768,8 +770,10 @@ class SkinTemplate extends Skin {
                                MWNamespace::getSubject( $title->getNamespace() ) );
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                $result = [];
-               if ( !Hooks::run( 'SkinTemplateTabAction', [ &$this,
+               if ( !Hooks::run( 'SkinTemplateTabAction', [ &$skinTemplate,
                                $title, $message, $selected, $checkEdit,
                                &$classes, &$query, &$text, &$result ] ) ) {
                        return $result;
@@ -870,8 +874,10 @@ class SkinTemplate extends Skin {
 
                $userCanRead = $title->quickUserCan( 'read', $user );
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                $preventActiveTabs = false;
-               Hooks::run( 'SkinTemplatePreventOtherActiveTabs', [ &$this, &$preventActiveTabs ] );
+               Hooks::run( 'SkinTemplatePreventOtherActiveTabs', [ &$skinTemplate, &$preventActiveTabs ] );
 
                // Checks if page is some kind of content
                if ( $title->canExist() ) {
@@ -919,19 +925,18 @@ class SkinTemplate extends Skin {
                                        $content_navigation['views']['view']['redundant'] = true;
                                }
 
-                               $isForeignFile = $title->inNamespace( NS_FILE ) && $this->canUseWikiPage() &&
-                                       $this->getWikiPage() instanceof WikiFilePage && !$this->getWikiPage()->isLocal();
+                               $page = $this->canUseWikiPage() ? $this->getWikiPage() : false;
+                               $isRemoteContent = $page && !$page->isLocal();
 
                                // If it is a non-local file, show a link to the file in its own repository
                                // @todo abstract this for remote content that isn't a file
-                               if ( $isForeignFile ) {
-                                       $file = $this->getWikiPage()->getFile();
+                               if ( $isRemoteContent ) {
                                        $content_navigation['views']['view-foreign'] = [
                                                'class' => '',
                                                'text' => wfMessageFallback( "$skname-view-foreign", 'view-foreign' )->
                                                        setContext( $this->getContext() )->
-                                                       params( $file->getRepo()->getDisplayName() )->text(),
-                                               'href' => $file->getDescriptionUrl(),
+                                                       params( $page->getWikiDisplayName() )->text(),
+                                               'href' => $page->getSourceURL(),
                                                'primary' => false,
                                        ];
                                }
@@ -955,9 +960,9 @@ class SkinTemplate extends Skin {
                                                        && $title->getDefaultMessageText() !== false
                                                )
                                        ) {
-                                               $msgKey = $isForeignFile ? 'edit-local' : 'edit';
+                                               $msgKey = $isRemoteContent ? 'edit-local' : 'edit';
                                        } else {
-                                               $msgKey = $isForeignFile ? 'create-local' : 'create';
+                                               $msgKey = $isRemoteContent ? 'create-local' : 'create';
                                        }
                                        $content_navigation['views']['edit'] = [
                                                'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection )
@@ -967,7 +972,7 @@ class SkinTemplate extends Skin {
                                                'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )
                                                        ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
-                                               'primary' => !$isForeignFile, // don't collapse this in vector
+                                               'primary' => !$isRemoteContent, // don't collapse this in vector
                                        ];
 
                                        // section link
@@ -1075,7 +1080,9 @@ class SkinTemplate extends Skin {
                                }
                        }
 
-                       Hooks::run( 'SkinTemplateNavigation', [ &$this, &$content_navigation ] );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
+                       Hooks::run( 'SkinTemplateNavigation', [ &$skinTemplate, &$content_navigation ] );
 
                        if ( $userCanRead && !$wgDisableLangConversion ) {
                                $pageLang = $title->getPageLanguage();
@@ -1117,12 +1124,16 @@ class SkinTemplate extends Skin {
                                'context' => 'subject'
                        ];
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
                        Hooks::run( 'SkinTemplateNavigation::SpecialPage',
-                               [ &$this, &$content_navigation ] );
+                               [ &$skinTemplate, &$content_navigation ] );
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $skinTemplate = $this;
                // Equiv to SkinTemplateContentActions
-               Hooks::run( 'SkinTemplateNavigation::Universal', [ &$this, &$content_navigation ] );
+               Hooks::run( 'SkinTemplateNavigation::Universal', [ &$skinTemplate, &$content_navigation ] );
 
                // Setup xml ids and tooltip info
                foreach ( $content_navigation as $section => &$links ) {
@@ -1255,9 +1266,11 @@ class SkinTemplate extends Skin {
                                ];
                        }
 
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $skinTemplate = $this;
                        // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals
                        Hooks::run( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink',
-                               [ &$this, &$nav_urls, &$revid, &$revid ] );
+                               [ &$skinTemplate, &$nav_urls, &$revid, &$revid ] );
                }
 
                if ( $out->isArticleRelated() ) {
@@ -1309,11 +1322,11 @@ class SkinTemplate extends Skin {
                        if ( !$user->isAnon() ) {
                                $sur = new UserrightsPage;
                                $sur->setContext( $this->getContext() );
-                               $canChange = $sur->userCanChangeRights( $this->getUser(), false );
+                               $canChange = $sur->userCanChangeRights( $user );
                                $nav_urls['userrights'] = [
                                        'text' => $this->msg(
                                                $canChange ? 'tool-link-userrights' : 'tool-link-userrights-readonly',
-                                               $this->getUser()->getName()
+                                               $rootUser
                                        )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
                                ];
index bdf7638..fbc3022 100644 (file)
@@ -198,9 +198,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
         * @param string $subPage Subpage of the special page.
         * @return string an AuthManager::ACTION_* constant.
         */
-       protected function getDefaultAction( $subPage ) {
-               throw new BadMethodCallException( 'Subclass did not implement getDefaultAction' );
-       }
+       abstract protected function getDefaultAction( $subPage );
 
        /**
         * Return custom message key.
index cb13840..00efeae 100644 (file)
@@ -140,16 +140,22 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts = new FormOptions();
 
                $opts->add( 'hideminor', false );
+               $opts->add( 'hidemajor', false );
                $opts->add( 'hidebots', false );
+               $opts->add( 'hidehumans', false );
                $opts->add( 'hideanons', false );
                $opts->add( 'hideliu', false );
                $opts->add( 'hidepatrolled', false );
+               $opts->add( 'hideunpatrolled', false );
                $opts->add( 'hidemyself', false );
                $opts->add( 'hidebyothers', false );
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $opts->add( 'hidecategorization', false );
                }
+               $opts->add( 'hidepageedits', false );
+               $opts->add( 'hidenewpages', false );
+               $opts->add( 'hidelog', false );
 
                $opts->add( 'namespace', '', FormOptions::INTNULL );
                $opts->add( 'invert', false );
@@ -230,13 +236,24 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                // Toggles
                if ( $opts['hideminor'] ) {
-                       $conds['rc_minor'] = 0;
+                       $conds[] = 'rc_minor = 0';
+               }
+               if ( $opts['hidemajor'] ) {
+                       $conds[] = 'rc_minor = 1';
                }
                if ( $opts['hidebots'] ) {
                        $conds['rc_bot'] = 0;
                }
-               if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
-                       $conds['rc_patrolled'] = 0;
+               if ( $opts['hidehumans'] ) {
+                       $conds[] = 'rc_bot = 1';
+               }
+               if ( $user->useRCPatrol() ) {
+                       if ( $opts['hidepatrolled'] ) {
+                               $conds[] = 'rc_patrolled = 0';
+                       }
+                       if ( $opts['hideunpatrolled'] ) {
+                               $conds[] = 'rc_patrolled = 1';
+                       }
                }
                if ( $botsonly ) {
                        $conds['rc_bot'] = 1;
@@ -269,6 +286,15 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                ) {
                        $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
                }
+               if ( $opts['hidepageedits'] ) {
+                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_EDIT );
+               }
+               if ( $opts['hidenewpages'] ) {
+                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_NEW );
+               }
+               if ( $opts['hidelog'] ) {
+                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
+               }
 
                // Namespace filtering
                if ( $opts['namespace'] !== '' ) {
@@ -495,4 +521,23 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        protected function getGroupName() {
                return 'changes';
        }
+
+       /**
+        * Get filters that can be rendered.
+        *
+        * Filters with 'msg' => false can be used to filter data but won't
+        * be presented as show/hide toggles in the UI. They are not returned
+        * by this function.
+        *
+        * @param array $allFilters Map of filter URL param names to properties (msg/default)
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getRenderableCustomFilters( $allFilters ) {
+               return array_filter(
+                       $allFilters,
+                       function( $filter ) {
+                               return isset( $filter['msg'] ) && ( $filter['msg'] !== false );
+                       }
+               );
+       }
 }
index 540ce4b..c3ee321 100644 (file)
@@ -1088,13 +1088,13 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        // B/C for old extensions that haven't been converted to AuthManager (or have been
                        // but somebody is using the old version) and still use templates via the
                        // UserCreateForm/UserLoginForm hook.
-                       // 'header' used by ConfirmEdit, CondfirmAccount, Persona, WikimediaIncubator, SemanticSignup
+                       // 'header' used by ConfirmEdit, ConfirmAccount, Persona, WikimediaIncubator, SemanticSignup
                        // 'formheader' used by MobileFrontend
                        $fieldDefinitions['header'] = [
                                'type' => 'info',
                                'raw' => true,
                                'default' => $template->get( 'header' ) ?: $template->get( 'formheader' ),
-                               'weight' => - 110,
+                               'weight' => -110,
                        ];
                }
                if ( $this->mEntryError ) {
index 00d8c4a..ba58e92 100644 (file)
@@ -853,7 +853,7 @@ class SpecialPage {
         * @since 1.28
         * @return \MediaWiki\Linker\LinkRenderer
         */
-       protected function getLinkRenderer() {
+       public function getLinkRenderer() {
                if ( $this->linkRenderer ) {
                        return $this->linkRenderer;
                } else {
index 74b474a..5448013 100644 (file)
@@ -77,6 +77,11 @@ class SpecialApiHelp extends UnlistedSpecialPage {
                $main = new ApiMain( $this->getContext(), false );
                try {
                        $module = $main->getModuleFromPath( $moduleName );
+               } catch ( ApiUsageException $ex ) {
+                       $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
+                               $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
+                       ) );
+                       return;
                } catch ( UsageException $ex ) {
                        $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
                                $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
index 585f70b..93cb377 100644 (file)
@@ -828,9 +828,13 @@ class SpecialBlock extends FormSpecialPage {
                $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
                $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
                $logId = $logEntry->insert();
+
+               if ( count( $data['Tags'] ) ) {
+                       $logEntry->setTags( $data['Tags'] );
+               }
+
                $logEntry->publish( $logId );
 
-               # Report to the user
                return true;
        }
 
index 87276a1..a36b414 100644 (file)
@@ -33,6 +33,18 @@ class SpecialChangeContentModel extends FormSpecialPage {
                }
        }
 
+       protected function postText() {
+               $text = '';
+               if ( $this->title ) {
+                       $contentModelLogPage = new LogPage( 'contentmodel' );
+                       $text = Xml::element( 'h2', null, $contentModelLogPage->getName()->text() );
+                       $out = '';
+                       LogEventsList::showLogExtract( $out, 'contentmodel', $this->title );
+                       $text .= $out;
+               }
+               return $text;
+       }
+
        protected function getDisplayFormat() {
                return 'ooui';
        }
index ff70848..b81ca3d 100644 (file)
@@ -87,6 +87,8 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                        return;
                }
 
+               $this->getOutput()->addBacklinkSubtitle( $this->getPageTitle() );
+
                $status = $this->trySubmit();
 
                if ( $status === false || !$status->isOK() ) {
@@ -135,9 +137,9 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
 
                $form->addPreText(
                        Html::openElement( 'dl' )
-                       . Html::element( 'dt', [], wfMessage( 'credentialsform-provider' ) )
+                       . Html::element( 'dt', [], wfMessage( 'credentialsform-provider' )->text() )
                        . Html::element( 'dd', [], $info['provider'] )
-                       . Html::element( 'dt', [], wfMessage( 'credentialsform-account' ) )
+                       . Html::element( 'dt', [], wfMessage( 'credentialsform-account' )->text() )
                        . Html::element( 'dd', [], $info['account'] )
                        . Html::closeElement( 'dl' )
                );
index 3cd4d4d..766de1b 100644 (file)
@@ -492,7 +492,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        $form .= "\t" . Html::hidden( $name, $value ) . "\n";
                }
 
-               $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
+               $tagFilter = ChangeTags::buildTagFilterSelector(
+                       $this->opts['tagfilter'], false, $this->getContext() );
 
                if ( $tagFilter ) {
                        $filterSelection = Html::rawElement(
@@ -528,7 +529,6 @@ class SpecialContributions extends IncludableSpecialPage {
                        'text',
                        [
                                'size' => '40',
-                               'required' => '',
                                'class' => [
                                        'mw-input',
                                        'mw-ui-input-inline',
index ad12046..5c8b3a6 100644 (file)
  * @ingroup SpecialPage
  */
 class DeletedContributionsPage extends SpecialPage {
+       /** @var FormOptions */
+       protected $mOpts;
+
        function __construct() {
-               parent::__construct( 'DeletedContributions', 'deletedhistory',
-                       /*listed*/true, /*function*/false, /*file*/false );
+               parent::__construct( 'DeletedContributions', 'deletedhistory' );
        }
 
        /**
@@ -40,40 +42,43 @@ class DeletedContributionsPage extends SpecialPage {
        function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
+               $this->checkPermissions();
 
                $user = $this->getUser();
 
-               if ( !$this->userCanExecute( $user ) ) {
-                       $this->displayRestrictionError();
-
-                       return;
-               }
-
-               $request = $this->getRequest();
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'deletedcontributions-title' ) );
 
-               $options = [];
+               $opts = new FormOptions();
+
+               $opts->add( 'target', '' );
+               $opts->add( 'namespace', '' );
+               $opts->add( 'limit', 20 );
+
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+               $opts->validateIntBounds( 'limit', 0, $this->getConfig()->get( 'QueryPageDefaultLimit' ) );
 
                if ( $par !== null ) {
-                       $target = $par;
-               } else {
-                       $target = $request->getVal( 'target' );
+                       $opts->setValue( 'target', $par );
                }
 
+               $ns = $opts->getValue( 'namespace' );
+               if ( $ns !== null && $ns !== '' ) {
+                       $opts->setValue( 'namespace', intval( $ns ) );
+               }
+
+               $this->mOpts = $opts;
+
+               $target = $opts->getValue( 'target' );
                if ( !strlen( $target ) ) {
-                       $out->addHTML( $this->getForm( '' ) );
+                       $this->getForm();
 
                        return;
                }
 
-               $options['limit'] = $request->getInt( 'limit',
-                       $this->getConfig()->get( 'QueryPageDefaultLimit' ) );
-               $options['target'] = $target;
-
                $userObj = User::newFromName( $target, false );
                if ( !$userObj ) {
-                       $out->addHTML( $this->getForm( '' ) );
+                       $this->getForm();
 
                        return;
                }
@@ -82,16 +87,9 @@ class DeletedContributionsPage extends SpecialPage {
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
 
-               $ns = $request->getVal( 'namespace', null );
-               if ( $ns !== null && $ns !== '' ) {
-                       $options['namespace'] = intval( $ns );
-               } else {
-                       $options['namespace'] = '';
-               }
-
-               $out->addHTML( $this->getForm( $options ) );
+               $this->getForm();
 
-               $pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
+               $pager = new DeletedContribsPager( $this->getContext(), $target, $opts->getValue( 'namespace' ) );
                if ( !$pager->getNumRows() ) {
                        $out->addWikiMsg( 'nocontribs' );
 
@@ -187,76 +185,35 @@ class DeletedContributionsPage extends SpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
-        * @param array $options The options to be included.
-        * @return string
         */
-       function getForm( $options ) {
-               $options['title'] = $this->getPageTitle()->getPrefixedText();
-               if ( !isset( $options['target'] ) ) {
-                       $options['target'] = '';
-               } else {
-                       $options['target'] = str_replace( '_', ' ', $options['target'] );
-               }
-
-               if ( !isset( $options['namespace'] ) ) {
-                       $options['namespace'] = '';
-               }
-
-               if ( !isset( $options['contribs'] ) ) {
-                       $options['contribs'] = 'user';
-               }
-
-               if ( $options['contribs'] == 'newbie' ) {
-                       $options['target'] = '';
-               }
-
-               $f = Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] );
-
-               foreach ( $options as $name => $value ) {
-                       if ( in_array( $name, [ 'namespace', 'target', 'contribs' ] ) ) {
-                               continue;
-                       }
-                       $f .= "\t" . Html::hidden( $name, $value ) . "\n";
-               }
+       function getForm() {
+               $opts = $this->mOpts;
+
+               $formDescriptor = [
+                       'target' => [
+                               'type' => 'user',
+                               'name' => 'target',
+                               'label-message' => 'sp-contributions-username',
+                               'default' => $opts->getValue( 'target' ),
+                               'ipallowed' => true,
+                       ],
 
-               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
-
-               $f .= Xml::openElement( 'fieldset' );
-               $f .= Xml::element( 'legend', [], $this->msg( 'sp-contributions-search' )->text() );
-               $f .= Xml::tags(
-                       'label',
-                       [ 'for' => 'target' ],
-                       $this->msg( 'sp-contributions-username' )->parse()
-               ) . ' ';
-               $f .= Html::input(
-                       'target',
-                       $options['target'],
-                       'text',
-                       [
-                               'size' => '20',
-                               'required' => '',
-                               'class' => [
-                                       'mw-autocomplete-user', // used by mediawiki.userSuggest
-                               ],
-                       ] + ( $options['target'] ? [] : [ 'autofocus' ] )
-               ) . ' ';
-               $f .= Html::namespaceSelector(
-                       [
-                               'selected' => $options['namespace'],
+                       'namespace' => [
+                               'type' => 'namespaceselect',
+                               'name' => 'namespace',
+                               'label-message' => 'namespace',
                                'all' => '',
-                               'label' => $this->msg( 'namespace' )->text()
                        ],
-                       [
-                               'name' => 'namespace',
-                               'id' => 'namespace',
-                               'class' => 'namespaceselector',
-                       ]
-               ) . ' ';
-               $f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
-               $f .= Xml::closeElement( 'fieldset' );
-               $f .= Xml::closeElement( 'form' );
-
-               return $f;
+               ];
+
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setWrapperLegendMsg( 'sp-contributions-search' )
+                       ->setSubmitTextMsg( 'sp-contributions-submit' )
+                       // prevent setting subpage and 'target' parameter at the same time
+                       ->setAction( $this->getPageTitle()->getLocalURL() )
+                       ->setMethod( 'get' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        /**
index 0defcd1..b447271 100644 (file)
@@ -149,7 +149,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
        /**
         * Executes an edit mode for the watchlist view, from which you can manage your watchlist
-        *
         */
        protected function executeViewEditWatchlist() {
                $out = $this->getOutput();
@@ -630,7 +629,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                if ( $title->exists() ) {
                        $tools['history'] = $linkRenderer->makeKnownLink(
                                $title,
-                               $this->msg( 'history_short' )->text(),
+                               $this->msg( 'history_small' )->text(),
                                [],
                                [ 'action' => 'history' ]
                        );
index 9692dd0..085b68d 100644 (file)
@@ -307,7 +307,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @since 1.20
         * @param array $data
         * @param HTMLForm $form
-        * @return Status|string|bool
+        * @return Status|bool
         */
        public static function uiSubmit( array $data, HTMLForm $form ) {
                return self::submit( $data, $form->getContext() );
@@ -320,8 +320,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         *
         * @param array $data
         * @param IContextSource $context
-        * @return Status|string|bool Status object, or potentially a String on error
-        * or maybe even true on success if anything uses the EmailUser hook.
+        * @return Status|bool
         */
        public static function submit( array $data, IContextSource $context ) {
                $config = $context->getConfig();
@@ -329,7 +328,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $target = self::getTarget( $data['Target'] );
                if ( !$target instanceof User ) {
                        // Messages used here: notargettext, noemailtext, nowikiemailtext
-                       return $context->msg( $target . 'text' )->parseAsBlock();
+                       return Status::newFatal( $target . 'text' );
                }
 
                $to = MailAddress::newFromUser( $target );
@@ -342,9 +341,33 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $text .= $context->msg( 'emailuserfooter',
                        $from->name, $to->name )->inContentLanguage()->text();
 
-               $error = '';
+               $error = false;
                if ( !Hooks::run( 'EmailUser', [ &$to, &$from, &$subject, &$text, &$error ] ) ) {
-                       return $error;
+                       if ( $error instanceof Status ) {
+                               return $error;
+                       } elseif ( $error === false || $error === '' || $error === [] ) {
+                               // Possibly to tell HTMLForm to pretend there was no submission?
+                               return false;
+                       } elseif ( $error === true ) {
+                               // Hook sent the mail itself and indicates success?
+                               return Status::newGood();
+                       } elseif ( is_array( $error ) ) {
+                               $status = Status::newGood();
+                               foreach ( $error as $e ) {
+                                       $status->fatal( $e );
+                               }
+                               return $status;
+                       } elseif ( $error instanceof MessageSpecifier ) {
+                               return Status::newFatal( $error );
+                       } else {
+                               // Ugh. Either a raw HTML string, or something that's supposed
+                               // to be treated like one.
+                               $type = is_object( $error ) ? get_class( $error ) : gettype( $error );
+                               wfDeprecated( "EmailUser hook returning a $type as \$error", '1.29' );
+                               return Status::newFatal( new ApiRawMessage(
+                                       [ '$1', Message::rawParam( (string)$error ) ], 'hookaborted'
+                               ) );
+                       }
                }
 
                if ( $config->get( 'UserEmailUseReplyTo' ) ) {
index ce88624..a2930fc 100644 (file)
@@ -536,6 +536,7 @@ class SpecialImport extends SpecialPage {
  */
 class ImportReporter extends ContextSource {
        private $reason = false;
+       private $logTags = [];
        private $mOriginalLogCallback = null;
        private $mOriginalPageOutCallback = null;
        private $mLogItemCount = 0;
@@ -558,6 +559,16 @@ class ImportReporter extends ContextSource {
                $this->reason = $reason;
        }
 
+       /**
+        * Sets change tags to apply to the import log entry and null revision.
+        *
+        * @param array $tags
+        * @since 1.29
+        */
+       public function setChangeTags( array $tags ) {
+               $this->logTags = $tags;
+       }
+
        function open() {
                $this->getOutput()->addHTML( "<ul>\n" );
        }
@@ -628,14 +639,6 @@ class ImportReporter extends ContextSource {
                                        . $this->reason;
                        }
 
-                       $logEntry = new ManualLogEntry( 'import', $action );
-                       $logEntry->setTarget( $title );
-                       $logEntry->setComment( $this->reason );
-                       $logEntry->setPerformer( $this->getUser() );
-                       $logEntry->setParameters( $logParams );
-                       $logid = $logEntry->insert();
-                       $logEntry->publish( $logid );
-
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
@@ -647,8 +650,9 @@ class ImportReporter extends ContextSource {
                                $this->getUser()
                        );
 
+                       $nullRevId = null;
                        if ( !is_null( $nullRevision ) ) {
-                               $nullRevision->insertOn( $dbw );
+                               $nullRevId = $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
@@ -657,6 +661,22 @@ class ImportReporter extends ContextSource {
                                        [ $page, $nullRevision, $latest, $this->getUser() ]
                                );
                        }
+
+                       // Create the import log entry
+                       $logEntry = new ManualLogEntry( 'import', $action );
+                       $logEntry->setTarget( $title );
+                       $logEntry->setComment( $this->reason );
+                       $logEntry->setPerformer( $this->getUser() );
+                       $logEntry->setParameters( $logParams );
+                       $logid = $logEntry->insert();
+                       if ( count( $this->logTags ) ) {
+                               $logEntry->setTags( $this->logTags );
+                       }
+                       // Make sure the null revision will be tagged as well
+                       $logEntry->setAssociatedRevId( $nullRevId );
+
+                       $logEntry->publish( $logid );
+
                } else {
                        $this->getOutput()->addHTML( "<li>" . $linkRenderer->makeKnownLink( $title ) . " " .
                                $this->msg( 'import-nonewrevisions' )->escaped() . "</li>\n" );
index c61609d..52cb30a 100644 (file)
@@ -111,7 +111,8 @@ class MIMEsearchPage extends QueryPage {
        function getPageHeader() {
                $formDescriptor = [
                        'mime' => [
-                               'type' => 'text',
+                               'type' => 'combobox',
+                               'options' => $this->getSuggestionsForTypes(),
                                'name' => 'mime',
                                'label-message' => 'mimetype',
                                'required' => true,
@@ -119,8 +120,7 @@ class MIMEsearchPage extends QueryPage {
                        ],
                ];
 
-               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                       ->setWrapperLegendMsg( 'mimesearch' )
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
                        ->setSubmitTextMsg( 'ilsubmit' )
                        ->setAction( $this->getPageTitle()->getLocalURL() )
                        ->setMethod( 'get' )
@@ -128,6 +128,33 @@ class MIMEsearchPage extends QueryPage {
                        ->displayForm( false );
        }
 
+       protected function getSuggestionsForTypes() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $lastMajor = null;
+               $suggestions = [];
+               $result = $dbr->select(
+                       [ 'image' ],
+                       // We ignore img_media_type, but using it in the query is needed for MySQL to choose a
+                       // sensible execution plan
+                       [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ],
+                       [],
+                       __METHOD__,
+                       [ 'GROUP BY' => [ 'img_media_type', 'img_major_mime', 'img_minor_mime' ] ]
+               );
+               foreach ( $result as $row ) {
+                       $major = $row->img_major_mime;
+                       $minor = $row->img_minor_mime;
+                       $suggestions[ "$major/$minor" ] = "$major/$minor";
+                       if ( $lastMajor === $major ) {
+                               // If there are at least two with the same major mime type, also include the wildcard
+                               $suggestions[ "$major/*" ] = "$major/*";
+                       }
+                       $lastMajor = $major;
+               }
+               ksort( $suggestions );
+               return $suggestions;
+       }
+
        public function execute( $par ) {
                $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
                $this->mime = trim( $this->mime );
index e11977f..1cb6549 100644 (file)
@@ -339,7 +339,7 @@ class MediaStatisticsPage extends QueryPage {
         * we need to implement since abstract in parent class.
         *
         * @param Skin $skin
-        * @param stdObject $result Result row
+        * @param stdClass $result Result row
         * @return bool|string|void
         * @throws MWException
         */
index 077a5d2..9e3a750 100644 (file)
@@ -108,7 +108,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        unset( $formDescriptor['hidepatrolled'] );
                }
 
-               $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+               HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
                        ->setWrapperLegendMsg( 'newimages-legend' )
                        ->setSubmitTextMsg( 'ilsubmit' )
                        ->setMethod( 'get' )
index 61b6a8c..db05ebe 100644 (file)
@@ -89,6 +89,12 @@ class SpecialPageLanguage extends FormSpecialPage {
                        'default' => $this->getConfig()->get( 'LanguageCode' ),
                ];
 
+               // Allow user to enter a comment explaining the change
+               $page['reason'] = [
+                       'type' => 'text',
+                       'label-message' => 'pagelang-reason'
+               ];
+
                return $page;
        }
 
@@ -111,68 +117,110 @@ class SpecialPageLanguage extends FormSpecialPage {
        /**
         *
         * @param array $data
-        * @return bool
+        * @return Status
         */
        public function onSubmit( array $data ) {
-               $title = Title::newFromText( $data['pagename'] );
+               $pageName = $data['pagename'];
 
-               // Check if title is valid
-               if ( !$title ) {
-                       return false;
+               // Check if user wants to use default language
+               if ( $data['selectoptions'] == 1 ) {
+                       $newLanguage = 'default';
+               } else {
+                       $newLanguage = $data['language'];
                }
 
+               try {
+                       $title = Title::newFromTextThrow( $pageName );
+               } catch ( MalformedTitleException $ex ) {
+                       return Status::newFatal( $ex->getMessageObject() );
+               }
+
+               // Url to redirect to after the operation
+               $this->goToUrl = $title->getFullURL(
+                       $title->isRedirect() ? [ 'redirect' => 'no' ] : []
+               );
+
+               return self::changePageLanguage(
+                       $this->getContext(),
+                       $title,
+                       $newLanguage,
+                       $data['reason'] === null ? '' : $data['reason']
+               );
+       }
+
+       /**
+        * @param IContextSource $context
+        * @param Title $title
+        * @param string $newLanguage Language code
+        * @param string $reason Reason for the change
+        * @param array $tags Change tags to apply to the log entry
+        * @return Status
+        */
+       public static function changePageLanguage( IContextSource $context, Title $title,
+               $newLanguage, $reason, array $tags = [] ) {
                // Get the default language for the wiki
-               $defLang = $this->getConfig()->get( 'LanguageCode' );
+               $defLang = $context->getConfig()->get( 'LanguageCode' );
 
                $pageId = $title->getArticleID();
 
                // Check if article exists
                if ( !$pageId ) {
-                       return false;
+                       return Status::newFatal(
+                               'pagelang-nonexistent-page',
+                               wfEscapeWikiText( $title->getPrefixedText() )
+                       );
                }
 
                // Load the page language from DB
                $dbw = wfGetDB( DB_MASTER );
-               $langOld = $dbw->selectField(
+               $oldLanguage = $dbw->selectField(
                        'page',
                        'page_lang',
                        [ 'page_id' => $pageId ],
                        __METHOD__
                );
 
-               // Url to redirect to after the operation
-               $this->goToUrl = $title->getFullURL();
-
-               // Check if user wants to use default language
-               if ( $data['selectoptions'] == 1 ) {
-                       $langNew = null;
-               } else {
-                       $langNew = $data['language'];
+               // Check if user wants to use the default language
+               if ( $newLanguage === 'default' ) {
+                       $newLanguage = null;
                }
 
                // No change in language
-               if ( $langNew === $langOld ) {
-                       return false;
+               if ( $newLanguage === $oldLanguage ) {
+                       // Check if old language does not exist
+                       if ( !$oldLanguage ) {
+                               return Status::newFatal( ApiMessage::create(
+                                       [
+                                               'pagelang-unchanged-language-default',
+                                               wfEscapeWikiText( $title->getPrefixedText() )
+                                       ],
+                                       'pagelang-unchanged-language'
+                               ) );
+                       }
+                       return Status::newFatal(
+                               'pagelang-unchanged-language',
+                               wfEscapeWikiText( $title->getPrefixedText() ),
+                               $oldLanguage
+                       );
                }
 
                // Hardcoded [def] if the language is set to null
-               $logOld = $langOld ? $langOld : $defLang . '[def]';
-               $logNew = $langNew ? $langNew : $defLang . '[def]';
+               $logOld = $oldLanguage ? $oldLanguage : $defLang . '[def]';
+               $logNew = $newLanguage ? $newLanguage : $defLang . '[def]';
 
                // Writing new page language to database
-               $dbw = wfGetDB( DB_MASTER );
                $dbw->update(
                        'page',
-                       [ 'page_lang' => $langNew ],
+                       [ 'page_lang' => $newLanguage ],
                        [
                                'page_id' => $pageId,
-                               'page_lang' => $langOld
+                               'page_lang' => $oldLanguage
                        ],
                        __METHOD__
                );
 
                if ( !$dbw->affectedRows() ) {
-                       return false;
+                       return Status::newFatal( 'pagelang-db-failed' );
                }
 
                // Logging change of language
@@ -181,9 +229,11 @@ class SpecialPageLanguage extends FormSpecialPage {
                        '5::newlanguage' => $logNew
                ];
                $entry = new ManualLogEntry( 'pagelang', 'pagelang' );
-               $entry->setPerformer( $this->getUser() );
+               $entry->setPerformer( $context->getUser() );
                $entry->setTarget( $title );
                $entry->setParameters( $logParams );
+               $entry->setComment( $reason );
+               $entry->setTags( $tags );
 
                $logid = $entry->insert();
                $entry->publish( $logid );
@@ -191,7 +241,11 @@ class SpecialPageLanguage extends FormSpecialPage {
                // Force re-render so that language-based content (parser functions etc.) gets updated
                $title->invalidateCache();
 
-               return true;
+               return Status::newGood( (object)[
+                       'oldLanguage' => $logOld,
+                       'newLanguage' => $logNew,
+                       'logId' => $logid,
+               ] );
        }
 
        public function onSuccess() {
index cd3299c..b2e5674 100644 (file)
@@ -91,11 +91,13 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
 
+               $opts->add( 'userExpLevel', 'all' );
+
                return $opts;
        }
 
        /**
-        * Get custom show/hide filters
+        * Get all custom filters
         *
         * @return array Map of filter URL param names to properties (msg/default)
         */
@@ -240,6 +242,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $opts['tagfilter']
                );
 
+               $this->filterOnUserExperienceLevel( $tables, $conds, $join_conds, $opts );
+
                if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
                        $opts )
                ) {
@@ -501,7 +505,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $extraOpts['category'] = $this->categoryFilterForm( $opts );
                }
 
-               $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
+               $tagFilter = ChangeTags::buildTagFilterSelector(
+                       $opts['tagfilter'], false, $this->getContext() );
                if ( count( $tagFilter ) ) {
                        $extraOpts['tagfilter'] = $tagFilter;
                }
@@ -521,6 +526,14 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                parent::addModules();
                $out = $this->getOutput();
                $out->addModules( 'mediawiki.special.recentchanges' );
+               if ( $this->getUser()->getOption(
+                               'rcenhancedfilters',
+                               /*default=*/ null,
+                               /*ignoreHidden=*/ true
+                       )
+               ) {
+                       $out->addModules( 'mediawiki.rcfilters.filters' );
+               }
        }
 
        /**
@@ -664,12 +677,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
                unset( $value );
 
-               $text = htmlspecialchars( $title );
                if ( $active ) {
-                       $text = '<strong>' . $text . '</strong>';
+                       $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return Linker::linkKnown( $this->getPageTitle(), $text, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
        }
 
        /**
@@ -747,9 +759,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $showhide = [ 'show', 'hide' ];
 
-               foreach ( $this->getCustomFilters() as $key => $params ) {
+               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
+
                // Disable some if needed
                if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
@@ -802,4 +815,65 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return 60 * 5;
        }
 
+       function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
+               global $wgLearnerEdits,
+                          $wgExperiencedUserEdits,
+                          $wgLearnerMemberSince,
+                          $wgExperiencedUserMemberSince;
+
+               $selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
+               // remove values that are not recognized
+               $selectedExpLevels = array_intersect(
+                       $selectedExpLevels,
+                       [ 'newcomer', 'learner', 'experienced' ]
+               );
+               sort( $selectedExpLevels );
+
+               if ( $selectedExpLevels ) {
+                       $tables[] = 'user';
+                       $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ];
+
+                       $now = time();
+                       $secondsPerDay = 86400;
+                       $learnerCutoff = $now - $wgLearnerMemberSince * $secondsPerDay;
+                       $experiencedUserCutoff = $now - $wgExperiencedUserMemberSince * $secondsPerDay;
+
+                       $aboveNewcomer = $this->getDB()->makeList(
+                               [
+                                       'user_editcount >= ' . intval( $wgLearnerEdits ),
+                                       'user_registration <= ' . $this->getDB()->timestamp( $learnerCutoff ),
+                               ],
+                               IDatabase::LIST_AND
+                       );
+
+                       $aboveLearner = $this->getDB()->makeList(
+                               [
+                                       'user_editcount >= ' . intval( $wgExperiencedUserEdits ),
+                                       'user_registration <= ' . $this->getDB()->timestamp( $experiencedUserCutoff ),
+                               ],
+                               IDatabase::LIST_AND
+                       );
+
+                       if ( $selectedExpLevels === [ 'newcomer' ] ) {
+                               $conds[] =  "NOT ( $aboveNewcomer )";
+                       } elseif ( $selectedExpLevels === [ 'learner' ] ) {
+                               $conds[] = $this->getDB()->makeList(
+                                       [ $aboveNewcomer, "NOT ( $aboveLearner )" ],
+                                       IDatabase::LIST_AND
+                               );
+                       } elseif ( $selectedExpLevels === [ 'experienced' ] ) {
+                               $conds[] = $aboveLearner;
+                       } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) {
+                               $conds[] = "NOT ( $aboveLearner )";
+                       } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) {
+                               $conds[] = $this->getDB()->makeList(
+                                       [ "NOT ( $aboveNewcomer )", $aboveLearner ],
+                                       IDatabase::LIST_OR
+                               );
+                       } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) {
+                               $conds[] = $aboveNewcomer;
+                       }
+               }
+       }
+
 }
index 8780c56..4b0fa00 100644 (file)
@@ -466,9 +466,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
                        if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
-                               $link = Linker::linkKnown(
+                               $link = $this->getLinkRenderer()->makeKnownLink(
                                        $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->getTitle(),
-                                       $this->msg( 'revdelete-edit-reasonlist' )->escaped(),
+                                       $this->msg( 'revdelete-edit-reasonlist' )->text(),
                                        [],
                                        [ 'action' => 'edit' ]
                                );
index e1e2049..761610e 100644 (file)
@@ -41,14 +41,10 @@ class SpecialRunJobs extends UnlistedSpecialPage {
        public function execute( $par = '' ) {
                $this->getOutput()->disable();
                if ( wfReadOnly() ) {
-                       // HTTP 423 Locked
-                       HttpStatus::header( 423 );
-                       print 'Wiki is in read-only mode';
-
+                       wfHttpError( 423, 'Locked', 'Wiki is in read-only mode.' );
                        return;
                } elseif ( !$this->getRequest()->wasPosted() ) {
-                       HttpStatus::header( 400 );
-                       print 'Request must be POSTed';
+                       wfHttpError( 400, 'Bad Request', 'Request must be POSTed.' );
                        return;
                }
 
@@ -58,8 +54,9 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
                $missing = array_diff_key( $required, $params );
                if ( count( $missing ) ) {
-                       HttpStatus::header( 400 );
-                       print 'Missing parameters: ' . implode( ', ', array_keys( $missing ) );
+                       wfHttpError( 400, 'Bad Request',
+                               'Missing parameters: ' . implode( ', ', array_keys( $missing ) )
+                       );
                        return;
                }
 
@@ -71,8 +68,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $verified = is_string( $providedSignature )
                        && hash_equals( $correctSignature, $providedSignature );
                if ( !$verified || $params['sigexpiry'] < time() ) {
-                       HttpStatus::header( 400 );
-                       print 'Invalid or stale signature provided';
+                       wfHttpError( 400, 'Bad Request', 'Invalid or stale signature provided.' );
                        return;
                }
 
index 9f83832..34620ff 100644 (file)
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Widget\Search\BasicSearchResultSetWidget;
+use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget;
+use MediaWiki\Widget\Search\FullSearchResultWidget;
+use MediaWiki\Widget\Search\SimpleSearchResultWidget;
 
 /**
  * implements Special:Search - Run text & title search and display the output
@@ -75,12 +79,6 @@ class SpecialSearch extends SpecialPage {
         */
        protected $runSuggestion = true;
 
-       /**
-        * Names of the wikis, in format: Interwiki prefix -> caption
-        * @var array
-        */
-       protected $customCaptions;
-
        /**
         * Search engine configurations.
         * @var SearchEngineConfig
@@ -101,35 +99,29 @@ class SpecialSearch extends SpecialPage {
         */
        public function execute( $par ) {
                $request = $this->getRequest();
+               $out = $this->getOutput();
 
                // Fetch the search term
-               $search = str_replace( "\n", " ", $request->getText( 'search' ) );
+               $term = str_replace( "\n", " ", $request->getText( 'search' ) );
 
                // Historically search terms have been accepted not only in the search query
                // parameter, but also as part of the primary url. This can have PII implications
                // in releasing page view data. As such issue a 301 redirect to the correct
                // URL.
-               if ( strlen( $par ) && !strlen( $search ) ) {
+               if ( strlen( $par ) && !strlen( $term ) ) {
                        $query = $request->getValues();
                        unset( $query['title'] );
                        // Strip underscores from title parameter; most of the time we'll want
                        // text form here. But don't strip underscores from actual text params!
                        $query['search'] = str_replace( '_', ' ', $par );
-                       $this->getOutput()->redirect( $this->getPageTitle()->getFullURL( $query ), 301 );
+                       $out->redirect( $this->getPageTitle()->getFullURL( $query ), 301 );
                        return;
                }
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $out = $this->getOutput();
-               $out->allowClickjacking();
-               $out->addModuleStyles( [
-                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
-                       'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
-               ] );
-               $this->addHelpLink( 'Help:Searching' );
-
+               // Need to load selected namespaces before handling nsRemember
                $this->load();
+               // TODO: This performs database actions on GET request, which is going to
+               // be a problem for our multi-datacenter work.
                if ( !is_null( $request->getVal( 'nsRemember' ) ) ) {
                        $this->saveNamespaces();
                        // Remove the token from the URL to prevent the user from inadvertently
@@ -141,16 +133,48 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
-               $out->addJsConfigVars( [ 'searchTerm' => $search ] );
                $this->searchEngineType = $request->getVal( 'srbackend' );
-
-               if ( $request->getVal( 'fulltext' )
-                       || !is_null( $request->getVal( 'offset' ) )
+               if (
+                       !$request->getVal( 'fulltext' ) &&
+                       $request->getVal( 'offset' ) === null
                ) {
-                       $this->showResults( $search );
-               } else {
-                       $this->goResult( $search );
+                       $url = $this->goResult( $term );
+                       if ( $url !== null ) {
+                               // successful 'go'
+                               $out->redirect( $url );
+                               return;
+                       }
+               }
+
+               $this->setupPage( $term );
+
+               if ( $this->getConfig()->get( 'DisableTextSearch' ) ) {
+                       $searchForwardUrl = $this->getConfig()->get( 'SearchForwardUrl' );
+                       if ( $searchForwardUrl ) {
+                               $url = str_replace( '$1', urlencode( $term ), $searchForwardUrl );
+                               $out->redirect( $url );
+                       } else {
+                               $out->addHTML(
+                                       "<fieldset>" .
+                                               "<legend>" .
+                                                       $this->msg( 'search-external' )->escaped() .
+                                               "</legend>" .
+                                               "<p class='mw-searchdisabled'>" .
+                                                       $this->msg( 'searchdisabled' )->escaped() .
+                                               "</p>" .
+                                               $this->msg( 'googlesearch' )->rawParams(
+                                                       htmlspecialchars( $term ),
+                                                       'UTF-8',
+                                                       $this->msg( 'searchbutton' )->escaped()
+                                               )->text() .
+                                       "</fieldset>"
+                               );
+                       }
+
+                       return;
                }
+
+               $this->showResults( $term );
        }
 
        /**
@@ -209,32 +233,25 @@ class SpecialSearch extends SpecialPage {
         * If an exact title match can be found, jump straight ahead to it.
         *
         * @param string $term
+        * @return string|null The url to redirect to, or null if no redirect.
         */
        public function goResult( $term ) {
-               $this->setupPage( $term );
-               # Try to go to page as entered.
-               $title = Title::newFromText( $term );
                # If the string cannot be used to create a title
-               if ( is_null( $title ) ) {
-                       $this->showResults( $term );
-
-                       return;
+               if ( is_null( Title::newFromText( $term ) ) ) {
+                       return null;
                }
                # If there's an exact or very near match, jump right there.
                $title = $this->getSearchEngine()
                        ->getNearMatcher( $this->getConfig() )->getNearMatch( $term );
-
-               if ( !is_null( $title ) &&
-                       Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] )
-               ) {
-                       if ( $url === null ) {
-                               $url = $title->getFullURL();
-                       }
-                       $this->getOutput()->redirect( $url );
-
-                       return;
+               if ( is_null( $title ) ) {
+                       return null;
                }
-               $this->showResults( $term );
+               $url = null;
+               if ( !Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] ) ) {
+                       return null;
+               }
+
+               return $url === null ? $title->getFullURL() : $url;
        }
 
        /**
@@ -243,6 +260,33 @@ class SpecialSearch extends SpecialPage {
        public function showResults( $term ) {
                global $wgContLang;
 
+               if ( $this->searchEngineType !== null ) {
+                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
+               }
+
+               $out = $this->getOutput();
+               $formWidget = new MediaWiki\Widget\Search\SearchFormWidget(
+                       $this,
+                       $this->searchConfig,
+                       $this->getSearchProfiles()
+               );
+               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
+               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
+                       // Empty query -- straight view of search form
+                       if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
+                               # Hook requested termination
+                               return;
+                       }
+                       $out->enableOOUI();
+                       // The form also contains the 'Showing results 0 - 20 of 1234' so we can
+                       // only do the form render here for the empty $term case. Rendering
+                       // the form when a search is provided is repeated below.
+                       $out->addHTML( $formWidget->render(
+                               $this->profile, $term, 0, 0, $this->offset, $this->isPowerSearch()
+                       ) );
+                       return;
+               }
+
                $search = $this->getSearchEngine();
                $search->setFeatureData( 'rewrite', $this->runSuggestion );
                $search->setLimitOffset( $this->limit, $this->offset );
@@ -251,34 +295,8 @@ class SpecialSearch extends SpecialPage {
                $term = $search->transformSearchTerm( $term );
 
                Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $search ] );
-
-               $this->setupPage( $term );
-
-               $out = $this->getOutput();
-
-               if ( $this->getConfig()->get( 'DisableTextSearch' ) ) {
-                       $searchFowardUrl = $this->getConfig()->get( 'SearchForwardUrl' );
-                       if ( $searchFowardUrl ) {
-                               $url = str_replace( '$1', urlencode( $term ), $searchFowardUrl );
-                               $out->redirect( $url );
-                       } else {
-                               $out->addHTML(
-                                       Xml::openElement( 'fieldset' ) .
-                                       Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
-                                       Xml::element(
-                                               'p',
-                                               [ 'class' => 'mw-searchdisabled' ],
-                                               $this->msg( 'searchdisabled' )->text()
-                                       ) .
-                                       $this->msg( 'googlesearch' )->rawParams(
-                                               htmlspecialchars( $term ),
-                                               'UTF-8',
-                                               $this->msg( 'searchbutton' )->escaped()
-                                       )->text() .
-                                       Xml::closeElement( 'fieldset' )
-                               );
-                       }
-
+               if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
+                       # Hook requested termination
                        return;
                }
 
@@ -298,33 +316,6 @@ class SpecialSearch extends SpecialPage {
                        $textMatches = $textStatus->getValue();
                }
 
-               // did you mean... suggestions
-               $didYouMeanHtml = '';
-               if ( $showSuggestion && $textMatches ) {
-                       if ( $textMatches->hasRewrittenQuery() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
-                       } elseif ( $textMatches->hasSuggestion() ) {
-                               $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches );
-                       }
-               }
-
-               if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
-                       # Hook requested termination
-                       return;
-               }
-
-               // start rendering the page
-               $out->addHTML(
-                       Xml::openElement(
-                               'form',
-                               [
-                                       'id' => ( $this->isPowerSearch() ? 'powersearch' : 'search' ),
-                                       'method' => 'get',
-                                       'action' => wfScript(),
-                               ]
-                       )
-               );
-
                // Get number of results
                $titleMatchesNum = $textMatchesNum = $numTitleMatches = $numTextMatches = 0;
                if ( $titleMatches ) {
@@ -334,33 +325,31 @@ class SpecialSearch extends SpecialPage {
                if ( $textMatches ) {
                        $textMatchesNum = $textMatches->numRows();
                        $numTextMatches = $textMatches->getTotalHits();
+                       if ( $textMatchesNum > 0 ) {
+                               $search->augmentSearchResults( $textMatches );
+                       }
                }
                $num = $titleMatchesNum + $textMatchesNum;
                $totalRes = $numTitleMatches + $numTextMatches;
 
+               // start rendering the page
                $out->enableOOUI();
-               $out->addHTML(
-                       # This is an awful awful ID name. It's not a table, but we
-                       # named it poorly from when this was a table so now we're
-                       # stuck with it
-                       Xml::openElement( 'div', [ 'id' => 'mw-search-top-table' ] ) .
-                       $this->shortDialog( $term, $num, $totalRes ) .
-                       Xml::closeElement( 'div' ) .
-                       $this->searchProfileTabs( $term ) .
-                       $this->searchOptions( $term ) .
-                       Xml::closeElement( 'form' ) .
-                       $didYouMeanHtml
-               );
+               $out->addHTML( $formWidget->render(
+                       $this->profile, $term, $num, $totalRes, $this->offset, $this->isPowerSearch()
+               ) );
 
-               $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
-               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
-                       // Empty query -- straight view of search form
-                       return;
+               // did you mean... suggestions
+               if ( $textMatches ) {
+                       $dymWidget = new MediaWiki\Widget\Search\DidYouMeanWidget( $this );
+                       $out->addHTML( $dymWidget->render( $term, $textMatches ) );
                }
 
                $out->addHTML( "<div class='searchresults'>" );
 
                $hasErrors = $textStatus && $textStatus->getErrors();
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
                if ( $hasErrors ) {
                        list( $error, $warning ) = $textStatus->splitByErrorType();
                        if ( $error->getErrors() ) {
@@ -379,83 +368,38 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-               // prev/next links
-               $prevnext = null;
-               if ( $num || $this->offset ) {
-                       // Show the create link ahead
-                       $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       if ( $totalRes > $this->limit || $this->offset ) {
-                               if ( $this->searchEngineType !== null ) {
-                                       $this->setExtraParam( 'srbackend', $this->searchEngineType );
-                               }
-                               $prevnext = $this->getLanguage()->viewPrevNext(
-                                       $this->getPageTitle(),
-                                       $this->offset,
-                                       $this->limit,
-                                       $this->powerSearchOptions() + [ 'search' => $term ],
-                                       $this->limit + $this->offset >= $totalRes
-                               );
-                       }
-               }
-               Hooks::run( 'SpecialSearchResults', [ $term, &$titleMatches, &$textMatches ] );
+               // Show the create link ahead
+               $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
 
-               $out->parserOptions()->setEditSection( false );
-               if ( $titleMatches ) {
-                       if ( $numTitleMatches > 0 ) {
-                               $out->wrapWikiMsg( "==$1==\n", 'titlematches' );
-                               $out->addHTML( $this->showMatches( $titleMatches ) );
-                       }
-                       $titleMatches->free();
-               }
-
-               if ( $textMatches ) {
-                       // output appropriate heading
-                       if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
-                               $out->addHTML( '<div class="mw-search-visualclear"></div>' );
-                               // if no title matches the heading is redundant
-                               $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-                       }
-
-                       // show results
-                       if ( $numTextMatches > 0 ) {
-                               $search->augmentSearchResults( $textMatches );
-                               $out->addHTML( $this->showMatches( $textMatches ) );
-                       }
-
-                       // show secondary interwiki results if any
-                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
-                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
-                       }
-               }
-
-               $hasOtherResults = $textMatches &&
-                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+               Hooks::run( 'SpecialSearchResults', [ $term, &$titleMatches, &$textMatches ] );
 
-               // If we have no results and we have not already displayed an error message
+               // If we have no results and have not already displayed an error message
                if ( $num === 0 && !$hasErrors ) {
-                       if ( !$this->offset ) {
-                               // If we have an offset the create link was rendered earlier in this function.
-                               // This class needs a good de-spaghettification, but for now this will
-                               // do the job.
-                               $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       }
                        $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", [
                                $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
                                wfEscapeWikiText( $term )
                        ] );
                }
 
-               if ( $hasOtherResults ) {
-                       foreach ( $textMatches->getInterwikiResults( SearchResultSet::INLINE_RESULTS )
-                                               as $interwiki => $interwikiResult ) {
-                               if ( $interwikiResult instanceof Status || $interwikiResult->numRows() == 0 ) {
-                                       // ignore bad interwikis for now
-                                       continue;
-                               }
-                               // TODO: wiki header
-                               $out->addHTML( $this->showMatches( $interwikiResult, $interwiki ) );
-                       }
+               // Although $num might be 0 there can still be secondary or inline
+               // results to display.
+               $linkRenderer = $this->getLinkRenderer();
+               $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer );
+               $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
+               $sidebarResultsWidget = new InterwikiSearchResultSetWidget(
+                       $this,
+                       $sidebarResultWidget,
+                       $linkRenderer,
+                       MediaWikiServices::getInstance()->getInterwikiLookup()
+               );
+               $widget = new BasicSearchResultSetWidget( $this, $mainResultWidget, $sidebarResultsWidget );
+
+               $out->addHTML( $widget->render(
+                       $term, $this->offset, $titleMatches, $textMatches
+               ) );
+
+               if ( $titleMatches ) {
+                       $titleMatches->free();
                }
 
                if ( $textMatches ) {
@@ -464,100 +408,24 @@ class SpecialSearch extends SpecialPage {
 
                $out->addHTML( '<div class="mw-search-visualclear"></div>' );
 
-               if ( $prevnext ) {
+               // prev/next links
+               if ( $totalRes > $this->limit || $this->offset ) {
+                       $prevnext = $this->getLanguage()->viewPrevNext(
+                               $this->getPageTitle(),
+                               $this->offset,
+                               $this->limit,
+                               $this->powerSearchOptions() + [ 'search' => $term ],
+                               $this->limit + $this->offset >= $totalRes
+                       );
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
 
+               // Close <div class='searchresults'>
                $out->addHTML( "</div>" );
 
                Hooks::run( 'SpecialSearchResultsAppend', [ $this, $out, $term ] );
        }
 
-       /**
-        * Produce wiki header for interwiki results
-        * @param string $interwiki Interwiki name
-        * @param SearchResultSet $interwikiResult The result set
-        * @return string
-        */
-       protected function interwikiHeader( $interwiki, $interwikiResult ) {
-               // TODO: we need to figure out how to name wikis correctly
-               $wikiMsg = $this->msg( 'search-interwiki-results-' . $interwiki )->parse();
-               return "<p class=\"mw-search-interwiki-header mw-search-visualclear\">\n$wikiMsg</p>";
-       }
-
-       /**
-        * Generates HTML shown to the user when we have a suggestion about a query
-        * that might give more results than their current query.
-        */
-       protected function getDidYouMeanHtml( SearchResultSet $textMatches ) {
-               # mirror Go/Search behavior of original request ..
-               $params = [ 'search' => $textMatches->getSuggestionQuery() ];
-               if ( $this->fulltext === null ) {
-                       $params['fulltext'] = 'Search';
-               } else {
-                       $params['fulltext'] = $this->fulltext;
-               }
-               $stParams = array_merge( $params, $this->powerSearchOptions() );
-
-               $suggest = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $textMatches->getSuggestionSnippet() ?: null,
-                       [ 'id' => 'mw-search-DYM-suggestion' ],
-                       $stParams
-               );
-
-               # HTML of did you mean... search suggestion link
-               return Html::rawElement(
-                       'div',
-                       [ 'class' => 'searchdidyoumean' ],
-                       $this->msg( 'search-suggest' )->rawParams( $suggest )->parse()
-               );
-       }
-
-       /**
-        * Generates HTML shown to user when their query has been internally rewritten,
-        * and the results of the rewritten query are being returned.
-        *
-        * @param string $term The users search input
-        * @param SearchResultSet $textMatches The response to the users initial search request
-        * @return string HTML linking the user to their original $term query, and the one
-        *  suggested by $textMatches.
-        */
-       protected function getDidYouMeanRewrittenHtml( $term, SearchResultSet $textMatches ) {
-               // Showing results for '$rewritten'
-               // Search instead for '$orig'
-
-               $params = [ 'search' => $textMatches->getQueryAfterRewrite() ];
-               if ( $this->fulltext === null ) {
-                       $params['fulltext'] = 'Search';
-               } else {
-                       $params['fulltext'] = $this->fulltext;
-               }
-               $stParams = array_merge( $params, $this->powerSearchOptions() );
-
-               $rewritten = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $textMatches->getQueryAfterRewriteSnippet() ?: null,
-                       [ 'id' => 'mw-search-DYM-rewritten' ],
-                       $stParams
-               );
-
-               $stParams['search'] = $term;
-               $stParams['runsuggestion'] = 0;
-               $original = Linker::linkKnown(
-                       $this->getPageTitle(),
-                       htmlspecialchars( $term ),
-                       [ 'id' => 'mw-search-DYM-original' ],
-                       $stParams
-               );
-
-               return Html::rawElement(
-                       'div',
-                       [ 'class' => 'searchdidyoumean' ],
-                       $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped()
-               );
-       }
-
        /**
         * @param Title $title
         * @param int $num The number of search results found
@@ -608,10 +476,21 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
+        * Sets up everything for the HTML output page including styles, javascript,
+        * page title, etc.
+        *
         * @param string $term
         */
        protected function setupPage( $term ) {
                $out = $this->getOutput();
+
+               $this->setHeaders();
+               $this->outputHeader();
+               // TODO: Is this true? The namespace remember uses a user token
+               // on save.
+               $out->allowClickjacking();
+               $this->addHelpLink( 'Help:Searching' );
+
                if ( strval( $term ) !== '' ) {
                        $out->setPageTitle( $this->msg( 'searchresults' ) );
                        $out->setHTMLTitle( $this->msg( 'pagetitle' )
@@ -619,8 +498,13 @@ class SpecialSearch extends SpecialPage {
                                ->inContentLanguage()->text()
                        );
                }
-               // add javascript specific to special:search
+
+               $out->addJsConfigVars( [ 'searchTerm' => $term ] );
                $out->addModules( 'mediawiki.special.search' );
+               $out->addModuleStyles( [
+                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
+                       'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
+               ] );
        }
 
        /**
@@ -652,17 +536,19 @@ class SpecialSearch extends SpecialPage {
 
        /**
         * Reconstruct the 'power search' options for links
+        * TODO: Instead of exposing this publicly, could we instead expose
+        *  a function for creating search links?
         *
         * @return array
         */
-       protected function powerSearchOptions() {
+       public function powerSearchOptions() {
                $opt = [];
-               if ( !$this->isPowerSearch() ) {
-                       $opt['profile'] = $this->profile;
-               } else {
+               if ( $this->isPowerSearch() ) {
                        foreach ( $this->namespaces as $n ) {
                                $opt['ns' . $n] = 1;
                        }
+               } else {
+                       $opt['profile'] = $this->profile;
                }
 
                return $opt + $this->extraParams;
@@ -705,422 +591,6 @@ class SpecialSearch extends SpecialPage {
                return false;
        }
 
-       /**
-        * Show whole set of results
-        *
-        * @param SearchResultSet $matches
-        * @param string $interwiki Interwiki name
-        *
-        * @return string
-        */
-       protected function showMatches( $matches, $interwiki = null ) {
-               global $wgContLang;
-
-               $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
-               $out = '';
-               $result = $matches->next();
-               $pos = $this->offset;
-
-               if ( $result && $interwiki ) {
-                       $out .= $this->interwikiHeader( $interwiki, $matches );
-               }
-
-               $out .= "<ul class='mw-search-results'>\n";
-               while ( $result ) {
-                       $out .= $this->showHit( $result, $terms, $pos++ );
-                       $result = $matches->next();
-               }
-               $out .= "</ul>\n";
-
-               // convert the whole thing to desired language variant
-               $out = $wgContLang->convert( $out );
-
-               return $out;
-       }
-
-       /**
-        * Format a single hit result
-        *
-        * @param SearchResult $result
-        * @param array $terms Terms to highlight
-        * @param int $position Position within the search results, including offset.
-        *
-        * @return string
-        */
-       protected function showHit( SearchResult $result, $terms, $position ) {
-               if ( $result->isBrokenTitle() ) {
-                       return '';
-               }
-
-               $title = $result->getTitle();
-
-               $titleSnippet = $result->getTitleSnippet();
-
-               if ( $titleSnippet == '' ) {
-                       $titleSnippet = null;
-               }
-
-               $link_t = clone $title;
-               $query = [];
-
-               Hooks::run( 'ShowSearchHitTitle',
-                       [ &$link_t, &$titleSnippet, $result, $terms, $this, &$query ] );
-
-               $link = Linker::linkKnown(
-                       $link_t,
-                       $titleSnippet,
-                       [ 'data-serp-pos' => $position ], // HTML attributes
-                       $query
-               );
-
-               // If page content is not readable, just return the title.
-               // This is not quite safe, but better than showing excerpts from non-readable pages
-               // Note that hiding the entry entirely would screw up paging.
-               if ( !$title->userCan( 'read', $this->getUser() ) ) {
-                       return "<li>{$link}</li>\n";
-               }
-
-               // If the page doesn't *exist*... our search index is out of date.
-               // The least confusing at this point is to drop the result.
-               // You may get less results, but... oh well. :P
-               if ( $result->isMissingRevision() ) {
-                       return '';
-               }
-
-               // format redirects / relevant sections
-               $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet();
-               $sectionTitle = $result->getSectionTitle();
-               $sectionText = $result->getSectionSnippet();
-               $categorySnippet = $result->getCategorySnippet();
-
-               $redirect = '';
-               if ( !is_null( $redirectTitle ) ) {
-                       if ( $redirectText == '' ) {
-                               $redirectText = null;
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
-                               "</span>";
-               }
-
-               $section = '';
-               if ( !is_null( $sectionTitle ) ) {
-                       if ( $sectionText == '' ) {
-                               $sectionText = null;
-                       }
-
-                       $section = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-section' )->rawParams(
-                                       Linker::linkKnown( $sectionTitle, $sectionText ) )->text() .
-                               "</span>";
-               }
-
-               $category = '';
-               if ( $categorySnippet ) {
-                       $category = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-category' )->rawParams( $categorySnippet )->text() .
-                               "</span>";
-               }
-
-               // format text extract
-               $extract = "<div class='searchresult'>" . $result->getTextSnippet( $terms ) . "</div>";
-
-               $lang = $this->getLanguage();
-
-               // format description
-               $byteSize = $result->getByteSize();
-               $wordCount = $result->getWordCount();
-               $timestamp = $result->getTimestamp();
-               $size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
-                       ->numParams( $wordCount )->escaped();
-
-               if ( $title->getNamespace() == NS_CATEGORY ) {
-                       $cat = Category::newFromTitle( $title );
-                       $size = $this->msg( 'search-result-category-size' )
-                               ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
-                               ->escaped();
-               }
-
-               $date = $lang->userTimeAndDate( $timestamp, $this->getUser() );
-
-               $fileMatch = '';
-               // Include a thumbnail for media files...
-               if ( $title->getNamespace() == NS_FILE ) {
-                       $img = $result->getFile();
-                       $img = $img ?: wfFindFile( $title );
-                       if ( $result->isFileMatch() ) {
-                               $fileMatch = "<span class='searchalttitle'>" .
-                                       $this->msg( 'search-file-match' )->escaped() . "</span>";
-                       }
-                       if ( $img ) {
-                               $thumb = $img->transform( [ 'width' => 120, 'height' => 120 ] );
-                               if ( $thumb ) {
-                                       $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
-                                       // Float doesn't seem to interact well with the bullets.
-                                       // Table messes up vertical alignment of the bullets.
-                                       // Bullets are therefore disabled (didn't look great anyway).
-                                       return "<li>" .
-                                               '<table class="searchResultImage">' .
-                                               '<tr>' .
-                                               '<td style="width: 120px; text-align: center; vertical-align: top;">' .
-                                               $thumb->toHtml( [ 'desc-link' => true ] ) .
-                                               '</td>' .
-                                               '<td style="vertical-align: top;">' .
-                                               "{$link} {$redirect} {$category} {$section} {$fileMatch}" .
-                                               $extract .
-                                               "<div class='mw-search-result-data'>{$desc} - {$date}</div>" .
-                                               '</td>' .
-                                               '</tr>' .
-                                               '</table>' .
-                                               "</li>\n";
-                               }
-                       }
-               }
-
-               $html = null;
-
-               $score = '';
-               $related = '';
-               if ( Hooks::run( 'ShowSearchHit', [
-                       $this, $result, $terms,
-                       &$link, &$redirect, &$section, &$extract,
-                       &$score, &$size, &$date, &$related,
-                       &$html
-               ] ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>" .
-                               "{$link} {$redirect} {$category} {$section} {$fileMatch}</div> {$extract}\n" .
-                               "<div class='mw-search-result-data'>{$size} - {$date}</div>" .
-                               "</li>\n";
-               }
-
-               return $html;
-       }
-
-       /**
-        * Extract custom captions from search-interwiki-custom message
-        */
-       protected function getCustomCaptions() {
-               if ( is_null( $this->customCaptions ) ) {
-                       $this->customCaptions = [];
-                       // format per line <iwprefix>:<caption>
-                       $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
-                       foreach ( $customLines as $line ) {
-                               $parts = explode( ":", $line, 2 );
-                               if ( count( $parts ) == 2 ) { // validate line
-                                       $this->customCaptions[$parts[0]] = $parts[1];
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Show results from other wikis
-        *
-        * @param SearchResultSet|array $matches
-        * @param string $query
-        *
-        * @return string
-        */
-       protected function showInterwiki( $matches, $query ) {
-               global $wgContLang;
-
-               $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
-                       $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
-               $out .= "<ul class='mw-search-iwresults'>\n";
-
-               // work out custom project captions
-               $this->getCustomCaptions();
-
-               if ( !is_array( $matches ) ) {
-                       $matches = [ $matches ];
-               }
-
-               foreach ( $matches as $set ) {
-                       $prev = null;
-                       $result = $set->next();
-                       while ( $result ) {
-                               $out .= $this->showInterwikiHit( $result, $prev, $query );
-                               $prev = $result->getInterwikiPrefix();
-                               $result = $set->next();
-                       }
-               }
-
-               // @todo Should support paging in a non-confusing way (not sure how though, maybe via ajax)..
-               $out .= "</ul></div>\n";
-
-               // convert the whole thing to desired language variant
-               $out = $wgContLang->convert( $out );
-
-               return $out;
-       }
-
-       /**
-        * Show single interwiki link
-        *
-        * @param SearchResult $result
-        * @param string $lastInterwiki
-        * @param string $query
-        *
-        * @return string
-        */
-       protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
-               if ( $result->isBrokenTitle() ) {
-                       return '';
-               }
-
-               $title = $result->getTitle();
-
-               $titleSnippet = $result->getTitleSnippet();
-
-               if ( $titleSnippet == '' ) {
-                       $titleSnippet = null;
-               }
-
-               $link = Linker::linkKnown(
-                       $title,
-                       $titleSnippet
-               );
-
-               // format redirect if any
-               $redirectTitle = $result->getRedirectTitle();
-               $redirectText = $result->getRedirectSnippet();
-               $redirect = '';
-               if ( !is_null( $redirectTitle ) ) {
-                       if ( $redirectText == '' ) {
-                               $redirectText = null;
-                       }
-
-                       $redirect = "<span class='searchalttitle'>" .
-                               $this->msg( 'search-redirect' )->rawParams(
-                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
-                               "</span>";
-               }
-
-               $out = "";
-               // display project name
-               if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) {
-                       if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) {
-                               // captions from 'search-interwiki-custom'
-                               $caption = $this->customCaptions[$title->getInterwiki()];
-                       } else {
-                               // default is to show the hostname of the other wiki which might suck
-                               // if there are many wikis on one hostname
-                               $parsed = wfParseUrl( $title->getFullURL() );
-                               $caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text();
-                       }
-                       // "more results" link (special page stuff could be localized, but we might not know target lang)
-                       $searchTitle = Title::newFromText( $title->getInterwiki() . ":Special:Search" );
-                       $searchLink = Linker::linkKnown(
-                               $searchTitle,
-                               $this->msg( 'search-interwiki-more' )->text(),
-                               [],
-                               [
-                                       'search' => $query,
-                                       'fulltext' => 'Search'
-                               ]
-                       );
-                       $out .= "</ul><div class='mw-search-interwiki-project'><span class='mw-search-interwiki-more'>
-                               {$searchLink}</span>{$caption}</div>\n<ul>";
-               }
-
-               $out .= "<li>{$link} {$redirect}</li>\n";
-
-               return $out;
-       }
-
-       /**
-        * Generates the power search box at [[Special:Search]]
-        *
-        * @param string $term Search term
-        * @param array $opts
-        * @return string HTML form
-        */
-       protected function powerSearchBox( $term, $opts ) {
-               global $wgContLang;
-
-               // Groups namespaces into rows according to subject
-               $rows = [];
-               foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
-                       $subject = MWNamespace::getSubject( $namespace );
-                       if ( !array_key_exists( $subject, $rows ) ) {
-                               $rows[$subject] = "";
-                       }
-
-                       $name = $wgContLang->getConverter()->convertNamespace( $namespace );
-                       if ( $name == '' ) {
-                               $name = $this->msg( 'blanknamespace' )->text();
-                       }
-
-                       $rows[$subject] .=
-                               Xml::openElement( 'td' ) .
-                               Xml::checkLabel(
-                                       $name,
-                                       "ns{$namespace}",
-                                       "mw-search-ns{$namespace}",
-                                       in_array( $namespace, $this->namespaces )
-                               ) .
-                               Xml::closeElement( 'td' );
-               }
-
-               $rows = array_values( $rows );
-               $numRows = count( $rows );
-
-               // Lays out namespaces in multiple floating two-column tables so they'll
-               // be arranged nicely while still accommodating different screen widths
-               $namespaceTables = '';
-               for ( $i = 0; $i < $numRows; $i += 4 ) {
-                       $namespaceTables .= Xml::openElement( 'table' );
-
-                       for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
-                               $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
-                       }
-
-                       $namespaceTables .= Xml::closeElement( 'table' );
-               }
-
-               $showSections = [ 'namespaceTables' => $namespaceTables ];
-
-               Hooks::run( 'SpecialSearchPowerBox', [ &$showSections, $term, $opts ] );
-
-               $hidden = '';
-               foreach ( $opts as $key => $value ) {
-                       $hidden .= Html::hidden( $key, $value );
-               }
-
-               # Stuff to feed saveNamespaces()
-               $remember = '';
-               $user = $this->getUser();
-               if ( $user->isLoggedIn() ) {
-                       $remember .= Xml::checkLabel(
-                               $this->msg( 'powersearch-remember' )->text(),
-                               'nsRemember',
-                               'mw-search-powersearch-remember',
-                               false,
-                               // The token goes here rather than in a hidden field so it
-                               // is only sent when necessary (not every form submission).
-                               [ 'value' => $user->getEditToken(
-                                       'searchnamespace',
-                                       $this->getRequest()
-                               ) ]
-                       );
-               }
-
-               // Return final output
-               return Xml::openElement( 'fieldset', [ 'id' => 'mw-searchoptions' ] ) .
-                       Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
-                       Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
-                       Xml::element( 'div', [ 'id' => 'mw-search-togglebox' ], '', false ) .
-                       Xml::element( 'div', [ 'class' => 'divider' ], '', false ) .
-                       implode( Xml::element( 'div', [ 'class' => 'divider' ], '', false ), $showSections ) .
-                       $hidden .
-                       Xml::element( 'div', [ 'class' => 'divider' ], '', false ) .
-                       $remember .
-                       Xml::closeElement( 'fieldset' );
-       }
-
        /**
         * @return array
         */
@@ -1166,169 +636,6 @@ class SpecialSearch extends SpecialPage {
                return $profiles;
        }
 
-       /**
-        * @param string $term
-        * @return string
-        */
-       protected function searchProfileTabs( $term ) {
-               $out = Html::element( 'div', [ 'class' => 'mw-search-visualclear' ] ) .
-                       Xml::openElement( 'div', [ 'class' => 'mw-search-profile-tabs' ] );
-
-               $bareterm = $term;
-               if ( $this->startsWithImage( $term ) ) {
-                       // Deletes prefixes
-                       $bareterm = substr( $term, strpos( $term, ':' ) + 1 );
-               }
-
-               $profiles = $this->getSearchProfiles();
-               $lang = $this->getLanguage();
-
-               // Outputs XML for Search Types
-               $out .= Xml::openElement( 'div', [ 'class' => 'search-types' ] );
-               $out .= Xml::openElement( 'ul' );
-               foreach ( $profiles as $id => $profile ) {
-                       if ( !isset( $profile['parameters'] ) ) {
-                               $profile['parameters'] = [];
-                       }
-                       $profile['parameters']['profile'] = $id;
-
-                       $tooltipParam = isset( $profile['namespace-messages'] ) ?
-                               $lang->commaList( $profile['namespace-messages'] ) : null;
-                       $out .= Xml::tags(
-                               'li',
-                               [
-                                       'class' => $this->profile === $id ? 'current' : 'normal'
-                               ],
-                               $this->makeSearchLink(
-                                       $bareterm,
-                                       [],
-                                       $this->msg( $profile['message'] )->text(),
-                                       $this->msg( $profile['tooltip'], $tooltipParam )->text(),
-                                       $profile['parameters']
-                               )
-                       );
-               }
-               $out .= Xml::closeElement( 'ul' );
-               $out .= Xml::closeElement( 'div' );
-               $out .= Xml::element( 'div', [ 'style' => 'clear:both' ], '', false );
-               $out .= Xml::closeElement( 'div' );
-
-               return $out;
-       }
-
-       /**
-        * @param string $term Search term
-        * @return string
-        */
-       protected function searchOptions( $term ) {
-               $out = '';
-               $opts = [];
-               $opts['profile'] = $this->profile;
-
-               if ( $this->isPowerSearch() ) {
-                       $out .= $this->powerSearchBox( $term, $opts );
-               } else {
-                       $form = '';
-                       Hooks::run( 'SpecialSearchProfileForm', [ $this, &$form, $this->profile, $term, $opts ] );
-                       $out .= $form;
-               }
-
-               return $out;
-       }
-
-       /**
-        * @param string $term
-        * @param int $resultsShown
-        * @param int $totalNum
-        * @return string
-        */
-       protected function shortDialog( $term, $resultsShown, $totalNum ) {
-               $searchWidget = new MediaWiki\Widget\SearchInputWidget( [
-                       'id' => 'searchText',
-                       'name' => 'search',
-                       'autofocus' => trim( $term ) === '',
-                       'value' => $term,
-                       'dataLocation' => 'content',
-                       'infusable' => true,
-               ] );
-
-               $layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
-                       'type' => 'submit',
-                       'label' => $this->msg( 'searchbutton' )->text(),
-                       'flags' => [ 'progressive', 'primary' ],
-               ] ), [
-                       'align' => 'top',
-               ] );
-
-               $out =
-                       Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
-                       Html::hidden( 'profile', $this->profile ) .
-                       Html::hidden( 'fulltext', 'Search' ) .
-                       $layout;
-
-               // Results-info
-               if ( $totalNum > 0 && $this->offset < $totalNum ) {
-                       $top = $this->msg( 'search-showingresults' )
-                               ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
-                               ->numParams( $resultsShown )
-                               ->parse();
-                       $out .= Xml::tags( 'div', [ 'class' => 'results-info' ], $top );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Make a search link with some target namespaces
-        *
-        * @param string $term
-        * @param array $namespaces Ignored
-        * @param string $label Link's text
-        * @param string $tooltip Link's tooltip
-        * @param array $params Query string parameters
-        * @return string HTML fragment
-        */
-       protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = [] ) {
-               $opt = $params;
-               foreach ( $namespaces as $n ) {
-                       $opt['ns' . $n] = 1;
-               }
-
-               $stParams = array_merge(
-                       [
-                               'search' => $term,
-                               'fulltext' => $this->msg( 'search' )->text()
-                       ],
-                       $opt
-               );
-
-               return Xml::element(
-                       'a',
-                       [
-                               'href' => $this->getPageTitle()->getLocalURL( $stParams ),
-                               'title' => $tooltip
-                       ],
-                       $label
-               );
-       }
-
-       /**
-        * Check if query starts with image: prefix
-        *
-        * @param string $term The string to check
-        * @return bool
-        */
-       protected function startsWithImage( $term ) {
-               global $wgContLang;
-
-               $parts = explode( ':', $term );
-               if ( count( $parts ) > 1 ) {
-                       return $wgContLang->getNsIndex( $parts[0] ) == NS_FILE;
-               }
-
-               return false;
-       }
-
        /**
         * @since 1.18
         *
index 3342c32..a7a1c58 100644 (file)
@@ -95,8 +95,9 @@ class SpecialStatistics extends SpecialPage {
                        if ( !$msg->isDisabled() ) {
                                $descriptionHtml = $this->msg( 'parentheses' )->rawParams( $msg->parse() )
                                        ->escaped();
-                               $text .= "<br />" . Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
-                                       " $descriptionHtml" );
+                               $text .= "<br />" .
+                                         Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
+                                                                               " $descriptionHtml" );
                        }
                }
 
@@ -119,8 +120,10 @@ class SpecialStatistics extends SpecialPage {
                        Xml::tags( 'th', [ 'colspan' => '2' ], $this->msg( 'statistics-header-pages' )
                                ->parse() ) .
                        Xml::closeElement( 'tr' ) .
-                               $this->formatRow( $linkRenderer->makeKnownLink( $specialAllPagesTitle,
-                                       $this->msg( 'statistics-articles' )->text(), [], [ 'hideredirects' => 1 ] ),
+                               $this->formatRow( $linkRenderer->makeKnownLink(
+                                       $specialAllPagesTitle,
+                                       $this->msg( 'statistics-articles' )->text(),
+                                       [], [ 'hideredirects' => 1 ] ),
                                        $this->getLanguage()->formatNum( $this->good ),
                                        [ 'class' => 'mw-statistics-articles' ],
                                        'statistics-articles-desc' ) .
@@ -152,9 +155,9 @@ class SpecialStatistics extends SpecialPage {
                                [ 'class' => 'mw-statistics-edits' ]
                        ) .
                        $this->formatRow( $this->msg( 'statistics-edits-average' )->parse(),
-                               $this->getLanguage()
-                                       ->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
-                               [ 'class' => 'mw-statistics-edits-average' ]
+                               $this->getLanguage()->formatNum(
+                                       sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 )
+                               ), [ 'class' => 'mw-statistics-edits-average' ]
                        );
        }
 
@@ -175,7 +178,8 @@ class SpecialStatistics extends SpecialPage {
                                $this->getLanguage()->formatNum( $this->activeUsers ),
                                [ 'class' => 'mw-statistics-users-active' ],
                                'statistics-users-active-desc',
-                               $this->getLanguage()->formatNum( $this->getConfig()->get( 'ActiveUserDays' ) )
+                               $this->getLanguage()->formatNum(
+                                       $this->getConfig()->get( 'ActiveUserDays' ) )
                        );
        }
 
@@ -184,7 +188,8 @@ class SpecialStatistics extends SpecialPage {
                $text = '';
                foreach ( $this->getConfig()->get( 'GroupPermissions' ) as $group => $permissions ) {
                        # Skip generic * and implicit groups
-                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) ) || $group == '*' ) {
+                       if ( in_array( $group, $this->getConfig()->get( 'ImplicitGroups' ) )
+                               || $group == '*' ) {
                                continue;
                        }
                        $groupname = htmlspecialchars( $group );
@@ -196,7 +201,8 @@ class SpecialStatistics extends SpecialPage {
                        }
                        $msg = $this->msg( 'grouppage-' . $groupname )->inContentLanguage();
                        if ( $msg->isBlank() ) {
-                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
+                               $grouppageLocalized = MWNamespace::getCanonicalName( NS_PROJECT ) .
+                                       ':' . $groupname;
                        } else {
                                $grouppageLocalized = $msg->text();
                        }
index ea40cb8..e67356f 100644 (file)
@@ -98,7 +98,7 @@ class SpecialTags extends SpecialPage {
                                ],
                        ];
 
-                       $form = new HTMLForm( $fields, $this->getContext() );
+                       $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                        $form->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $form->setWrapperLegendMsg( 'tags-create-heading' );
                        $form->setHeaderText( $this->msg( 'tags-create-explanation' )->parseAsBlock() );
@@ -312,7 +312,7 @@ class SpecialTags extends SpecialPage {
                                $out->parse( $status->getWikiText() ) .
                                $this->msg( 'tags-create-warnings-below' )->parseAsBlock();
 
-                       $subform = new HTMLForm( $fields, $this->getContext() );
+                       $subform = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                        $subform->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $subform->setWrapperLegendMsg( 'tags-create-heading' );
                        $subform->setHeaderText( $headerText );
@@ -377,7 +377,7 @@ class SpecialTags extends SpecialPage {
                        'required' => true,
                ];
 
-               $form = new HTMLForm( $fields, $this->getContext() );
+               $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
                $form->tagAction = 'delete'; // custom property on HTMLForm object
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
@@ -428,7 +428,7 @@ class SpecialTags extends SpecialPage {
                        'required' => true,
                ];
 
-               $form = new HTMLForm( $fields, $this->getContext() );
+               $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
                $form->tagAction = $actionStr;
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
index 326a1fa..0d42e3f 100644 (file)
@@ -175,7 +175,7 @@ class SpecialUnblock extends SpecialPage {
         * @param array $data
         * @param IContextSource $context
         * @throws ErrorPageError
-        * @return array|bool Array(message key, parameters) on failure, True on success
+        * @return array|bool Array( Array( message key, parameters ) ) on failure, True on success
         */
        public static function processUnblock( array $data, IContextSource $context ) {
                $performer = $context->getUser();
@@ -209,11 +209,18 @@ class SpecialUnblock extends SpecialPage {
                        return [ 'unblock-hideuser' ];
                }
 
+               $reason = [ 'hookaborted' ];
+               if ( !Hooks::run( 'UnblockUser', [ &$block, &$performer, &$reason ] ) ) {
+                       return $reason;
+               }
+
                # Delete block
                if ( !$block->delete() ) {
-                       return [ 'ipb_cant_unblock', htmlspecialchars( $block->getTarget() ) ];
+                       return [ [ 'ipb_cant_unblock', htmlspecialchars( $block->getTarget() ) ] ];
                }
 
+               Hooks::run( 'UnblockUserComplete', [ $block, $performer ] );
+
                # Unset _deleted fields as needed
                if ( $block->mHideName ) {
                        # Something is deeply FUBAR if this is not a User object, but who knows?
index 1cc40a9..77b6926 100644 (file)
  * @ingroup SpecialPage
  */
 class UncategorizedCategoriesPage extends UncategorizedPagesPage {
+       /**
+        * Holds a list of categories, which shouldn't be listed on this special page,
+        * even if it is uncategorized.
+        * @var array
+        */
+       private $exceptionList = null;
+
        function __construct( $name = 'Uncategorizedcategories' ) {
                parent::__construct( $name );
                $this->requestedNamespace = NS_CATEGORY;
        }
 
+       /**
+        * Returns an array of category titles (usually without the namespace), which
+        * shouldn't be listed on this page, even if they're uncategorized.
+        *
+        * @return array
+        */
+       private function getExceptionList() {
+               if ( $this->exceptionList === null ) {
+                       $exList = $this->msg( 'uncategorized-categories-exceptionlist' )
+                               ->inContentLanguage()->plain();
+                       $proposedTitles = explode( "\n", $exList );
+                       foreach ( $proposedTitles as $count => $titleStr ) {
+                               if ( strpos( $titleStr, '*' ) !== 0 ) {
+                                       continue;
+                               }
+                               $titleStr = preg_replace( "/^\\*\\s*/", '', $titleStr );
+                               $title = Title::newFromText( $titleStr, NS_CATEGORY );
+                               if ( $title && $title->getNamespace() !== NS_CATEGORY ) {
+                                       $title = Title::makeTitleSafe( NS_CATEGORY, $titleStr );
+                               }
+                               if ( $title ) {
+                                       $this->exceptionList[] = $title->getDBKey();
+                               }
+                       }
+               }
+               return $this->exceptionList;
+       }
+
+       public function getQueryInfo() {
+               $dbr = wfGetDB( DB_SLAVE );
+               $query = parent::getQueryInfo();
+               $exceptionList = $this->getExceptionList();
+               if ( $exceptionList ) {
+                       $query['conds'][] = 'page_title not in ( ' . $dbr->makeList( $exceptionList ) . ' )';
+               }
+
+               return $query;
+       }
+
        /**
         * Formats the result
         * @param Skin $skin The current skin
@@ -42,6 +88,6 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
                $text = $title->getText();
 
-               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+               return $this->getLinkRenderer()->makeKnownLink( $title, $text );
        }
 }
index 04f5be4..4c6a593 100644 (file)
@@ -1141,8 +1141,8 @@ class SpecialUndelete extends SpecialPage {
                                'textarea',
                                [
                                        'readonly' => 'readonly',
-                                       'cols' => $user->getIntOption( 'cols' ),
-                                       'rows' => $user->getIntOption( 'rows' )
+                                       'cols' => 80,
+                                       'rows' => 25
                                ],
                                $content->getNativeData() . "\n"
                        );
@@ -1806,11 +1806,9 @@ class SpecialUndelete extends SpecialPage {
                // Show revision undeletion warnings and errors
                $status = $archive->getRevisionStatus();
                if ( $status && !$status->isGood() ) {
-                       $out->addWikiText( '<div class="error">' .
-                               $status->getWikiText(
-                                       'cannotundelete',
-                                       'cannotundelete'
-                               ) . '</div>'
+                       $out->wrapWikiMsg(
+                               "<div class=\"error\" id=\"mw-error-cannotundelete\">\n$1\n</div>",
+                               'cannotundelete'
                        );
                }
 
index 2cc1a7b..9fcbf15 100644 (file)
@@ -50,8 +50,6 @@ class UnusedimagesPage extends ImageQueryPage {
                                'namespace' => NS_FILE,
                                'title' => 'img_name',
                                'value' => 'img_timestamp',
-                               'img_user', 'img_user_text',
-                               'img_description'
                        ],
                        'conds' => [ 'il_to IS NULL' ],
                        'join_conds' => [ 'imagelinks' => [ 'LEFT JOIN', 'il_to = img_name' ] ]
index ae375b2..96878a3 100644 (file)
@@ -116,10 +116,12 @@ class UnwatchedpagesPage extends QueryPage {
 
                $text = $wgContLang->convert( $nt->getPrefixedText() );
 
-               $plink = Linker::linkKnown( $nt, htmlspecialchars( $text ) );
-               $wlink = Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+
+               $plink = $linkRenderer->makeKnownLink( $nt, $text );
+               $wlink = $linkRenderer->makeKnownLink(
                        $nt,
-                       $this->msg( 'watch' )->escaped(),
+                       $this->msg( 'watch' )->text(),
                        [ 'class' => 'mw-watch-link' ],
                        [ 'action' => 'watch' ]
                );
index f7e46cb..c5a1f27 100644 (file)
@@ -209,7 +209,9 @@ class SpecialUpload extends SpecialPage {
                        $this->processUpload();
                } else {
                        # Backwards compatibility hook
-                       if ( !Hooks::run( 'UploadForm:initial', [ &$this ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $upload = $this;
+                       if ( !Hooks::run( 'UploadForm:initial', [ &$upload ] ) ) {
                                wfDebug( "Hook 'UploadForm:initial' broke output of the upload form\n" );
 
                                return;
@@ -483,8 +485,9 @@ class SpecialUpload extends SpecialPage {
 
                        return;
                }
-
-               if ( !Hooks::run( 'UploadForm:BeforeProcessing', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $upload = $this;
+               if ( !Hooks::run( 'UploadForm:BeforeProcessing', [ &$upload ] ) ) {
                        wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
                        // This code path is deprecated. If you want to break upload processing
                        // do so by hooking into the appropriate hooks in UploadBase::verifyUpload
@@ -570,7 +573,9 @@ class SpecialUpload extends SpecialPage {
 
                // Success, redirect to description page
                $this->mUploadSuccessful = true;
-               Hooks::run( 'SpecialUploadComplete', [ &$this ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $upload = $this;
+               Hooks::run( 'SpecialUploadComplete', [ &$upload ] );
                $this->getOutput()->redirect( $this->mLocalFile->getTitle()->getFullURL() );
        }
 
@@ -1085,12 +1090,14 @@ class UploadForm extends HTMLForm {
                                global $wgContLang;
 
                                $mto = $file->transform( [ 'width' => 120 ] );
-                               $this->addHeaderText(
-                                       '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
-                                       Html::element( 'img', [
-                                               'src' => $mto->getUrl(),
-                                               'class' => 'thumbimage',
-                                       ] ) . '</div>', 'description' );
+                               if ( $mto ) {
+                                       $this->addHeaderText(
+                                               '<div class="thumb t' . $wgContLang->alignEnd() . '">' .
+                                               Html::element( 'img', [
+                                                       'src' => $mto->getUrl(),
+                                                       'class' => 'thumbimage',
+                                               ] ) . '</div>', 'description' );
+                               }
                        }
                }
 
@@ -1113,7 +1120,7 @@ class UploadForm extends HTMLForm {
                                        ? 'filereuploadsummary'
                                        : 'fileuploadsummary',
                                'default' => $this->mComment,
-                               'cols' => $this->getUser()->getIntOption( 'cols' ),
+                               'cols' => 80,
                                'rows' => 8,
                        ]
                ];
index 3ba46c1..b1f8a17 100644 (file)
@@ -49,19 +49,25 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * @param User $user
-        * @param bool $checkIfSelf
+        * Check whether the current user (from context) can change the target user's rights.
+        *
+        * @param User $targetUser User whose rights are being changed
+        * @param bool $checkIfSelf If false, assume that the current user can add/remove groups defined
+        *   in $wgGroupsAddToSelf / $wgGroupsRemoveFromSelf, without checking if it's the same as target
+        *   user
         * @return bool
         */
-       public function userCanChangeRights( $user, $checkIfSelf = true ) {
+       public function userCanChangeRights( $targetUser, $checkIfSelf = true ) {
+               $isself = $this->getUser()->equals( $targetUser );
+
                $available = $this->changeableGroups();
-               if ( $user->getId() == 0 ) {
+               if ( $targetUser->getId() == 0 ) {
                        return false;
                }
 
                return !empty( $available['add'] )
                        || !empty( $available['remove'] )
-                       || ( ( $this->isself || !$checkIfSelf ) &&
+                       || ( ( $isself || !$checkIfSelf ) &&
                                ( !empty( $available['add-self'] )
                                        || !empty( $available['remove-self'] ) ) );
        }
@@ -76,6 +82,7 @@ class UserrightsPage extends SpecialPage {
        public function execute( $par ) {
                $user = $this->getUser();
                $request = $this->getRequest();
+               $session = $request->getSession();
                $out = $this->getOutput();
 
                if ( $par !== null ) {
@@ -88,6 +95,10 @@ class UserrightsPage extends SpecialPage {
                        $this->mTarget = trim( $this->mTarget );
                }
 
+               if ( $this->mTarget !== null && User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
+                       $this->isself = true;
+               }
+
                $fetchedStatus = $this->fetchUser( $this->mTarget, true );
                if ( $fetchedStatus->isOK() ) {
                        $this->mFetchedUser = $fetchedStatus->value;
@@ -99,7 +110,13 @@ class UserrightsPage extends SpecialPage {
                }
 
                // show a successbox, if the user rights was saved successfully
-               if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
+               if (
+                       $session->get( 'specialUserrightsSaveSuccess' ) &&
+                       $this->mFetchedUser !== null
+               ) {
+                       // Remove session data for the success message
+                       $session->remove( 'specialUserrightsSaveSuccess' );
+
                        $out->addModules( [ 'mediawiki.special.userrights' ] );
                        $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
                        $out->addHTML(
@@ -167,6 +184,9 @@ class UserrightsPage extends SpecialPage {
                                        $targetUser
                                );
 
+                               // Set session data for the success message
+                               $session->set( 'specialUserrightsSaveSuccess', 1 );
+
                                $out->redirect( $this->getSuccessURL() );
 
                                return;
@@ -180,7 +200,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        function getSuccessURL() {
-               return $this->getPageTitle( $this->mTarget )->getFullURL( [ 'success' => 1 ] );
+               return $this->getPageTitle( $this->mTarget )->getFullURL();
        }
 
        /**
@@ -219,9 +239,10 @@ class UserrightsPage extends SpecialPage {
         * @param array $add Array of groups to add
         * @param array $remove Array of groups to remove
         * @param string $reason Reason for group change
+        * @param array $tags Array of change tags to add to the log entry
         * @return array Tuple of added, then removed groups
         */
-       function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
+       function doSaveUserGroups( $user, $add, $remove, $reason = '', $tags = [] ) {
                // Validate input set...
                $isself = $user->getName() == $this->getUser()->getName();
                $groups = $user->getGroups();
@@ -236,6 +257,8 @@ class UserrightsPage extends SpecialPage {
                        $groups )
                );
 
+               Hooks::run( 'ChangeUserGroups', [ $this->getUser(), $user, &$add, &$remove ] );
+
                $oldGroups = $user->getGroups();
                $newGroups = $oldGroups;
 
@@ -273,7 +296,7 @@ class UserrightsPage extends SpecialPage {
                Hooks::run( 'UserRights', [ &$user, $add, $remove ], '1.26' );
 
                if ( $newGroups != $oldGroups ) {
-                       $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
+                       $this->addLogEntry( $user, $oldGroups, $newGroups, $reason, $tags );
                }
 
                return [ $add, $remove ];
@@ -285,8 +308,9 @@ class UserrightsPage extends SpecialPage {
         * @param array $oldGroups
         * @param array $newGroups
         * @param array $reason
+        * @param array $tags
         */
-       function addLogEntry( $user, $oldGroups, $newGroups, $reason ) {
+       function addLogEntry( $user, $oldGroups, $newGroups, $reason, $tags ) {
                $logEntry = new ManualLogEntry( 'rights', 'rights' );
                $logEntry->setPerformer( $this->getUser() );
                $logEntry->setTarget( $user->getUserPage() );
@@ -296,6 +320,9 @@ class UserrightsPage extends SpecialPage {
                        '5::newgroups' => $newGroups,
                ] );
                $logid = $logEntry->insert();
+               if ( count( $tags ) ) {
+                       $logEntry->setTags( $tags );
+               }
                $logEntry->publish( $logid );
        }
 
@@ -444,29 +471,6 @@ class UserrightsPage extends SpecialPage {
                );
        }
 
-       /**
-        * Go through used and available groups and return the ones that this
-        * form will be able to manipulate based on the current user's system
-        * permissions.
-        *
-        * @param array $groups List of groups the given user is in
-        * @return array Tuple of addable, then removable groups
-        */
-       protected function splitGroups( $groups ) {
-               list( $addable, $removable, $addself, $removeself ) = array_values( $this->changeableGroups() );
-
-               $removable = array_intersect(
-                       array_merge( $this->isself ? $removeself : [], $removable ),
-                       $groups
-               ); // Can't remove groups the user doesn't have
-               $addable = array_diff(
-                       array_merge( $this->isself ? $addself : [], $addable ),
-                       $groups
-               ); // Can't add groups the user does have
-
-               return [ $addable, $removable ];
-       }
-
        /**
         * Show the form to edit group memberships.
         *
@@ -781,4 +785,3 @@ class UserrightsPage extends SpecialPage {
                return 'users';
        }
 }
-
index 272f074..708eced 100644 (file)
@@ -78,9 +78,16 @@ class SpecialVersion extends SpecialPage {
                // Now figure out what to do
                switch ( strtolower( $parts[0] ) ) {
                        case 'credits':
+                               $out->addModuleStyles( 'mediawiki.special.version' );
+
                                $wikiText = '{{int:version-credits-not-found}}';
                                if ( $extName === 'MediaWiki' ) {
                                        $wikiText = file_get_contents( $IP . '/CREDITS' );
+                                       // Put the contributor list into columns
+                                       $wikiText = str_replace(
+                                               [ '<!-- BEGIN CONTRIBUTOR LIST -->', '<!-- END CONTRIBUTOR LIST -->' ],
+                                               [ '<div class="mw-version-credits">', '</div>' ],
+                                               $wikiText );
                                } elseif ( ( $extNode !== null ) && isset( $extNode['path'] ) ) {
                                        $file = $this->getExtAuthorsFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
index 4824961..85ac2de 100644 (file)
@@ -52,6 +52,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $this->addHelpLink( 'Help:Watching pages' );
                $output->addModules( [
                        'mediawiki.special.changeslist.visitedstatus',
+                       'mediawiki.special.watchlist',
                ] );
 
                $mode = SpecialEditWatchlist::getMode( $request, $subpage );
@@ -130,7 +131,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        /**
-        * Get custom show/hide filters
+        * Get all custom filters
         *
         * @return array Map of filter URL param names to properties (msg/default)
         */
@@ -421,12 +422,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $user = $this->getUser();
                $out = $this->getOutput();
 
-               // if the user wishes, that the watchlist is reloaded, whenever a filter changes,
-               // add the module for that
-               if ( $user->getBoolOption( 'watchlistreloadautomatically' ) ) {
-                       $out->addModules( [ 'mediawiki.special.watchlist' ] );
-               }
-
                $out->addSubtitle(
                        $this->msg( 'watchlistfor2', $user->getName() )
                                ->rawParams( SpecialEditWatchlist::buildTools(
@@ -465,9 +460,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $filters['hidecategorization'] = 'wlshowhidecategorization';
                }
 
-               foreach ( $this->getCustomFilters() as $key => $params ) {
+               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
+
                // Disable some if needed
                if ( !$user->useRCPatrol() ) {
                        unset( $filters['hidepatrolled'] );
@@ -608,7 +604,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $form .= Xml::openElement( 'form', [ 'method' => 'post',
                                'action' => $this->getPageTitle()->getLocalURL(),
                                'id' => 'mw-watchlist-resetbutton' ] ) . "\n" .
-                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), [ 'name' => 'dummy' ] ) . "\n" .
+                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(),
+                               [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" .
                        Html::hidden( 'reset', 'all' ) . "\n";
                        foreach ( $nondefaults as $key => $value ) {
                                $form .= Html::hidden( $key, $value ) . "\n";
index 1ead290..439b6ab 100644 (file)
@@ -327,7 +327,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $query = [];
                }
 
-               $link = Linker::linkKnown(
+               $link = $this->getLinkRenderer()->makeKnownLink(
                        $nt,
                        null,
                        $row->page_is_redirect ? [ 'class' => 'mw-redirect' ] : [],
@@ -376,9 +376,15 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $title = $this->getPageTitle();
                }
 
+               $linkRenderer = $this->getLinkRenderer();
+
+               if ( $text !== null ) {
+                       $text = new HtmlArmor( $text );
+               }
+
                // always show a "<- Links" link
                $links = [
-                       'links' => Linker::linkKnown(
+                       'links' => $linkRenderer->makeKnownLink(
                                $title,
                                $text,
                                [],
@@ -393,7 +399,11 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $target )->supportsDirectEditing()
                ) {
-                       $links['edit'] = Linker::linkKnown(
+                       if ( $editText !== null ) {
+                               $editText = new HtmlArmor( $editText );
+                       }
+
+                       $links['edit'] = $linkRenderer->makeKnownLink(
                                $target,
                                $editText,
                                [],
@@ -406,7 +416,11 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
        }
 
        function makeSelfLink( $text, $query ) {
-               return Linker::linkKnown(
+               if ( $text !== null ) {
+                       $text = new HtmlArmor( $text );
+               }
+
+               return $this->getLinkRenderer()->makeKnownLink(
                        $this->selfTitle,
                        $text,
                        [],
index 5609310..efc51ef 100644 (file)
@@ -25,6 +25,8 @@
  *
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class AllMessagesTablePager extends TablePager {
 
        protected $filter, $prefix, $langcode, $displayPrefix;
@@ -297,6 +299,7 @@ class AllMessagesTablePager extends TablePager {
        }
 
        function formatValue( $field, $value ) {
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                switch ( $field ) {
                        case 'am_title' :
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
@@ -313,25 +316,19 @@ class AllMessagesTablePager extends TablePager {
                                );
 
                                if ( $this->mCurrentRow->am_customised ) {
-                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
+                                       $title = $linkRenderer->makeKnownLink( $title, $this->getLanguage()->lcfirst( $value ) );
                                } else {
-                                       $title = Linker::link(
+                                       $title = $linkRenderer->makeBrokenLink(
                                                $title,
-                                               $this->getLanguage()->lcfirst( $value ),
-                                               [],
-                                               [],
-                                               [ 'broken' ]
+                                               $this->getLanguage()->lcfirst( $value )
                                        );
                                }
                                if ( $this->mCurrentRow->am_talk_exists ) {
-                                       $talk = Linker::linkKnown( $talk, $this->talk );
+                                       $talk = $linkRenderer->makeKnownLink( $talk, $this->talk );
                                } else {
-                                       $talk = Linker::link(
+                                       $talk = $linkRenderer->makeBrokenLink(
                                                $talk,
-                                               $this->talk,
-                                               [],
-                                               [],
-                                               [ 'broken' ]
+                                               $this->talk
                                        );
                                }
 
index d822976..a4124db 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class BlockListPager extends TablePager {
 
        protected $conds;
@@ -72,7 +74,7 @@ class BlockListPager extends TablePager {
                        ];
 
                        foreach ( $keys as $key ) {
-                               $msg[$key] = $this->msg( $key )->escaped();
+                               $msg[$key] = $this->msg( $key )->text();
                        }
                }
 
@@ -83,6 +85,8 @@ class BlockListPager extends TablePager {
 
                $formatted = '';
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                switch ( $name ) {
                        case 'ipb_timestamp':
                                $formatted = htmlspecialchars( $language->userTimeAndDate( $value, $this->getUser() ) );
@@ -117,18 +121,18 @@ class BlockListPager extends TablePager {
                                ) );
                                if ( $this->getUser()->isAllowed( 'block' ) ) {
                                        if ( $row->ipb_auto ) {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Unblock' ),
                                                        $msg['unblocklink'],
                                                        [],
                                                        [ 'wpTarget' => "#{$row->ipb_id}" ]
                                                );
                                        } else {
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ),
                                                        $msg['unblocklink']
                                                );
-                                               $links[] = Linker::linkKnown(
+                                               $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Block', $row->ipb_address ),
                                                        $msg['change-blocklink']
                                                );
@@ -174,21 +178,21 @@ class BlockListPager extends TablePager {
                        case 'ipb_params':
                                $properties = [];
                                if ( $row->ipb_anon_only ) {
-                                       $properties[] = $msg['anononlyblock'];
+                                       $properties[] = htmlspecialchars( $msg['anononlyblock'] );
                                }
                                if ( $row->ipb_create_account ) {
-                                       $properties[] = $msg['createaccountblock'];
+                                       $properties[] = htmlspecialchars( $msg['createaccountblock'] );
                                }
                                if ( $row->ipb_user && !$row->ipb_enable_autoblock ) {
-                                       $properties[] = $msg['noautoblockblock'];
+                                       $properties[] = htmlspecialchars( $msg['noautoblockblock'] );
                                }
 
                                if ( $row->ipb_block_email ) {
-                                       $properties[] = $msg['emailblock'];
+                                       $properties[] = htmlspecialchars( $msg['emailblock'] );
                                }
 
                                if ( !$row->ipb_allow_usertalk ) {
-                                       $properties[] = $msg['blocklist-nousertalk'];
+                                       $properties[] = htmlspecialchars( $msg['blocklist-nousertalk'] );
                                }
 
                                $formatted = $language->commaList( $properties );
index 345577d..7db90c1 100644 (file)
@@ -92,21 +92,24 @@ class CategoryPager extends AlphabeticPager {
        }
 
        public function getStartForm( $from ) {
-               return Xml::tags(
-                       'form',
-                       [ 'method' => 'get', 'action' => wfScript() ],
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::fieldset(
-                               $this->msg( 'categories' )->text(),
-                               Xml::inputLabel(
-                                       $this->msg( 'categoriesfrom' )->text(),
-                                       'from', 'from', 20, $from, [ 'class' => 'mw-ui-input-inline' ] ) .
-                               ' ' .
-                               Html::submitButton(
-                                       $this->msg( 'categories-submit' )->text(),
-                                       [], [ 'mw-ui-progressive' ]
-                               )
-                       )
-               );
+               $formDescriptor = [
+                       'from' => [
+                               'type' => 'title',
+                               'namespace' => NS_CATEGORY,
+                               'relative' => true,
+                               'label-message' => 'categoriesfrom',
+                               'name' => 'from',
+                               'id' => 'from',
+                               'size' => 20,
+                               'default' => $from,
+                       ],
+               ];
+
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+                       ->setSubmitTextMsg( 'categories-submit' )
+                       ->setWrapperLegendMsg( 'categories' )
+                       ->setMethod( 'get' );
+               return $htmlForm->prepareForm()->getHTML( false );
        }
+
 }
index a145e45..39c55c8 100644 (file)
@@ -23,6 +23,8 @@
  * Pager for Special:Contributions
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class ContribsPager extends ReverseChronologicalPager {
 
        public $mDefaultDirection = IndexPager::DIR_DESCENDING;
@@ -347,6 +349,8 @@ class ContribsPager extends ReverseChronologicalPager {
                $ret = '';
                $classes = [];
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                /*
                 * There may be more than just revision rows. To make sure that we'll only be processing
                 * revisions here, let's _try_ to build a revision out of our row (without displaying
@@ -367,9 +371,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $classes = [];
 
                        $page = Title::newFromRow( $row );
-                       $link = Linker::link(
+                       $link = $linkRenderer->makeLink(
                                $page,
-                               htmlspecialchars( $page->getPrefixedText() ),
+                               $page->getPrefixedText(),
                                [ 'class' => 'mw-contributions-title' ],
                                $page->isRedirect() ? [ 'redirect' => 'no' ] : []
                        );
@@ -389,9 +393,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        }
                        # Is there a visible previous revision?
                        if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
-                               $difftext = Linker::linkKnown(
+                               $difftext = $linkRenderer->makeKnownLink(
                                        $page,
-                                       $this->messages['diff'],
+                                       new HtmlArmor( $this->messages['diff'] ),
                                        [],
                                        [
                                                'diff' => 'prev',
@@ -401,9 +405,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        } else {
                                $difftext = $this->messages['diff'];
                        }
-                       $histlink = Linker::linkKnown(
+                       $histlink = $linkRenderer->makeKnownLink(
                                $page,
-                               $this->messages['hist'],
+                               new HtmlArmor( $this->messages['hist'] ),
                                [],
                                [ 'action' => 'history' ]
                        );
@@ -434,9 +438,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true );
                        $date = $lang->userTimeAndDate( $row->rev_timestamp, $user );
                        if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                               $d = Linker::linkKnown(
+                               $d = $linkRenderer->makeKnownLink(
                                        $page,
-                                       htmlspecialchars( $date ),
+                                       $date,
                                        [ 'class' => 'mw-changeslist-date' ],
                                        [ 'oldid' => intval( $row->rev_id ) ]
                                );
index 1acbba1..9ffcce9 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class DeletedContribsPager extends IndexPager {
 
        public $mDefaultDirection = IndexPager::DIR_DESCENDING;
@@ -39,7 +41,7 @@ class DeletedContribsPager extends IndexPager {
                parent::__construct( $context );
                $msgs = [ 'deletionlog', 'undeleteviewlink', 'diff' ];
                foreach ( $msgs as $msg ) {
-                       $this->messages[$msg] = $this->msg( $msg )->escaped();
+                       $this->messages[$msg] = $this->msg( $msg )->text();
                }
                $this->target = $target;
                $this->namespace = $namespace;
@@ -240,6 +242,8 @@ class DeletedContribsPager extends IndexPager {
        function formatRevisionRow( $row ) {
                $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                $rev = new Revision( [
                        'title' => $page,
                        'id' => $row->ar_rev_id,
@@ -254,7 +258,7 @@ class DeletedContribsPager extends IndexPager {
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
                $logs = SpecialPage::getTitleFor( 'Log' );
-               $dellog = Linker::linkKnown(
+               $dellog = $linkRenderer->makeKnownLink(
                        $logs,
                        $this->messages['deletionlog'],
                        [],
@@ -264,7 +268,7 @@ class DeletedContribsPager extends IndexPager {
                        ]
                );
 
-               $reviewlink = Linker::linkKnown(
+               $reviewlink = $linkRenderer->makeKnownLink(
                        SpecialPage::getTitleFor( 'Undelete', $page->getPrefixedDBkey() ),
                        $this->messages['undeleteviewlink']
                );
@@ -272,7 +276,7 @@ class DeletedContribsPager extends IndexPager {
                $user = $this->getUser();
 
                if ( $user->isAllowed( 'deletedtext' ) ) {
-                       $last = Linker::linkKnown(
+                       $last = $linkRenderer->makeKnownLink(
                                $undelete,
                                $this->messages['diff'],
                                [],
@@ -283,17 +287,16 @@ class DeletedContribsPager extends IndexPager {
                                ]
                        );
                } else {
-                       $last = $this->messages['diff'];
+                       $last = htmlspecialchars( $this->messages['diff'] );
                }
 
                $comment = Linker::revComment( $rev );
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
-               $date = htmlspecialchars( $date );
 
                if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $link = $date; // unusable link
+                       $link = htmlspecialchars( $date ); // unusable link
                } else {
-                       $link = Linker::linkKnown(
+                       $link = $linkRenderer->makeKnownLink(
                                $undelete,
                                $date,
                                [ 'class' => 'mw-changeslist-date' ],
@@ -308,7 +311,7 @@ class DeletedContribsPager extends IndexPager {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
-               $pagelink = Linker::link(
+               $pagelink = $linkRenderer->makeLink(
                        $page,
                        null,
                        [ 'class' => 'mw-changeslist-title' ]
index 7fc4a95..59dea02 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\MediaWikiServices;
+
 class ImageListPager extends TablePager {
 
        protected $mFieldNames = null;
@@ -422,6 +424,7 @@ class ImageListPager extends TablePager {
         * @throws MWException
         */
        function formatValue( $field, $value ) {
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                switch ( $field ) {
                        case 'thumb':
                                $opt = [ 'time' => wfTimestamp( TS_MW, $this->mCurrentRow->img_timestamp ) ];
@@ -449,9 +452,9 @@ class ImageListPager extends TablePager {
                                // Weird files can maybe exist? Bug 22227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
                                if ( $filePage ) {
-                                       $link = Linker::linkKnown(
+                                       $link = $linkRenderer->makeKnownLink(
                                                $filePage,
-                                               htmlspecialchars( $filePage->getText() )
+                                               $filePage->getText()
                                        );
                                        $download = Xml::element( 'a',
                                                [ 'href' => wfLocalFile( $filePage )->getUrl() ],
@@ -462,9 +465,9 @@ class ImageListPager extends TablePager {
                                        // Add delete links if allowed
                                        // From https://github.com/Wikia/app/pull/3859
                                        if ( $filePage->userCan( 'delete', $this->getUser() ) ) {
-                                               $deleteMsg = $this->msg( 'listfiles-delete' )->escaped();
+                                               $deleteMsg = $this->msg( 'listfiles-delete' )->text();
 
-                                               $delete = Linker::linkKnown(
+                                               $delete = $linkRenderer->makeKnownLink(
                                                        $filePage, $deleteMsg, [], [ 'action' => 'delete' ]
                                                );
                                                $delete = $this->msg( 'parentheses' )->rawParams( $delete )->escaped();
@@ -479,9 +482,9 @@ class ImageListPager extends TablePager {
                        case 'img_user_text':
                                if ( $this->mCurrentRow->img_user ) {
                                        $name = User::whoIs( $this->mCurrentRow->img_user );
-                                       $link = Linker::link(
+                                       $link = $linkRenderer->makeLink(
                                                Title::makeTitle( NS_USER, $name ),
-                                               htmlspecialchars( $name )
+                                               $name
                                        );
                                } else {
                                        $link = htmlspecialchars( $value );
index 56229b3..bbf97e1 100644 (file)
@@ -54,15 +54,17 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                $batch = new LinkBatch();
                # Give some pointers to make (last) links
                $this->mForm->prevId = [];
+               $rev_id = null;
                foreach ( $this->mResult as $row ) {
                        $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
                        $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
 
-                       $rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id;
-                       if ( $rev_id > $row->rev_id ) {
-                               $this->mForm->prevId[$rev_id] = $row->rev_id;
-                       } elseif ( $rev_id < $row->rev_id ) {
-                               $this->mForm->prevId[$row->rev_id] = $rev_id;
+                       if ( isset( $rev_id ) ) {
+                               if ( $rev_id > $row->rev_id ) {
+                                       $this->mForm->prevId[$rev_id] = $row->rev_id;
+                               } elseif ( $rev_id < $row->rev_id ) {
+                                       $this->mForm->prevId[$row->rev_id] = $rev_id;
+                               }
                        }
 
                        $rev_id = $row->rev_id;
index 9f6c58c..e22b939 100644 (file)
@@ -27,7 +27,7 @@ use MediaWiki\MediaWikiServices;
 class NewFilesPager extends ReverseChronologicalPager {
 
        /**
-        * @var ImageGallery
+        * @var ImageGalleryBase
         */
        protected $gallery;
 
index 1346e1c..8da1553 100644 (file)
@@ -75,7 +75,7 @@ class BalanceSets {
                self::HTML_NAMESPACE => [
                        'html' => true, 'head' => true, 'body' => true, 'frameset' => true,
                        'frame' => true,
-                       'plaintext' => true, 'isindex' => true,
+                       'plaintext' => true,
                        'xmp' => true, 'iframe' => true, 'noembed' => true,
                        'noscript' => true, 'script' => true,
                        'title' => true
@@ -119,9 +119,9 @@ class BalanceSets {
                        'h2' => true, 'h3' => true, 'h4' => true, 'h5' => true,
                        'h6' => true, 'head' => true, 'header' => true, 'hgroup' => true,
                        'hr' => true, 'html' => true, 'iframe' => true, 'img' => true,
-                       'input' => true, 'isindex' => true, 'li' => true, 'link' => true,
+                       'input' => true, 'li' => true, 'link' => true,
                        'listing' => true, 'main' => true, 'marquee' => true,
-                       'menu' => true, 'menuitem' => true, 'meta' => true, 'nav' => true,
+                       'menu' => true, 'meta' => true, 'nav' => true,
                        'noembed' => true, 'noframes' => true, 'noscript' => true,
                        'object' => true, 'ol' => true, 'p' => true, 'param' => true,
                        'plaintext' => true, 'pre' => true, 'script' => true,
@@ -156,7 +156,8 @@ class BalanceSets {
 
        public static $impliedEndTagsSet = [
                self::HTML_NAMESPACE => [
-                       'dd' => true, 'dt' => true, 'li' => true, 'optgroup' => true,
+                       'dd' => true, 'dt' => true, 'li' => true,
+                       'menuitem' => true, 'optgroup' => true,
                        'option' => true, 'p' => true, 'rb' => true, 'rp' => true,
                        'rt' => true, 'rtc' => true
                ]
@@ -498,6 +499,16 @@ class BalanceElement {
                                        $this->attribs = [ 'class' => "mw-empty-elt" ];
                                }
                                $blank = false;
+                       } elseif (
+                               $this->isA( BalanceSets::$extraLinefeedSet ) &&
+                               count( $this->children ) > 0 &&
+                               substr( $this->children[0], 0, 1 ) == "\n"
+                       ) {
+                               // Double the linefeed after pre/listing/textarea
+                               // according to the (old) HTML5 fragment serialization
+                               // algorithm (see https://github.com/whatwg/html/issues/944)
+                               // to ensure this will round-trip.
+                               array_unshift( $this->children, "\n" );
                        }
                        $flat = $blank ? '' : "{$this}";
                } else {
@@ -529,15 +540,6 @@ class BalanceElement {
                                $out .= "{$elt}";
                        }
                        $out .= "</{$this->localName}>";
-                       if (
-                               $this->isA( BalanceSets::$extraLinefeedSet ) &&
-                               $out[$len] === "\n"
-                       ) {
-                               // Double the linefeed after pre/listing/textarea
-                               // according to the HTML5 fragment serialization algorithm.
-                               $out = substr( $out, 0, $len + 1 ) .
-                                       substr( $out, $len );
-                       }
                } else {
                        $out = "<{$this->localName}{$encAttribs} />";
                        Assert::invariant(
@@ -1410,6 +1412,7 @@ class BalanceActiveFormattingElements {
        private $noahTableStack = [ [] ];
 
        public function __destruct() {
+               $next = null;
                for ( $node = $this->head; $node; $node = $next ) {
                        $next = $node->nextAFE;
                        $node->prevAFE = $node->nextAFE = $node->nextNoah = null;
@@ -1769,7 +1772,7 @@ class BalanceActiveFormattingElements {
  *   and escaped.
  * - All null characters are assumed to have been removed.
  * - The following elements are disallowed: <html>, <head>, <body>, <frameset>,
- *   <frame>, <plaintext>, <isindex>, <xmp>, <iframe>,
+ *   <frame>, <plaintext>, <xmp>, <iframe>,
  *   <noembed>, <noscript>, <script>, <title>.  As a result,
  *   further simplifications can be made:
  *   - `frameset-ok` is not tracked.
@@ -1864,7 +1867,9 @@ class Balancer {
         *         provide historical compatibility with the old "tidy"
         *         program: <p>-wrapping is done to the children of
         *         <body> and <blockquote> elements, and empty elements
-        *         are removed.
+        *         are removed.  The <pre>/<listing>/<textarea> serialization
+        *         is also tweaked to allow lossless round trips.
+        *         (See: https://github.com/whatwg/html/issues/944)
         *     'allowComments': boolean, defaults to true.
         *         When true, allows HTML comments in the input.
         *         The Sanitizer generally strips all comments, so if you
@@ -1996,6 +2001,7 @@ class Balancer {
                // Some hoops we have to jump through
                $adjusted = $this->stack->adjustedCurrentNode( $this->fragmentContext );
 
+               // The spec calls this the "tree construction dispatcher".
                $isForeign = true;
                if (
                        $this->stack->length() === 0 ||
@@ -2036,6 +2042,9 @@ class Balancer {
                if ( $token === 'text' ) {
                        $this->stack->insertText( $value );
                        return true;
+               } elseif ( $token === 'comment' ) {
+                       $this->stack->insertComment( $value );
+                       return true;
                } elseif ( $token === 'tag' ) {
                        switch ( $value ) {
                        case 'font':
@@ -2467,7 +2476,6 @@ class Balancer {
                        case 'header':
                        case 'hgroup':
                        case 'main':
-                       case 'menu':
                        case 'nav':
                        case 'ol':
                        case 'p':
@@ -2480,6 +2488,16 @@ class Balancer {
                                $this->stack->insertHTMLElement( $value, $attribs );
                                return true;
 
+                       case 'menu':
+                               if ( $this->stack->inButtonScope( "p" ) ) {
+                                       $this->inBodyMode( 'endtag', 'p' );
+                               }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
                        case 'h1':
                        case 'h2':
                        case 'h3':
@@ -2655,7 +2673,6 @@ class Balancer {
                                // (hence we don't need to examine the tag's "type" attribute)
                                return true;
 
-                       case 'menuitem':
                        case 'param':
                        case 'source':
                        case 'track':
@@ -2667,6 +2684,9 @@ class Balancer {
                                if ( $this->stack->inButtonScope( 'p' ) ) {
                                        $this->inBodyMode( 'endtag', 'p' );
                                }
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
                                $this->stack->insertHTMLElement( $value, $attribs );
                                $this->stack->pop();
                                return true;
@@ -2675,8 +2695,6 @@ class Balancer {
                                // warts!
                                return $this->inBodyMode( $token, 'img', $attribs, $selfClose );
 
-                       // OMITTED: <isindex>
-
                        case 'textarea':
                                $this->stack->insertHTMLElement( $value, $attribs );
                                $this->ignoreLinefeed = true;
@@ -2714,6 +2732,14 @@ class Balancer {
                                $this->stack->insertHTMLElement( $value, $attribs );
                                return true;
 
+                       case 'menuitem':
+                               if ( $this->stack->currentNode->isHtmlNamed( 'menuitem' ) ) {
+                                       $this->stack->pop();
+                               }
+                               $this->afe->reconstruct( $this->stack );
+                               $this->stack->insertHTMLElement( $value, $attribs );
+                               return true;
+
                        case 'rb':
                        case 'rtc':
                                if ( $this->stack->inScope( 'ruby' ) ) {
index 56d5ce7..9f6feb8 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 namespace MediaWiki\Tidy;
 
-use ReplacementArray;
 use ParserOutput;
 use Parser;
 
@@ -20,33 +19,32 @@ use Parser;
 class RaggettWrapper {
 
        /**
-        * @var ReplacementArray
+        * @var array
         */
        protected $mTokens;
 
+       /**
+        * @var int
+        */
        protected $mMarkerIndex;
 
-       public function __construct() {
-               $this->mTokens = null;
-       }
-
        /**
         * @param string $text
         * @return string
         */
        public function getWrapped( $text ) {
-               $this->mTokens = new ReplacementArray;
+               $this->mTokens = [];
                $this->mMarkerIndex = 0;
 
                // Replace <mw:editsection> elements with placeholders
                $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                       [ &$this, 'replaceCallback' ], $text );
+                       [ $this, 'replaceCallback' ], $text );
                // ...and <mw:toc> markers
                $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
-                       [ &$this, 'replaceCallback' ], $wrappedtext );
+                       [ $this, 'replaceCallback' ], $wrappedtext );
                // ... and <math> tags
                $wrappedtext = preg_replace_callback( '/\<math(.*?)\<\\/math\>/s',
-                       [ &$this, 'replaceCallback' ], $wrappedtext );
+                       [ $this, 'replaceCallback' ], $wrappedtext );
                // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
@@ -66,13 +64,12 @@ class RaggettWrapper {
 
        /**
         * @param array $m
-        *
         * @return string
         */
-       public function replaceCallback( $m ) {
+       private function replaceCallback( array $m ) {
                $marker = Parser::MARKER_PREFIX . "-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
                $this->mMarkerIndex++;
-               $this->mTokens->setPair( $marker, $m[0] );
+               $this->mTokens[$marker] = $m[0];
                return $marker;
        }
 
@@ -88,7 +85,7 @@ class RaggettWrapper {
                $text = str_replace( '<li datafld=""', '<li', $text );
 
                // Restore the contents of placeholder tokens
-               $text = $this->mTokens->replace( $text );
+               $text = strtr( $text, $this->mTokens );
 
                return $text;
        }
index 799961a..2dddac5 100644 (file)
@@ -22,7 +22,7 @@
  * MalformedTitleException is thrown when a TitleParser is unable to parse a title string.
  * @since 1.23
  */
-class MalformedTitleException extends Exception {
+class MalformedTitleException extends Exception implements ILocalizedException {
        private $titleText = null;
        private $errorMessage = null;
        private $errorMessageParameters = [];
@@ -72,4 +72,12 @@ class MalformedTitleException extends Exception {
        public function getErrorMessageParameters() {
                return $this->errorMessageParameters;
        }
+
+       /**
+        * @since 1.29
+        * @return Message
+        */
+       public function getMessageObject() {
+               return wfMessage( $this->getErrorMessage(), $this->getErrorMessageParameters() );
+       }
 }
index a937e75..7a71714 100644 (file)
@@ -21,6 +21,8 @@
  * @license GPL 2+
  * @author Daniel Kinzler
  */
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkTarget;
 
 /**
@@ -50,17 +52,25 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        protected $localInterwikis;
 
+       /**
+        * @var InterwikiLookup
+        */
+       protected $interwikiLookup;
+
        /**
         * @param Language $language The language object to use for localizing namespace names.
         * @param GenderCache $genderCache The gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
+        * @param InterwikiLookup|null $interwikiLookup
         */
        public function __construct( Language $language, GenderCache $genderCache,
-               $localInterwikis = []
+               $localInterwikis = [], $interwikiLookup = null
        ) {
                $this->language = $language;
                $this->genderCache = $genderCache;
                $this->localInterwikis = (array)$localInterwikis;
+               $this->interwikiLookup = $interwikiLookup ?:
+                       MediaWikiServices::getInstance()->getInterwikiLookup();
        }
 
        /**
@@ -318,13 +328,13 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                if ( $this->language->getNsIndex( $x[1] ) ) {
                                                        # Disallow Talk:File:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
-                                               } elseif ( Interwiki::isValidInterwiki( $x[1] ) ) {
+                                               } elseif ( $this->interwikiLookup->isValidInterwiki( $x[1] ) ) {
                                                        // TODO: get rid of global state!
                                                        # Disallow Talk:Interwiki:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                }
                                        }
-                               } elseif ( Interwiki::isValidInterwiki( $p ) ) {
+                               } elseif ( $this->interwikiLookup->isValidInterwiki( $p ) ) {
                                        # Interwiki link
                                        $dbkey = $m[2];
                                        $parts['interwiki'] = $this->language->lc( $p );
index 597bf2f..7c370f1 100644 (file)
@@ -78,7 +78,8 @@ class TitleValue implements LinkTarget {
                Assert::parameterType( 'string', $interwiki, '$interwiki' );
 
                // Sanity check, no full validation or normalization applied here!
-               Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey', 'invalid DB key' );
+               Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey',
+                       "invalid DB key '$dbkey'" );
                Assert::parameter( $dbkey !== '', '$dbkey', 'should not be empty' );
 
                $this->namespace = $namespace;
index ea6ef30..96f8638 100644 (file)
@@ -775,7 +775,9 @@ abstract class UploadBase {
                                        User::IGNORE_USER_RIGHTS
                                );
                        }
-                       Hooks::run( 'UploadComplete', [ &$this ] );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $uploadBase = $this;
+                       Hooks::run( 'UploadComplete', [ &$uploadBase ] );
 
                        $this->postProcessUpload();
                }
index 08cf434..c0c2cb5 100644 (file)
@@ -63,6 +63,52 @@ class UploadFromChunks extends UploadFromFile {
                }
        }
 
+       /**
+        * {@inheritdoc}
+        */
+       public function tryStashFile( User $user, $isPartial = false ) {
+               try {
+                       $this->verifyChunk();
+               } catch ( UploadChunkVerificationException $e ) {
+                       return Status::newFatal( $e->msg );
+               }
+
+               return parent::tryStashFile( $user, $isPartial );
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28 Use tryStashFile() instead
+        */
+       public function stashFile( User $user = null ) {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashFile( $user );
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28
+        */
+       public function stashFileGetKey() {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashFileGetKey();
+       }
+
+       /**
+        * {@inheritdoc}
+        * @throws UploadChunkVerificationException
+        * @deprecated since 1.28
+        */
+       public function stashSession() {
+               wfDeprecated( __METHOD__, '1.28' );
+               $this->verifyChunk();
+               return parent::stashSession();
+       }
+
        /**
         * Calls the parent doStashFile and updates the uploadsession table to handle "chunks"
         *
@@ -74,7 +120,6 @@ class UploadFromChunks extends UploadFromFile {
                $this->mChunkIndex = 0;
                $this->mOffset = 0;
 
-               $this->verifyChunk();
                // Create a local stash target
                $this->mStashFile = parent::doStashFile( $user );
                // Update the initial file offset (based on file size)
@@ -113,7 +158,7 @@ class UploadFromChunks extends UploadFromFile {
 
        /**
         * Append the final chunk and ready file for parent::performUpload()
-        * @return FileRepoStatus
+        * @return Status
         */
        public function concatenateChunks() {
                $chunkIndex = $this->getChunkIndex();
@@ -222,7 +267,7 @@ class UploadFromChunks extends UploadFromFile {
                                        $this->verifyChunk();
                                        $this->mTempPath = $oldTemp;
                                } catch ( UploadChunkVerificationException $e ) {
-                                       return Status::newFatal( $e->getMessage() );
+                                       return Status::newFatal( $e->msg );
                                }
                                $status = $this->outputChunk( $chunkPath );
                                if ( $status->isGood() ) {
@@ -313,7 +358,7 @@ class UploadFromChunks extends UploadFromFile {
         *
         * @param string $chunkPath
         * @throws UploadChunkFileException
-        * @return FileRepoStatus
+        * @return Status
         */
        private function outputChunk( $chunkPath ) {
                // Key is fileKey + chunk index
@@ -364,7 +409,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mDesiredDestName = $oldDesiredDestName;
                $this->mTitle = false;
                if ( is_array( $res ) ) {
-                       throw new UploadChunkVerificationException( $res[0] );
+                       throw new UploadChunkVerificationException( $res );
                }
        }
 }
@@ -376,4 +421,10 @@ class UploadChunkFileException extends MWException {
 }
 
 class UploadChunkVerificationException extends MWException {
+       public $msg;
+       public function __construct( $res ) {
+               $this->msg = call_user_func_array( 'wfMessage', $res );
+               parent::__construct( call_user_func_array( 'wfMessage', $res )
+                       ->inLanguage( 'en' )->useDatabase( false )->text() );
+       }
 }
index 2ee8ed2..fed64c2 100644 (file)
@@ -301,7 +301,8 @@ class User implements IDBAccessObject {
        protected $queryFlagsUsed = self::READ_NORMAL;
 
        /** @var string Indicates type of block (used for eventlogging)
-        * Permitted values: 'cookie-block', 'proxy-block', 'openproxy-block', 'xff-block'
+        * Permitted values: 'cookie-block', 'proxy-block', 'openproxy-block', 'xff-block',
+        * 'config-block'
         */
        public $blockTrigger = false;
 
@@ -1581,7 +1582,7 @@ class User implements IDBAccessObject {
         *   Check when actually saving should be done against master.
         */
        private function getBlockedStatus( $bFromSlave = true ) {
-               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
+               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff, $wgSoftBlockRanges;
 
                if ( -1 != $this->mBlockedby ) {
                        return;
@@ -1643,16 +1644,20 @@ class User implements IDBAccessObject {
                if ( !$block instanceof Block && $ip !== null && !in_array( $ip, $wgProxyWhitelist ) ) {
                        // Local list
                        if ( self::isLocallyBlockedProxy( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
-                               $block->mReason = wfMessage( 'proxyblockreason' )->text();
-                               $block->setTarget( $ip );
+                               $block = new Block( [
+                                       'byText' => wfMessage( 'proxyblocker' )->text(),
+                                       'reason' => wfMessage( 'proxyblockreason' )->text(),
+                                       'address' => $ip,
+                                       'systemBlock' => 'proxy',
+                               ] );
                                $this->blockTrigger = 'proxy-block';
                        } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'sorbs' )->text() );
-                               $block->mReason = wfMessage( 'sorbsreason' )->text();
-                               $block->setTarget( $ip );
+                               $block = new Block( [
+                                       'byText' => wfMessage( 'sorbs' )->text(),
+                                       'reason' => wfMessage( 'sorbsreason' )->text(),
+                                       'address' => $ip,
+                                       'systemBlock' => 'dnsbl',
+                               ] );
                                $this->blockTrigger = 'openproxy-block';
                        }
                }
@@ -1676,6 +1681,21 @@ class User implements IDBAccessObject {
                        }
                }
 
+               if ( !$block instanceof Block
+                       && $ip !== null
+                       && $this->isAnon()
+                       && IP::isInRanges( $ip, $wgSoftBlockRanges )
+               ) {
+                       $block = new Block( [
+                               'address' => $ip,
+                               'byText' => 'MediaWiki default',
+                               'reason' => wfMessage( 'softblockrangesreason', $ip )->text(),
+                               'anonOnly' => true,
+                               'systemBlock' => 'wgSoftBlockRanges',
+                       ] );
+                       $this->blockTrigger = 'config-block';
+               }
+
                if ( $block instanceof Block ) {
                        wfDebug( __METHOD__ . ": Found block.\n" );
                        $this->mBlock = $block;
@@ -1690,8 +1710,10 @@ class User implements IDBAccessObject {
                        $this->blockTrigger = false;
                }
 
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                // Extensions
-               Hooks::run( 'GetBlockedStatus', [ &$this ] );
+               Hooks::run( 'GetBlockedStatus', [ &$user ] );
        }
 
        /**
@@ -1776,21 +1798,22 @@ class User implements IDBAccessObject {
                }
 
                if ( !is_array( $wgProxyList ) ) {
-                       // Load from the specified file
+                       // Load values from the specified file
                        $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
                }
 
-               if ( !is_array( $wgProxyList ) ) {
-                       $ret = false;
-               } elseif ( array_search( $ip, $wgProxyList ) !== false ) {
-                       $ret = true;
-               } elseif ( array_key_exists( $ip, $wgProxyList ) ) {
-                       // Old-style flipped proxy list
-                       $ret = true;
-               } else {
-                       $ret = false;
+               if ( is_array( $wgProxyList ) ) {
+                       if (
+                               // Look for IP as value
+                               array_search( $ip, $wgProxyList ) !== false ||
+                               // Look for IP as key (for backwards-compatility)
+                               array_key_exists( $ip, $wgProxyList )
+                       ) {
+                               return true;
+                       }
                }
-               return $ret;
+
+               return false;
        }
 
        /**
@@ -1824,9 +1847,11 @@ class User implements IDBAccessObject {
         * @return bool True if a rate limiter was tripped
         */
        public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                // Call the 'PingLimiter' hook
                $result = false;
-               if ( !Hooks::run( 'PingLimiter', [ &$this, $action, &$result, $incrBy ] ) ) {
+               if ( !Hooks::run( 'PingLimiter', [ &$user, $action, &$result, $incrBy ] ) ) {
                        return $result;
                }
 
@@ -2061,14 +2086,18 @@ class User implements IDBAccessObject {
                } elseif ( !$ip ) {
                        $ip = $this->getRequest()->getIP();
                }
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $blocked = false;
                $block = null;
-               Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked, &$block ] );
+               Hooks::run( 'UserIsBlockedGlobally', [ &$user, $ip, &$blocked, &$block ] );
 
                if ( $blocked && $block === null ) {
                        // back-compat: UserIsBlockedGlobally didn't have $block param first
-                       $block = new Block;
-                       $block->setTarget( $ip );
+                       $block = new Block( [
+                               'address' => $ip,
+                               'systemBlock' => 'global-block'
+                       ] );
                }
 
                $this->mGlobalBlock = $blocked ? $block : false;
@@ -2084,7 +2113,9 @@ class User implements IDBAccessObject {
                if ( $this->mLocked !== null ) {
                        return $this->mLocked;
                }
-               $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$this ], null );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
                $this->mLocked = $authUser && $authUser->isLocked();
                Hooks::run( 'UserIsLocked', [ $this, &$this->mLocked ] );
                return $this->mLocked;
@@ -2101,7 +2132,9 @@ class User implements IDBAccessObject {
                }
                $this->getBlockedStatus();
                if ( !$this->mHideName ) {
-                       $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$this ], null );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
+                       $authUser = AuthManager::callLegacyAuthPlugin( 'getUserInstance', [ &$user ], null );
                        $this->mHideName = $authUser && $authUser->isHidden();
                        Hooks::run( 'UserIsHidden', [ $this, &$this->mHideName ] );
                }
@@ -2220,8 +2253,10 @@ class User implements IDBAccessObject {
         * @return array
         */
        public function getNewMessageLinks() {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $talks = [];
-               if ( !Hooks::run( 'UserRetrieveNewTalks', [ &$this, &$talks ] ) ) {
+               if ( !Hooks::run( 'UserRetrieveNewTalks', [ &$user, &$talks ] ) ) {
                        return $talks;
                } elseif ( !$this->getNewtalk() ) {
                        return [];
@@ -2477,24 +2512,6 @@ class User implements IDBAccessObject {
                return $this->mTouched;
        }
 
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getTemporaryPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Set the password and reset the random token.
         * Calls through to authentication plugin if necessary;
@@ -2662,16 +2679,6 @@ class User implements IDBAccessObject {
                throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
-       /**
-        * Has password reminder email been sent within the last
-        * $wgPasswordReminderResendTime hours?
-        * @deprecated Removed in 1.27. See above.
-        * @return bool
-        */
-       public function isPasswordReminderThrottled() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Get the user's e-mail address
         * @return string User's email address
@@ -2791,7 +2798,7 @@ class User implements IDBAccessObject {
         * @param string $oname The option to check
         * @param string $defaultOverride A default value returned if the option does not exist
         * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
-        * @return string User's current value for the option
+        * @return string|null User's current value for the option
         * @see getBoolOption()
         * @see getIntOption()
         */
@@ -3231,8 +3238,10 @@ class User implements IDBAccessObject {
                                $this->getGroups(), // explicit groups
                                $this->getAutomaticGroups( $recache ) // implicit groups
                        ) );
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
                        // Hook for additional groups
-                       Hooks::run( 'UserEffectiveGroups', [ &$this, &$this->mEffectiveGroups ] );
+                       Hooks::run( 'UserEffectiveGroups', [ &$user, &$this->mEffectiveGroups ] );
                        // Force reindexation of groups when a hook has unset one of them
                        $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
                }
@@ -3599,7 +3608,9 @@ class User implements IDBAccessObject {
 
                // If we're working on user's talk page, we should update the talk page message indicator
                if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
-                       if ( !Hooks::run( 'UserClearNewTalkNotification', [ &$this, $oldid ] ) ) {
+                       // Avoid PHP 7.1 warning of passing $this by reference
+                       $user = $this;
+                       if ( !Hooks::run( 'UserClearNewTalkNotification', [ &$user, $oldid ] ) ) {
                                return;
                        }
 
@@ -3831,7 +3842,9 @@ class User implements IDBAccessObject {
         * Log this user out.
         */
        public function logout() {
-               if ( Hooks::run( 'UserLogout', [ &$this ] ) ) {
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               if ( Hooks::run( 'UserLogout', [ &$user ] ) ) {
                        $this->doLogout();
                }
        }
@@ -4506,7 +4519,9 @@ class User implements IDBAccessObject {
                        return false;
                }
                $canSend = $this->isEmailConfirmed();
-               Hooks::run( 'UserCanSendEmail', [ &$this, &$canSend ] );
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
+               Hooks::run( 'UserCanSendEmail', [ &$user, &$canSend ] );
                return $canSend;
        }
 
@@ -4532,8 +4547,10 @@ class User implements IDBAccessObject {
        public function isEmailConfirmed() {
                global $wgEmailAuthentication;
                $this->load();
+               // Avoid PHP 7.1 warning of passing $this by reference
+               $user = $this;
                $confirmed = true;
-               if ( Hooks::run( 'EmailConfirmed', [ &$this, &$confirmed ] ) ) {
+               if ( Hooks::run( 'EmailConfirmed', [ &$user, &$confirmed ] ) ) {
                        if ( $this->isAnon() ) {
                                return false;
                        }
index 516e9ae..212f325 100644 (file)
@@ -26,7 +26,6 @@
  *
  * Only a functional interface is provided: ZipFileReader::read(). No access is
  * given to object instances.
- *
  */
 class ZipDirectoryReader {
        /**
diff --git a/includes/widget/search/BasicSearchResultSetWidget.php b/includes/widget/search/BasicSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..2c31bd2
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Message;
+use SearchResultSet;
+use SpecialSearch;
+use Status;
+
+/**
+ * Renders the search result area. Handles Title and Full-Text search results,
+ * along with inline and sidebar secondary (interwiki) results.
+ */
+class BasicSearchResultSetWidget {
+       /** @var SpecialSearch */
+       protected $specialPage;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var InterwikiSearchResultSetWidget */
+       protected $sidebarWidget;
+
+       public function __construct(
+               SpecialSearch $specialPage,
+               SearchResultWidget $resultWidget,
+               InterwikiSearchResultSetWidget $sidebarWidget
+       ) {
+               $this->specialPage = $specialPage;
+               $this->resultWidget = $resultWidget;
+               $this->sidebarWidget = $sidebarWidget;
+       }
+
+       /**
+        * @param string $term The search term to highlight
+        * @param int $offset The offset of the first result in the result set
+        * @param SearchResultSet|null $titleResultSet Results of searching only page titles
+        * @param SearchResultSet|null $textResultSet Results of general full text search.
+        * @return string HTML
+        */
+       public function render(
+               $term,
+               $offset,
+               SearchResultSet $titleResultSet = null,
+               SearchResultSet $textResultSet = null
+       ) {
+               global $wgContLang;
+
+               $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false;
+               $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false;
+               $hasSecondary = $textResultSet
+                       ? $textResultSet->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                       : false;
+               $hasSecondaryInline = $textResultSet
+                       ? $textResultSet->hasInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                       : false;
+
+               if ( !$hasTitle && !$hasText && !$hasSecondary && !$hasSecondaryInline ) {
+                       return '';
+               }
+
+               $out = '';
+               if ( $hasTitle ) {
+                       $out .= $this->header( $this->specialPage->msg( 'titlematches' ) )
+                               . $this->renderResultSet( $titleResultSet, $offset );
+               }
+
+               if ( $hasText ) {
+                       if ( $hasTitle ) {
+                               $out .= "<div class='mw-search-visualclear'></div>" .
+                                       $this->header( $this->specialPage->msg( 'textmatches' ) );
+                       }
+                       $out .= $this->renderResultSet( $textResultSet, $offset );
+               }
+
+               if ( $hasSecondaryInline ) {
+                       $iwResults = $textResultSet->getInterwikiResults( SearchResultSet::INLINE_RESULTS );
+                       foreach ( $iwResults as $interwiki => $results ) {
+                               if ( $results instanceof Status || $results->numRows() === 0 ) {
+                                       // ignore bad interwikis for now
+                                       continue;
+                               }
+                               $out .=
+                                       "<p class='mw-search-interwiki-header mw-search-visualclear'>" .
+                                               $this->specialPage->msg( "search-interwiki-results-{$interwiki}" )->parse() .
+                                       "</p>";
+                               $out .= $this->renderResultSet( $results, $offset );
+                       }
+               }
+
+               if ( $hasSecondary ) {
+                       $out .= $this->sidebarWidget->render(
+                               $term,
+                               $textResultSet->getInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                       );
+               }
+
+               // Convert the whole thing to desired language variant
+               // TODO: Move this up to Special:Search?
+               return $wgContLang->convert( $out );
+       }
+
+       /**
+        * Generate a headline for a section of the search results. In prior
+        * implementations this was rendering wikitext of '==$1==', but seems
+        * a waste to call the full parser to generate this tiny bit of html
+        *
+        * @param Message $msg i18n message to use as header
+        * @return string HTML
+        */
+       protected function header( Message $msg ) {
+               return
+                       "<h2>" .
+                               "<span class='mw-headline'>" . $msg->escaped() . "</span>" .
+                       "</h2>";
+       }
+
+       /**
+        * @param SearchResultSet $resultSet The search results to render
+        * @param int $offset Offset of the first result in $resultSet
+        * @return string HTML
+        */
+       protected function renderResultSet( SearchResultSet $resultSet, $offset ) {
+               global $wgContLang;
+
+               $terms = $wgContLang->convertForSearchResult( $resultSet->termMatches() );
+
+               $hits = [];
+               $result = $resultSet->next();
+               while ( $result ) {
+                       $hits[] .= $this->resultWidget->render( $result, $terms, $offset++ );
+                       $result = $resultSet->next();
+               }
+
+               return "<ul class='mw-search-results'>" . implode( '', $hits ) . "</ul>";
+       }
+}
diff --git a/includes/widget/search/DidYouMeanWidget.php b/includes/widget/search/DidYouMeanWidget.php
new file mode 100644 (file)
index 0000000..3aee87b
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Linker;
+use SearchResultSet;
+use SpecialSearch;
+
+/**
+ * Renders a suggested search for the user, or tells the user
+ * a suggested search was run instead of the one provided.
+ */
+class DidYouMeanWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+
+       public function __construct( SpecialSearch $specialSearch ) {
+               $this->specialSearch = $specialSearch;
+       }
+
+       /**
+        * @param string $term The user provided search term
+        * @param SearchResultSet $resultSet
+        * @return string HTML
+        */
+       public function render( $term, SearchResultSet $resultSet ) {
+               if ( $resultSet->hasRewrittenQuery() ) {
+                       $html = $this->rewrittenHtml( $term, $resultSet );
+               } elseif ( $resultSet->hasSuggestion() ) {
+                       $html = $this->suggestionHtml( $resultSet );
+               } else {
+                       return '';
+               }
+
+               return "<div class='searchdidyoumean'>$html</div>";
+       }
+
+       /**
+        * Generates HTML shown to user when their query has been internally
+        * rewritten, and the results of the rewritten query are being returned.
+        *
+        * @param string $term The users search input
+        * @param SearchResultSet $resultSet The response to the search request
+        * @return string HTML Links the user to their original $term query, and the
+        *  one suggested by $resultSet
+        */
+       protected function rewrittenHtml( $term, SearchResultSet $resultSet ) {
+               $params = [
+                       'search' => $resultSet->getQueryAfterRewrite(),
+                       // Don't magic this link into a 'go' link, it should always
+                       // show search results.
+                       'fultext' => 1,
+               ];
+               $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
+
+               $rewritten = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       $resultSet->getQueryAfterRewriteSnippet() ?: null,
+                       [ 'id' => 'mw-search-DYM-rewritten' ],
+                       $stParams
+               );
+
+               $stParams['search'] = $term;
+               $stParams['runsuggestion'] = 0;
+               $original = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       htmlspecialchars( $term, ENT_QUOTES, 'UTF-8' ),
+                       [ 'id' => 'mwsearch-DYM-original' ],
+                       $stParams
+               );
+
+               return $this->specialSearch->msg( 'search-rewritten' )
+                       ->rawParams( $rewritten, $original )
+                       ->escaped();
+       }
+
+       /**
+        * Generates HTML shown to the user when we have a suggestion about
+        * a query that might give more/better results than their current
+        * query.
+        *
+        * @param SearchResultSet $resultSet
+        * @return string HTML
+        */
+       protected function suggestionHtml( SearchResultSet $resultSet ) {
+               $params = [
+                       'search' => $resultSet->getSuggestionQuery(),
+                       'fulltext' => 1,
+               ];
+               $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
+
+               $suggest = Linker::linkKnown(
+                       $this->specialSearch->getPageTitle(),
+                       $resultSet->getSuggestionSnippet() ?: null,
+                       [ 'id' => 'mw-search-DYM-suggestion' ],
+                       $stParams
+               );
+
+               return $this->specialSearch->msg( 'search-suggest' )
+                       ->rawParams( $suggest )->parse();
+       }
+}
diff --git a/includes/widget/search/FullSearchResultWidget.php b/includes/widget/search/FullSearchResultWidget.php
new file mode 100644 (file)
index 0000000..0d0fa12
--- /dev/null
@@ -0,0 +1,284 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Category;
+use Hooks;
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+
+/**
+ * Renders a 'full' multi-line search result with metadata.
+ *
+ *  The Title
+ *  some *highlighted* *text* about the search result
+ *  5KB (651 words) - 12:40, 6 Aug 2016
+ */
+class FullSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       protected $specialPage;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+
+       public function __construct( SpecialSearch $specialPage, LinkRenderer $linkRenderer ) {
+               $this->specialPage = $specialPage;
+               $this->linkRenderer = $linkRenderer;
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+               // If the page doesn't *exist*... our search index is out of date.
+               // The least confusing at this point is to drop the result.
+               // You may get less results, but... on well. :P
+               if ( $result->isBrokenTitle() || $result->isMissingRevision() ) {
+                       return '';
+               }
+
+               $link = $this->generateMainLinkHtml( $result, $terms, $position );
+               // If page content is not readable, just return ths title.
+               // This is not quite safe, but better than showing excerpts from
+               // non-readable pages. Note that hiding the entry entirely would
+               // screw up paging (really?).
+               if ( !$result->getTitle()->userCan( 'read', $this->specialPage->getUser() ) ) {
+                       return "<li>{$link}</li>";
+               }
+
+               $redirect = $this->generateRedirectHtml( $result );
+               $section = $this->generateSectionHtml( $result );
+               $category = $this->generateCategoryHtml( $result );
+               $date = $this->specialPage->getLanguage()->userTimeAndDate(
+                       $result->getTimestamp(),
+                       $this->specialPage->getUser()
+               );
+               list( $file, $desc, $thumb ) = $this->generateFileHtml( $result );
+               $snippet = $result->getTextSnippet( $terms );
+               if ( $snippet ) {
+                       $extract = "<div class='searchresult'>$snippet</div>";
+               } else {
+                       $extract = '';
+               }
+
+               if ( $thumb === null ) {
+                       // If no thumb, then the description is about size
+                       $desc = $this->generateSizeHtml( $result );
+
+                       // Let hooks do their own final construction if desired.
+                       // FIXME: Not sure why this is only for results without thumbnails,
+                       // but keeping it as-is for now to prevent breaking hook consumers.
+                       $html = null;
+                       $score = '';
+                       $related = '';
+                       if ( !Hooks::run( 'ShowSearchHit', [
+                               $this->specialPage, $result, $terms,
+                               &$link, &$redirect, &$section, &$extract,
+                               &$score, &$size, &$date, &$related, &$html
+                       ] ) ) {
+                               return $html;
+                       }
+               }
+
+               // All the pieces have been collected. Now generate the final HTML
+               $joined = "{$link} {$redirect} {$category} {$section} {$file}";
+               $meta = $this->buildMeta( $desc, $date );
+
+               if ( $thumb === null ) {
+                       $html =
+                               "<div class='mw-search-result-heading'>{$joined}</div>" .
+                               "{$extract} {$meta}";
+               } else {
+                       $html =
+                               "<table class='searchResultImage'>" .
+                                       "<tr>" .
+                                               "<td style='width: 120px; text-align: center; vertical-align: top'>" .
+                                                       $thumb .
+                                               "</td>" .
+                                               "<td style='vertical-align: top'>" .
+                                                       "{$joined} {$extract} {$meta}" .
+                                               "</td>" .
+                                       "</tr>" .
+                               "</table>";
+               }
+
+               return "<li>{$html}</li>";
+       }
+
+       /**
+        * Generates HTML for the primary call to action. It is
+        * typically the article title, but the search engine can
+        * return an exact snippet to use (typically the article
+        * title with highlighted words).
+        *
+        * @param SearchResult $result
+        * @param string $terms
+        * @param int $position
+        * @return string HTML
+        */
+       protected function generateMainLinkHtml( SearchResult $result, $terms, $position ) {
+               $snippet = $result->getTitleSnippet();
+               if ( $snippet === '' ) {
+                       $snippet = null;
+               } else {
+                       $snippet = new HtmlArmor( $snippet );
+               }
+
+               // clone to prevent hook from changing the title stored inside $result
+               $title = clone $result->getTitle();
+               $query = [];
+
+               Hooks::run( 'ShowSearchHitTitle',
+                       [ &$title, &$snippet, $result, $terms, $this->specialPage, &$query ] );
+
+               $link = $this->linkRenderer->makeLink(
+                       $title,
+                       $snippet,
+                       [ 'data-serp-pos' => $position ],
+                       $query
+               );
+
+               return $link;
+       }
+
+       /**
+        * Generates an alternate title link, such as (redirect from <a>Foo</a>).
+        *
+        * @param string $msgKey i18n message  used to wrap title
+        * @param Title|null $title The title to link to, or null to generate
+        *  the message without a link. In that case $text must be non-null.
+        * @param string|null $text The text snippet to display, or null
+        *  to use the title
+        * @return string HTML
+        */
+       protected function generateAltTitleHtml( $msgKey, Title $title = null, $text ) {
+               $inner = $title === null
+                       ? $text
+                       : $this->linkRenderer->makeLink( $title, $text ? new HtmlArmor( $text ) : null );
+
+               return "<span class='searchalttitle'>" .
+                               $this->specialPage->msg( $msgKey )->rawParams( $inner )->text()
+                       . "</span>";
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateRedirectHtml( SearchResult $result ) {
+               $title = $result->getRedirectTitle();
+               return $title === null
+                       ? ''
+                       : $this->generateAltTitleHtml( 'search-redirect', $title, $result->getRedirectSnippet() );
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateSectionHtml( SearchResult $result ) {
+               $title = $result->getSectionTitle();
+               return $title === null
+                       ? ''
+                       : $this->generateAltTitleHtml( 'search-section', $title, $result->getSectionSnippet() );
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateCategoryHtml( SearchResult $result ) {
+               $snippet = $result->getCategorySnippet();
+               return $snippet
+                       ? $this->generateAltTitleHtml( 'search-category', null, $snippet )
+                       : '';
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return string HTML
+        */
+       protected function generateSizeHtml( SearchResult $result ) {
+               $title = $result->getTitle();
+               if ( $title->getNamespace() === NS_CATEGORY ) {
+                       $cat = Category::newFromTitle( $title );
+                       return $this->specialPage->msg( 'search-result-category-size' )
+                               ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
+                               ->escaped();
+               // TODO: This is a bit odd...but requires changing the i18n message to fix
+               } elseif ( $result->getByteSize() !== null || $result->getWordCount() > 0 ) {
+                       $lang = $this->specialPage->getLanguage();
+                       $bytes = $lang->formatSize( $result->getByteSize() );
+                       $words = $result->getWordCount();
+
+                       return $this->specialPage->msg( 'search-result-size', $bytes )
+                               ->numParams( $words )
+                               ->escaped();
+               }
+
+               return '';
+       }
+
+       /**
+        * @param SearchResult $result
+        * @return array Three element array containing the main file html,
+        *  a text description of the file, and finally the thumbnail html.
+        *  If no thumbnail is available the second and third will be null.
+        */
+       protected function generateFileHtml( SearchResult $result ) {
+               $title = $result->getTitle();
+               if ( $title->getNamespace() !== NS_FILE ) {
+                       return [ '', null, null ];
+               }
+
+               if ( $result->isFileMatch() ) {
+                       $html = "<span class='searchalttitle'>" .
+                                       $this->specialPage->msg( 'search-file-match' )->escaped() .
+                               "</span>";
+               } else {
+                       $html = '';
+               }
+
+               $descHtml = null;
+               $thumbHtml = null;
+
+               $img = $result->getFile() ?: wfFindFile( $title );
+               if ( $img ) {
+                       $thumb = $img->transform( [ 'width' => 120, 'height' => 120 ] );
+                       if ( $thumb ) {
+                               $descHtml = $this->specialPage->msg( 'parentheses' )
+                                       ->rawParams( $img->getShortDesc() )
+                                       ->escaped();
+                               $thumbHtml = $thumb->toHtml( [ 'desc-link' => true ] );
+                       }
+               }
+
+               return [ $html, $descHtml, $thumbHtml ];
+       }
+
+       /**
+        * @param string $desc HTML description of result, ex: size in bytes, or empty string
+        * @param string $date HTML representation of last edit date, or empty string
+        * @return string HTML A div combining $desc and $date with a separator in a <div>.
+        *  If either is missing only one will be represented. If both are missing an empty
+        *  string will be returned.
+        */
+       protected function buildMeta( $desc, $date ) {
+               if ( $desc && $date ) {
+                       $meta = "{$desc} - {$date}";
+               } elseif ( $desc ) {
+                       $meta = $desc;
+               } elseif ( $date ) {
+                       $meta = $date;
+               } else {
+                       return '';
+               }
+
+               return "<div class='mw-search-result-data'>{$meta}</div>";
+       }
+}
diff --git a/includes/widget/search/InterwikiSearchResultSetWidget.php b/includes/widget/search/InterwikiSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..c738483
--- /dev/null
@@ -0,0 +1,130 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResultSet;
+use SpecialSearch;
+use Title;
+
+/**
+ * Renders one or more SearchResultSets into a sidebar grouped by
+ * interwiki prefix. Includes a per-wiki header indicating where
+ * the results are from.
+ */
+class InterwikiSearchResultSetWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var string[]|null */
+       protected $customCaptions;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+       /** @var InterwikiLookup */
+       protected $iwLookup;
+
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchResultWidget $resultWidget,
+               LinkRenderer $linkRenderer,
+               InterwikiLookup $iwLookup
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->resultWidget = $resultWidget;
+               $this->linkRenderer = $linkRenderer;
+               $this->iwLookup = $iwLookup;
+       }
+
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets ) {
+               if ( !is_array( $resultSets ) ) {
+                       $resultSets = [ $resultSets ];
+               }
+
+               $this->loadCustomCaptions();
+
+               $iwResults = [];
+               foreach ( $resultSets as $resultSet ) {
+                       $result = $resultSet->next();
+                       while ( $result ) {
+                               if ( !$result->isBrokenTitle() ) {
+                                       $iwResults[$result->getTitle()->getInterwiki()][] = $result;
+                               }
+                               $result = $resultSet->next();
+                       }
+               }
+
+               $out = '';
+               foreach ( $iwResults as $iwPrefix => $results ) {
+                       $out .= $this->headerHtml( $iwPrefix, $term );
+                       $out .= "<ul class='mw-search-iwresults'>";
+                       // TODO: Assumes interwiki results are never paginated
+                       $position = 0;
+                       foreach ( $results as $result ) {
+                               $out .= $this->resultWidget->render( $result, $term, $position++ );
+                       }
+                       $out .= "</ul>";
+               }
+
+               return
+                       "<div id='mw-search-interwiki'>" .
+                               "<div id='mw-search-interwiki-caption'>" .
+                                       $this->specialSearch->msg( 'search-interwiki-caption' )->text() .
+                               '</div>' .
+                               $out .
+                       "</div>";
+       }
+
+       /**
+        * Generates an appropriate HTML header for the given interwiki prefix
+        *
+        * @param string $iwPrefix Interwiki prefix of wiki to show header for
+        * @param string $term User provided search term
+        * @return string HTML
+        */
+       protected function headerHtml( $iwPrefix, $term ) {
+               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
+                       $caption = $this->customCaptions[$iwPrefix];
+               } else {
+                       $interwiki = $this->iwLookup->fetch( $iwPrefix );
+                       $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
+                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->text();
+               }
+               $searchLink = $this->linkRenderer->makeLink(
+                       Title::newFromText( "$iwPrefix:Special:Search" ),
+                       $this->specialSearch->msg( 'search-interwiki-more' )->text(),
+                       [],
+                       [
+                               'search' => $term,
+                               'fulltext' => 1,
+                       ]
+               );
+               return
+                       "<div class='mw-search-interwiki-project'>" .
+                               "<span class='mw-search-interwiki-more'>{$searchLink}</span>" .
+                               $caption .
+               "</div>";
+       }
+
+       protected function loadCustomCaptions() {
+               if ( $this->customCaptions !== null ) {
+                       return;
+               }
+
+               $this->customCaptions = [];
+               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->text() );
+               foreach ( $customLines as $line ) {
+                       $parts = explode( ':', $line, 2 );
+                       if ( count( $parts ) === 2 ) {
+                               $this->customCaptions[$parts[0]] = $parts[1];
+                       }
+               }
+       }
+}
diff --git a/includes/widget/search/SearchFormWidget.php b/includes/widget/search/SearchFormWidget.php
new file mode 100644 (file)
index 0000000..e223b95
--- /dev/null
@@ -0,0 +1,312 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Hooks;
+use Html;
+use MediaWiki\Widget\SearchInputWidget;
+use MWNamespace;
+use SearchEngineConfig;
+use SpecialSearch;
+use Xml;
+
+class SearchFormWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchEngineConfig */
+       protected $searchConfig;
+       /** @var array */
+       protected $profiles;
+
+       /**
+        * @param SpecialSearch $specialSearch
+        * @param SearchEngineConfig $searchConfig
+        * @param array $profiles
+        */
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchEngineConfig $searchConfig,
+               array $profiles
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->searchConfig = $searchConfig;
+               $this->profiles = $profiles;
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @param bool $isPowerSearch Is the 'advanced' section open?
+        * @return string HTML
+        */
+       public function render(
+               $profile,
+               $term,
+               $numResults,
+               $totalResults,
+               $offset,
+               $isPowerSearch
+       ) {
+               return Xml::openElement(
+                               'form',
+                               [
+                                       'id' => $isPowerSearch ? 'powersearch' : 'search',
+                                       'method' => 'get',
+                                       'action' => wfScript(),
+                               ]
+                       ) .
+                               '<div id="mw-search-top-table">' .
+                                       $this->shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) .
+                               '</div>' .
+                               "<div class='mw-search-visualclear'></div>" .
+                               "<div class='mw-search-profile-tabs'>" .
+                                       $this->profileTabsHtml( $profile, $term ) .
+                                       "<div style='clear:both'></div>" .
+                               "</div>" .
+                               $this->optionsHtml( $term, $isPowerSearch, $profile ) .
+                       '</form>';
+       }
+
+       /**
+        * @param string $profile The current search profile
+        * @param string $term The current search term
+        * @param int $numResults The number of results shown
+        * @param int $totalResults The total estimated results found
+        * @param int $offset Current offset in search results
+        * @return string HTML
+        */
+       protected function shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) {
+               $searchWidget = new SearchInputWidget( [
+                       'id' => 'searchText',
+                       'name' => 'search',
+                       'autofocus' => trim( $term ) === '',
+                       'value' => $term,
+                       'dataLocation' => 'content',
+                       'infusable' => true,
+               ] );
+
+               $layout = new \OOUI\ActionFieldLayout( $searchWidget, new \OOUI\ButtonInputWidget( [
+                       'type' => 'submit',
+                       'label' => $this->specialSearch->msg( 'searchbutton' )->text(),
+                       'flags' => [ 'progressive', 'primary' ],
+               ] ), [
+                       'align' => 'top',
+               ] );
+
+               $html =
+                       Html::hidden( 'title', $this->specialSearch->getPageTitle()->getPrefixedText() ) .
+                       Html::hidden( 'profile', $profile ) .
+                       Html::hidden( 'fulltext', '1' ) .
+                       $layout;
+
+               if ( $totalResults > 0 && $offset < $totalResults ) {
+                       $html .= Xml::tags(
+                               'div',
+                               [ 'class' => 'results-info' ],
+                               $this->specialSearch->msg( 'search-showingresults' )
+                                       ->numParams( $offset + 1, $offset + $numResults, $totalResults )
+                                       ->numParams( $numResults )
+                                       ->parse()
+                       );
+               }
+
+               return $html;
+       }
+
+       /**
+        * Generates HTML for the list of available search profiles.
+        *
+        * @param string $profile The currently selected profile
+        * @param string $term The user provided search terms
+        * @return string HTML
+        */
+       protected function profileTabsHtml( $profile, $term ) {
+               $bareterm = $this->startsWithImage( $term )
+                       ? substr( $term, strpos( $term, ':' ) + 1 )
+                       : $term;
+               $lang = $this->specialSearch->getLanguage();
+               $items = [];
+               foreach ( $this->profiles as $id => $profileConfig ) {
+                       $profileConfig['parameters']['profile'] = $id;
+                       $tooltipParam = isset( $profileConfig['namespace-messages'] )
+                               ? $lang->commaList( $profileConfig['namespace-messages'] )
+                               : null;
+                       $items[] = Xml::tags(
+                               'li',
+                               [ 'class' => $profile === $id ? 'current' : 'normal' ],
+                               $this->makeSearchLink(
+                                       $bareterm,
+                                       $this->specialSearch->msg( $profileConfig['message'] )->text(),
+                                       $this->specialSearch->msg( $profileConfig['tooltip'], $tooltipParam )->text(),
+                                       $profileConfig['parameters']
+                               )
+                       );
+               }
+
+               return
+                               "<div class='search-types'>" .
+                                       "<ul>" . implode( '', $items ) . "</ul>" .
+                               "</div>";
+       }
+
+       /**
+        * Check if query starts with image: prefix
+        *
+        * @param string $term The string to check
+        * @return bool
+        */
+       protected function startsWithImage( $term ) {
+               global $wgContLang;
+
+               $parts = explode( ':', $term );
+               return count( $parts ) > 1
+                       ? $wgContLang->getNsIndex( $parts[0] ) === NS_FILE
+                       : false;
+       }
+
+       /**
+        * Make a search link with some target namespaces
+        *
+        * @param string $term The term to search for
+        * @param string $label Link's text
+        * @param string $tooltip Link's tooltip
+        * @param array $params Query string parameters
+        * @return string HTML fragment
+        */
+       protected function makeSearchLink( $term, $label, $tooltip, array $params = [] ) {
+               $params += [
+                       'search' => $term,
+                       'fulltext' => 1,
+               ];
+
+               return Xml::element(
+                       'a',
+                       [
+                               'href' => $this->specialSearch->getPageTitle()->getLocalURL( $params ),
+                               'title' => $tooltip,
+                       ],
+                       $label
+               );
+       }
+
+       /**
+        * Generates HTML for advanced options available with the currently
+        * selected search profile.
+        *
+        * @param string $term User provided search term
+        * @param bool $isPowerSearch Is the advanced search profile enabled?
+        * @param string $profile The current search profile
+        * @return string HTML
+        */
+       protected function optionsHtml( $term, $isPowerSearch, $profile ) {
+               $html = '';
+               $opts = [
+                       'profile' => $profile,
+               ];
+
+               if ( $isPowerSearch ) {
+                       $html .= $this->powerSearchBox( $term, $opts );
+               } else {
+                       $form = '';
+                       Hooks::run( 'SpecialSearchProfileForm', [
+                               $this->specialSearch, &$form, $profile, $term, $opts
+                       ] );
+                       $html .= $form;
+               }
+
+               return $html;
+       }
+
+       /**
+        * @param string $term The current search term
+        * @param array $opts Additional key/value pairs that will be submitted
+        *  with the generated form.
+        * @return string HTML
+        */
+       protected function powerSearchBox( $term, array $opts ) {
+               global $wgContLang;
+
+               $rows = [];
+               $activeNamespaces = $this->specialSearch->getNamespaces();
+               foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
+                       $subject = MWNamespace::getSubject( $namespace );
+                       if ( !isset( $rows[$subject] ) ) {
+                               $rows[$subject] = "";
+                       }
+
+                       $name = $wgContLang->getConverter()->convertNamespace( $namespace );
+                       if ( $name === '' ) {
+                               $name = $this->specialSearch->msg( 'blanknamespace' )->text();
+                       }
+
+                       $rows[$subject] .=
+                               '<td>' .
+                                       Xml::checkLabel(
+                                               $name,
+                                               "ns{$namespace}",
+                                               "mw-search-ns{$namespace}",
+                                               in_array( $namespace, $activeNamespaces )
+                                       ) .
+                               '</td>';
+               }
+
+               // Lays out namespaces in multiple floating two-column tables so they'll
+               // be arranged nicely while still accomodating diferent screen widths
+               $tableRows = [];
+               foreach ( $rows as $row ) {
+                       $tableRows[] = "<tr>{$row}</tr>";
+               }
+               $namespaceTables = [];
+               foreach ( array_chunk( $tableRows, 4 ) as $chunk ) {
+                       $namespaceTables[] = implode( '', $chunk );
+               }
+
+               $showSections = [
+                       'namespaceTables' => "<table>" . implode( '</table><table>', $namespaceTables ) . '</table>',
+               ];
+               Hooks::run( 'SpecialSearchPowerBox', [ &$showSections, $term, $opts ] );
+
+               $hidden = '';
+               foreach ( $opts as $key => $value ) {
+                       $hidden .= Html::hidden( $key, $value );
+               }
+
+               $divider = "<div class='divider'></div>";
+
+               // Stuff to feed SpecialSearch::saveNamespaces()
+               $user = $this->specialSearch->getUser();
+               $remember = '';
+               if ( $user->isLoggedIn() ) {
+                       $remember = $divider . Xml::checkLabel(
+                               $this->specialSearch->msg( 'powersearch-remember' )->text(),
+                               'nsRemember',
+                               'mw-search-powersearch-remember',
+                               false,
+                               // The token goes here rather than in a hidden field so it
+                               // is only sent when necessary (not every form submission)
+                               [ 'value' => $user->getEditToken(
+                                       'searchnamespace',
+                                       $this->specialSearch->getRequest()
+                               ) ]
+                       );
+               }
+
+               return
+                       "<fieldset id='mw-searchoptions'>" .
+                               "<legend>" . $this->specialSearch->msg( 'powersearch-legend' )->escaped() . '</legend>' .
+                               "<h4>" . $this->specialSearch->msg( 'powersearch-ns' )->escaped() . '</h4>' .
+                               // populated by js if available
+                               "<div id='mw-search-togglebox'></div>" .
+                               $divider .
+                               implode(
+                                       $divider,
+                                       $showSections
+                               ) .
+                               $hidden .
+                               $remember .
+                       "</fieldset>";
+       }
+}
diff --git a/includes/widget/search/SearchResultWidget.php b/includes/widget/search/SearchResultWidget.php
new file mode 100644 (file)
index 0000000..3fbdbef
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use SearchResult;
+
+/**
+ * Renders a single search result to HTML
+ */
+interface SearchResultWidget {
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The zero indexed result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position );
+}
diff --git a/includes/widget/search/SimpleSearchResultWidget.php b/includes/widget/search/SimpleSearchResultWidget.php
new file mode 100644 (file)
index 0000000..9fe816a
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+
+/**
+ * Renders a simple one-line result
+ */
+class SimpleSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+
+       public function __construct( SpecialSearch $specialSearch, LinkRenderer $linkRenderer ) {
+               $this->specialSearch = $specialSearch;
+               $this->linkRenderer = $linkRenderer;
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+               $title = $result->getTitle();
+               $titleSnippet = $result->getTitleSnippet();
+               if ( $titleSnippet ) {
+                       $titleSnippet = new HtmlArmor( $titleSnippet );
+               } else {
+                       $titleSnippet = null;
+               }
+
+               $link = $this->linkRenderer->makeLink( $title, $titleSnippet );
+
+               $redirectTitle = $result->getRedirectTitle();
+               $redirect = '';
+               if ( $redirectTitle !== null ) {
+                       $redirectText = $result->getRedirectSnippet();
+                       if ( $redirectText ) {
+                               $redirectText = new HtmlArmor( $redirectText );
+                       } else {
+                               $redirectText = null;
+                       }
+                       $redirect =
+                               "<span class='searchalttitle'>" .
+                                       $this->specialSearch->msg( 'search-redirect' )->rawParams(
+                                               $this->linkRenderer->makeLink( $redirectTitle, $redirectText )
+                                       )->text() .
+                               "</span>";
+               }
+
+               return "<li>{$link} {$redirect}</li>";
+       }
+}
index 2e4ef89..8c7ce31 100644 (file)
@@ -45,7 +45,9 @@ class Language {
        public $dateFormatStrings = [];
        public $mExtendedSpecialPageAliases;
 
-       protected $namespaceNames, $mNamespaceIds, $namespaceAliases;
+       /** @var array|null */
+       protected $namespaceNames;
+       protected $mNamespaceIds, $namespaceAliases;
 
        /**
         * ReplacementArray object caches
@@ -463,10 +465,11 @@ class Language {
                if ( is_null( $this->namespaceNames ) ) {
                        global $wgMetaNamespace, $wgMetaNamespaceTalk, $wgExtraNamespaces;
 
-                       $this->namespaceNames = self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
                        $validNamespaces = MWNamespace::getCanonicalNamespaces();
 
-                       $this->namespaceNames = $wgExtraNamespaces + $this->namespaceNames + $validNamespaces;
+                       $this->namespaceNames = $wgExtraNamespaces +
+                               self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
+                       $this->namespaceNames += $validNamespaces;
 
                        $this->namespaceNames[NS_PROJECT] = $wgMetaNamespace;
                        if ( $wgMetaNamespaceTalk ) {
@@ -2097,17 +2100,15 @@ class Language {
                $data = explode( '|', $tz, 3 );
 
                if ( $data[0] == 'ZoneInfo' ) {
-                       MediaWiki\suppressWarnings();
-                       $userTZ = timezone_open( $data[2] );
-                       MediaWiki\restoreWarnings();
-                       if ( $userTZ !== false ) {
-                               $date = date_create( $ts, timezone_open( 'UTC' ) );
-                               date_timezone_set( $date, $userTZ );
-                               $date = date_format( $date, 'YmdHis' );
-                               return $date;
+                       try {
+                               $userTZ = new DateTimeZone( $data[2] );
+                               $date = new DateTime( $ts, new DateTimeZone( 'UTC' ) );
+                               $date->setTimezone( $userTZ );
+                               return $date->format( 'YmdHis' );
+                       } catch ( Exception $e ) {
+                               // Unrecognized timezone, default to 'Offset' with the stored offset.
+                               $data[0] = 'Offset';
                        }
-                       # Unrecognized timezone, default to 'Offset' with the stored offset.
-                       $data[0] = 'Offset';
                }
 
                if ( $data[0] == 'System' || $tz == '' ) {
@@ -2577,7 +2578,7 @@ class Language {
 
        /**
         * @param string $key
-        * @return array|null
+        * @return string|null
         */
        public function getMessage( $key ) {
                return self::$dataCache->getSubitem( $this->mCode, 'messages', $key );
@@ -3734,6 +3735,43 @@ class Language {
                        return $wgGrammarForms[$this->getCode()][$case][$word];
                }
 
+               $grammarTransformations = $this->getGrammarTransformations();
+
+               if ( isset( $grammarTransformations[$case] ) ) {
+                       $forms = $grammarTransformations[$case];
+
+                       // Some names of grammar rules are aliases for other rules.
+                       // In such cases the value is a string rather than object,
+                       // so load the actual rules.
+                       if ( is_string( $forms ) ) {
+                               $forms = $grammarTransformations[$forms];
+                       }
+
+                       foreach ( array_values( $forms ) as $rule ) {
+                               $form = $rule[0];
+
+                               if ( $form === '@metadata' ) {
+                                       continue;
+                               }
+
+                               $replacement = $rule[1];
+
+                               $regex = '/' . addcslashes( $form, '/' ) . '/u';
+                               $patternMatches = preg_match( $regex, $word );
+
+                               if ( $patternMatches === false ) {
+                                       wfLogWarning(
+                                               'An error occurred while processing grammar. ' .
+                                               "Word: '$word'. Regex: /$form/."
+                                       );
+                               } elseif ( $patternMatches === 1 ) {
+                                       $word = preg_replace( $regex, $replacement, $word );
+
+                                       break;
+                               }
+                       }
+               }
+
                return $word;
        }
 
@@ -3937,10 +3975,11 @@ class Language {
         *
         * @param string $str The validated block duration in English
         * @param User $user User object to use timezone from or null for $wgUser
+        * @param int $now Current timestamp, for formatting relative block durations
         * @return string Somehow translated block duration
         * @see LanguageFi.php for example implementation
         */
-       function translateBlockExpiry( $str, User $user = null ) {
+       function translateBlockExpiry( $str, User $user = null, $now = 0 ) {
                $duration = SpecialBlock::getSuggestedDurations( $this );
                foreach ( $duration as $show => $value ) {
                        if ( strcmp( $str, $value ) == 0 ) {
@@ -3957,11 +3996,11 @@ class Language {
                }
 
                // If all else fails, return a standard duration or timestamp description.
-               $time = strtotime( $str, 0 );
+               $time = strtotime( $str, $now );
                if ( $time === false ) { // Unknown format. Return it as-is in case.
                        return $str;
-               } elseif ( $time !== strtotime( $str, 1 ) ) { // It's a relative timestamp.
-                       // $time is relative to 0 so it's a duration length.
+               } elseif ( $time !== strtotime( $str, $now + 1 ) ) { // It's a relative timestamp.
+                       // The result differs based on current time, so it's a duration length.
                        return $this->formatDuration( $time );
                } else { // It's an absolute timestamp.
                        if ( $time === 0 ) {
index 5a9f652..06fec44 100644 (file)
@@ -415,8 +415,6 @@ class LanguageConverter {
                                                $attr = $this->recursiveConvertTopLevel( $attr, $toVariant );
                                        }
 
-                                       // Remove HTML tags to avoid disrupting the layout
-                                       $attr = preg_replace( '/<[^>]+>/', '', $attr );
                                        if ( $attr !== $attrs[$attrName] ) {
                                                $attrs[$attrName] = $attr;
                                                $changed = true;
index 3388536..54ff421 100644 (file)
@@ -85,9 +85,10 @@ class LanguageFi extends Language {
        /**
         * @param string $str
         * @param User $user User object to use timezone from or null for $wgUser
+        * @param int $now Current timestamp, for formatting relative block durations
         * @return string
         */
-       function translateBlockExpiry( $str, User $user = null ) {
+       function translateBlockExpiry( $str, User $user = null, $now = 0 ) {
                /*
                        'ago', 'now', 'today', 'this', 'next',
                        'first', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
deleted file mode 100644 (file)
index a6aaf6d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Hebrew (עברית) specific code.
- *
- * 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
- * @author Rotem Liss
- * @ingroup Language
- */
-
-/**
- * Hebrew (עברית)
- *
- * @ingroup Language
- */
-class LanguageHe extends Language {
-
-       /**
-        * Convert grammar forms of words.
-        *
-        * Available cases:
-        * "prefixed" (or "תחילית") - when the word has a prefix
-        *
-        * @param string $word The word to convert
-        * @param string $case The case
-        *
-        * @return string
-        */
-       public function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['he'][$case][$word] ) ) {
-                       return $wgGrammarForms['he'][$case][$word];
-               }
-
-               switch ( $case ) {
-                       case 'prefixed':
-                       case 'תחילית':
-                               # Duplicate the "Waw" if prefixed, but not if it is already double.
-                               if ( substr( $word, 0, 2 ) === "ו" && substr( $word, 0, 4 ) !== "וו" ) {
-                                       $word = "ו" . $word;
-                               }
-
-                               # Remove the "He" article if prefixed.
-                               if ( substr( $word, 0, 2 ) === "ה" ) {
-                                       $word = substr( $word, 2 );
-                               }
-
-                               # Add a hyphen (maqaf) before non-Hebrew letters.
-                               if ( substr( $word, 0, 2 ) < "א" || substr( $word, 0, 2 ) > "ת" ) {
-                                       $word = "־" . $word;
-                               }
-               }
-
-               return $word;
-       }
-}
index a2288d0..e8731dc 100644 (file)
@@ -96,44 +96,6 @@ class IuConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{Syllabic | Latin-} -or-
-        * -{code:text | code:text | ...}-
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
-       /**
-        * Do not convert content on talk pages
-        *
-        * @param string $text
-        * @param Parser $parser
-        * @return string
-        */
-       function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
-                       && $parser->getTitle()->isTalkPage() );
-
-               return parent::parserConvert( $text, $parser );
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 548c9a0..3605e8d 100644 (file)
@@ -216,31 +216,6 @@ class KkConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{ekavian | iyekavian-} -or-
-        * -{code:text | code:text | ...}-
-        *
-        * update: delete all rule parsing because it's not used
-        *      currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
        /**
         * A function wrapper:
         *  - if there is no selected variant, leave the link
index 62de390..7b15721 100644 (file)
  * @ingroup Language
  */
 class LanguageRu extends Language {
-       /**
-        * Convert from the nominative form of a noun to some other case
-        * Invoked with {{grammar:case|word}}
-        *
-        * @param string $word
-        * @param string $case
-        * @return string
-        */
-       function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['ru'][$case][$word] ) ) {
-                       return $wgGrammarForms['ru'][$case][$word];
-               }
-
-               $grammarTransformations = $this->getGrammarTransformations();
-
-               if ( isset( $grammarTransformations[$case] ) ) {
-                       foreach ( array_values( $grammarTransformations[$case] ) as $rule ) {
-                               $form = $rule[0];
-
-                               if ( $form === '@metadata' ) {
-                                       continue;
-                               }
-
-                               $replacement = $rule[1];
-
-                               $regex = "/$form/";
-
-                               if ( preg_match( $regex, $word ) ) {
-                                       $word = preg_replace( $regex, $replacement, $word );
-
-                                       break;
-                               }
-                       }
-               }
-
-               return $word;
-       }
-
        /**
         * Four-digit number should be without group commas (spaces)
         * See manual of style at https://ru.wikipedia.org/wiki/Википедия:Оформление_статей
index 0de396d..36821b0 100644 (file)
@@ -72,44 +72,6 @@ class ShiConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{Tifinagh | Latin-} -or-
-        * -{code:text | code:text | ...}-
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
-       /**
-        * Do not convert content on talk pages
-        *
-        * @param string $text
-        * @param Parser $parser
-        * @return string
-        */
-       function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
-                       && $parser->getTitle()->isTalkPage() );
-
-               return parent::parserConvert( $text, $parser );
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 886ee94..6491f55 100644 (file)
@@ -75,31 +75,6 @@ class SrConverter extends LanguageConverter {
                ];
        }
 
-       /**
-        * rules should be defined as -{ekavian | iyekavian-} -or-
-        * -{code:text | code:text | ...}-
-        *
-        * update: delete all rule parsing because it's not used
-        * currently, and just produces a couple of bugs
-        *
-        * @param string $rule
-        * @param array $flags
-        * @return array
-        */
-       function parseManualRule( $rule, $flags = [] ) {
-               if ( in_array( 'T', $flags ) ) {
-                       return parent::parseManualRule( $rule, $flags );
-               }
-
-               $carray = [];
-               // otherwise ignore all formatting
-               foreach ( $this->mVariants as $v ) {
-                       $carray[$v] = $rule;
-               }
-
-               return $carray;
-       }
-
        /**
         * A function wrapper:
         *   - if there is no selected variant, leave the link
index 72bde40..a155d03 100644 (file)
  * @ingroup Language
  */
 class LanguageUk extends Language {
-
-       /**
-        * Convert from the nominative form of a noun to some other case
-        * Invoked with {{grammar:case|word}}
-        *
-        * @param string $word
-        * @param string $case
-        * @return string
-        */
-       function convertGrammar( $word, $case ) {
-               global $wgGrammarForms;
-               if ( isset( $wgGrammarForms['uk'][$case][$word] ) ) {
-                       return $wgGrammarForms['uk'][$case][$word];
-               }
-
-               # These rules don't cover the whole language.
-               # They are used only for site names.
-
-               # join and array_slice instead mb_substr
-               $ar = [];
-               preg_match_all( '/./us', $word, $ar );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
-                       switch ( $case ) {
-                               case 'genitive': # родовий відмінок
-                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
-                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-                                       } elseif ( implode( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
-                                       }
-                                       break;
-                               case 'accusative': # знахідний відмінок
-                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
-                                       }
-                                       break;
-                       }
-               }
-               return $word;
-       }
-
        /**
         * Ukrainian numeric format is "12 345,67" but "1234,56"
         *
index a15d910..4594385 100644 (file)
@@ -3110,7 +3110,6 @@ public static $zh2Hant = [
 '一干部下' => '一干部下',
 '一年' => '一年',
 '一年里' => '一年裡',
-'一别头' => '一彆頭',
 '一斗斗' => '一斗斗',
 '一树百获' => '一樹百穫',
 '一准' => '一準',
@@ -3342,7 +3341,6 @@ public static $zh2Hant = [
 '干嚎' => '乾嚎',
 '干回付' => '乾回付',
 '干圆洁净' => '乾圓潔淨',
-'干地' => '乾地',
 '干坞' => '乾塢',
 '干女' => '乾女',
 '干奴才' => '乾奴才',
@@ -4124,6 +4122,8 @@ public static $zh2Hant = [
 '划過' => '划過',
 '划龍舟' => '划龍舟',
 '划龙舟' => '划龍舟',
+'划龍船' => '划龍船',
+'划龙船' => '划龍船',
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
@@ -4430,7 +4430,6 @@ public static $zh2Hant = [
 '吸干' => '吸乾',
 '吹干' => '吹乾',
 '吹发' => '吹髮',
-'吹胡' => '吹鬍',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
 '吕后' => '呂后',
 '呂后' => '呂后',
@@ -4460,6 +4459,8 @@ public static $zh2Hant = [
 '哀挽' => '哀輓',
 '品鉴' => '品鑑',
 '哄堂大笑' => '哄堂大笑',
+'哈啰喂' => '哈囉喂',
+'哈囉喂' => '哈囉喂',
 '員山庄' => '員山庄',
 '哪里' => '哪裡',
 '唁吊' => '唁弔',
@@ -4483,7 +4484,6 @@ public static $zh2Hant = [
 '喂!' => '喂!',
 '喂,' => '喂,',
 '善于' => '善於',
-'喜向往' => '喜向往',
 '喜欢表' => '喜歡錶',
 '喜欢钟' => '喜歡鐘',
 '喜欢钟表' => '喜歡鐘錶',
@@ -4494,6 +4494,8 @@ public static $zh2Hant = [
 '乔岳' => '喬嶽',
 '单于' => '單于',
 '單于' => '單于',
+'单向' => '單向',
+'單向' => '單向',
 '单单于' => '單單於',
 '单干' => '單幹',
 '单打独斗' => '單打獨鬥',
@@ -4583,7 +4585,6 @@ public static $zh2Hant = [
 '在于' => '在於',
 '地图里' => '地圖裡',
 '地心历表' => '地心曆表',
-'地方志' => '地方志',
 '地志' => '地誌',
 '地丑德齐' => '地醜德齊',
 '坏于' => '坏於',
@@ -4722,7 +4723,6 @@ public static $zh2Hant = [
 '天后宫' => '天后宮',
 '天地志狼' => '天地志狼',
 '天地为范' => '天地為範',
-'天干地支' => '天干地支',
 '天后来' => '天後來',
 '天后半' => '天後半',
 '天后天' => '天後天',
@@ -4866,7 +4866,6 @@ public static $zh2Hant = [
 '封為后' => '封為后',
 '封面里' => '封面裡',
 '射雕' => '射鵰',
-'专向往' => '專向往',
 '专辑里' => '專輯裡',
 '尊后' => '尊后',
 '对不准' => '對不準',
@@ -4947,6 +4946,7 @@ public static $zh2Hant = [
 '山里的' => '山裡的',
 '山谷' => '山谷',
 '山重水复' => '山重水複',
+'岩松了' => '岩松了',
 '岫岩' => '岫巖',
 '岱岳' => '岱嶽',
 '峇里海' => '峇里海',
@@ -5011,6 +5011,7 @@ public static $zh2Hant = [
 '年代里' => '年代裡',
 '年历' => '年曆',
 '年历史' => '年歷史',
+'年历次' => '年歷次',
 '年谷' => '年穀',
 '年里' => '年裡',
 '年鉴' => '年鑑',
@@ -5166,8 +5167,6 @@ public static $zh2Hant = [
 '强奸' => '強姦',
 '强干' => '強幹',
 '强于' => '強於',
-'别口气' => '彆口氣',
-'别强' => '彆強',
 '别扭' => '彆扭',
 '别拗' => '彆拗',
 '别气' => '彆氣',
@@ -5403,6 +5402,7 @@ public static $zh2Hant = [
 '怠于' => '怠於',
 '急于' => '急於',
 '急冲而下' => '急衝而下',
+'性别扭曲' => '性別扭曲',
 '性征' => '性徵',
 '性欲' => '性慾',
 '怨气冲天' => '怨氣衝天',
@@ -5573,7 +5573,6 @@ public static $zh2Hant = [
 '抓奸' => '抓姦',
 '抓斗' => '抓鬥',
 '抗御' => '抗禦',
-'折向往' => '折向往',
 '折子戏' => '折子戲',
 '折子戲' => '折子戲',
 '折戟沈河' => '折戟沈河',
@@ -5682,6 +5681,7 @@ public static $zh2Hant = [
 '卷款' => '捲款',
 '卷毛' => '捲毛',
 '卷烟盒' => '捲煙盒',
+'卷瓣' => '捲瓣',
 '卷积云' => '捲積雲',
 '卷筒' => '捲筒',
 '卷帘' => '捲簾',
@@ -5927,10 +5927,8 @@ public static $zh2Hant = [
 '断发' => '斷髮',
 '断发文身' => '斷髮文身',
 '方便面' => '方便麵',
-'方向往' => '方向往',
-'方志恒' => '方志恒',
+'方向' => '方向',
 '方法里' => '方法裡',
-'方志' => '方誌',
 '于后' => '於後',
 '于征' => '於徵',
 '于海上' => '於海上',
@@ -6625,6 +6623,7 @@ public static $zh2Hant = [
 '煮面' => '煮麵',
 '熊杰' => '熊杰',
 '荧郁' => '熒鬱',
+'熬制' => '熬製',
 '炖制' => '燉製',
 '燎发' => '燎髮',
 '烧干' => '燒乾',
@@ -6791,7 +6790,6 @@ public static $zh2Hant = [
 '白里透红' => '白裡透紅',
 '白面包青天' => '白面包青天',
 '白发' => '白髮',
-'白胡' => '白鬍',
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
@@ -6836,7 +6834,6 @@ public static $zh2Hant = [
 '皮里阳秋' => '皮裡陽秋',
 '皮制' => '皮製',
 '皮松' => '皮鬆',
-'皱别' => '皺彆',
 '皱折' => '皺摺',
 '盆吊' => '盆弔',
 '盈余' => '盈餘',
@@ -7224,7 +7221,6 @@ public static $zh2Hant = [
 '编码表' => '編碼表',
 '编钟' => '編鐘',
 '编余' => '編餘',
-'编发' => '編髮',
 '缓征' => '緩徵',
 '缓冲' => '緩衝',
 '致密' => '緻密',
@@ -7272,6 +7268,7 @@ public static $zh2Hant = [
 '系紧' => '繫緊',
 '系绳' => '繫繩',
 '系累' => '繫纍',
+'系膜' => '繫膜',
 '系舟' => '繫舟',
 '系船' => '繫船',
 '系辞' => '繫辭',
@@ -7468,7 +7465,6 @@ public static $zh2Hant = [
 '艸木丰丰' => '艸木丰丰',
 '芒果干' => '芒果乾',
 '花不要采' => '花不要採',
-'花卷' => '花捲',
 '花盆里' => '花盆裡',
 '花菴词选' => '花菴詞選',
 '花药' => '花葯',
@@ -7851,7 +7847,10 @@ public static $zh2Hant = [
 '西昆' => '西崑',
 '西岳' => '西嶽',
 '西历' => '西曆',
+'西历代' => '西歷代',
+'西历任' => '西歷任',
 '西历史' => '西歷史',
+'西历次' => '西歷次',
 '西湖里' => '西湖里',
 '西西里' => '西西里',
 '西谷米' => '西谷米',
@@ -8154,7 +8153,8 @@ public static $zh2Hant = [
 '轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
 '轮回' => '輪迴',
-'转向往' => '轉向往',
+'轉向' => '轉向',
+'转向' => '轉向',
 '转托' => '轉託',
 '转斗千里' => '轉鬥千里',
 '辛丑' => '辛丑',
@@ -8627,7 +8627,6 @@ public static $zh2Hant = [
 '长发公主' => '長髮公主',
 '长发妹' => '長髮妹',
 '长发姑娘' => '長髮姑娘',
-'长胡' => '長鬍',
 '门帘' => '門帘',
 '门吊儿' => '門弔兒',
 '门里' => '門裡',
@@ -13453,6 +13452,7 @@ public static $zh2Hans = [
 '以微知著' => '以微知著',
 '仰屋著書' => '仰屋著书',
 '彷彿' => '仿佛',
+'伊東豊雄' => '伊东丰雄',
 '夥計' => '伙计',
 '佛頭著糞' => '佛头著粪',
 '偵蒐' => '侦搜',
diff --git a/languages/data/grammarTransformations/he.json b/languages/data/grammarTransformations/he.json
new file mode 100644 (file)
index 0000000..e127f8b
--- /dev/null
@@ -0,0 +1,26 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Rotem Liss",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ]
+       },
+       "prefixed": "תחילית",
+       "תחילית": [
+               [ "@metadata", [
+                       "comment", "הכפלת ו, מחיקת ה הידיעה, הוספת מקף"
+               ] ],
+               [
+                       "^(ו[^ו].+)$",
+                       "ו$1"
+               ],
+               [
+                       "^ה(.+)$",
+                       "$1"
+               ],
+               [
+                       "^([^א-ת].+)$",
+                       "־$1"
+               ]
+       ]
+}
diff --git a/languages/data/grammarTransformations/uk.json b/languages/data/grammarTransformations/uk.json
new file mode 100644 (file)
index 0000000..6512225
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gutsul",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ],
+               "comment": "These rules don't cover the whole grammar of the language, and are intended only for names of languages and Wikimedia projects."
+       },
+       "genitive": [
+               [ "(.+)ія$", "$1ії" ],
+               [ "(.+)ти$", "$1т" ],
+               [ "(.+)ди$", "$1дів" ],
+               [ "(.+)ник$", "$1ника" ]
+       ],
+       "accusative": [
+               [ "(.+)ія$", "$1ію" ]
+       ]
+}
index 9a8c749..156efdb 100644 (file)
        "searcharticle": "اذهب",
        "history": "تاريخ الصفحة",
        "history_short": "تاريخ",
+       "history_small": "تاريخ",
        "updatedmarker": "عدلت منذ زيارتي الأخيرة",
        "printableversion": "نسخة للطباعة",
        "permalink": "رابط دائم",
        "blockedtitle": "المستخدم ممنوع",
        "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:''$2''\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "systemblockedtext": "اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه تلقائيا بواسطة ميدياويكي.\nالسبب المعطى هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* نهاية المنع: $6\n* المقصود بالمنع: $7\n\nعنوان الأيبي الحالي الخاص بك هو $3.\nمن فضلك ضمن كل التفاصيل بالأعلى في أي استعلام تقوم به.",
        "blockednoreason": "لا سبب معطى",
        "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
        "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
        "saveprefs": "احفظ",
        "restoreprefs": "استرجع كل الإعدادات الافتراضية",
        "prefs-editing": "التحرير",
-       "rows": "صفوف:",
-       "columns": "أعمدة:",
        "searchresultshead": "بحث",
        "stub-threshold": "الحد لتنسيق وصلة البذرة ($1):",
        "stub-threshold-sample-link": "عينة",
        "userrights-user-editname": "أدخل اسم مستخدم:",
        "editusergroup": "تحميل مجموعات المستخدم",
        "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "عرض صلاحيات المستخدم {{GENDER:$1|للمستخدم|للمستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "تعديل مجموعات المستخدم",
+       "userrights-viewusergroup": "عرض مجموعات المستخدم",
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
        "action-upload_by_url": "رفع هذا الملف من عنوان مسار",
        "action-writeapi": "استخدام API الكتابة",
        "action-delete": "حذف هذه الصفحة",
-       "action-deleterevision": "حذف هذه المراجعة",
-       "action-deletedhistory": "رؤية تاريخ هذه الصفحة المحذوف",
+       "action-deleterevision": "حذف المراجعات",
+       "action-deletelogentry": "حذف مدخلات السجل",
+       "action-deletedhistory": "رؤية تاريخ الصفحات المحذوف",
+       "action-deletedtext": "رؤية تاريخ المراجعات المحذوف",
        "action-browsearchive": "البحث في الصفحات المحذوفة",
-       "action-undelete": "استرجاع هذه الصفحة",
-       "action-suppressrevision": "مراجعة واسترجاع هذه المراجعة المخفية",
+       "action-undelete": "استرجاع الصفحات",
+       "action-suppressrevision": "مراجعة واسترجاع المراجعات المخفية",
        "action-suppressionlog": "رؤية هذا السجل الخاص",
        "action-block": "منع هذا المستخدم من التعديل",
        "action-protect": "تغيير مستويات الحماية لهذه الصفحة",
        "action-userrights-interwiki": "تعديل صلاحيات المستخدم للمستخدمين في الويكيات الأخرى",
        "action-siteadmin": "غلق أو رفع غلق قاعدة البيانات",
        "action-sendemail": "إرسال رسائل بريد إلكتروني",
+       "action-editmyoptions": "تعديل تفضيلاتك",
        "action-editmywatchlist": "تعديل قائمة مراقبتك",
        "action-viewmywatchlist": "مشاهدة قائمة مراقبتك",
        "action-viewmyprivateinfo": "مشاهدة معلوماتك الخاصة",
        "recentchanges-legend-heading": "<strong>شرح:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
        "recentchanges-submit": "أظهر",
+       "rcfilters-activefilters": "المرشحات النشطة",
+       "rcfilters-restore-default-filters": "استرجاع المرشحات الافتراضية",
+       "rcfilters-clear-all-filters": "مسح كل المرشحات",
+       "rcfilters-search-placeholder": "رشح أحدث التغييرات (تصفح أو ابدأ الكتابة)",
+       "rcfilters-invalid-filter": "مرشح غير صحيح",
+       "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
+       "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
+       "rcfilters-filtergroup-registration": "تسجيل المستخدم",
+       "rcfilters-filter-registered-label": "مسجل",
+       "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
+       "rcfilters-filter-unregistered-label": "غير مسجل",
+       "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
+       "rcfilters-filtergroup-authorship": "ملكية التعديلات",
+       "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
+       "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
+       "rcfilters-filter-editsbyother-label": "التعديلات بواسطة الآخرين",
+       "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت).",
+       "rcfilters-filtergroup-userExpLevel": "مستوى الخبرة (للمستخدمين المسجلين فقط)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "القادمون الجدد",
+       "rcfilters-filter-userExpLevel-newcomer-description": "أقل من 10 تعديلات و4 أيام من النشاط.",
+       "rcfilters-filter-userExpLevel-learner-label": "المتعلمون",
+       "rcfilters-filter-userExpLevel-learner-description": "المزيد من أيام النشاط والتعديلات أكثر من \"القادمين الجدد\" ولكن أقل من \"المستخدمين ذوي الخبرة\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "المستخدمون ذوو الخبرة",
+       "rcfilters-filter-userExpLevel-experienced-description": "أكثر من 30 يوما من النشاط و500 تعديل.",
+       "rcfilters-filtergroup-automated": "المساهمات الأوتوماتيكية",
+       "rcfilters-filter-bots-label": "بوت",
+       "rcfilters-filter-bots-description": "التعديلات بواسطة الأدوات الأوتوماتيكية.",
+       "rcfilters-filter-humans-label": "بشري (ليس بوت)",
+       "rcfilters-filter-humans-description": "التعديلات بواسطة المحررين البشريين.",
+       "rcfilters-filtergroup-significance": "الأهمية",
+       "rcfilters-filter-minor-label": "تعديلات طفيفة",
+       "rcfilters-filter-minor-description": "التعديلات التي علم عليها المستخدم كطفيفة.",
+       "rcfilters-filter-major-label": "التعديلات غير الطفيفة",
+       "rcfilters-filter-major-description": "التعديلات غير المعلم عليها كطفيفة.",
+       "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-categorization-description": "سجلات إضافة أو إزالة الصفحات من التصنيفات.",
+       "rcfilters-filter-logactions-label": "الأفعال المسجلة",
+       "rcfilters-filter-logactions-description": "الأفعال الإدارية، إنشاء الحسابات، حذف الصفحات، عمليات الرفع....",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhidebots-show": "أظهر",
        "rcshowhidebots-hide": "أخف",
-       "rcshowhideliu": "$1 {{GENDER:$1|مستخدمين مسجلين|مستخدمات مسجلات|مستخدمون مسجلون}}",
+       "rcshowhideliu": "$1 المستخدمين المسجلين",
        "rcshowhideliu-show": "أظهر",
        "rcshowhideliu-hide": "أخف",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
        "uncategorizedcategories": "تصنيفات غير مصنفة",
        "uncategorizedimages": "ملفات غير مصنفة",
        "uncategorizedtemplates": "قوالب غير مصنفة",
+       "uncategorized-categories-exceptionlist": " # يحتوي على قائمة بالتصنيفات، التي لا ينبغي أن تكون موجودة في Special:UncategorizedCategories. واحد لكل سطر، مع البدء ب \"*\". السطور التي تبدأ بحرف آخر (بما في ذلك الفراغ) سيتم تجاهلها. استخدم \"#\" للتعليقات.",
        "unusedcategories": "تصنيفات غير مستخدمة",
        "unusedimages": "ملفات غير مستخدمة",
        "wantedcategories": "تصنيفات مطلوبة",
        "emailccsubject": "نسخة من رسالتك إلى $1: $2",
        "emailsent": "أُرسل البريد الإلكتروني",
        "emailsenttext": "أُرسلت رسالتك الإلكترونية.",
-       "emailuserfooter": "هذا البريد الإلكتروني {{GENDER:$1|تم إرساله}} بواسطة $1 إلى {{GENDER:$2|$2}} بواسطة وظيفة \"{{int:emailuser}}\" في {{SITENAME}}.",
+       "emailuserfooter": "هذا البريد الإلكتروني {{GENDER:$1|تم إرساله}} بواسطة $1 إلى {{GENDER:$2|$2}} بواسطة وظيفة \"{{int:emailuser}}\" في {{SITENAME}}. عنوان البريد الخاص {{GENDER:$2|بك}} سيتم إرساله مباشرة {{GENDER:$1|للمرسل الأصلي|للمرسلة الأصلية}}، مما يكشف عنوان البريد الإلكتروني الخاص {{GENDER:$2|بك}} {{GENDER:$1|لهم}}.",
        "usermessage-summary": "ترك رسالة نظام.",
        "usermessage-editor": "مراسل النظام",
        "watchlist": "قائمة مراقبتي",
        "confirm": "أكد",
        "excontent": "المحتوى كان: '$1'",
        "excontentauthor": "المحتوى كان: \"$1\" والمساهم الوحيد كان \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
-       "exbeforeblank": "المحتوى قبل الإفراغ كان: '$1'",
+       "exbeforeblank": "المحتوى قبل الإفراغ كان: \"$1\"",
        "delete-confirm": "حذف \"$1\"",
        "delete-legend": "حذف",
        "historywarning": "'''تنبيه:''' الصفحة التي تريد حذفها بها {{PLURAL:$1|نسخة|نسخة واحدة|نسختان|$1 نسخ|$1 نسخة}}. انظر",
        "changecontentmodel-emptymodels-title": "لا موديلات محتوى متوفرة",
        "changecontentmodel-emptymodels-text": "المحتوى على[[:$1]] لا يمكن تغييره لأي نوع.",
        "log-name-contentmodel": "سجل تغيير نموذج المحتوى",
-       "log-description-contentmodel": "الأحداث المرتبطة بنماذج المحتوى لصفحة",
+       "log-description-contentmodel": "هذه الصفحة تعرض التغييرات لموديل المحتوى للصفحات، والصفحات التي تم إنشاؤها بموديل محتوى يختلف عن الافتراضي",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|أنشأ|أنشأت}} الصفحة $3 باستخدام موديل محتوى غير قياسي \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|غير|غيرت}} موديل المحتوى للصفحة $3 من \"$4\" إلى \"$5\"",
        "logentry-contentmodel-change-revertlink": "استرجع",
        "modifiedarticleprotection": "غير مستوى حماية \"[[$1]]\"",
        "unprotectedarticle": "أزال الحماية من \"[[$1]]\"",
        "movedarticleprotection": "نقل إعدادات الحماية من \"[[$2]]\" إلى \"[[$1]]\"",
-       "protectedarticle-comment": "{{GENDER:$2|محمي}} \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|حمى}} \"[[$1]]\"",
        "modifiedarticleprotection-comment": "{{GENDER:$2|غير مستوى الحماية|غيرت مستوى الحماية}} ل\"[[$1]]\"",
        "unprotectedarticle-comment": "{{GENDER:$2|أزال الحماية|أزالت الحماية}} من \"[[$1]]\"",
        "protect-title": "ضبط حماية \"$1\"",
        "sorbs": "دي إن إس بي إل",
        "sorbsreason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.",
        "sorbs_create_account_reason": "عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.\nلا يمكنك إنشاء حساب.",
+       "softblockrangesreason": "المساهمات بدون تسجيل الدخول غير مسموح بها من عنوان الأيبي الخاص بك ($1). من فضلك سجل الدخول.",
        "xffblockreason": "عنوان آي‌بي مذكور في ترويسة X-Forwarded-For، الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد حُظِر. السبب الأصلي للحظر كان: $1",
        "cant-see-hidden-user": "المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.",
        "ipbblocked": "لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع",
        "cant-move-to-user-page": "أنت لا تمتلك الصلاحية لنقل صفحة إلى صفحة مستخدم (ماعدا إلى صفحة مستخدم فرعية).",
        "cant-move-category-page": "أنت لا تمتلك صلاحية نقل صفحات التصانيف.",
        "cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
+       "cant-move-subpages": "أنت لا تمتلك الصلاحية لنقل الصفحات الفرعية.",
+       "namespace-nosubpages": "النطاق \"$1\" لا يسمح بالصفحات الفرعية.",
        "newtitle": "عنوان جديد:",
        "move-watch": "راقب هذه الصفحة",
        "movepagebtn": "انقل الصفحة",
        "pageinfo-length": "حجم الصفحة (بالبايت)",
        "pageinfo-article-id": "معرف الصفحة (ID)",
        "pageinfo-language": "لغة محتوى الصفحة",
+       "pageinfo-language-change": "غير",
        "pageinfo-content-model": "نموذج محتوى الصفحة",
        "pageinfo-content-model-change": "تغيير",
        "pageinfo-robot-policy": "فهرسة الروبوتات",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|غير|غيرت}} مستوى الحماية ل$3 $4 [مضمن]",
        "logentry-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية {{GENDER:$6|$3}} من $4 إلى $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
-       "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
+       "logentry-rights-autopromote": "تمَ تلقائياً ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "logentry-upload-upload": " {{GENDER:$2|رفع|رفعت}} $1 $3",
        "logentry-upload-overwrite": "{{GENDER:$2|رفع|رفعت}} $1 نسخة جديدة من  $3",
        "logentry-upload-revert": "{{GENDER:$2|رفع|رفعت}} $1 $3",
        "feedback-useragent": "وكيل المستخدم:",
        "searchsuggest-search": "ابحث في {{SITENAME}}",
        "searchsuggest-containing": "يحتوي...",
-       "api-error-autoblocked": "عنوان الأيبي الخاص بك تم منعه تلقائيا، لأنه تم استخدامه بواسطة مستخدم ممنوع",
-       "api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
        "api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
-       "api-error-blocked": "لقد منعت من التحرير.",
-       "api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
-       "api-error-duplicate": "هناك {{PLURAL:$1|ملف آخر|بعض الملفات الأخرى}} مسبقا على الموقع بنفس المحتوى.",
-       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
-       "api-error-empty-file": "كان ملف الذي قمت بإرسال فارغة.",
        "api-error-emptypage": "إنشاء صفحات فارغة جديدة، غير مسموح به.",
-       "api-error-fetchfileerror": "خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.",
-       "api-error-fileexists-forbidden": "يوجد مسبقا ملف باسم \"$1\"، ولا يمكن استبداله.",
-       "api-error-fileexists-shared-forbidden": "يوجد مسبقا ملف باسم \"$1\" في مستودع الملفات المشتركة، ولا يمكن استبداله.",
-       "api-error-file-too-large": "الملف الذي أرسلته كان كبيرا جدا.",
-       "api-error-filename-tooshort": "اسم الملف قصير جدا.",
-       "api-error-filetype-banned": "نوع الملف هذا ممنوع.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ليس نوع ملف مسموح به|ليست أنواع ملفات مسموح بها}}. {{PLURAL:$3|نوع الملف المسموح به هو|أنواع الملفات المسموح بها هي}} $2.",
-       "api-error-filetype-missing": "يفتقد الملفّ ملحق نوعيّته.",
-       "api-error-hookaborted": "التعديل الذي تحاول أن تقوم به تم إحباطه",
-       "api-error-http": "خطأ داخلي: تعذر الاتصال بالخادم.",
-       "api-error-illegal-filename": "اسم الملف غير مسموح به.",
-       "api-error-internal-error": "خطأ داخلي: حدث خطأ عند معالجة التحميل الخاص بك على الويكي.",
-       "api-error-invalid-file-key": "خطأ داخلي: لم يتم العثور على الملف في التخزين المؤقت.",
-       "api-error-missingparam": "خطأ داخلي : متغيرات مفقودة ضمن الطلب.",
-       "api-error-missingresult": "خطأ داخلي : لا يمكن التحديد ما إذا كان النسخ ناجحاً.",
-       "api-error-mustbeloggedin": "يجب أن تكون مسجلا في لتحميل الملفات.",
-       "api-error-mustbeposted": "خطأ داخلي: الطلب يتطلب HTTP POST.",
-       "api-error-noimageinfo": "نجح التحميل، ولكن الخادم لم يقدم لنا أي معلومات حول الملف.",
-       "api-error-nomodule": "خطأ داخلي: لم يتم تعيين تحميل الوحدة النمطية.",
-       "api-error-ok-but-empty": "خطأ داخلي : لم يكن هناك استجابة من الملقم.",
-       "api-error-overwrite": "لا يسمح بالكتابة فوق ملف موجود.",
-       "api-error-ratelimited": "أنت تحاول رفع الكثير من الملفات في فترة زمنية قصيرة أقصر مما تسمح به هذه الويكي.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
-       "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
        "api-error-publishfailed": "خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت",
-       "api-error-stasherror": "حدث خطأ أثناء رفع الملف لتخزينه.",
-       "api-error-stashedfilenotfound": "لم يعثر على الملف المحجوب عند محاولة رفعه من الحجب.",
-       "api-error-stashpathinvalid": "وكان الطريق الذي يجب أن يتم العثور على ملف مخبئ غير صالح.",
-       "api-error-stashfilestorage": "حدث خطأ أثناء رفع الملف لتخزينه.",
-       "api-error-stashzerolength": "لا يمكن أن خادم تخبئة الملف، لأنه يحتوي على طول صفري.",
-       "api-error-stashnotloggedin": "يجب عليك تسجيل الدخول لحفظ الملفات في مرفوعاتك.",
-       "api-error-stashwrongowner": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك ليس لك.",
-       "api-error-stashnosuchfilekey": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك غير موجود.",
-       "api-error-timeout": "لم يستجب الملقم في الوقت المتوقع.",
-       "api-error-unclassified": "حدث خطأ غير معروف",
-       "api-error-unknown-code": "خطأ غير معروف: \"$1\"",
-       "api-error-unknown-error": "خطأ داخلي: قد حدث خطأ عند محاولة تحميل الملف الخاص بك.",
-       "api-error-unknown-warning": "تحذير غير معروف: \"$1\"",
+       "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
+       "api-error-unknown-warning": "تحذير غير معروف: \"$1\".",
        "api-error-unknownerror": "خطأ غير معروف: \"$1\"",
-       "api-error-uploaddisabled": "تم تعطيل الرفع على هذه الويكي.",
-       "api-error-verification-error": "هذا الملف قد يكون معطوباً أو يحتوي على امتداد غير صحيح.",
-       "api-error-was-deleted": "تم رفع ملف بهذا الاسم سابقا ثم تم حذفه بعد هذا.",
        "duration-seconds": "{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}",
        "duration-minutes": "{{PLURAL:$1|أقل من دقيقة|دقيقة واحدة|دقيقتان|$1 دقائق|$1 دقيقة}}",
        "duration-hours": "({{PLURAL:$1||ساعة واحدة|ساعتان|$1 ساعات|$1 ساعة}})",
        "pagelang-language": "اللغة",
        "pagelang-use-default": "استخدام اللغة الافتراضية",
        "pagelang-select-lang": "اختر اللغة",
+       "pagelang-reason": "السبب",
        "pagelang-submit": "إرسال",
+       "pagelang-nonexistent-page": "الصفحة $1 غير موجودة.",
+       "pagelang-unchanged-language": "الصفحة $1 مضبوطة فعلا للغة $2.",
+       "pagelang-unchanged-language-default": "الصفحة $1 مضبوطة فعلا للغة المحتوى الافتراضية الخاصة بالويكي.",
+       "pagelang-db-failed": "قاعدة البيانات فشلت في تغيير لغة الصفحة.",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
        "log-name-pagelang": "سجل تغيير اللغة",
        "log-action-filter-newusers": "نوع إنشاء الحساب:",
        "log-action-filter-patrol": "نوع الخفر:",
        "log-action-filter-protect": "نوع الحماية:",
-       "log-action-filter-rights": "نوع تغيير الصلاحية",
+       "log-action-filter-rights": "نوع تغيير الصلاحية:",
        "log-action-filter-suppress": "نوع الإخفاء:",
        "log-action-filter-upload": "نوع الرفع:",
        "log-action-filter-all": "الكل",
        "log-action-filter-block-reblock": "منع التعديل",
        "log-action-filter-block-unblock": "رفع المنع",
        "log-action-filter-contentmodel-change": "تغيير موديل المحتوى",
-       "log-action-filter-contentmodel-new": "إنشاء صفحة بموديل محتوى غير قياسي",
+       "log-action-filter-contentmodel-new": "إنشاء صفحة بموديل محتوى غير افتراضي",
        "log-action-filter-delete-delete": "حذف الصفحات",
        "log-action-filter-delete-delete_redir": "إعادة الكتابة فوق التحويلة",
        "log-action-filter-delete-restore": "استرجاع الصفحات",
        "usercssispublic": "من فضل لاحظ: صفحات الCSS الفرعية لا ينبغي أن تحتوي على بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
-       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "المراجعة $1",
+       "pageid": "معرف الصفحة $1"
 }
index dd96161..6a9ed15 100644 (file)
@@ -11,7 +11,7 @@
                ]
        },
        "tog-underline": "Miñcewirilpe lasun",
-       "tog-showtoolbar": "Pengelün kümeelün ñi chemkün",
+       "tog-showtoolbar": "Pengelün kümeelkünun ñi chemkün",
        "tog-editondblclick": "Wirin pakina epu klik mew",
        "underline-always": "Rumel",
        "underline-never": "Turpu",
@@ -89,7 +89,7 @@
        "and": "&#32;ka",
        "qbfind": "Kintupe",
        "qbbrowse": "Kintun",
-       "qbedit": "Pepikape",
+       "qbedit": "Kümelkünun",
        "qbpageoptions": "Tüfachi wülngiñ",
        "qbmyoptions": "tañi nütramkawe",
        "faq": "Rumelfemkelu ramtun",
        "permalink": "Mülekalelu lasun",
        "print": "Wirinentupe",
        "view": "Pen",
-       "edit": "Kümeelün",
+       "edit": "Kümelkünun",
        "create": "Dewman",
-       "editthispage": "Wirin tüfachi wülngiñ",
+       "editthispage": "Kümelkünufinge tüfachi wirin zungu",
        "create-this-page": "Llitun tüfachi pakina",
        "delete": "Liftun",
        "deletethispage": "Ñamümün tüfachi pakina",
        "currentevents-url": "Project:Fantepu chemkün",
        "disclaimers": "Tukuldungun ñi pin ley",
        "disclaimerpage": "Project:Katrütuwün ñi llowdüngun",
-       "edithelp": "Kellü wirin",
+       "edithelp": "Kellun kümeelkünuam",
        "mainpage": "Ñidol Wülngiñ",
        "mainpage-description": "Ñidol Wülngiñ",
        "portal": "Lofche ñi wülngiñ",
        "youhavenewmessages": "Nieymi $1 ($2).",
        "newmessagesdifflinkplural": "we {{PLURAL:$1|kalekünuy|kalekünuy}}",
        "youhavenewmessagesmulti": "Nieymi we yefalzugu $1 mew.",
-       "editsection": "Wirin",
+       "editsection": "Kümeelkünun",
        "editold": "kümeelün",
        "viewsourceold": "Kimam chew küpan chi wirin",
-       "editlink": "kümeelün",
+       "editlink": "kümeelkünun",
        "viewsourcelink": "kimam chew küpan chi wirin",
-       "editsectionhint": "Kümeelan katrüntuku: $1",
+       "editsectionhint": "Kümeelkünun trokiñ: $1",
        "toc": "Trokiñdungu",
        "showtoc": "pegelpe",
        "hidetoc": "ellkangepe",
        "hr_tip": "Kakül wif (Pünengelayafuy rumel)",
        "summary": "Pichi trokiñündungu:",
        "subject": "Dungu/üy:",
-       "minoredit": "Tüfachi ta kiñe pichi wirin",
+       "minoredit": "Püchin kümeelkünungey",
        "watchthis": "Llaytun tüfachi pakina",
        "savearticle": "Eltukawün wülngiñ",
        "preview": "Pen chum müley",
        "noarticletext": "Iney no rume wirilay tüfachi wülngiñ mew. Eymi [[Special:Search/{{PAGENAME}}|pepikintuymi tüfachi üy]] kake wülngiñ mew,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} kintuymi koneltuyelelu wirintukun],\nkam [{{fullurl:{{FULLPAGENAME}}|action=edit}} kümeelaymi tüfachi wülngiñ]</span>.",
        "noarticletext-nopermission": "Iney no rume wirilay tüfachi wülngiñ mew. \nEymi [[Special:Search/{{PAGENAME}}|pepikintuymi tüfachi üy]] kake wülngiñ mew,\nkam <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} kintuymi koneltuyelelu wirintukun]</span>.",
        "previewnote": "'''Ngüneduamimi tüfachi wüne pen petu eltukawam!'''\nEltukawlelay feychi kalekünun!",
-       "editing": "Kümeelngey $1",
+       "editing": "Kümeelngekey $1",
        "editingsection": "Wirin $1 (Dungu)",
        "editingcomment": "Wirin $1 (we dungu)",
        "yourtext": "Tami wirin",
        "randompage": "Tuchi wülngiñ rume",
        "statistics": "Chuntelen",
        "statistics-pages": "Pakina",
-       "brokenredirects-edit": "pepikan",
+       "brokenredirects-edit": "Kümeelkünun",
        "brokenredirects-delete": "ñamümün",
        "withoutinterwiki-submit": "Pegelpe",
        "nbytes": "$1 {{PLURAL:$1 byte}}",
        "protect-level-sysop": "Pu ngünefe müṯen",
        "protect-summary-cascade": "Trayengko",
        "protect-expiry-options": "1 ora:1 hour,1 aṉtü:1 day,1 semana:1 week,2 semanas:2 weeks,1 küyeṉ:1 month,3 küyeṉ:3 months,6 küyeṉ:6 months,1 tripantu:1 year,Rumel:infinite",
-       "restriction-edit": "Pepiwelukay",
+       "restriction-edit": "Kümeelkünun",
        "restriction-move": "Pepiwiñami",
        "restriction-create": "Llitun",
        "viewdeletedpage": "Pen pakina ñamümüngelu",
        "siteuser": "Kellufe $1 {{SITENAME}}",
        "others": "fill",
        "siteusers": "{{PLURAL:$2|Kellufe|Kellufe}} $1 {{SITENAME}}",
-       "previousdiff": "← Füta wirin",
+       "previousdiff": "← Kuyfi kümeelkünun wirin",
        "nextdiff": "We wirin →",
        "file-info-size": "$1 × $2 adentun piküsel, eltukawün ñi tunte ngen: $3, MIME ñi chumngen: $4",
        "file-nohires": "Pepiduamngefalay chum pengeam.",
index dcab5ec..b490f27 100644 (file)
@@ -8,7 +8,8 @@
                        "Zanatos",
                        "زكريا",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "MtDu"
                ]
        },
        "tog-underline": "Ṣetter l-lyanaṫ:",
        "variants": "lhja:",
        "errorpagetitle": "ĥata'",
        "returnto": "Rjeĝ le $1",
-       "tagline": "Men",
+       "tagline": "Men {{SITENAME}}",
        "help": "Mosaĝada",
        "search": "Qelleb",
        "searchbutton": "Qelleb",
        "userrights-reason": "S-Sbab:",
        "userrights-no-interwiki": "ma msmoḫ-likċ ṫĝddel hoqoq l-mosṫĥdim fl-wikiat loĥra.",
        "userrights-nodatabase": "qaĝidaṫ l-bayanaṫ $1 ma kayna-ċ wlla kayna walakin maċi f-had l-wiki.",
-       "userrights-nologin": "ĥaṣṣk [[Special:UserLogin|ṫdĥol]] b-ĥisab idari baċ ṫĝti hoqoq l-mosṫĥdim.",
-       "userrights-notallowed": "l-ḫisab ṫaĝk ma mṣmoh-lihċ iĝti ḫoqoq l-mosṫĥdim.",
        "userrights-changeable-col": "lmojmoat li imkn li tghiyrha",
        "userrights-unchangeable-col": "lmjmoat li maymknch lik tghyrha",
        "userrights-irreversible-marker": "$1*",
index 947d17d..0120e9b 100644 (file)
        "navigation-heading": "لستة التصفح",
        "errorpagetitle": "غلطه",
        "returnto": "ارجع ل $1.",
-       "tagline": "من ويكيبيديا, الموسوعه الحره",
+       "tagline": "من {{SITENAME}}",
        "help": "مساعده",
        "search": "تدوير",
        "searchbutton": "تدوير",
        "saveprefs": "حفظ",
        "restoreprefs": "استرجع التظبيطات الاصليه",
        "prefs-editing": "تعديل",
-       "rows": "صفوف:",
-       "columns": "عمدان:",
        "searchresultshead": "تدوير",
        "stub-threshold": "الحد لتنسيق <a href=\"#\" class=\"stub\">لينك البذرة</a>:",
        "stub-threshold-disabled": "معطل",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت  مش من حقك تعدل صلاحيات اليوزرز على الويكيات التانية.",
        "userrights-nodatabase": "قاعدة البيانات $1  مش موجودة أو مش محلية.",
-       "userrights-nologin": "انت لازم [[Special:UserLogin|تسجيل الدخول]] بحساب  مدير لتعديل حقوق اليوزر.",
-       "userrights-notallowed": "حسابك  ماعندوش  إذن لتعديل حقوق اليوزر.",
        "userrights-changeable-col": "المجموعات اللى تقدر تغييرها",
        "userrights-unchangeable-col": "المجموعات اللى مش ممكن انك تغيرها",
        "group": "المجموعة:",
        "right-siteadmin": "قفل وفتح قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات مع الصفحات الموصوله لحد عمق 5",
        "right-sendemail": "يبعت إيميل لليوزرز التانيين",
-       "right-passwordreset": "إعادة ضبط كلمة سر يوزر",
        "right-managechangetags": "إنشاء و مسح [[Special:Tags|الوسوم]] من قاعدة البيانات",
        "newuserlogpage": "سجل اليوزرز الجداد",
        "newuserlogpagetext": "دا سجل لليوزرز الجداد",
        "sp-contributions-blocked-notice": "اليوزر ده ممنوع دلوقتى.\nآخر عمليه منع في السجل موجوده تحت كمرجع:",
        "sp-contributions-search": "دور على مساهمات",
        "sp-contributions-username": "عنوان أيبى أو اسم يوزر:",
-       "sp-contributions-toponly": "اظÙ\87ر Ø§Ø®ØªÙ\8aر ØªØ¹Ø¯Ù\8aÙ\84  Ø¨Ø³",
+       "sp-contributions-toponly": "اظهر اخر تعديل  بس",
        "sp-contributions-submit": "تدوير",
        "whatlinkshere": "ايه بيوصل هنا",
        "whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
index 8a6dc4c..d8c3adf 100644 (file)
        "searcharticle": "Dir",
        "history": "Historial de la páxina",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "anovada dende la mio visita cabera",
        "printableversion": "Versión pa imprentar",
        "permalink": "Enllaz permanente",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "blockedtext": "'''El to nome d'usuariu o direición IP ta bloquiáu.'''\n\nEl bloquéu fexolu $1.\nEl motivu conseñáu ye ''$2''.\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.\nNun pues usar la función 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de\ncorréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "autoblockedtext": "La to direición IP bloquióse automáticamente porque usóla otru usuariu que foi bloquiáu por $1.\nEl motivu conseñáu ye:\n\n:''$2''\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] p'aldericar sobre'l bloquéu.\n\nTen en cuenta que nun pues usar la función «manda-y un corréu electrónicu a esti usuariu» a nun ser que tengas rexistrada una direición de corréu electrónicu válida nes [[Special:Preferences|preferencies d'usuariu]] y que nun tengas torgao usala.\n\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
+       "systemblockedtext": "El to nome d'usuariu o dirección IP bloquióse automáticamente pol software MediaWiki.\nEl motivu dau ye:\n\n:<em>$2</em>\n\n* Entamu del bloquéu: $8\n* Caducidá de bloquéu: $6\n* Destinatariu del bloquéu: $7\n\nLa to dirección IP actual ye $3.\nPor favor, incluye tolos anteriores en cualquier consulta que faigas.",
        "blockednoreason": "nun se dio nengún motivu",
        "whitelistedittext": "Tienes d'$1 pa editar páxines.",
        "confirmedittext": "Tienes de confirmar la direición de corréu electrónicu enantes d'editar páxines.\nPor favor, configura y valida la direición de corréu nes [[Special:Preferences|preferencies d'usuariu]].",
        "saveprefs": "Guardar",
        "restoreprefs": "Restaurar tolos axustes predeterminaos (en toles seiciones)",
        "prefs-editing": "Edición",
-       "rows": "Fileres:",
-       "columns": "Columnes:",
        "searchresultshead": "Buscar",
        "stub-threshold": "Llende superior pa dar formatu d'entamu a un enllaz ($1):",
        "stub-threshold-sample-link": "exemplu",
        "userrights-user-editname": "Escribe un nome d'usuariu:",
        "editusergroup": "Cargar los grupos d'usuariu",
        "editinguser": "Camudando los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Viendo los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar los grupos d'usuariu",
+       "userrights-viewusergroup": "Ver los grupos d'usuariu",
        "saveusergroups": "Guardar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
        "userrights-groupsmember": "Miembru de:",
        "userrights-groupsmember-auto": "Miembru implícitu de:",
        "action-upload_by_url": "xubir esti ficheru dende una URL",
        "action-writeapi": "usar l'API d'escritura",
        "action-delete": "desaniciar esta páxina",
-       "action-deleterevision": "desaniciar esta revisión",
-       "action-deletedhistory": "ver l'historial elimináu d'esta páxina",
+       "action-deleterevision": "desaniciar revisiones",
+       "action-deletelogentry": "desaniciar les entraes del rexistru",
+       "action-deletedhistory": "ver l'historial elimináu d'una páxina",
+       "action-deletedtext": "ver el testu d'una revisión desaniciada",
        "action-browsearchive": "buscar páxines desaniciaes",
-       "action-undelete": "restaurar esta páxina",
-       "action-suppressrevision": "revisar y restaurar esta revisión tapecida",
+       "action-undelete": "restaurar páxines",
+       "action-suppressrevision": "revisar y restaurar revisiones tapecíes",
        "action-suppressionlog": "ver esti rexistru priváu",
        "action-block": "bloquiar qu'esti usuariu edite",
        "action-protect": "camudar los niveles de proteición pa esta páxina",
        "action-userrights-interwiki": "editar los permisos d'usuariu de los usuarios d'otres wikis",
        "action-siteadmin": "candar o descandar la base de datos",
        "action-sendemail": "unviar correos",
+       "action-editmyoptions": "editar les preferencies propies",
        "action-editmywatchlist": "editar la llista de vixilancia",
        "action-viewmywatchlist": "ver la llista de vixilancia propia",
        "action-viewmyprivateinfo": "ver la so información privada",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Amosar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-search-placeholder": "Filtriar los cambeos recién (restola o empieza a escribir)",
+       "rcfilters-invalid-filter": "Filtru inválidu",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
+       "rcfilters-filtergroup-registration": "Rexistru del usuariu",
+       "rcfilters-filter-registered-label": "Rexistraos",
+       "rcfilters-filter-registered-description": "Editores coneutaos.",
+       "rcfilters-filter-unregistered-label": "Non rexistraos",
+       "rcfilters-filter-unregistered-description": "Editores ensin coneutar.",
+       "rcfilters-filtergroup-authorship": "Editar autoría",
+       "rcfilters-filter-editsbyself-label": "Les tos propies ediciones",
+       "rcfilters-filter-editsbyself-description": "Ediciones de to",
+       "rcfilters-filter-editsbyother-label": "Ediciones d'otros",
+       "rcfilters-filter-editsbyother-description": "Ediciones creaes por otros usuarios (non por ti).",
+       "rcfilters-filtergroup-userExpLevel": "Nivel d'esperiencia (solo pa usuarios rexistraos)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recién llegaos",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 ediciones y 4 díes d'actividá.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
+       "rcfilters-filter-userExpLevel-learner-description": "Más díes d'actividá y ediciones que los «Recién llegaos», pero menos que los «Usuarios espertos».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuarios espertos",
+       "rcfilters-filter-userExpLevel-experienced-description": "Más de 30 díes d'actividá y 500 ediciones.",
+       "rcfilters-filtergroup-automated": "Contribuciones automátiques",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Ediciones feches con ferramientes automátiques.",
+       "rcfilters-filter-humans-label": "Ser humanu (non bot)",
+       "rcfilters-filter-humans-description": "Ediciones feches por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significación",
+       "rcfilters-filter-minor-label": "Ediciones menores",
+       "rcfilters-filter-minor-description": "Ediciones que l'autor etiquetó como menores.",
+       "rcfilters-filter-major-label": "Ediciones non menores",
+       "rcfilters-filter-major-description": "Ediciones ensin etiquetar como menores.",
+       "rcfilters-filtergroup-changetype": "Tipu de cambéu",
+       "rcfilters-filter-pageedits-label": "Ediciones de páxines",
+       "rcfilters-filter-pageedits-description": "Ediciones del conteníu wiki, alderiques, descripciones de categoríes...",
+       "rcfilters-filter-newpages-label": "Creaciones de páxines",
+       "rcfilters-filter-newpages-description": "Ediciones nes que se creen páxines nueves.",
+       "rcfilters-filter-categorization-label": "Cambeos de categoríes",
+       "rcfilters-filter-categorization-description": "Rexistros de les páxines que s'añaden o borren de categoríes.",
+       "rcfilters-filter-logactions-label": "Aiciones rexistraes",
+       "rcfilters-filter-logactions-description": "Aiciones alministratives, creación de cuentes, desanicios de páxines, xubíes de ficheros...",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
        "uncategorizedcategories": "Categoríes non categorizaes",
        "uncategorizedimages": "Archivos non categorizaos",
        "uncategorizedtemplates": "Plantíes non categorizaes",
+       "uncategorized-categories-exceptionlist": "# Contien una llista de categoríes que nun tendríen d'apaecer en Special:UncategorizedCategories. Una categoría per llinia, empezando por «*». Nun se tienen en cuenta les llinies qu'empiecen con otru caráuter (espacios en blancu incluyíos). Usa «#» p'añadir comentarios.",
        "unusedcategories": "Categoríes non usaes",
        "unusedimages": "Imáxenes non usaes",
        "wantedcategories": "Categoríes buscaes",
        "emailccsubject": "Copia del to mensaxe a $1: $2",
        "emailsent": "Corréu unviáu",
        "emailsenttext": "Unviose'l to mensaxe de corréu.",
-       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}. Unviaráse'l {{GENDER:$2|to}} corréu direutamente {{GENDER:$1|al remitente|a la remitente}} orixinal, {{GENDER:$1|revelando-y}} la {{GENDER:$2|to}} direición de corréu.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
        "watchlist": "Llista de siguimientu",
        "changecontentmodel-emptymodels-title": "Nun hai modelos de conteníu disponibles",
        "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun pue convertise a nengún tipu.",
        "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu",
-       "log-description-contentmodel": "Socesos rellacionaos colos modelos de conteníu d'una páxina",
+       "log-description-contentmodel": "Esta páxina recueye los cambeos nel modelu de conteníu de les páxines, y les páxines creaes con un modelu de conteníu distintu del predetermináu.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la páxina $3 usando un modelu de conteníu non predetermináu «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}}'l modelu de conteníu de la páxina $3 dende «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "revertir",
        "proxyblockreason": "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.",
        "sorbsreason": "La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.",
        "sorbs_create_account_reason": "La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta",
+       "softblockrangesreason": "Nun se permiten les contribuciones anónimes dende la to dirección IP ($1). Por favor, anicia sesión.",
        "xffblockreason": "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
        "cant-see-hidden-user": "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.\nComo nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
        "ipbblocked": "Nun pues bloquiar o desbloquiar a otros usuarios, porque tas bloquiáu tu mesmu",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
        "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
        "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
+       "cant-move-subpages": "Nun tienes permisu pa mover subpáxines.",
+       "namespace-nosubpages": "L'espaciu de nomes «$1» nun permite subpáxines.",
        "newtitle": "Títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "pageinfo-length": "Llonxitú de la páxina (en bytes)",
        "pageinfo-article-id": "ID de la páxina",
        "pageinfo-language": "Llingua del conteníu de la páxina",
+       "pageinfo-language-change": "camudar",
        "pageinfo-content-model": "Plantía del conteníu de la páxina",
        "pageinfo-content-model-change": "camudar",
        "pageinfo-robot-policy": "Indexación por robots",
        "feedback-useragent": "Axente d'usuariu:",
        "searchsuggest-search": "Buscar en {{SITENAME}}",
        "searchsuggest-containing": "que contien...",
-       "api-error-autoblocked": "La to dirección IP bloquióse automáticamente porque la usó un usuariu bloquiáu.",
-       "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "api-error-badtoken": "Fallu internu: token incorreutu.",
-       "api-error-blocked": "Tas bloquiáu pa editar.",
-       "api-error-copyuploaddisabled": "Xubir d'una URL ta desactivao nesti sirvidor.",
-       "api-error-duplicate": "Yá hai {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
-       "api-error-empty-file": "El ficheru qu'unviasti taba baleru.",
        "api-error-emptypage": "Nun se permite la creación de páxines nueves baleres.",
-       "api-error-fetchfileerror": "Fallu internu: daqué nun funcionó al buscar el ficheru.",
-       "api-error-fileexists-forbidden": "Yá esiste un ficheru col nome «$1» y nun se pue sobrescribir.",
-       "api-error-fileexists-shared-forbidden": "Yá esiste un ficheru col nome «$1» nel repositoriu de ficheros compartíos, y nun se pue sobrescribir.",
-       "api-error-file-too-large": "El ficheru qu'unviasti yera demasiao grande.",
-       "api-error-filename-tooshort": "El nome de ficheru ye demasiao curtiu.",
-       "api-error-filetype-banned": "Esta triba de ficheru ta torgada.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun ye una triba de ficheru permitida|nun son tribes de ficheru permitíes}}. {{PLURAL:$3|La triba de ficheru permitida ye|Les tribes de ficheru permitíes son}} $2.",
-       "api-error-filetype-missing": "Al ficheru falta-y una estensión.",
-       "api-error-hookaborted": "La conexón con una estensión encaboxó el cambéu que tentasti facer.",
-       "api-error-http": "Fallu internu: Nun se pudo coneutar col sirvidor.",
-       "api-error-illegal-filename": "El nome de ficheru nun ta permitíu.",
-       "api-error-internal-error": "Fallu internu: daqué nun funcionó al procesar la xubida na wiki.",
-       "api-error-invalid-file-key": "Fallu internu: nun s'atopó el ficheru nel depósitu temporal.",
-       "api-error-missingparam": "Fallu internu: falten parámetros na solicitú.",
-       "api-error-missingresult": "Fallu internu: nun se pudo determinar si la copia foi bien.",
-       "api-error-mustbeloggedin": "Tienes de tar autenticáu pa xubir ficheros.",
-       "api-error-mustbeposted": "Fallu internu: la solicitú necesita HTTP POST.",
-       "api-error-noimageinfo": "La xubida foi correuta, pero el sirvidor nun dio información dala del ficheru.",
-       "api-error-nomodule": "Fallu internu: nun se configuró dengún módulu de xubíes.",
-       "api-error-ok-but-empty": "Fallu internu: nun hai respuesta del sirvidor.",
-       "api-error-overwrite": "Nun ta permitío sobroscribir un ficheru esistente.",
-       "api-error-ratelimited": "Tas tentando xubir más ficheros nun espaciu de tiempu más pequeñu del que permite esta wiki.\nTéntalo otra vuelta en dellos minutos.",
-       "api-error-stashfailed": "Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.",
        "api-error-publishfailed": "Fallu internu: el sirvidor nun pudo espublizar el ficheru temporal.",
-       "api-error-stasherror": "Hebo un error al xubir el ficheru al almacén.",
-       "api-error-stashedfilenotfound": "Nun s'alcontró'l ficheru na reserva al intentar cargalu dende allí.",
-       "api-error-stashpathinvalid": "El camín onde tenía qu'alcontrase'l ficheru de la reserva ye inválidu.",
-       "api-error-stashfilestorage": "Hebo un error al atroxar el ficheru nel depósitu.",
-       "api-error-stashzerolength": "El sirvidor nun pudo atroxar el ficheru nel depósitu porque tien tamañu cero.",
-       "api-error-stashnotloggedin": "Tienes d'aniciar sesión p'atroxar ficheros nel depósitu de carga.",
-       "api-error-stashwrongowner": "El ficheru al qu'intentabes acceder nel depósitu nun te pertenez.",
-       "api-error-stashnosuchfilekey": "La clave de ficheru a la qu'intentabes acceder nel depósitu nun esiste.",
-       "api-error-timeout": "El sirvidor nun respondió nel tiempu esperáu.",
-       "api-error-unclassified": "Hebo un fallu desconocíu",
-       "api-error-unknown-code": "Fallu desconocíu: «$1»",
-       "api-error-unknown-error": "Fallu internu: daqué nun funcionó al tentar xubir el ficheru.",
-       "api-error-unknown-warning": "Avisu desconocíu: $1",
+       "api-error-stashfailed": "Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.",
+       "api-error-unknown-warning": "Avisu desconocíu: «$1».",
        "api-error-unknownerror": "Fallu desconocíu: «$1».",
-       "api-error-uploaddisabled": "Les xubíes tan desactivaes nesta wiki.",
-       "api-error-verification-error": "Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.",
-       "api-error-was-deleted": "Anteriormente xubióse y desanicióse dempués un ficheru con esti nome.",
        "duration-seconds": "$1 {{PLURAL:$1|segundu|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "pagelang-language": "Llingua",
        "pagelang-use-default": "Usar la llingua predeterminada",
        "pagelang-select-lang": "Escoyer llingua",
+       "pagelang-reason": "Motivu",
        "pagelang-submit": "Unviar",
+       "pagelang-nonexistent-page": "La páxina $1 nun esiste.",
+       "pagelang-unchanged-language": "La páxina $1 yá ta configurada pal idioma $2.",
+       "pagelang-unchanged-language-default": "La páxina $1 yá ta configurada pal idioma del conteníu predetermináu de la wiki.",
+       "pagelang-db-failed": "La base de datos nun pudo camudar l'idioma de la páxina.",
        "right-pagelang": "Cambiar la llingua de la páxina",
        "action-pagelang": "cambiar la llingua de la páxina",
        "log-name-pagelang": "Rexistru de cambeos d'idioma",
        "log-action-filter-block-reblock": "Cambiu de bloquéu",
        "log-action-filter-block-unblock": "Desbloquéu",
        "log-action-filter-contentmodel-change": "Cambéu de modelu de conteníu",
-       "log-action-filter-contentmodel-new": "Creación de páxina con modelu de conteníu non estándar",
+       "log-action-filter-contentmodel-new": "Creación de páxina con modelu de conteníu non predetermináu",
        "log-action-filter-delete-delete": "Desaniciu de páxines",
        "log-action-filter-delete-delete_redir": "Sobreescritura de redireición",
        "log-action-filter-delete-restore": "Restauración de páxines",
        "usercssispublic": "Atención: les subpáxines CSS nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>",
+       "revid": "revisión $1",
+       "pageid": "ID de páxina $1"
 }
index e2ea9aa..c335429 100644 (file)
@@ -12,7 +12,7 @@
                        "Аль-Гимравий"
                ]
        },
-       "tog-underline": "Ð\9bинкал Ð³Ñ\8aоÑ\80кÑ\8cмÑ\83Ñ\85Ñ\8aизе",
+       "tog-underline": "РегÐ\86елазда Ð³Ñ\8aоÑ\80кÑ\8c Ð¼Ñ\83Ñ\85Ñ\8a Ð»Ñ\8aезе:",
        "tog-hideminor": "ЧӀахӀиял хиса-басиязул сияхӀалда дагьа-макъал хиса-басиял рахчизе",
        "tog-showtoolbar": "Хиса-басиял гьарулеб мехалда тӀасияб алатазул панель бихьизабизе",
        "tog-editondblclick": "КӀиго кӀутӀиялдалъун гьумералъул хиса-баси гьабизе",
        "moredotdotdot": "Жеги...",
        "morenotlisted": "Гьаб сияхӀ цӀураб гьечӀо",
        "mypage": "Гьумер",
-       "mytalk": "БахӀс",
+       "mytalk": "Гьоркьоб лъей",
+       "anontalk": "Гьоркьоб лъей",
        "navigation": "Навигация",
        "and": "&#32;ва",
        "qbfind": "ЦӀехезе",
        "qbbrowse": "Балагьизе",
        "qbedit": "Хисизабизе",
-       "qbpageoptions": "Гьемералъул рекъезаби",
+       "qbpageoptions": "Гьумералъул рекъезаби",
        "qbmyoptions": "Дур рекъезаби",
        "faq": "FAQ",
        "namespaces": "ЦӀаразул сияхӀ",
        "searchbutton": "Хъирщизе",
        "go": "Ине",
        "searcharticle": "Ине",
-       "history": "ХиÑ\81а-баÑ\81азул тарих",
+       "history": "ХиÑ\81а-баÑ\81иÑ\8fзул тарих",
        "history_short": "Тарих",
        "printableversion": "Басмалъул версия",
-       "permalink": "Даимаб линк",
+       "permalink": "Даимаб регІел",
        "print": "Басмаялда бахъизе",
        "view": "Балагьи",
        "view-foreign": "$1 сайталда балагьизе",
        "unprotectthispage": "Гьаб гьумералъул цӀуни хисизабизе",
        "newpage": "ЦIияб гьумер",
        "talkpage": "БахӀс",
-       "talkpagelinktext": "Ð\91аÑ\85\81",
+       "talkpagelinktext": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "specialpage": "Хъулухъияб гьумер",
        "personaltools": "Дур алатал",
-       "articlepage": "Ð\91алагÑ\8cизе Ð¼Ð°ÐºÑ\8aалаÑ\8fлда",
-       "talk": "Ð\91аÑ\85Ð\86Ñ\81",
+       "articlepage": "Ð\9cакÑ\8aалаÑ\8fлде Ð±Ð°Ð»Ð°Ð³Ñ\8cизе",
+       "talk": "Ð\93Ñ\8cоÑ\80кÑ\8cоб Ð»Ñ\8aей",
        "views": "Балагьиял",
        "toolbox": "Алатал",
-       "userpage": "ГӀахьалчиясул гьумер",
+       "userpage": "ГӀахьалчиясул гьумералъухъ балагьизе",
        "projectpage": "Проекталъул гьумералъухъ балагьизе",
        "imagepage": "Файлалъул гьумер балагьизе",
        "mediawikipage": "Кагъаталъул гьумер балагьизе",
        "otherlanguages": "Цоги мацӀазда",
-       "redirectedfrom": "(«$1» гьемералдасан гьаниб битӀана)",
+       "redirectedfrom": "(«$1» гьумералдасан гьаниб битӀана)",
        "redirectpagesub": "Цоги гьумералда сверизабураб гьумер",
        "redirectto": "Редирект:",
        "lastmodifiedat": "Ахирисеб нухалъ гьаб гьумералъул хиса-баси гьабуна:  $2, $1.",
        "jumptonavigation": "навигация",
        "jumptosearch": "хъирщизе",
        "pool-errorunknown": "Лъалареб гъалатӀ",
-       "aboutsite": "{{SITENAME}} хӀакъалъулъ",
+       "aboutsite": "{{GRAMMAR:prepositional|{{SITENAME}}}} хІакъалъулъ",
        "aboutpage": "Project:ХӀакъалъулъ",
        "currentevents": "Жакъасел лъугьа-бахъинал",
        "currentevents-url": "Project:Гьанжесел лъугьа-бахъинал",
        "disclaimerpage": "Project:Жавабчилъиялдасан инкар гьаби",
        "edithelp": "Хисизабиялъе кумек",
        "helppage-top-gethelp": "Кумек",
-       "mainpage": "БетӀераб гьумер",
-       "mainpage-description": "БетӀераб гьумер",
+       "mainpage": "БетІераб гьумер",
+       "mainpage-description": "БетІераб гьумер",
        "policy-url": "Project:КъагӀидаби",
        "portal": "ЖамгӀияб портал",
        "portal-url": "Project:Майдан",
        "createacct-reason-ph": "Щай дуца цогияб аккаунт гIуцIулеб бугеб",
        "createacct-submit": "Аккаунт гIуцIизе",
        "createacct-another-submit": "Цоги аккаунт гIуцIизе",
-       "createacct-benefit-heading": "{{SITENAME}} гӀуцӀун буго нужго гӀадинал гӀадамаца.",
+       "createacct-benefit-heading": "{{SITENAME}} — ккола нужго гӀадинал гӀадамазулги нужерги гІахьалаб хІалтІи.",
        "createacct-benefit-body1": "{{PLURAL:$1|хиса-баси}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|гьумер}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|гьумер|гьумерал}}",
        "createacct-benefit-body3": "Ахирисеб заманаялда жаниб {{PLURAL:$1|гIахьалчи}}",
        "badretype": "Дуца рихьизарурал паролал данде кколел гьечIо",
        "userexists": "Бихьизабураб гIахьалчиясул цIар цогияс хIалтIизабулеб буго.\nБегьулеб батани, дуего батIияб цIар бище.",
        "pt-createaccount": "Аккаунт рагьизе",
        "pt-userlogout": "КъватӀиве инзе",
        "passwordreset": "Парол хисизе",
+       "passwordreset-username": "ГІахьалчиясул цІар:",
        "resettokens-tokens": "Токенал:",
        "italic_sample": "Курсивалъулаб хъвай",
        "italic_tip": "Курсивалъулаб хъвай",
        "link_sample": "Линкалъул бетӀер",
-       "link_tip": "Ð\96аниÑ\81аб Ð»Ð¸Ð½Ðº",
+       "link_tip": "Ð\96аниÑ\81еб Ñ\80егÐ\86ел",
        "headline_sample": "БетIералъул текст",
        "headline_tip": "2-еб даражаялъул бетIер",
-       "media_tip": "Файлалъе линк",
+       "media_tip": "Файлалде регІел",
        "sig_tip": "Дур гъулбас ва гьабсагӀаталъ заман",
        "summary": "Дуца гьарурал хиса-басиял:",
        "subject": "Тема/бетӀер",
        "showdiff": "Гьарурал хиса-басиял",
        "loginreqlink": "Жаниве лъугьине",
        "newarticle": "(ЦIияб)",
+       "newarticletext": "РегІелаздасан нуж лъугьана жеги гІуцІун гьечІеб гьумералде.\nГьеб гІуцІизе бокьани, гъоркьехун текст хъвай (цІикІкІун лъазе бл. [$1 баяналъулаб гьумералде]).\nНуж гьанире гъалатІ ккун щварал ратани, гІицІго '''нахъе''' абураб кнопка мерхье дурго браузералъул.",
        "updated": "(ЦӀигьабуна)",
        "note": "<strong>ХӀужа:</strong>",
        "previewnote": "<strong>КӀочоге, мун гьабсагӀаталъ балагьула вуго макъалаялъул букӀине бугеб куцалъухъ.</strong>\nДуца гьарурал хиса-басиял цӀунун гьечӀо!",
        "lineno": "Мухъ $1:",
        "editundo": "нахъчӀвазе",
        "diff-empty": "(БатӀалъи гьечӀо)",
-       "searchresults": "ЦӀех-рехалъул хӀасилал",
+       "searchresults": "ЦІех-рехалъул хІасилал",
        "prevn": "{{PLURAL:$1|1=цебесалаб|цересел}} $1",
        "nextn": "{{PLURAL:$1|1=хадусалаб|хадусел}} $1",
        "prev-page": "Цебесеб гьумер",
        "searchprofile-everything-tooltip": "Киналго гьумеразда хъирщизе (бахӀсазул гьумераздагицин)",
        "search-result-size": "$1 ({{PLURAL:$2|$2 рагӀи|$2 рагӀи|$2 рагӀи}})",
        "searchall": "киналго",
+       "search-nonefound": "Дуца гьабураб цІех-рехалда данде кколеб щибго батичІо.",
+       "powersearch-ns": "ЦІарал рищун хъирщи:",
+       "powersearch-togglelabel": "ГІуж лъезе:",
        "powersearch-toggleall": "Киналго",
        "powersearch-togglenone": "Щибниги",
+       "powersearch-remember": "Дуца тІаса бищараб рекъезаби цІунизе хадубккун букІине бугеб хъирщиялъе",
        "search-external": "КъватIисеб цIехей",
        "preferences": "Рекъезаби",
        "mypreferences": "Рекъезаби",
        "action-upload": "гьаб файл жанибе цIазе",
        "enhancedrc-history": "тарих",
        "recentchanges": "ЦӀиял хиса-басиял",
+       "recentchanges-legend": "ЦІиял хиса-басиязул рекъезариял",
        "recentchanges-label-newpage": "Гьаб хиса-басигун цӀияб гьумер рагьана.",
        "recentchanges-label-minor": "Гьаб буго дагьа-макъаб хиса-баси",
        "recentchanges-label-bot": "Гьаб хиса-баси ботас гьабуна",
+       "recentchanges-label-unpatrolled": "Гьаб хиса-басиялъул жеги лъицаниги хал гьабичІо",
+       "recentchanges-label-plusminus": "байт роценалдалъун кIодолъи-гьитIинлъи хисизаби",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гьединго балагье [[Special:NewPages|цІиял гьумеразул сияхІалъухъ]])",
        "rcshowhideminor": "$1 гӀиси-микъинал хиса-басиял",
        "rcshowhideminor-show": "Бихьизабизе",
        "rcshowhideminor-hide": "Бахчизе",
        "rcshowhidemine": "$1 дир хиса-басиял",
        "rcshowhidemine-show": "Бихьизабизе",
        "rcshowhidemine-hide": "Бахчизе",
+       "rcshowhidecategorization": "Гьумерал категориязде бикьи $1",
+       "rclinks": "$2 къояйида жаниб гьабураб, ахирисеб $1 хиса-баси бихьизабизе<br />$3",
        "diff": "батӀалъи",
        "hist": "тарих",
        "hide": "Бахчизе",
        "booksources-search": "Хъирщизе",
        "specialloguserlabel": "ГӀахьалчи:",
        "log": "Журналал",
+       "logempty": "Журналалда данде кколел хъвай-хъвагІаял гьечІо.",
        "allarticles": "Киналго макъалаби",
-       "allpagessubmit": "Ð\98нзе",
+       "allpagessubmit": "ТÓ\80Ñ\83базабизе",
        "categories": "Категориял",
-       "watchlist": "Халгьабиялъул сияхӀ",
-       "mywatchlist": "Халгьабиялъул сияхӀ",
+       "watchlist": "Халгьабиялъул сияхІ",
+       "mywatchlist": "Халгьабиялъул сияхІ",
        "watch": "Хал кквезе",
        "namespace": "ЦӀаразул сияхӀ:",
+       "invert": "ТІасабищараб сверизабизе",
        "blanknamespace": "(Аслияб)",
        "contributions": "{{GENDER:$1|ГӀахьалчиясул}} хӀалтӀи",
        "mycontris": "Дур хӀалтӀи",
+       "sp-contributions-newbies": "ГІицІго, цІиял гІахьалчагІаз гьабураб хІалтІи бихьизабизе",
+       "sp-contributions-talk": "гьоркьоб лъей",
        "sp-contributions-userrights": "ГІахьалчиясул ихтиярал",
-       "whatlinkshere": "Гьанире линкал",
+       "sp-contributions-search": "ХІалтІи хъирщизе",
+       "sp-contributions-hideminor": "ГІиси-бикъинал хиса-басиял рахчизе",
+       "whatlinkshere": "Гьанире регІелал",
        "whatlinkshere-title": "«$1» гьумералда бухьен гьабулел гьумерал",
        "whatlinkshere-page": "Гьумер:",
+       "nolinkshere": "'''[[:$1]]''' гьумералде цоги гьумераздасан регІелал гьечІо.",
        "isredirect": "редирект-гьумер",
-       "isimage": "файлалъул линк",
+       "isimage": "файлалъул регІел",
        "whatlinkshere-prev": "{{PLURAL:$1|1=цебесеб|цересел}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=хадусеб|хадусел}} $1",
-       "whatlinkshere-links": "← линкал",
+       "whatlinkshere-links": "← регІелал",
        "whatlinkshere-hideredirs": "$1 редиректал",
        "whatlinkshere-hidelinks": "$1 линкал",
        "whatlinkshere-filters": "Фильтрал",
+       "whatlinkshere-submit": "ТӀубазабизе",
        "blockip": "ГІахьалчи блокалда лъезе",
        "ipbsubmit": "Гьав гІахьалчи/адрес блокалда лъезе",
        "ipb-confirmhideuser": "Нужеда ракІалда буго гІахьалчи блокалда лъезе ва гьесул цмар бахчизе. Гьеб загьирлъуларо сияхІазда ва журналазда. Гьеб гьабизе бокьун бугищ нужее?",
        "blocklink": "Блокалда лъезе",
        "contribslink": "хӀалтӀи",
        "move-page-legend": "Гьумералъул цӀар хисизе",
+       "newtitle": "ЦІияб цІар:",
+       "move-watch": "Басрияб ва цІияб цІаразул гьумерал дурго халкквеязул сияхІалде журазе",
        "movepagebtn": "Гьумералъул цӀар хисизе",
-       "movelogpage": "ЦӀарал хисиялъул журнал",
+       "movetalk": "Гьелдаго данде кколеб гьоркьоб лъеялъул гьумералъулги цІар хисизе",
+       "move-subpages": "($1 щвезегІан) гъоркьгьумеразул цІарал хисизе",
+       "movelogpage": "ЦІарал хисиялъул журнал",
+       "movesubpagetext": "Гьаб гьумералъул $1 {{PLURAL:$1|гъоркьгьумер|гъоркьгьумер|гъоркьгьумер}} буго.",
+       "move-leave-redirect": "Цоги рахъалдехун сверизабунин абураб ишара лъезе",
        "thumbnail-more": "КӀодолъизабизе",
        "tooltip-pt-userpage": "Дур гӀахьалчиясул гьумер",
        "tooltip-pt-mytalk": "Дур бахӀсалъул гьумер",
        "tooltip-n-recentchanges": "Ахирисел хиса-басиязул сияхӀ",
        "tooltip-n-randompage": "Цебе ккараб гьумералда балагьизе",
        "tooltip-n-help": "Баянал росизе кӀолеб бакӀ",
-       "tooltip-t-whatlinkshere": "Гьаб гьумералда линк гьабулелщинал гьумеразул сияхӀ",
+       "tooltip-t-whatlinkshere": "Гьаб гьумералда регІелал гьарулелщинал гьумеразул сияхІ",
        "tooltip-t-upload": "Файлал цІазе",
        "tooltip-t-specialpages": "Хъулухъиял гьумеразул сияхӀ",
        "tooltip-t-print": "Гьаб гьумералъул басмаялъул сверел",
        "tooltip-ca-nstab-main": "Аслияб гьумер бихьизабизе",
-       "tooltip-ca-nstab-user": "ГӀахьалчиясул гьумер",
+       "tooltip-ca-nstab-user": "ГІахьалчиясул хасаб гьумер",
        "tooltip-ca-nstab-special": "Гьаб буго хъулухъияб гьумер. Гьаб хисизабизе данде кколаро.",
        "tooltip-ca-nstab-image": "Файлалъул гьумер",
        "tooltip-save": "Дуца гьарурал хиса-басиял цӀунизе",
        "exif-orientation-1": "Нормалияб",
        "namespacesall": "киналго",
        "monthsall": "киналго",
+       "table_pager_limit_submit": "ТӀубазабизе",
        "hijri-calendar-m1": "МухІаррам",
        "hijri-calendar-m3": "РабигІул-Аввал",
        "hijri-calendar-m4": "РабигІу Ссани",
index fcaa1bb..d06e28e 100644 (file)
        "accmailtext": "[[User talk:$1|$1]] اوچون بیر راست‌گله رمز یارادیلیب و $2-ه گؤندریلدی.\n\nبو یئنی حسابین رمزی، گیرندن سونرا <em>[[Special:ChangePassword|رمز دَییشدیرمه]]</em> صحیفه‌سیندن دَییشیله بیلر.",
        "newarticle": "(یئنی)",
        "newarticletext": "مووجود اوْلمايان صفحه‌‌يه اوْلان لینکی ایزله‌دینیز. \nآشاغیداکی یئره یازیلارینیزی يازیب، بۇ صفحه‌‌نی '''سیز''' يارادا بیلرسینیز. (آرتیق معلومات اۆچون [$1 کؤمک صفحه‌‌سینه] باخین). اگر بۇ صفحه‌‌يه ایشتباه گلمیسینیزسه تکجه براوزرین '''قایید''' دۆيمه‌سینه وۇرون.",
-       "anontalkpagetext": "''بو صحیفه قئیدیات‌دان کئچممیش و یا داخیل اولمامیش آنونیم ایستیفادچییه عایید موذاکیره صحیفه‌سی‌دیر.\nاونا گؤره بو ایستیفادچینی رقم‌لردن عبارت ایپ اونوانی ایله معین ائتمک مجبوریتیندییک.\nبئله ایپ اونوان بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز آنونیم ایستیفادچیسینیزسه و بو مئساژین سیزه عایید اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:CreateAccount|قئیدیات‌دان کئچین]] و یا [[Special:UserLogin|داخی اولون]].''",
+       "anontalkpagetext": "----<em>بو صفحه حسابسیز و یا سیستمه گیرمه میش تانیلماز ایشلدنه مربوط دانیشیق صفحه‌سی‌دیر.\nاونا گؤره بو ایشلدنی رقم‌لردن عبارت ایپی آدرسی ایله بللیلشدیریلیبدیر.</em>\nبئله آیپی آدرسی بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز تانیلماز ایشلدنسینیز و بو پیامین سیزه مربوط اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:CreateAccount|حساب یارادین]] و یا [[Special:UserLogin|سیستمه گیرین]].''",
        "noarticletext": "ایندی بو صفحه‌ده یازی یوخدور.\nسیز آیری صفحه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]،\nیا دا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باغلی قئیدلری آختارا بیلرسیز]،\nیا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صفحه‌نی دَییشدیره بیلرسیز]</span>.",
        "noarticletext-nopermission": "بو صحیفه‌‌ ایندی بوشدور. \nباشقا صحیفه‌‌لرده عینی آددا صحیفه‌‌نی  [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],\nو يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.",
        "missing-revision": "«{{FULLPAGENAME}}» صحیفه‌سی اوچون $1 نومره‌لی نوسخه یوخدور.\n\nعموماُ بو ایشکال، واختی گئچمیش بیر باغلانتی ایله سیلینمیش بیر صحیفه‌یه گلنده، قاباغا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمک سیاهی]‌سینده باشقا بیلگیلر اولا بیلر.",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "brokenredirects-edit": "دَییشدیر",
        "brokenredirects-delete": "سیل",
-       "withoutinterwiki": "دیل باغلانتیلاری اولمایان صحیفه‌لر",
+       "withoutinterwiki": "دیل باغلانتیلاری اولمایان صفحه‌لر",
        "withoutinterwiki-summary": "آشاغیداکی صفحه‌لر، آیری دیل‌لره باغلانتیلاری یوخدور.",
        "withoutinterwiki-legend": "اؤن‌اَک",
        "withoutinterwiki-submit": "گؤستر",
index ce5b1f9..03531a6 100644 (file)
        "about": "Тасуирлау",
        "article": "Мәҡәлә",
        "newwindow": "(яңы биттә)",
-       "cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "moredotdotdot": "Дауамы...",
        "morenotlisted": "Был исемлек тулы түгел",
        "mypage": "Бит",
        "views": "Ҡарауҙар",
        "toolbox": "Ҡоралдар",
        "tool-link-userrights": "{{GENDER:$1|Ҡатнашыусы}} төркөмдәрен үҙгәртергә",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Ҡатнашыусы|Ҡатнашыулар}} төркөмдәрен ҡарарға",
        "tool-link-emailuser": "{{GENDER:$1|Ҡатнашыусыға}} хат яҙырға",
        "userpage": "Ҡулланыусы битен ҡарарға",
        "projectpage": "Проект битен ҡарарға",
        "title-invalid-too-long": "Һоралған бит исеме бик оҙон. $1 {{PLURAL:$1|байттан}} артмаҫҡа тейеш.",
        "title-invalid-leading-colon": "Һораған бит башында ярамаған ике нөктә бар.",
        "perfcached": "Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.",
-       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана",
+       "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе $4 {{PLURAL:$4|яҙма}} һаҡлана.",
        "querypage-no-updates": "Был битте яңыртыу хәҙер тыйылған.\nБында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.",
        "viewsource": "Сығанаҡты ҡарау",
        "viewsource-title": "$1 битенең сығанаҡ текстын ҡарарға",
        "createacct-yourpasswordagain-ph": "Серһүҙҙе тағы бер тапҡыр яҙығыҙ",
        "userlogin-remembermypassword": "Системала ҡалырға",
        "userlogin-signwithsecure": "Һаҡланыулы тоташыу",
+       "cannotlogin-title": "инеп булмай",
+       "cannotlogin-text": "Инеү мөмкин түгел",
        "cannotloginnow-title": "Хәҙер үк инеп булмай",
        "cannotloginnow-text": "$1 файҙалланған ваҡытта инергә ярамай",
+       "cannotcreateaccount-title": "Иҫәп яҙмаһын булдырып булмай",
+       "cannotcreateaccount-text": "Был викила иҫәп яҙмаһын булдырыу ҡаралмаған.",
        "yourdomainname": "Һеҙҙең домен",
        "password-change-forbidden": "Был викиҙа серһүҙегеҙҙе үҙгәртә алмайһығыҙ.",
        "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.",
        "eauthentsent": "Күрһәтелгән электрон почта адресына адресты үҙгәртеүҙе раҫлауығыҙ өсөн хат ебәрелде. Хатта был адрес һеҙҙеке булғанын раҫлау өсөн ниндәй ғәмәлдәрҙе үтәү кәрәклеге тураһында мәғлүмәт бар.",
        "throttled-mailpassword": "Серһүҙҙе иҫләтеү ғәмәле {{PLURAL:$1|һуңғы $1 сәғәт}} эсенде ҡулланылды инде.\nНасар ниәтле ҡулланыуҙарға ҡаршы, Серһүҙ иҫләтеү ғәмәлен {{PLURAL:$1|1=сәғәт|$1 сәғәт}} эсендә бер тапҡыр ғына ҡулланырға була.",
        "mailerror": "Хат ебәреү хатаһы: $1",
-       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар.",
+       "acct_creation_throttle_hit": "Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар. Был ваҡыт эсендә $2 тапҡыр инеп була.",
        "emailauthenticated": "Электрон почта адресығыҙ раҫланды: $3, $2.",
        "emailnotauthenticated": "Электрон почта адресығыҙ раҫланмаған әле. Киләһе ғәмәлдәр өсөн электрон почта эшләмәйәсәк.",
        "noemailprefs": "Электрон почта адресығыҙ күрһәтелмәгән, шул сәбәпле викиның электрон почта функциялары ябыҡ.",
        "resetpass_submit": "Серһүҙ ҡуйырға һәм танышырға",
        "changepassword-success": "Серһүҙегеҙ уңышлы үҙгәртелде!",
        "changepassword-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
-       "botpasswords": "Роботтар серһүҙе.",
+       "botpasswords": "Роботтар серһүҙе",
        "botpasswords-summary": "<em>ПРобот пароле</em> API иҫәп яҙмаһына логин һәм паролһыҙ инергә мөмкинлек бирә. Робот пароле менән ингәндә ҡулланыусы хоҡуғы сикләнгән булыуы мөмкин.\n\nНи өсөн икәнен белмәһәгеҙ, быны эшләмәүегеҙ яҡшыраҡ.",
        "botpasswords-disabled": "Роботтар серһүҙе һүндерелгән.",
        "botpasswords-no-central-id": "Робот серһүҙен ҡулланыу өсөн үҙәк иҫәп яҙмаһына инергә кәрәк.",
        "botpasswords-updated-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе яңыртылды.",
        "botpasswords-deleted-title": "Робот серһүҙе юйылды.",
        "botpasswords-deleted-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе юйылды.",
-       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em>",
+       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em><strong>$3</strong> ҡатнашыусы исеме <strong>$4</strong> пароль сифаты)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ғәмәлдә түгел.",
        "botpasswords-restriction-failed": "Робот серһүҙе менән бәйле сәбәптәр булғанға инеү башҡарылманы.",
        "botpasswords-invalid-name": "Күрһәтелгән ҡулланыусы исемендә робот $1 серһүҙен бүлеүсе тамға юҡ.",
        "resetpass_forbidden-reason": "Серһүҙҙәр үҙгәртелә алмай: $1",
        "resetpass-no-info": "Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.",
        "resetpass-submit-loggedin": "Серһүҙҙе үҙгәртергә",
-       "resetpass-submit-cancel": "Ð\91Ó©Ñ\82Ó©Ñ\80Ó©Ñ\80гÓ\99",
+       "resetpass-submit-cancel": "Ð\9aиÑ\80е Ð°Ð»Ñ\8bÑ\80Ò\93а",
        "resetpass-wrong-oldpass": "Хаталы ваҡытлыса йәки ағымдағы серһүҙ.\nҺеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.",
        "resetpass-recycled": "Үҙегеҙҙекенән айырмалы серһүҙ һайлағыҙ.",
        "resetpass-temp-emailed": "Һеҙ электорон почта аша ебәрелгән ваҡытлыса серһүҙ менән индегеҙ. Инеүҙе башҡарыу өсөн яңы серһүҙ яҙығыҙ.",
        "saveprefs": "Һаҡларға",
        "restoreprefs": "Алдан ҡуйылған көйләүҙәрҙе тергеҙергә",
        "prefs-editing": "Мөхәррирләү",
-       "rows": "Юлдар:",
-       "columns": "Бағаналар:",
        "searchresultshead": "Эҙләү",
        "stub-threshold": "Яһалма һылтамаларҙың биҙәлеше буйынса сикләүҙәр ($1):",
        "stub-threshold-sample-link": "миҫал",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "{{SITENAME}} эсендә эҙләү",
        "searchsuggest-containing": "эстәлегендә...",
-       "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
-       "api-error-blocked": "Мөхәррирләү һеҙҙең өсөн бикләнде.",
-       "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
-       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
-       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
-       "api-error-empty-file": "Һеҙ ебәргән файл буш.",
        "api-error-emptypage": "Яңы буш биттәр яһау тыйыла.",
-       "api-error-fetchfileerror": "Эске хата: файлды күсергән ваҡытта хата китте",
-       "api-error-fileexists-forbidden": "«$1» исемле файл бар һәм өҫтөнә яҙып булмай.",
-       "api-error-fileexists-shared-forbidden": "«$1» исемле файл уртаҡ файлдар һаҡлағысында бар һәм өҫтөнә яҙып булмай.",
-       "api-error-file-too-large": "Һеҙ ебәргән файл үтә ҙур.",
-       "api-error-filename-tooshort": "Файл исеме бик ҡыҫҡа.",
-       "api-error-filetype-banned": "Был файл төрө тыйылған.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|1=тыйылған файл төрө|тыйылған файл төрҙәре}}. Рөхсәт ителгән {{PLURAL:$3|1=файл төрө|файл төрҙәре}} $2.",
-       "api-error-filetype-missing": "Был файлдың ҡушымтаһы юҡ",
-       "api-error-hookaborted": "Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө",
-       "api-error-http": "Эске хата: серверға бәйләнеп булмай.",
-       "api-error-illegal-filename": "Рөхсәт ителмәгән файл исеме.",
-       "api-error-internal-error": "Эске хата: һеҙ викиға йөкләгәнде тикшергән ваҡытта хата китте",
-       "api-error-invalid-file-key": "Эске хата: ваҡытлыса һаҡлағыста файл табылманы",
-       "api-error-missingparam": "Эске хата: мөрәжәғеттең параматрҙары юҡ.",
-       "api-error-missingresult": "Эске хата: күсереү уңышлы булыуын билдәләп булманы.",
-       "api-error-mustbeloggedin": "Файлдарҙы йөкмәтеү өсөн һеҙ сисемаға танышырға тейешһегеҙ.",
-       "api-error-mustbeposted": "Эске хата: мөрәжәғәт HTTP POST адресын талап итә.",
-       "api-error-noimageinfo": "Йөкләү уңышлы тамамланды, әммә сервер файл тураһында бер ниндәйҙә мәғлүмәт бирмәне.",
-       "api-error-nomodule": "Эске хата: тейәү модуле көйләнмәгән.",
-       "api-error-ok-but-empty": "Эске хата: серверҙан яуап юҡ.",
-       "api-error-overwrite": "Булған файлды алыштырыу рөхсәт ителмәй.",
-       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-publishfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
-       "api-error-stasherror": "Файлы һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashedfilenotfound": "Ваҡытлыса һаҡлағыстан файлы тейәгән ваҡытта сығанаҡ файл табылманы.",
-       "api-error-stashpathinvalid": "Ваҡытлыса һаҡлағыста урынлашҡан файл юлы дөрөҫ түгел.",
-       "api-error-stashfilestorage": "Файлды һаҡлағысҡа тейәгән ваҡытта хата китте.",
-       "api-error-stashzerolength": "Сервер файлды ваҡытлыса һаҡлағыста һаҡлау алмай, сөнкт оҙонлоғо 0.",
-       "api-error-stashnotloggedin": "Файлды ваҡытлыса һаҡлағысҡа урынлаштырыу өсөн һеҙ системаҡа инергә тейешһегеҙ.",
-       "api-error-stashwrongowner": "Ваҡытлыса һаҡлағыстағы файлда асырға теләнегеҙ, был файл һеҙҙеке түгел",
-       "api-error-stashnosuchfilekey": "Ваҡытлыса һаҡлағыста һеҙ асырға теләгән файлдың асҡысы юҡ.",
-       "api-error-timeout": "Көтөлгән ваҡыт эсендә сервер яуып бирмәне.",
-       "api-error-unclassified": "Билдәһеҙ хата барлыҡҡа килде.",
-       "api-error-unknown-code": "Билдәһеҙ хата: «$1»",
-       "api-error-unknown-error": "Эске хата: файлды йөкләгәндә ниндәйҙер хата китте.",
+       "api-error-stashfailed": "Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.",
        "api-error-unknown-warning": "Билдәһеҙ белдереү: \"$1\".",
        "api-error-unknownerror": "Билдәһеҙ хата: «$1»",
-       "api-error-uploaddisabled": "Был викила файл тейәү мөмкинлеге ябылған.",
-       "api-error-verification-error": "Был файл боҙолған, йәки дөрөҫ булмаған ҡушымтаһы бар.",
        "duration-seconds": "$1 {{PLURAL:$1|1=секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|1=минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|1=сәғәт|сәғәт}}",
index 61a8ce4..1aa6e36 100644 (file)
        "searcharticle": "Старонка",
        "history": "Гісторыя старонкі",
        "history_short": "Гісторыя",
+       "history_small": "гісторыя",
        "updatedmarker": "абноўлена з часу майго апошняга наведваньня",
        "printableversion": "Вэрсія для друку",
        "permalink": "Сталая спасылка",
        "blockedtitle": "Удзельнік заблякаваны",
        "blockedtext": "<strong>Ваш рахунак удзельніка ці IP-адрас быў заблякаваны.</strong>\n\nБлякаваньне выканаў $1.\nПрычына гэтага: <em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне. Заўважце, што Вы ня зможаце ўжыць магчымасьць «даслаць ліст па электроннай пошце», пакуль не пазначыце сапраўдны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], і калі гэта Вам не было забаронена.\nВаш IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што Вы будзеце рабіць.",
        "autoblockedtext": "Ваш IP-адрас быў аўтаматычна заблякаваны, таму што ён ужываўся іншым удзельнікам, які быў заблякаваны $1.\nПрычына гэтага:\n\n:<em>$2</em>\n\n* Блякаваньне пачалося: $8\n* Блякаваньне скончыцца: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці з адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне.\n\nЗаўважце, што Вы ня зможаце ўжываць магчымасьць «даслаць ліст праз электронную пошту», пакуль ня будзе пазначаны дзейны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах удзельніка]], і калі гэта Вам не было забаронена.\n\nВаш цяперашні IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што Вы будзеце рабіць.",
+       "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблякаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не пазначана",
        "whitelistedittext": "Вам трэба $1, каб рэдагаваць старонкі.",
        "confirmedittext": "Вы мусіце пацьвердзіць Ваш адрас электроннай пошты перад рэдагаваньнем старонак. Калі ласка, пазначце і пацьвердзіце адрас электроннай пошты праз Вашы [[Special:Preferences|налады]].",
        "editingold": "<strong>Папярэджаньне: вы рэдагуеце састарэлую вэрсію гэтай старонкі.</strong>\nКалі вы паспрабуеце захаваць яе, любыя зьмены, зробленыя пасьля гэтай вэрсіі, будуць страчаныя.",
        "yourdiff": "Адрозьненьні",
        "copyrightwarning": "Калі ласка, зьвярніце ўвагу на тое, што ўсе дадаткі і зьмены ў {{GRAMMAR:месны|{{SITENAME}}}} разглядаюцца як выдадзеныя ў адпаведнасьці з умовамі ліцэнзіі $2 (глядзіце падрабязнасьці на $1). Калі вы супраць таго, каб вашыя матэрыялы неабмежавана рэдагавалася і распаўсюджвалася, не дадавайце іх.<br />\nВы таксама абавязуецеся, што ваш матэрыял напісаны асабіста вамі або зьяўляецца грамадзкім набыткам, альбо ўзяты з падобных вольных крыніцаў.\n<strong>Нельга без дазволу дадаваць матэрыялы, абароненыя аўтарскім правам!</strong>",
-       "copyrightwarning2": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ð°Ñ\9eважÑ\86е, Ñ\88Ñ\82о Ñ\9eвеÑ\81Ñ\8c Ñ\83нÑ\91Ñ\81ак Ñ\9e {{GRAMMAR:вÑ\96навалÑ\8cнÑ\8b|{{SITENAME}}}} Ð¼Ð¾Ð¶Ð° Ñ\80Ñ\8dдагаваÑ\86Ñ\86а, Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\86а Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\86а Ñ\96нÑ\88Ñ\8bмÑ\96 Ñ\9eдзелÑ\8cнÑ\96камÑ\96.\nÐ\9aалÑ\96 Ð\92Ñ\8b Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð½Ñ\8f Ð·Ð³Ð¾Ð´Ð½Ñ\8bÑ\8f, ÐºÐ°Ð»Ñ\96 Ð»Ð°Ñ\81ка, Ð½Ðµ Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\81Ñ\8eдÑ\8b Ð\92аÑ\88Ñ\8bÑ\8f Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\8b.<br />\nРазÑ\8cмÑ\8fÑ\88Ñ\87Ñ\8dнÑ\8cнем Ñ\82Ñ\83Ñ\82 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e, Ð\92Ñ\8b Ð´Ñ\8dклÑ\8fÑ\80Ñ\83еÑ\86е, Ñ\88Ñ\82о Ð\92Ñ\8b Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86еÑ\81Ñ\8f Ñ\96Ñ\85 Ð°Ñ\9eÑ\82аÑ\80ам, Ñ\86Ñ\96 Ð\92Ñ\8b Ñ\81капÑ\96Ñ\8fвалÑ\96 Ñ\96Ñ\85 Ð· ÐºÑ\80Ñ\8bнÑ\96Ñ\86Ñ\8b, Ñ\8fкаÑ\8f Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fе Ð²Ð¾Ð»Ñ\8cнае Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81ваÑ\96Ñ\85 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e (дзелÑ\8f Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð³Ð»Ñ\8fдзÑ\96Ñ\86е $1).\n\n'''Ð\9aÐ\90Ð\9bÐ\86 Ð\9bÐ\90СÐ\9aÐ\90, Ð\9dÐ\95 Ð\97ЬÐ\9cЯШЧÐ\90Ð\99ЦÐ\95 Ð¢Ð£Ð¢ Ð\91Ð\95Ð\97 Ð\94Ð\90Ð\97Ð\92Ð\9eÐ\9bУ Ð\9cÐ\90ТЭРЫЯÐ\9bЫ, Ð¯Ð\9aÐ\86Я Ð\90Ð¥Ð\9eÐ\8eÐ\92Ð\90ЮЦЦÐ\90 Ð\90Ð\8eТÐ\90РСÐ\9aÐ\86Ð\9c Ð\9fРÐ\90Ð\92Ð\90Ð\9c!'''",
+       "copyrightwarning2": "Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð·Ð°Ñ\9eважÑ\86е, Ñ\88Ñ\82о Ñ\9eвеÑ\81Ñ\8c Ñ\83нÑ\91Ñ\81ак Ñ\9e {{GRAMMAR:вÑ\96навалÑ\8cнÑ\8b|{{SITENAME}}}} Ð¼Ð¾Ð¶Ð° Ñ\80Ñ\8dдагаваÑ\86Ñ\86а, Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\86а Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\86а Ñ\96нÑ\88Ñ\8bмÑ\96 Ñ\9eдзелÑ\8cнÑ\96камÑ\96.\nÐ\9aалÑ\96 Ð²Ñ\8b Ð· Ð³Ñ\8dÑ\82Ñ\8bм Ð½Ñ\8f Ð·Ð³Ð¾Ð´Ð½Ñ\8bÑ\8f, ÐºÐ°Ð»Ñ\96 Ð»Ð°Ñ\81ка, Ð½Ðµ Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\81Ñ\8eдÑ\8b Ð\92аÑ\88Ñ\8bÑ\8f Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\8b.<br />\nРазÑ\8cмÑ\8fÑ\88Ñ\87Ñ\8dнÑ\8cнем Ñ\82Ñ\83Ñ\82 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e, Ð²Ñ\8b Ð´Ñ\8dклÑ\8fÑ\80Ñ\83еÑ\86е, Ñ\88Ñ\82о Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86еÑ\81Ñ\8f Ñ\96Ñ\85 Ð°Ñ\9eÑ\82аÑ\80ам, Ñ\86Ñ\96 Ñ\81капÑ\96Ñ\8fвалÑ\96 Ñ\96Ñ\85 Ð· ÐºÑ\80Ñ\8bнÑ\96Ñ\86Ñ\8b, Ñ\8fкаÑ\8f Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fе Ð²Ð¾Ð»Ñ\8cнае Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81ваÑ\96Ñ\85 Ñ\82Ñ\8dкÑ\81Ñ\82аÑ\9e (дзелÑ\8f Ð¿Ð°Ð´Ñ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\8fÑ\9e Ð³Ð»Ñ\8fдзÑ\96Ñ\86е $1).\n\n<strong>Ð\9dе Ð·Ñ\8cмÑ\8fÑ\88Ñ\87айÑ\86е Ñ\82Ñ\83Ñ\82 Ð±ÐµÐ· Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ð¼Ð°Ñ\82Ñ\8dÑ\80Ñ\8bÑ\8fлÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð°Ñ\85оÑ\9eваÑ\8eÑ\86Ñ\86а Ð°Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96м Ð¿Ñ\80авам!</strong>",
        "editpage-cannot-use-custom-model": "Мадэль зьместу гэтай старонкі ня можа быць зьмененая.",
-       "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілябайт|кілябайты|кілябайтаў}}, што болей устаноўленага абмежаваньня на $2 {{PLURAL:$2|кілябайт|кілябайты|кілябайтаў}}.'''\nСтаронка ня можа быць захаваная.",
+       "longpageerror": "<strong>Памылка: аб’ём тэксту, які вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілябайт|кілябайты|кілябайтаў}}, што болей за ўсталяванае абмежаваньне на $2 {{PLURAL:$2|кілябайт|кілябайты|кілябайтаў}}.</strong>\nСтаронка ня можа быць захаваная.",
        "readonlywarning": "<strong>Папярэджаньне: База зьвестак была заблякаваная для тэхнічнага абслугоўваньня, таму немагчыма цяпер захаваць Вашыя зьмены.</strong>\nВы можаце скапіяваць тэкст у файл на Вашым кампутары, а пазьней захаваць сюды.\n\nСыстэмны адміністратар, які заблякаваў базу зьвестак, прапанаваў наступнае тлумачэньне: $1",
-       "protectedpagewarning": "'''Папярэджаньне: Гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.'''\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
-       "semiprotectedpagewarning": "'''Заўвага:''' Гэтая старонка была абароненая, і рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "protectedpagewarning": "<strong>Папярэджаньне: гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "semiprotectedpagewarning": "<strong>Заўвага:</strong> гэтая старонка была абароненая, таму рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "cascadeprotectedwarning": "'''Папярэджаньне:''' гэтая старонка абароненая, толькі ўдзельнікі з правамі адміністратараў могуць рэдагаваць яе, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку|наступныя старонкі}} з каскаднай абаронай:",
-       "titleprotectedwarning": "'''Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].'''\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
+       "titleprotectedwarning": "<strong>Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "templatesused": "{{PLURAL:$1|Шаблён, які ўжываецца|Шаблёны, якія ўжываюцца}} на гэтай старонцы:",
        "templatesusedpreview": "У гэтым папярэднім праглядзе {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:",
        "templatesusedsection": "У гэтай сэкцыі {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:",
        "template-protected": "(абаронены)",
        "template-semiprotected": "(часткова абароненая)",
        "hiddencategories": "Гэтая старонка належыць да $1 {{PLURAL:$1|схаванай катэгорыі|схаваных катэгорыяў}}:",
-       "nocreatetext": "У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.\nВы можаце вярнуцца і рэдагаваць існуючую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].",
+       "nocreatetext": "У {{GRAMMAR:месны|{{SITENAME}}}} абмежаванае стварэньне новых старонак.\nВы можаце вярнуцца і рэдагаваць існую старонку, альбо [[Special:UserLogin|ўвайсьці ў сыстэму ці стварыць рахунак]].",
        "nocreate-loggedin": "Вы ня маеце дазволу на стварэньне новых старонак.",
        "sectioneditnotsupported-title": "Рэдагаваньне сэкцыяў не падтрымліваецца",
-       "sectioneditnotsupported-text": "Рэдагаваньне сэкцыяў не падтрымліваецца ў гэтай старонцы рэдагаваньня",
+       "sectioneditnotsupported-text": "Рэдагаваньне сэкцыяў не падтрымліваецца на гэтай старонцы.",
        "permissionserrors": "Памылка дазволу",
        "permissionserrorstext": "Вы ня маеце дазволу на гэтае дзеяньне з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "contentmodelediterror": "Вы ня можаце рэдагаваць гэтую вэрсію, бо яе мадэль зьместу — <code>$1</code>, якая адрозьніваецца ад цяперашняй мадэлі зьместу старонкі — <code>$2</code>.",
-       "recreate-moveddeleted-warn": "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
+       "recreate-moveddeleted-warn": "<strong>Увага: вы ствараеце старонку, якая раней была выдаленая.</strong>\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
        "moveddeleted-notice": "Гэта старонка была выдаленая. Журналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй.",
        "moveddeleted-notice-recent": "Выбачайце, гэтая старонка была нядаўна выдаленая (цягам апошніх 24 гадзінаў).\nЖурналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй для даведкі.",
        "log-fulllog": "Паказаць журнал цалкам",
        "postedit-confirmation-saved": "Вашая праўка была захаваная.",
        "edit-already-exists": "Немагчыма стварыць новую старонку.\nЯна ўжо існуе.",
        "defaultmessagetext": "Перадвызначаны тэкст паведамленьня",
-       "content-failed-to-parse": "Зьмест «$2» не адпавядае тыпу $1: $3.",
+       "content-failed-to-parse": "Зьмест «$2» не адпавядае мадэлі $1: $3.",
        "invalid-content-data": "Няслушныя зьвесткі",
        "content-not-allowed-here": "Зьмест тыпу «$1» на старонцы [[$2]] не дазволены",
        "editwarning-warning": "Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.\nКалі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «{{int:prefs-editing}}» вашых наладаў.",
        "editpage-invalidcontentmodel-text": "Мадэль зьместу «$1» не падтрымліваецца.",
        "editpage-notsupportedcontentformat-title": "Фармат зьмесьціва не падтрымліваецца",
        "editpage-notsupportedcontentformat-text": "Фармат зьмесьціва $1 не падтрымліваецца мадэльлю зьмесьціва $2.",
-       "content-model-wikitext": "вікі-тэкст",
+       "content-model-wikitext": "вікітэкст",
        "content-model-text": "просты тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.",
        "expensive-parserfunction-category": "Старонкі, якія ўтрымліваюць зашмат працаёмістых зваротаў да функцыяў парсэра",
-       "post-expand-template-inclusion-warning": "Папярэджаньне: Памер уключаемых шаблёнаў занадта вялікі.\nНекаторыя шаблёны ня будуць уключаныя.",
+       "post-expand-template-inclusion-warning": "<strong>Папярэджаньне</strong>: памер выкарыстаных шаблёнаў занадта вялікі.\nНекаторыя шаблёны ня будуць уключаныя.",
        "post-expand-template-inclusion-category": "Старонкі, у якіх перавышаны дапушчальны памер уключаных шаблёнаў",
-       "post-expand-template-argument-warning": "Увага: Гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёна, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
+       "post-expand-template-argument-warning": "<strong>Увага</strong>: гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёну, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
        "post-expand-template-argument-category": "Старонкі, у якіх прапушчаныя парамэтры шаблёнаў",
        "parser-template-loop-warning": "Выяўлены цыкль у шаблёнах: [[$1]]",
-       "parser-template-recursion-depth-warning": "Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)",
+       "parser-template-recursion-depth-warning": "Перавышаны ліміт глыбіні рэкурсіі шаблёну ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
        "node-count-exceeded-category-desc": "На старонцы перавышаная максымальная колькасьць вузлоў.",
        "node-count-exceeded-warning": "Старонка перавысіла дазволеную колькасьць вузлоў",
        "expansion-depth-exceeded-category": "Старонкі зь перавышанай глыбінёй уключэньня",
        "expansion-depth-exceeded-category-desc": "Старонка перавышае максымальную глыбіню раскрыцьця.",
-       "expansion-depth-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80авÑ\8bÑ\81Ñ\96ла Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\83Ñ\8e Ð³Ð»Ñ\8bбÑ\96нÑ\8e Ñ\9eклÑ\8eÑ\87Ñ\8dнÑ\8cнÑ\8fÑ\9e",
-       "parser-unstrip-loop-warning": "Ð\92Ñ\8bзнаÑ\87анаÑ\8f Ð½ÐµÐ·Ð°Ñ\87Ñ\8bненаÑ\8f Ð¿Ñ\8fÑ\82лÑ\8f",
-       "parser-unstrip-recursion-limit": "Перавышанае абмежаваньне глыбіні рэкурсіі ($1)",
-       "converter-manual-rule-error": "Знойдзеная памылка ў ручным правіле моўнага канвэртара",
+       "expansion-depth-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80авÑ\8bÑ\81Ñ\96ла Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\83Ñ\8e Ð³Ð»Ñ\8bбÑ\96нÑ\8e Ñ\80азгоÑ\80Ñ\82ванÑ\8cнÑ\8f",
+       "parser-unstrip-loop-warning": "Ð\92Ñ\8bзнаÑ\87анаÑ\8f Ð¿Ñ\8fÑ\82лÑ\8f unstrip",
+       "parser-unstrip-recursion-limit": "Перавышаны ліміт рэкурсіі unstrip ($1)",
+       "converter-manual-rule-error": "Знойдзеная памылка ў ручным правіле моўнага канвэртару",
        "undo-success": "Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.",
        "undo-failure": "Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.",
        "undo-norev": "Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.",
        "undo-nochange": "Выглядае, што праўка ўжо была адмененая.",
        "undo-summary": "Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])",
-       "undo-summary-username-hidden": "Ð\92Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8f $1 Ñ\81каÑ\81аванаÑ\8f Ñ\81Ñ\85аванÑ\8bм Ñ\83дзелÑ\8cнÑ\96кам",
+       "undo-summary-username-hidden": "СкаÑ\81аванÑ\8cне Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96 $1 Ñ\81Ñ\85аванага Ñ\9eдзелÑ\8cнÑ\96ка",
        "cantcreateaccount-text": "Стварэньне рахункаў з гэтага IP-адрасу ('''$1''') было заблякаванае [[User:$3|$3]].\n\nПрычына блякаваньня пададзеная $3: ''$2''",
        "cantcreateaccount-range-text": "Стварэньне рахункаў з IP-адрасоў у дыяпазоне <strong>$1</strong>, у які ўваходзіць ваш IP-адрас (<strong>$4</strong>), было забароненае {{GENDER:$3|ўдзельнікам|ўдзельніцай}} [[User:$3|$3]].\n\n{{GENDER:$3|Удзельнікам|Удзельніцай}} $3 была пададзеная наступная прычына: <em>$2</em>.",
        "viewpagelogs": "Паказаць журналы падзеяў для гэтай старонкі",
        "saveprefs": "Захаваць",
        "restoreprefs": "Аднавіць усе стандартныя налады (ва ўсіх разьдзелах)",
        "prefs-editing": "Рэдагаваньне",
-       "rows": "Радкоў:",
-       "columns": "Слупкоў:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Максымальны памер старонкі для паказу спасылак як на накід ($1):",
        "stub-threshold-sample-link": "прыклад",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
        "editusergroup": "Загрузіць групы ўдзельніка",
        "editinguser": "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Прагляд правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Рэдагаваць групы ўдзельнікаў і ўдзельніц",
+       "userrights-viewusergroup": "Прагляд групаў удзельніка",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-groupsmember": "Уваходзіць у:",
        "userrights-groupsmember-auto": "Няяўны чалец:",
        "action-upload_by_url": "загрузку гэтага файла з URL-адрасу",
        "action-writeapi": "выкарыстаньне API для запісаў",
        "action-delete": "выдаленьне гэтай старонкі",
-       "action-deleterevision": "выдаленьне гэтай вэрсіі",
+       "action-deleterevision": "выдаленьне вэрсіяў",
+       "action-deletelogentry": "выдаленьне запісаў у журнале",
        "action-deletedhistory": "прагляд выдаленай гісторыі гэтай старонкі",
+       "action-deletedtext": "прагляд тэксту выдаленай вэрсіі",
        "action-browsearchive": "пошук выдаленых старонак",
-       "action-undelete": "аднаўленьне гэтай старонкі",
-       "action-suppressrevision": "прагляд і аднаўленьне гэтай схаванай вэрсіі",
+       "action-undelete": "аднаўленьне старонак",
+       "action-suppressrevision": "прагляд і аднаўленьне схаваных вэрсіяў",
        "action-suppressionlog": "прагляд гэтага прыватнага журнала",
        "action-block": "блякаваньне гэтага ўдзельніка ад рэдагаваньняў",
        "action-protect": "зьмену ўзроўню абароны гэтай старонкі",
        "action-userrights-interwiki": "рэдагаваньне правоў удзельнікаў у іншых вікі",
        "action-siteadmin": "блякаваньне і разблякаваньне базы зьвестак",
        "action-sendemail": "адпраўляць лісты іншым удзельнікам",
+       "action-editmyoptions": "рэдагаваньне вашых наладаў",
        "action-editmywatchlist": "рэдагаваць ваш сьпіс назіраньня",
        "action-viewmywatchlist": "праглядаць ваш сьпіс назіраньня",
        "action-viewmyprivateinfo": "прагляд вашых прыватных зьвестак",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "recentchanges-submit": "Паказаць",
+       "rcfilters-activefilters": "Актыўныя фільтры",
+       "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчаньні",
+       "rcfilters-search-placeholder": "Фільтар апошніх зьменаў (праглядзець або пачніце друкаваць)",
+       "rcfilters-invalid-filter": "Няслушны фільтар",
+       "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
+       "rcfilters-filter-registered-label": "Зарэгістраваныя",
+       "rcfilters-filter-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
+       "rcfilters-filter-unregistered-label": "Незарэгістраваныя",
+       "rcfilters-filter-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму",
+       "rcfilters-filtergroup-authorship": "Рэдагаваць аўтарства",
+       "rcfilters-filter-editsbyself-label": "Вашыя праўкі",
+       "rcfilters-filter-editsbyself-description": "Праўкі, зробленыя вамі",
+       "rcfilters-filter-editsbyother-label": "Праўкі іншых удзельнікаў",
+       "rcfilters-filter-editsbyother-description": "Праўкі, зробленыя іншымі ўдзельнікамі (ня вамі).",
+       "rcfilters-filtergroup-userExpLevel": "Узровень досьведу (толькі для зарэгістраваных удзельнікаў)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Навічкі",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Менш за 10 правак і 4 дні актыўнасьці.",
+       "rcfilters-filter-userExpLevel-learner-label": "Вучні",
+       "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасьці і правак, чым у «навічкоў», але меней чым у «дасьведчаных удзельнікаў».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Дасьведчаныя ўдзельнікі",
+       "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасьці і 500 правак.",
+       "rcfilters-filtergroup-automated": "Аўтаматычны ўнёсак",
+       "rcfilters-filter-bots-label": "Робат",
+       "rcfilters-filter-bots-description": "Праўкі, зробленыя з дапамогай аўтаматызаваных інструмэнтаў.",
+       "rcfilters-filter-humans-label": "Чалавек (ня робат)",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "uncategorizedcategories": "Некатэгарызаваныя катэгорыі",
        "uncategorizedimages": "Некатэгарызаваныя файлы",
        "uncategorizedtemplates": "Некатэгарызаваныя шаблёны",
+       "uncategorized-categories-exceptionlist": "# Утрымлівае сьпіс катэгорыяў, якія не павінны згадвацца на Special:UncategorizedCategories. Па адной на радок, пачынаецца з «*». Радкі, якія пачынаюцца зь іншага сымбалю (у тым ліку і з прабелу) ігнаруюцца. Ужывайце «#» для камэнтароў.",
        "unusedcategories": "Катэгорыі, якія не выкарыстоўваюцца",
        "unusedimages": "Файлы, якія не выкарыстоўваюцца",
        "wantedcategories": "Запатрабаваныя катэгорыі",
        "changecontentmodel-emptymodels-title": "Няма даступных мадэляў зьместу",
        "changecontentmodel-emptymodels-text": "Зьмест на [[:$1]] ня можа быць ператвораны ні ў які тып.",
        "log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
-       "log-description-contentmodel": "Ð\9fадзеÑ\96, Ð·Ñ\8cвÑ\8fзанÑ\8bÑ\8f Ð· Ð¼Ð°Ð´Ñ\8dлÑ\8fмÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83 Ñ\81Ñ\82аÑ\80онак",
+       "log-description-contentmodel": "Ð\93Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96вае Ð·Ñ\8cменÑ\8b Ð¼Ð°Ð´Ñ\8dлÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83 Ñ\81Ñ\82аÑ\80онак, Ð° Ñ\82акÑ\81ама Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ñ\81Ñ\82воÑ\80анÑ\8bÑ\8f Ð· Ð¼Ð°Ð´Ñ\8dлÑ\8cлÑ\8e Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83, Ð°Ð´Ñ\80ознай Ð°Ð´ Ñ\81Ñ\82андаÑ\80Ñ\82най.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|стварыў|стварыла}} старонку $3 з дапамогай нестандартнай мадэлі зьместу «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "адкаціць",
        "proxyblockreason": "Ваш IP-адрас быў заблякаваны таму што ён належыць адкрытаму проксі.\nКалі ласка, зьвяжыцеся з Вашым Інтэрнэт-правайдарам альбо са службай тэхнічнай падтрымкі і паведаміце ім пра гэтую сур'ёзную праблему бясьпекі.",
        "sorbsreason": "Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.",
        "sorbs_create_account_reason": "Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.\nВы ня зможаце стварыць рахунак",
+       "softblockrangesreason": "Ананімны ўнёсак не дазволены з вашага IP-адрасу ($1). Калі ласка, увайдзіце ў сыстэму.",
        "xffblockreason": "IP-адрас, прыведзены ў загалоўку X-Forwarded-For, які належыць або вам, або проксі-сэрвэру, быў заблякаваны. Прычынай блякаваньня было: $1",
        "cant-see-hidden-user": "Удзельнік, якога Вы спрабуеце заблякаваць, ужо заблякаваны і схаваны. З-за таго, што Вы ня маеце правоў хаваньня ўдзельнікаў, Вы ня можаце бачыць альбо зьмяняць блякаваньне удзельніка.",
        "ipbblocked": "Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі",
        "cant-move-to-user-page": "Вы ня маеце правоў для пераносу старонкі ў прастору ўдзельніка (апрача падстаронак).",
        "cant-move-category-page": "Вы ня маеце правоў для пераносу старонак катэгорыяў.",
        "cant-move-to-category-page": "Вы ня маеце правоў для пераносу старонак у прастору назваў катэгорыяў.",
+       "cant-move-subpages": "Вы ня маеце дазволу на перанос падстаронак.",
+       "namespace-nosubpages": "Прастора назваў «$1» не дазваляе выкарыстаньне падстаронак.",
        "newtitle": "Новая назва:",
        "move-watch": "Назіраць за гэтай старонкай",
        "movepagebtn": "Перанесьці старонку",
        "pageinfo-length": "Памер старонкі (у байтах)",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова зьместу старонкі",
+       "pageinfo-language-change": "зьмяніць",
        "pageinfo-content-model": "Мадэль зьместу старонкі",
        "pageinfo-content-model-change": "зьмяніць",
        "pageinfo-robot-policy": "Індэксацыя пашукавікамі",
        "feedback-useragent": "Агент удзельніка:",
        "searchsuggest-search": "Пошук у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "утрымлівае...",
-       "api-error-autoblocked": "Ваш IP-адрас быў аўтаматычна заблякаваны, бо ён быў выкарыстаны заблякаваным удзельнікам.",
-       "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
-       "api-error-blocked": "Рэдагаваньне было для вас заблякаванае.",
-       "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым сэрвэры.",
-       "api-error-duplicate": "На сайце ўжо {{PLURAL:$1|1=існуе іншы файл|існуюць іншыя файлы}} з такім жа зьместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў файл|былі файлы}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэньне новых пустых старонак забаронена.",
-       "api-error-fetchfileerror": "Унутраная памылка: падчас атрыманьня файла штосьці здарылася.",
-       "api-error-fileexists-forbidden": "Файл з назвай «$1» ужо існуе і ня можа быць перазапісаны.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвай «$1» ужо існуе ў супольным сховішчы файлаў і ня можа быць перазапісаны.",
-       "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
-       "api-error-filename-tooshort": "Назва файла занадта кароткая.",
-       "api-error-filetype-banned": "Гэты тып файла забаронены.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=забаронены тып файлаў|забароненыя тыпы файлаў}}. {{PLURAL:$3|1=Дазволены тып файлаў|Дазволеныя тыпы файлаў}}: $2.",
-       "api-error-filetype-missing": "У файла няма пашырэньня.",
-       "api-error-hookaborted": "Прапанаваная Вамі зьмена была адхіленая апрацоўшчыкам пашырэньня.",
-       "api-error-http": "Унутраная памылка: немагчыма далучыцца да сэрвэра.",
-       "api-error-illegal-filename": "Недазволеная назва файла.",
-       "api-error-internal-error": "Унутраная памылка: падчас апрацоўкі Вашага файла штосьці здарылася.",
-       "api-error-invalid-file-key": "Унутраная памылка: ня быў знойдзены часовы файл.",
-       "api-error-missingparam": "Унутраная памылка: запыт бракуе парамэтраў.",
-       "api-error-missingresult": "Унутраная памылка: немагчыма вызначыць, ці пасьпяхова зробленае капіяваньне.",
-       "api-error-mustbeloggedin": "Для загрузкі файлаў неабходна ўвайсьці ў сыстэму.",
-       "api-error-mustbeposted": "Памылка гэтага праграмнага забесьпячэньня; яно не выкарыстоўвае слушны HTTP-мэтад.",
-       "api-error-noimageinfo": "Файл загружаны, але сэрвэр ня даў пра яго ніякай інфармацыі.",
-       "api-error-nomodule": "Унутраная памылка: ня выбраны модуль загрузкі.",
-       "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сэрвэра.",
-       "api-error-overwrite": "Замена існуючага файла забароненая.",
-       "api-error-ratelimited": "Вы спрабуеце загрузіць за кароткі час болей файлаў, чым дазваляе вікі.\nКалі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
-       "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сэрвэр ня змог захаваць часловы файл.",
-       "api-error-stasherror": "Падчас загрузкі файла ў сховішча адбылася памылка.",
-       "api-error-stashedfilenotfound": "Схаваны файл ня быў знойдзены пры спробе загрузіць яго з схованкі.",
-       "api-error-stashpathinvalid": "Шлях, дзе павінен быў знаходзіцца схаваны файл, апынуўся няслушным.",
-       "api-error-stashfilestorage": "Адбылася памылка пры захаваньні файла ў схованку.",
-       "api-error-stashzerolength": "Сэрвэр ня змог схаваць файл, бо ён мае нулявы памер.",
-       "api-error-stashnotloggedin": "Вы мусіце ўвайсьці ў сыстэму, каб захоўваць файлы ў схованку загрузкі.",
-       "api-error-stashwrongowner": "Файл, да якога вы спрабуеце атрымаць доступ у схованцы, не належыць вам.",
-       "api-error-stashnosuchfilekey": "Ключ файла, да якога вы спрабуеце атрымаць доступ у схованцы, не існуе.",
-       "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
-       "api-error-unclassified": "Узьнікла невядомая памылка",
-       "api-error-unknown-code": "Невядомая памылка: «$1».",
-       "api-error-unknown-error": "Унутраная памылка: падчас загрузкі файла здарылася штосьці невядомае.",
-       "api-error-unknown-warning": "Невядомае папярэджаньне: $1",
+       "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
+       "api-error-unknown-warning": "Невядомае папярэджаньне: «$1».",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
-       "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушнае пашырэньне.",
-       "api-error-was-deleted": "Файл з такой назвай ужо загружаўся раней і быў потым выдалены.",
        "duration-seconds": "$1 {{PLURAL:$1|сэкунда|сэкунды|сэкундаў}}",
        "duration-minutes": "$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Ужываць мову па змоўчаньні",
        "pagelang-select-lang": "Абярыце мову",
+       "pagelang-reason": "Прычына",
        "pagelang-submit": "Адправіць",
+       "pagelang-nonexistent-page": "Старонка $1 не існуе.",
+       "pagelang-unchanged-language": "Мова старонкі $1 ужо вызначаная як $2.",
+       "pagelang-unchanged-language-default": "Мова старонкі $1 ужо вызначаная як мова па змоўчаньні гэтай вікі.",
+       "pagelang-db-failed": "База зьвестак не змагла зьмяніць мову старонкі.",
        "right-pagelang": "Зьмяніць мову старонкі",
        "action-pagelang": "зьмену мовы старонкі",
        "log-name-pagelang": "Журнал зьменаў мовы",
        "mw-widgets-dateinput-no-date": "Дата не абраная",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "mw-widgets-mediasearch-input-placeholder": "Пошук мультымэдыя",
+       "mw-widgets-mediasearch-noresults": "Нічога ня знойдзена.",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Дадаць катэгорыю…",
        "sessionmanager-tie": "Немагчыма выкарыстаць адначасова некалькі тыпаў аўтэнтыфікацыі: $1.",
        "sessionprovider-generic": "$1 сэсіі",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сэсіі на падставе файлаў-кукі",
        "sessionprovider-nocookies": "Файлы-кукі могуць быць адключаныя. Упэўніцеся, што ў вас уключаныя файлы-кукі і пачніце спачатку.",
        "randomrootpage": "Выпадковая карэнная старонка",
        "log-action-filter-block": "Тып блякаваньня:",
-       "log-action-filter-contentmodel": "ТÑ\8bп Ð¼Ð°Ð´Ñ\8bÑ\84Ñ\96каÑ\86Ñ\8bÑ\96 contentmodel:",
+       "log-action-filter-contentmodel": "ТÑ\8bп Ð·Ñ\8cменÑ\8b Ð¼Ð°Ð´Ñ\8dлÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82Ñ\83:",
        "log-action-filter-delete": "Тып выдаленьня:",
        "log-action-filter-import": "Тып імпарту:",
        "log-action-filter-managetags": "Тып дзеяньня кіраваньня меткамі:",
        "log-action-filter-contentmodel-change": "Зьмена мадэлі зьместу",
        "log-action-filter-contentmodel-new": "Стварэньне старонкі зь нестандартнай мадэльлю зьместу",
        "log-action-filter-delete-delete": "Выдаленьне старонкі",
+       "log-action-filter-delete-delete_redir": "Перазапіс перанакіраваньня",
        "log-action-filter-delete-restore": "Аднаўленьне старонкі",
        "log-action-filter-delete-event": "Выдаленьне журналу",
        "log-action-filter-delete-revision": "Выдаленьне вэрсіі",
        "log-action-filter-patrol-patrol": "Ручное патруляваньне",
        "log-action-filter-patrol-autopatrol": "Аўтаматычнае патруляваньне",
        "log-action-filter-protect-protect": "Абарона",
+       "log-action-filter-protect-modify": "Зьмена абароны",
        "log-action-filter-protect-unprotect": "Зьняцьце абароны",
+       "log-action-filter-protect-move_prot": "Перанос абароны",
+       "log-action-filter-rights-rights": "Ручная зьмена",
        "log-action-filter-rights-autopromote": "Аўтаматычнае зьмяненьне",
+       "log-action-filter-suppress-event": "Утойваньне журнала",
+       "log-action-filter-suppress-revision": "Утойваньне вэрсіі",
+       "log-action-filter-suppress-delete": "Утойваньне старонкі",
+       "log-action-filter-suppress-block": "Утойваньне ўдзельніка праз блякаваньне",
+       "log-action-filter-suppress-reblock": "Утойваньне ўдзельніка праз паўторнае блякаваньне",
        "log-action-filter-upload-upload": "Новая загрузка",
+       "log-action-filter-upload-overwrite": "Паўторная загрузка",
+       "authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
+       "authmanager-authn-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць правераныя на сапраўднасьць.",
+       "authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
+       "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэньне лякальнага рахунку не атрымалася: $1",
+       "authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
        "authmanager-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index 4da0c06..e9301d8 100644 (file)
        "searcharticle": "Артыкул",
        "history": "Гісторыя старонкі",
        "history_short": "Гісторыя",
+       "history_small": "гісторыя",
        "updatedmarker": "абноўлена ад часу апошняга наведвання",
        "printableversion": "Для друку",
        "permalink": "Нязменная спасылка",
        "eauthentsent": "Пацверджанне было адасланае электроннай поштай на азначаны адрас эл.пошты.\nКаб туды, у далейшым, трапляла іншая пошта адсюль, патрабуецца выканаць інструкцыі, выкладзеныя ў тым эл.паведамленні, каб пацвердзіць сваё права на рахунак эл.пошты.",
        "throttled-mailpassword": "Нагаданне пра пароль ужо адсылалася на працягу апошн{{PLURAL:$1|яй гадзіны|іх $1 гадзін}}. Дзеля абароны ад злоўжыванняў, дазваляецца атрымліваць толькі адно такое нагаданне за {{PLURAL:$1|гадзіну|$1 гадзіны|$1 гадзін}}.",
        "mailerror": "Памылка адсылання эл.пошты: $1",
-       "acct_creation_throttle_hit": "На гэтай вікі за апошні дзень створаны {{PLURAL:$1|1 рахунак|$1 рахункаў}} наведвальнікамі з вашага адрасу IP. Больш за такі час не дазваляецца. Таму на пэўны час з гэтага адрасу IP нельга ствараць новых рахункаў.",
+       "acct_creation_throttle_hit": "Наведвальнікі гэтай вікі, якія карысталіся Вашым ІР-адрасам, ужо стварылі {{PLURAL:$1|рахунак|рахункі|рахункаў}} за $2. Больш за такі час не дазваляецца. Таму на пэўны час з гэтага адрасу IP нельга ствараць новых рахункаў.",
        "emailauthenticated": "Ваш адрас эл.пошты быў пацверджаны на пляцоўцы $2 ($3).",
        "emailnotauthenticated": "Адрас эл.пошты яшчэ не пацверджаны. \nЭл.пошта ў гэтых магчымасцях адсылацца не будзе.",
        "noemailprefs": "Патрэбны адрас эл.пошты, каб дзейнічалі гэтыя магчымасці.",
        "blockedtitle": "Удзельнік заблакаваны",
        "blockedtext": "'''Ваша імя ўдзельніка або адрас IP былі пастаўлены пад блок.'''\n\nБлок быў пастаўлены ўдзельнікам: $1. Пададзеная прычына: ''$2''.\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блока: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\nВаш адрас IP: $3, нумар блоку: #$5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
        "autoblockedtext": "Ваш адрас IP быў аўтаматычна заблакаваны, таму што ім карыстаўся ўдзельнік, заблакаваны адміністратарам $1.\nПададзеная прычына блоку:\n\n:''$2''\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блоку: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\n\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\n\nВаш адрас IP: $3. Ваш нумар блоку: $5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
+       "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблакаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блакіроўкі: $8\n* Заканчэнне блакіроўкі: $6\n* Мэта блакіравання: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не вызначана",
        "whitelistedittext": "Належыць $1 каб правіць старонкі.",
        "confirmedittext": "Вам трэба пацвердзіць свой адрас эл.пошты перад тым, як правіць старонкі.\nВызначце і пацвердзіце адрас ў сваіх [[Special:Preferences|настáўленнях]].",
        "nonunicodebrowser": "<strong>Увага: ваш браўзер не працуе з Unicode-кадаваннем.</strong> Каб вы маглі карэктна правіць старонкі, усе знакі, не ўключаныя ў ASCII, паказваюцца ў рэдактарскім акне як шаснаццаткавыя коды.",
        "editingold": "<strong>Увага: Вы правіце састарэлую версію гэтай старонкі.</strong>\nКалі Вы паспрабуеце захаваць яе, то страціце змены ў артыкуле, зробленыя пасля колішняга запісу гэтай версіі.",
        "yourdiff": "Адрозненні",
-       "copyrightwarning": "Заўважце, што ўсе ўклады на {{SITENAME}} лічацца выданымі на ўмовах $2 (бач падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
-       "copyrightwarning2": "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (бач падрабязнасці на $1).\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
+       "copyrightwarning": "Заўважце, што ўсе ўклады на {{GRAMMAR:месны|{{SITENAME}}}} лічацца выданымі на ўмовах $2 (гл. падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n<strong>Нельга без дазволу дадаваць матэрыялы, абароненыя аўтарскім правам!</strong>",
+       "copyrightwarning2": "Заўважце, што кожны ўклад на {{GRAMMAR:месны|{{SITENAME}}}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (гл. падрабязнасці на $1).\n<strong>Не змяшчайце тут без дазволу матэрыялы, якія ахоўваюцца аўтарскім правам!</strong>",
        "editpage-cannot-use-custom-model": "Мадэль зместу гэтай старонкі не можа быць зменена.",
-       "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''\nСтаронка не можа быць захаваная.",
+       "longpageerror": "<strong>Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.</strong>\nСтаронка не можа быць захаваная.",
        "readonlywarning": "<strong>Увага: зараз вы не можаце запісаць свае праўкі, таму што база звестак зачынена на абслугоўванне.</strong>\nМагчыма, варта перанесці ваш тэкст у асобны файл і запісаць на потым.\n\nСістэмны адміністратар, які зачыніў базу, растлумачыў гэта так: $1",
-       "protectedpagewarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
-       "semiprotectedpagewarning": "'''Увага:''' старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
+       "protectedpagewarning": "<strong>Увага: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.</strong>\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
+       "semiprotectedpagewarning": "<strong>Увага:</strong> старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
        "cascadeprotectedwarning": "<strong>Увага:</strong> гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
        "titleprotectedwarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць ствараць толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]].'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
        "templatesused": "Шабло{{PLURAL:$1|н|ны}} на гэтай старонцы:",
        "parser-template-loop-warning": "Цыклічнае ўключэнне шаблона: [[$1]]",
        "parser-template-recursion-depth-warning": "Вычарпаны ліміт глыбіні ўключэння шаблонаў ($1)",
        "language-converter-depth-warning": "Перавышана глыбіня моўнага канвертэра ($1)",
-       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-category": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83лÑ\96 ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "node-count-exceeded-category-desc": "На старонцы перавышана максімальная колькасць кропак.",
-       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c ÐºÑ\80опак",
+       "node-count-exceeded-warning": "СÑ\82аÑ\80онка Ð¿ÐµÑ\80аÑ\81Ñ\8fгнÑ\83ла ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\86Ñ\8c Ð²Ñ\83злоÑ\9e",
        "expansion-depth-exceeded-category": "Старонкі, якія перасягнулі глыбіню разгортвання",
        "expansion-depth-exceeded-category-desc": "На старонцы перасягнута максімальная глыбіня разгортвання.",
        "expansion-depth-exceeded-warning": "Старонка перасягнула глыбіню разгортвання",
        "saveprefs": "Запісаць",
        "restoreprefs": "Аднавіць усе прадвызначэнні (ва ўсіх раздзелах)",
        "prefs-editing": "Праца",
-       "rows": "Радкі:",
-       "columns": "Калонкі:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Парог для паказу спасылкі як на пачатковы артыкул ($1):",
        "stub-threshold-sample-link": "прыклад",
        "prefs-help-recentchangescount": "Гэта ўключае ў сябе апошнія змены, гісторыі старонак, журналы.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ к сеціўнай стужцы з вашага спіса назірання.\nКожны, хто ведае гэты ключ, будзе мець магчымасць чытаць ваш спіс назірання, таму не дзяліцеся ім.\nКалі трэба, можна [[Special:ResetTokens|скінуць яго]].",
        "savedprefs": "Настройкі замацаваныя.",
-       "savedrights": "Ð\94азволы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 захаваныя.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Карыстацца настаўленнямі серверу ($1)",
        "prefswarning-warning": "Вы зрабілі змены ў сваіх настройках, якія яшчэ не былі запісаныя.\nКалі вы закрыеце гэту старонку, не націснуўшы \"$1\", вашы настройкі не будуць абноўлены.",
        "prefs-tabs-navigation-hint": "Падказка: Вы можаце карыстацца клавішамі са стрэлкамі ўлева і ўправа для навігацыі паміж карткамі ў спісе картак.",
        "userrights": "Распараджэнне правамі ўдзельніка",
-       "userrights-lookup-user": "РаÑ\81паÑ\80аджаÑ\86Ñ\86а Ð³Ñ\80Ñ\83памÑ\96 Ñ\9eдзелÑ\8cнÑ\96каÑ\9e",
+       "userrights-lookup-user": "Ð\92Ñ\8bбеÑ\80Ñ\8bÑ\86е Ñ\9eдзелÑ\8cнÑ\96ка",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
-       "editusergroup": "Ð\9fÑ\80авÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b {{GENDER:$1|Ñ\9eдзелÑ\8cнÑ\96каÑ\9e\9eдзелÑ\8cнÑ\96Ñ\86}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b Ñ\9eдзелÑ\8cнÑ\96ка",
        "editinguser": "Змена праў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Прагляд правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Распараджацца групамі ўдзельніка",
+       "userrights-viewusergroup": "Прагляд груп удзельніка",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў|ўдзельніц}}",
        "userrights-groupsmember": "У групе:",
        "userrights-groupsmember-auto": "Няяўны член:",
        "action-upload_by_url": "загрузіць гэты файл з адраса URL",
        "action-writeapi": "ужываць API запісвання",
        "action-delete": "сціраць гэтую старонку",
-       "action-deleterevision": "сціраць гэтую версію",
+       "action-deleterevision": "сціраць версіі старонак",
+       "action-deletelogentry": "выдаленне запісаў у журнале",
        "action-deletedhistory": "бачыць сцёртую гісторыю гэтай старонкі",
+       "action-deletedtext": "прагляд тэксту выдаленай версіі",
        "action-browsearchive": "шукаць у сцёртых старонках",
-       "action-undelete": "аднаўляць гэтую старонку",
+       "action-undelete": "аднаўленне старонак",
        "action-suppressrevision": "бачыць і аднаўляць гэтую схаваную версію",
        "action-suppressionlog": "бачыць гэты прыватны журнал",
        "action-block": "блакаваць праўкі гэтага ўдзельніка",
        "action-userrights-interwiki": "мяняць дазволы ўдзельнікаў на іншых вікі",
        "action-siteadmin": "зачыняць і адчыняць базу даных",
        "action-sendemail": "адпраўка электронных пісем",
+       "action-editmyoptions": "змяненне Вашых наладаў",
        "action-editmywatchlist": "правіць свой спіс назірання",
        "action-viewmywatchlist": "глядзець свой спіс назірання",
        "action-viewmyprivateinfo": "бачыць свае асабістыя звесткі",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
        "recentchanges-submit": "Паказаць",
+       "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасці і правак, чым у «навічкоў», але меней чым у «дасведчаных удзельнікаў».",
+       "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасці і 500 правак.",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "apisandbox-submit-invalid-fields-title": "Некаторыя палі недапушчальныя",
        "apisandbox-submit-invalid-fields-message": "Калі ласка, выпраўце адзначаныя палі і паспрабуйце ізноў.",
        "apisandbox-results": "Вынікі",
+       "apisandbox-sending-request": "Адпраўка API-запыту…",
+       "apisandbox-loading-results": "Атрымліваем API-вынікі…",
        "apisandbox-request-url-label": "URL-адрас запыту:",
        "apisandbox-request-time": "Час запыту: {{PLURAL:$1|$1 мс}}",
        "apisandbox-results-fixtoken": "Папраўце токен і паўтарыце адпраўку",
        "listgrouprights-namespaceprotection-header": "Абмежаванні прасторы назваў",
        "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
        "listgrouprights-namespaceprotection-restrictedto": "Дазвол(ы), неабходныя для праўкі",
+       "listgrants": "Дазволы",
+       "listgrants-grant": "Дазвол",
        "listgrants-rights": "Правы",
        "trackingcategories": "Катэгорыі для асочвання",
        "trackingcategories-summary": "На гэтай старонцы пералічаны катэгорыі для асочвання, якія аўтаматычна напаўняюцца праграмным забеспячэннем MediaWiki. Іх можна перайменаваць, змяніўшы адпаведныя сістэмныя паведамленні ў прасторы назваў {{ns:8}}.",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Эл.пошта адаслана",
        "emailsenttext": "Ваш ліст эл.пошты быў адасланы.",
-       "emailuserfooter": "Гэты эл.ліст быў высланы ад $1 да $2 праз функцыю \"{{:{{ns:mediawiki}}:emailuser/be}}\" пляцоўкі {{SITENAME}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}. {{GENDER:$2|Ваш}} ліст у адказ будзе дасланы {{GENDER:$1|адпраўніку|адпраўніцы}}, і {{GENDER:$1|яму|ёй}} будзе бачны {{GENDER:$2|ваш}} адрас электроннай пошты.",
        "usermessage-summary": "Пакінуць адмысловае паведамленне.",
        "usermessage-editor": "Адмысловая дастаўка",
        "watchlist": "Мой спіс назірання",
        "sp-contributions-newbies-sub": "З новых рахункаў",
        "sp-contributions-newbies-title": "Уклады ўдзельнікаў з новых рахункаў",
        "sp-contributions-blocklog": "блакіроўкі",
-       "sp-contributions-suppresslog": "заглушаны ўклад удзельніка",
-       "sp-contributions-deleted": "сцёрты ўклад удзельніка",
+       "sp-contributions-suppresslog": "схаваны ўклад {{GENDER:$1|удзельніка|удзельніцы}}",
+       "sp-contributions-deleted": "сцёрты ўклад {{GENDER:$1|удзельніка|удзельніцы}}",
        "sp-contributions-uploads": "укладанні",
        "sp-contributions-logs": "журналы",
        "sp-contributions-talk": "размовы",
        "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
-       "moveuserpage-warning": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
+       "moveuserpage-warning": "<strong>Увага:</strong> Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік <em>не</em> будзе пераназваны.",
        "movecategorypage-warning": "<strong>Увага:</strong> Вы збіраецеся перанесці старонку катэгорыі. Заўважце, што толькі гэта старонка будзе перанесена, і ніводная старонка са старой катэгорыі <em>не будзе</em> катэгарызавана ў новай.",
        "movenologintext": "Вы павінны быць зарэгістраваным удзельнікам, і [[Special:UserLogin|ўвайсці ў сістэму]], каб пераносіць старонкі.",
        "movenotallowed": "Вам не дазволена пераносіць старонкі.",
        "pageinfo-length": "Аб'ём старонкі (у байтах)",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова змесціва старонкі",
+       "pageinfo-language-change": "змяніць",
        "pageinfo-content-model": "Мадэль змесціва старонкі",
        "pageinfo-content-model-change": "змяніць",
        "pageinfo-robot-policy": "Індэксаванне робатамі",
        "feedback-thanks-title": "Дзякуем!",
        "searchsuggest-search": "Шукаць у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "змяшчае...",
-       "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
-       "api-error-copyuploaddisabled": "Загрузка з URL-адраса забаронена на гэтым серверы.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе іншы файл|існуюць іншыя файлы}} з такім жа зместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў файл|былі файлы}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
-       "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
-       "api-error-fileexists-forbidden": "Файл з назвай \"$1\" ужо ёсць і не можа быць перапісаны.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвай \"$1\" ужо ёсць у супольным сховішчы файлаў, ён не можа быць перапісаны.",
-       "api-error-file-too-large": "Дасланы Вамі файл занадта вялікі.",
-       "api-error-filename-tooshort": "Імя файла занадта кароткае.",
-       "api-error-filetype-banned": "Гэты тып файлаў забаронены.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпу|тыпаў}}: $2.",
-       "api-error-filetype-missing": "У файла няма пашырэння.",
-       "api-error-hookaborted": "Прапанаванае вамі змяненне было адменена ў апрацоўшчыку пашырэння.",
-       "api-error-http": "Унутраная памылка: немагчыма далучыцца да сервера.",
-       "api-error-illegal-filename": "Імя файла не дапускаецца.",
-       "api-error-internal-error": "Унутраная памылка: падчас апрацоўкі Вашага файла штосьці здарылася.",
-       "api-error-invalid-file-key": "Унутраная памылка: не быў знойдзены часовы файл.",
-       "api-error-missingparam": "Унутраная памылка: запыт бракуе параметраў.",
-       "api-error-missingresult": "Унутраная памылка: немагчыма вызначыць, ці паспяхова зробленае капіяванне.",
-       "api-error-mustbeloggedin": "Для загрузкі файлаў неабходна ўвайсці ў сістэму.",
-       "api-error-mustbeposted": "Памылка гэтага праграмнага забеспячэння; яно не выкарыстоўвае слушны HTTP-метад.",
-       "api-error-noimageinfo": "Файл загружаны, але сервер не даў пра яго ніякай інфармацыі.",
-       "api-error-nomodule": "Унутраная памылка: не выбраны модуль загрузкі.",
-       "api-error-ok-but-empty": "Унутраная памылка: няма адказу ад сервера.",
-       "api-error-overwrite": "Замена існуючага файла не дапускаецца.",
-       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сервер не змог апублікаваць тымчасовы файл.",
-       "api-error-stasherror": "У час укладання файла ў сховішча здарылася памылка.",
-       "api-error-timeout": "Сервер не адказаў у чаканы тэрмін.",
-       "api-error-unclassified": "Узнікла невядомая памылка",
-       "api-error-unknown-code": "Невядомая памылка: «$1».",
-       "api-error-unknown-error": "Унутраная памылка: падчас загрузкі файла здарылася штосьці невядомае.",
+       "api-error-stashfailed": "Унутраная памылка: сервер не змог захаваць часовы файл.",
        "api-error-unknown-warning": "Невядомае папярэджанне: $1",
        "api-error-unknownerror": "Невядомая памылка: «$1».",
-       "api-error-uploaddisabled": "Загрузка ў гэтую вікі адключаная.",
-       "api-error-verification-error": "Гэты файл можа быць пашкоджаны, ці мае няслушны канчатак назвы.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|мінута|мінуты|мінут}}",
        "duration-hours": "$1 {{PLURAL:$1|гадзіна|гадзіны|гадзін}}",
        "special-characters-title-emdash": "доўгі працяжнік",
        "special-characters-title-minus": "мінус",
        "mw-widgets-dateinput-no-date": "Дата не выбрана",
+       "mw-widgets-mediasearch-input-placeholder": "Пошук мультымедыя",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраванне на $1",
        "log-action-filter-all": "Усе",
        "log-action-filter-protect-move_prot": "Ахова старонкі",
        "log-action-filter-rights-rights": "Ручное змяненне",
        "log-action-filter-rights-autopromote": "Аўтаматычнае змяненне",
+       "log-action-filter-suppress-event": "Cкрыванне журнала",
+       "log-action-filter-suppress-revision": "Скрыванне версіі",
+       "log-action-filter-suppress-delete": "Cкрыванне старонкі",
+       "log-action-filter-suppress-block": "Скрыванне ўдзельніка праз блакіраванне",
+       "log-action-filter-suppress-reblock": "Скрыванне ўдзельніка праз паўторнае блакіраванне",
        "log-action-filter-upload-upload": "Новая перадача",
-       "log-action-filter-upload-overwrite": "Ð\92Ñ\8bкладванне",
+       "log-action-filter-upload-overwrite": "Ð\9fаÑ\9eÑ\82оÑ\80наÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83зка",
        "authmanager-authn-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
        "authmanager-authn-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць завераны.",
-       "authmanager-authn-no-local-user": "Прадастаўленыя ўліковыя дадзеныя не звязаныя з нікодным удзельнікам на гэтай Вікі.",
+       "authmanager-authn-no-local-user": "Пададзеныя ўліковыя дадзеныя не звязаныя з ніводным удзельнікам на гэтай Вікі.",
        "authmanager-authn-no-local-user-link": "Прадастаўленыя ўліковыя дадзеныя сапраўдныя, але не звязаныя з ніводным удзельнікам гэтай Вікі. Увайдзіце іншым спосабам або стварыце новы акаўнт і ў вас з'явіцца магчымасць звязаць свае папярэднія ўліковыя дадзеныя для гэтага ўліковага запісу.",
        "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэнне лакальнага ўліковага запісу не ўдалося: $1",
        "authmanager-change-not-supported": "Прадастаўленыя ўліковыя дадзеныя не могуць быць зменены, як нішто не будзе іх выкарыстоўваць.",
index 649847c..2ec3bc7 100644 (file)
        "sp-contributions-newbies": "Показване само на приносите на нови потребители",
        "sp-contributions-newbies-sub": "на нови потребители",
        "sp-contributions-newbies-title": "Потребителски приноси за нови сметки",
-       "sp-contributions-blocklog": "Ð\94невник на блокиранията",
+       "sp-contributions-blocklog": "дневник на блокиранията",
        "sp-contributions-deleted": "изтрити приноси на {{GENDER:$1|потребител}}",
        "sp-contributions-uploads": "качвания",
        "sp-contributions-logs": "дневници",
        "tags-deactivate": "спиране",
        "tags-hitcount": "$1 {{PLURAL:$1|промяна|промени}}",
        "tags-manage-no-permission": "Нямате права за управление на етикети за промени.",
-       "tags-manage-blocked": "Ð\92ие Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\83пÑ\80авлÑ\8fваÑ\82е ÐµÑ\82икеÑ\82и Ð·Ð° Ð¿Ñ\80омени, Ð´Ð¾ÐºÐ°Ñ\82о Ñ\81Ñ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани.",
+       "tags-manage-blocked": "Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\83пÑ\80авлÑ\8fваÑ\82е ÐµÑ\82икеÑ\82и Ð·Ð° Ð¿Ñ\80омени, Ð´Ð¾ÐºÐ°Ñ\82о Ñ\81Ñ\82е {{GENDER:$1|блокиÑ\80ани}}.",
        "tags-create-heading": "Създаване на нов етикет",
        "tags-create-explanation": "По подразбиране, новосъздадените етикети са достъпни за използване от потребители и ботове.",
        "tags-create-tag-name": "Име на етикета:",
index cdc13ad..b288535 100644 (file)
        "index-category": "آ تاکدیمان که دیسته بوته گنت",
        "noindex-category": "آ تاکدیمان که ایندیکس نه بوته‌انت",
        "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
-       "about": "بی باره ها",
+       "about": "بِه باره‌ئا",
        "article": "محتوائین تاکدیم",
        "newwindow": "(نوکین دروازگئ تا پاچ بکنێت)",
        "cancel": "کنسیل",
        "pool-errorunknown": "ناشناخته ئین خطا",
        "pool-servererror": "پول سنتر سرویس بی دسترس ئا نه اینت ( $1 ).",
        "poolcounter-usage-error": "خطا استفاده شه: $1",
-       "aboutsite": "بی بارها {{SITENAME}}",
+       "aboutsite": "مالومات بِه {{SITENAME}}ئي باره‌ئا",
        "aboutpage": "Project:بِه باره‌ئا",
        "copyright": "محتوایات بی  $1 اجازه نامه ئا هستنت مگه ای که آی خلاف ئا ذکر بوته بیئنت .",
        "copyrightpage": "{{ns:project}}:کاپی رایت یا باز کورتینی حق",
        "saveprefs": "ذخیره",
        "restoreprefs": "بیر گردینتین موچین تنظیمان بی اولی ئین رقما",
        "prefs-editing": "ایڈیٹ کورتین",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "گشتین",
        "stub-threshold": "آستانه په کۆنڈ لینکاني قالب بندیا ($1):",
        "stub-threshold-sample-link": "نمونه",
index e137ee9..244ac7a 100644 (file)
        "tog-numberheadings": "हेडिंग के ऑटो-नंबरिंग",
        "tog-showtoolbar": "संपादन औजारपट्टी के देखावल जाव",
        "tog-editondblclick": "दुइ क्लिक पर पन्ना सभ के संपादन करीं",
-       "tog-editsectiononrightclick": "à¤\96à¤\82ड à¤\95à¥\80 à¤¹à¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤®à¥\8dपादित करीं",
-       "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ दिहल जाव",
-       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ दिहल जाव",
-       "tog-watchmoves": "हमरा द्वारा स्थानांतरित पन्ना आ फाइलन के हमरा धियानसूची में जोड़ दिहल जाव",
-       "tog-watchdeletion": "हमरा द्वारा हटावल पन्ना आ फाइल सभ के हमार धियानसूची में जोड़ दिहल जाव",
+       "tog-editsectiononrightclick": "हà¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤\82पादन à¤¸à¤\82भव करीं",
+       "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ल जाव",
+       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ल जाव",
+       "tog-watchmoves": "हमरा द्वारा स्थानांतरित पन्ना आ फाइलन के हमरा धियानसूची में जोड़ल जाव",
+       "tog-watchdeletion": "हमरा द्वारा हटावल पन्ना आ फाइल सभ के हमार धियानसूची में जोड़ल जाव",
        "tog-watchuploads": "हम नया फाइल अपलोड करीं त उनहना के हमार धियानसूची में जोड़ल जाय",
-       "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ दिहल जाव",
-       "tog-minordefault": "डिफालà¥\8dà¤\9f à¤°à¥\82प à¤¸à¥\87 à¤¸à¤\97रà¥\80 à¤¸à¤\82पादन à¤\95à¥\81ल à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\95à¥\80 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95à¤\87ल à¤\9cाव",
+       "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ल जाव",
+       "tog-minordefault": "डिफाल्ट रूप से सगरी संपादन के छोट संपादन की रुप में चिन्हित कइल जाव",
        "tog-previewontop": "झलक (प्रीव्यू) संपादन बक्सा से पहिले देखावल जाय",
        "tog-previewonfirst": "पहिला संपादन पर झलक (प्रीव्यू) देखावल जाय",
-       "tog-enotifwatchlistpages": "हमार धियानसूची में दर्ज कौनो भी पन्ना या फाइल में बदलाव होखला पर हमके ई-मेल कइल जाव",
-       "tog-enotifusertalkpages": "अगर हमरे बातचीत पन्ना पर कौनो बदलाव होखे त हमके ई-मेल कइल जाव",
-       "tog-enotifminoredits": "पन्ना आ फाइल पर छोटो बदलाव होखे त हमके ई-मेल कइल जाव",
-       "tog-enotifrevealaddr": "नोटिफिकेशन ई-मेल में हमार ई-मेल पता देखावल जाव",
-       "tog-shownumberswatching": "धियान रखे वालन सदस्यन के देखावल जाव",
+       "tog-enotifwatchlistpages": "हमार धियानसूची में दर्ज कौनो भी पन्ना या फाइल में बदलाव होखला पर हमके ईमेल कइल जाव",
+       "tog-enotifusertalkpages": "अगर हमरे बातचीत पन्ना पर कौनो बदलाव होखे त हमके ईमेल कइल जाव",
+       "tog-enotifminoredits": "पन्ना आ फाइल पर छोटो बदलाव होखे त हमके ईमेल कइल जाव",
+       "tog-enotifrevealaddr": "नोटिफिकेशन ईमेल में हमार ईमेल पता देखावल जाव",
+       "tog-shownumberswatching": "धियान à¤°à¤\96à¥\87 à¤µà¤¾à¤²à¤¨ à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82à¤\96à¥\8dया à¤¦à¥\87à¤\96ावल à¤\9cाव",
        "tog-oldsig": "राउर वर्तमान दसखत:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
        "tog-uselivepreview": "लगातार झलक (लाइव प्रीव्यू) इस्तेमाल कइल जाव",
-       "tog-forceeditsummary": "यदि à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾ à¤¦à¤¿à¤¹ल होखे त हमके सूचित कइल जाय",
-       "tog-watchlisthideown": "हमरà¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤¾à¤° à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपाà¤\88à¤\82",
+       "tog-forceeditsummary": "सà¤\82पादन à¤¸à¤\82à¤\9bà¥\87प à¤¨à¤¾ à¤­à¤°à¤² à¤\97à¤\87ल होखे त हमके सूचित कइल जाय",
+       "tog-watchlisthideown": "धियानसà¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤¾à¤° à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
        "tog-watchlisthidebots": "धियानसूची से बॉट संपादन छिपावल जाय",
        "tog-watchlisthideminor": "धियानसूची से छोट संपादन छिपावल जाय",
-       "tog-watchlisthideliu": "धियानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन छिपावल जाय",
+       "tog-watchlisthideliu": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤­à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤¸à¤\82पादन à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 छिपावल जाय",
        "tog-watchlistreloadautomatically": "जब कौनों फिल्टर बदलल जाय तब धियानसूची ऑटोमेटिक दोबारा लोड होखे (जावास्क्रिप्ट जरूरी)",
-       "tog-watchlisthideanons": "à¤\86à¤\87॰पà¥\80॰ à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 से छिपावल जाय",
-       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 से छिपावल जाय",
+       "tog-watchlisthideanons": "बà¥\87नाम à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤¸à¤\82पादन à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 से छिपावल जाय",
+       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\87 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 से छिपावल जाय",
        "tog-watchlisthidecategorization": "पन्ना श्रेणीकरण छिपावल जाय",
-       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®à¤°à¥\8b के भेजल जाय",
+       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®के भेजल जाय",
        "tog-diffonly": "अंतर देखावत समय नीचे पन्ना के सामग्री न देखावल जाय",
        "tog-showhiddencats": "छिपल श्रेणियन के भी देखावल जाय",
        "tog-norollbackdiff": "रोलबैक कइला के बाद अंतर न देखावल जाय",
        "tog-useeditwarning": "जो हम कौनों पन्ना पर संपादन करत घरी परिवर्तन के बिना सहेजले छोड़ देईं त हमके खबर कइल जाय",
-       "tog-prefershttps": "लà¥\89à¤\97िन रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
+       "tog-prefershttps": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
        "underline-default": "जिल्द (स्किन) या ब्राउजर डिफॉल्ट",
        "december-date": "दिसंबर $1",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणी}}",
-       "category_header": "\"$1\" श्रेणी में पन्ना",
+       "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
+       "category_header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤ªà¤¨à¥\8dना",
        "subcategories": "उपश्रेणी",
-       "category-media-header": "\"$1\" श्रेणी में मीडिया",
-       "category-empty": "''इ श्रेणी में इ समय कउनो पन्ना या मीडिया नइखे।''",
+       "category-media-header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤®à¥\80डिया",
+       "category-empty": "<em>ए श्रेणी में एह समय कौनों पन्ना भा मीडिया नइखे।</em>",
        "hidden-categories": "{{PLURAL:$1|छिपावल गइल श्रेणी|छिपावल गइल श्रेणी सब}}",
        "hidden-category-category": "छिपावल गइल श्रेणी",
-       "category-subcat-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\96ालà¥\80 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤¶à¥\8dरà¥\87णà¥\80 à¤¬à¤¾|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¸à¤¬}} बा।}}",
-       "category-subcat-count-limited": "à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 बाड़ीं।}}",
-       "category-article-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¤¾à¤¤à¥\8dर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤ªà¤¨à¥\8dन à¤¬à¤¾à¥¤|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87}}, à¤\95à¥\81ल à¤ªà¤¨à¥\8dना $2}}",
-       "category-article-count-limited": "निमà¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना|$1 à¤ªà¤¨à¥\8dना}} à¤\87 à¤¶à¥\8dरà¥\87णà¥\80à¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾।",
-       "category-file-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\96ालà¥\80 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤«à¤\87ल à¤¬à¤¾à¥¤|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤\95à¥\81ल à¤«à¤¼à¤¾à¤\87लà¤\82 $2 {{PLURAL:$1|फाà¤\87ल|$1फाà¤\87लà¤\82}} à¤¬à¤¾à¤¡à¤¼à¥\87}}",
-       "category-file-count-limited": "वरà¥\8dतमान à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना|$1 à¤ªà¤¨à¥\8dनाà¤\82}} à¤\87 à¤¶à¥\8dरà¥\87णà¥\80à¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾à¤¡à¤¼à¥\87।",
+       "category-subcat-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\96ालà¥\80 à¤\8fà¤\95 à¤ à¥\8b à¤¶à¥\8dरà¥\87णà¥\80 à¤¬à¤¾|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¸à¤¬}} à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात बा।}}",
+       "category-subcat-count-limited": "à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤\95à¥\81ल बाड़ीं।}}",
+       "category-article-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\8fà¤\95हà¥\80 à¤ à¥\8b à¤ªà¤¨à¥\8dना à¤­à¤° à¤¬à¤¾à¤\9fà¥\87।|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|पनà¥\8dना à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dनासभ à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¤¡à¤¼à¥\87à¤\82}}।}}",
+       "category-article-count-limited": "वरà¥\8dतमान à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87à¤\82}}।",
+       "category-file-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\8fà¤\95हà¥\80 à¤ à¥\8b à¤«à¤¾à¤\87ल à¤­à¤° à¤¬à¤¾à¤\9fà¥\87।|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¥\8cà¤\9cà¥\82द à¤\95à¥\81ल $2 à¤®à¥\87à¤\82 à¤¸à¥\87 {{PLURAL:$1|फाà¤\87ल à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾|$1 à¤«à¤¾à¤\87लसभ à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82}}।}}",
+       "category-file-count-limited": "वरà¥\8dतमान à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$1|फाà¤\87ल à¤¬à¤¾|$1 à¤«à¤¾à¤\87ल à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82}}।",
        "listingcontinuesabbrev": "जारी...",
        "index-category": "सूचीबद्ध पन्ना",
        "noindex-category": "बिनासूचीबद्ध पन्ना",
        "moredotdotdot": "अउर...",
        "morenotlisted": "हो सकेला कि ई लिस्ट पूरा न होखे।",
        "mypage": "पन्ना",
-       "mytalk": "हमार à¤¬à¤¾à¤¤à¤\9aà¥\80त à¤ªà¤¨à¥\8dना",
+       "mytalk": "बातà¤\9aà¥\80त",
        "anontalk": "बातचीत",
        "navigation": "नेविगेशन",
        "and": "&#32;अउर",
        "qbedit": "संपादन",
        "qbpageoptions": "ई पन्ना",
        "qbmyoptions": "हमार पन्ना",
-       "faq": "साधारण सवाल",
+       "faq": "à¤\86म सवाल",
        "faqpage": "Project:अक्सर पूछल जाए वाला सवाल",
-       "actions": "à¤\95ारà¥\8dयवाहà¥\80",
+       "actions": "à¤\8fà¤\95à¥\8dशन",
        "namespaces": "नाँवस्थान",
        "variants": "अउरी प्रकार",
-       "navigation-heading": "नà¥\87विà¤\97à¥\87शन à¤®à¥\87नà¥\81",
+       "navigation-heading": "नà¥\87विà¤\97à¥\87शन à¤®à¥\87नà¥\82",
        "errorpagetitle": "खराबी",
-       "returnto": "$1 à¤ªà¤° à¤²à¥\8cà¤\9f à¤\9cाà¤\88ं।",
+       "returnto": "$1 à¤ªà¤° à¤²à¤µà¤\9fà¥\80ं।",
        "tagline": "भोजपुरी {{SITENAME}} से",
        "help": "मदद",
        "search": "खोज",
        "searcharticle": "जाईं",
        "history": "पन्ना के इतिहास",
        "history_short": "इतिहास",
-       "updatedmarker": "हमार à¤\85नà¥\8dतिम à¤\86à¤\97मन à¤¸े बदलाव",
+       "updatedmarker": "हमरà¥\87 à¤\85à¤\82तिम à¤¬à¥\87र à¤¦à¥\87à¤\96लà¥\87 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\95े बदलाव",
        "printableversion": "छापे लायक संस्करण",
        "permalink": "स्थायी कड़ी",
        "print": "छापीं",
-       "view": "दà¥\87à¤\96à¥\80à¤\82",
+       "view": "वà¥\8dयà¥\82",
        "view-foreign": "$1 पर देखीं",
        "edit": "संपादन",
        "edit-local": "लोकल विवरण देखीं",
        "create": "बनाईं",
        "create-local": "लोकल विवरण जोड़ीं",
-       "editthispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤®à¥\8dपादन करीं",
-       "create-this-page": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¨à¤¿à¤°à¥\8dमाण à¤\95रà¥\80ं",
+       "editthispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन करीं",
+       "create-this-page": "à¤\88 à¤ªà¤¨à¥\8dना à¤¬à¤¨à¤¾à¤\88ं",
        "delete": "मिटाईं",
        "deletethispage": "ई पन्ना के मिटाईं",
        "undeletethispage": "ई पन्ना के फिर से स्थापित करीं",
-       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\97à¥\8b à¤¹à¤\9fावल à¤\97à¤\88ल|$1 à¤¹à¤\9fावल à¤\97à¤\88लà¤\82}} à¤¬à¤¦à¤²à¤¾à¤µ à¤µà¤¾à¤ªà¤¸ à¤²à¤¾à¤\88ं",
-       "viewdeleted_short": "देखें {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}",
-       "protect": "सà¤\82रà¤\95à¥\8dषण करीं",
+       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन|$1 à¤ à¥\87 à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\81ल}} à¤¬à¤¿à¤¨à¤¾à¤®à¥\87à¤\9fावल à¤\95रà¥\80ं",
+       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन कुल}} देखीं",
+       "protect": "सà¥\81रà¤\95à¥\8dषित करीं",
        "protect_change": "बदलीं",
-       "protectthispage": "à¤\87 पन्ना के सुरक्षित करीं।",
+       "protectthispage": "à¤\8f पन्ना के सुरक्षित करीं।",
        "unprotect": "सुरक्षा बदलीं",
-       "unprotectthispage": "à¤\87 पन्ना के सुरक्षा बदलीं",
+       "unprotectthispage": "à¤\8f पन्ना के सुरक्षा बदलीं",
        "newpage": "नया पन्ना",
-       "talkpage": "à¤\87 पन्ना पर चर्चा करीं",
-       "talkpagelinktext": "बात-चीत",
+       "talkpage": "à¤\8f पन्ना पर चर्चा करीं",
+       "talkpagelinktext": "बातचीत",
        "specialpage": "खास पन्ना",
-       "personaltools": "वà¥\8dयà¤\95à¥\8dतिà¤\97त औजार",
+       "personaltools": "निà¤\9cà¥\80 औजार",
        "articlepage": "सामग्री पन्ना देखीं",
-       "talk": "बात-चीत",
-       "views": "à¤\95à¤\87सन à¤²à¤\89à¤\95à¥\80?",
+       "talk": "बातचीत",
+       "views": "वà¥\8dयà¥\82",
        "toolbox": "औजार",
-       "tool-link-userrights": "{{GENDER:$1|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता}} à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयसमà¥\82ह बदलीं",
+       "tool-link-userrights": "{{GENDER:$1|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता}} à¤\95à¥\87 à¤®à¤\82डलà¥\80 बदलीं",
        "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} के ईमेल करीं",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
        "projectpage": "परियोजना पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
-       "mediawikipage": "सनà¥\8dदà¥\87श पन्ना देखीं",
+       "mediawikipage": "सनà¥\87सा पन्ना देखीं",
        "templatepage": "टेम्पलेट पन्ना देखीं",
        "viewhelppage": "मदद पन्ना देखीं",
        "categorypage": "श्रेणी पन्ना देखीं",
-       "viewtalkpage": "बात-à¤\9aà¥\80त देखीं",
+       "viewtalkpage": "à¤\9aरà¥\8dà¤\9aा देखीं",
        "otherlanguages": "दुसरी भाषा में",
        "redirectedfrom": "($1 से अनुप्रेषित)",
        "redirectpagesub": "अनुप्रेषण पन्ना",
        "redirectto": "अनुप्रेषित:",
-       "lastmodifiedat": "$1 à¤\95à¥\87 $2 à¤ªà¤° à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\85नà¥\8dतिम बेर बदलाव भइल।",
-       "viewcount": "à¤\88 à¤ªà¤¨à¥\8dना {{PLURAL:$1|à¤\8fà¤\95|$1}} à¤¬à¤¾à¤° à¤¦à¥\87à¤\96ल à¤\97à¤\88ल बा।",
+       "lastmodifiedat": "$1 à¤\95à¥\87 $2 à¤¬à¤\9cà¥\87 à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\85à¤\82तिम बेर बदलाव भइल।",
+       "viewcount": "à¤\88 à¤ªà¤¨à¥\8dना {{PLURAL:$1|à¤\8fà¤\95|$1}} à¤¬à¥\87र à¤¦à¥\87à¤\96ल à¤\97à¤\87ल बा।",
        "protectedpage": "सुरक्षित पन्ना",
        "jumpto": "इहाँ जाईं:",
        "jumptonavigation": "नेविगेशन",
        "jumptosearch": "खोजीं",
-       "view-pool-error": "à¤\95à¥\8dषमा à¤\95रà¥\80à¤\82, à¤\88 à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\88ल à¤¬à¤¾à¥¤\nà¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¦à¥\87à¤\96à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87नà¥\8dतजार करीं।\n\n$1",
-       "generic-pool-error": "à¤\95à¥\8dषमा à¤\95रà¥\80à¤\82, à¤\88 à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\88ल à¤¬à¤¾à¥¤\nà¤\88 à¤¸à¤\82साधन à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\88 à¤¸à¤\82साधन à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9a à¤¬à¤¨à¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87नà¥\8dतजार करीं।",
-       "pool-timeout": "तालाबनà¥\8dदà¥\80 à¤\96ातिर à¤ªà¥\8dरतà¥\80à¤\95à¥\8dषा समय समाप्त",
+       "view-pool-error": "माफ à¤\95रà¥\80à¤\82, à¤\8f à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\87ल à¤¬à¤¾à¥¤\nà¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¥¤\nà¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¦à¥\87à¤\96à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87à¤\82तजार करीं।\n\n$1",
+       "generic-pool-error": "माफ à¤\95रà¥\80à¤\82, à¤\8f à¤¸à¤®à¤¯ à¤¸à¤°à¥\8dवर à¤ªà¤° à¤¬à¤¹à¥\81त à¤\9cà¥\8dयादा à¤²à¥\8bड à¤¬à¤¢à¤¼ à¤\97à¤\87ल à¤¬à¤¾à¥¤\nà¤\8f à¤¸à¤\82साधन à¤\95à¥\87 à¤¬à¤¹à¥\81तà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¦à¥\87à¤\96à¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¥¤\nà¤\8f à¤¸à¤\82साधन à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9a à¤¬à¤¨à¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤\95à¥\83पया à¤\95à¥\81à¤\9b à¤¦à¥\87र à¤¤à¤\95 à¤\87à¤\82तजार करीं।",
+       "pool-timeout": "तालाबनà¥\8dदà¥\80 à¤\96ातिर à¤\87à¤\82तà¤\9cार समय समाप्त",
        "pool-queuefull": "पूल पंक्ति भर गइल",
-       "pool-errorunknown": "à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¥\8dरà¥\81à¤\9fि",
-       "pool-servererror": "पà¥\82ल à¤\95ाà¤\89à¤\82à¤\9fर à¤¸à¥\87वा à¤\89पलबà¥\8dध à¤¨à¤¾à¤¹à¥\80 à¤¬à¤¾ ($1)।",
-       "poolcounter-usage-error": "à¤\89पयà¥\8bà¤\97 à¤¤à¥\8dरà¥\81à¤\9fि: $1",
+       "pool-errorunknown": "नामालà¥\82म à¤\96राबà¥\80",
+       "pool-servererror": "पà¥\82ल à¤\95ाà¤\89à¤\82à¤\9fर à¤¸à¤°à¥\8dविस à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87 ($1)।",
+       "poolcounter-usage-error": "à¤\87सà¥\8dतमाल à¤\96राबà¥\80: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
        "aboutpage": "Project:बारे में",
-       "copyright": "à¤\89पलबà¥\8dध à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 à¤\85धà¥\80न à¤\89पलबà¥\8dध à¤¬à¤¾ à¤\9cब à¤¤à¤\95 à¤\95à¥\80 à¤\85लà¤\97 à¤¸à¥\87 à¤\89लà¥\8dलà¥\87à¤\96 à¤¨à¤¾ à¤\95रल à¤\97à¤\88ल à¤¹à¥\8bà¤\96à¥\87 ।",
+       "copyright": "à¤\89पलबà¥\8dध à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 $1 à¤\95à¥\87 à¤\85धà¥\80न à¤\89पलबà¥\8dध à¤¬à¤¾ à¤\9cब à¤¤à¤\95 à¤\95à¥\80 à¤\85लà¤\97 à¤¸à¥\87 à¤\89लà¥\8dलà¥\87à¤\96 à¤¨à¤¾ à¤\95à¤\87ल à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87।",
        "copyrightpage": "{{ns:project}}:कापीराइट सब",
        "currentevents": "हाल के घटना सब",
        "currentevents-url": "Project:हाल के घटना सब",
        "portal-url": "Project:सदस्य-समाज मुख्यपन्ना",
        "privacy": "गोपनीयता नीति",
        "privacypage": "Project:गोपनीयता नीति",
-       "badaccess": "à¤\85नà¥\81मति à¤¤à¥\8dरà¥\81à¤\9fी",
-       "badaccess-group0": "रà¤\89à¤\86 à¤\9cवन à¤\95ारà¥\8dरवाà¤\88 à¤\96ातिर à¤\85नà¥\81रà¥\8bध à¤\95à¤\88लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\89 à¤\95à¥\87 à¤¨à¤¿à¤·à¥\8dपादन à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81मति à¤¨à¤\88खे।",
-       "badaccess-groups": "रà¤\89à¤\86 à¤\9cà¥\8cन à¤\95à¥\8dरिया à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\89 à¤®à¤¾à¤¤à¥\8dर {{PLURAL:$2|$1 à¤¸à¤®à¥\82ह|$1 à¤¸à¤®à¥\82हà¤\82}} à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\80 à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¡à¤¼à¥\87।",
+       "badaccess": "परमà¥\80शन à¤\96राबी",
+       "badaccess-group0": "à¤\9cवन à¤\95ारà¥\8dरवाà¤\88 à¤\95à¥\87 à¤®à¤¾à¤\81à¤\97 à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤\93à¤\95रा à¤²à¤¾à¤\97à¥\82 à¤\95रà¥\87 à¤\95à¥\87 à¤\87à¤\9cाà¤\9cत à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤¨à¤\87खे।",
+       "badaccess-groups": "रà¤\89à¤\86 à¤\9cà¥\8cन à¤\95ारवाà¤\88 à¤\95à¥\87 à¤®à¤¾à¤\81à¤\97 à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤\8a {{PLURAL:$2|$1 à¤®à¤\82डलà¥\80|$1 à¤®à¤\82डलà¥\80 à¤¸à¤­}} à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¥\8bà¤\97 à¤­à¤° à¤\95र à¤¸à¤\95त à¤¬à¤¾।",
        "versionrequired": "मिडीयाविकी के संस्करण $1 के होखल जरुरी बा",
-       "versionrequiredtext": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95à¥\80 à¤\95à¥\87 $1 à¤¸à¤\82सà¥\8dà¤\95रण à¤\9c़रà¥\82रà¥\80 à¤¬à¤¾à¥¤\nदà¥\87à¤\96à¥\80à¤\82 [[Special:Version|सà¤\82सà¥\8dà¤\95रण à¤ªà¤¨à¥\8dना]]।",
-       "ok": "ठिक",
+       "versionrequiredtext": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95à¥\80 à¤\95à¥\87 à¤µà¤°à¥\8dशन $1 à¤\9cरà¥\82रà¥\80 à¤¬à¤¾à¥¤\n[[Special:Version|वरà¥\8dशन à¤ªà¤¨à¥\8dना]] à¤¦à¥\87à¤\96à¥\80à¤\82।",
+       "ok": "ठà¥\80क",
        "retrievedfrom": "\"$1\" से लिहल गइल",
        "youhavenewmessages": "रउआ लगे बा $1 ($2).",
-       "youhavenewmessagesfromusers": "रउआ खातिर {{PLURAL:$3|एगो अन्य सदस्य|$3 अन्य सदस्यन}} के $1 बा। ($2)",
-       "youhavenewmessagesmanyusers": "रà¤\89à¤\86 à¤\96ातिर à¤\95à¤\88 à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा $1 à¤¬à¤¾à¥¤ ($2)",
-       "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\8dदà¥\87श|999=नयà¤\95ा à¤¸à¤¨à¥\8dदà¥\87श}}",
-       "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
-       "youhavenewmessagesmulti": "रà¤\89à¤\86 à¤²à¤\97à¥\87 $1 à¤ªà¤° à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\8dदà¥\87श बा",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|रउवाँ खातिर}}{{PLURAL:$3|अउरी प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
+       "youhavenewmessagesmanyusers": "रà¤\89वाà¤\81 à¤\96ातिर à¤\95à¤\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤­à¥\87à¤\9cल $1 à¤¬à¤¾ ($2)।",
+       "newmessageslinkplural": "{{PLURAL:$1|नया à¤¸à¤¨à¥\87सा|999=नया à¤¸à¤¨à¥\87सा à¤¸à¤­}}",
+       "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
+       "youhavenewmessagesmulti": "राà¤\89वाà¤\81 à¤\96ातिर $1 à¤ªà¤° à¤¨à¤¯à¤¾ à¤¸à¤¨à¥\87सा बा",
        "editsection": "संपादन",
        "editold": "संपादन",
        "viewsourceold": "स्रोत देखीं",
        "editlink": "संपादन",
        "viewsourcelink": "स्रोत देखीं",
-       "editsectionhint": "सà¤\82पादन à¤\96à¤\82ड: $1",
-       "toc": "सामà¤\97à¥\8dरी",
-       "showtoc": "दà¥\87à¤\96ाà¤\88ं",
-       "hidetoc": "à¤\9bà¥\81पाईं",
+       "editsectionhint": "à¤\96à¤\82ड à¤\95à¥\87 à¤¸à¤\82पादन: $1",
+       "toc": "बिसयसà¥\82à¤\9aी",
+       "showtoc": "दà¥\87à¤\96à¥\80ं",
+       "hidetoc": "à¤\9bिपाईं",
        "collapsible-collapse": "सेकुड़ीं",
-       "collapsible-expand": "फà¥\88लाईं",
+       "collapsible-expand": "फà¤\87लाईं",
        "confirmable-confirm": "का {{GENDER:$1|आप}} निश्चित बानी?",
        "confirmable-yes": "जी",
        "confirmable-no": "ना",
-       "thisisdeleted": "दà¥\87à¤\96à¥\80à¤\82 à¤¯à¤¾ à¤­à¤\82डार करीं $1?",
-       "viewdeleted": "$1 à¤¦à¥\87à¤\96ब?",
-       "restorelink": "देखीं {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}",
-       "feedlinks": "फ़à¥\80ड:",
-       "feed-invalid": "à¤\97लत à¤¸à¤¬à¥\8dसà¥\8dà¤\95à¥\8dरà¥\80पà¥\8dशन à¤«à¤¼ीड प्रकार",
-       "feed-unavailable": "सà¤\82à¤\98 à¤«à¤¼à¥\80ड à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87",
-       "site-rss-feed": "$1 आर एस एस फिड",
+       "thisisdeleted": "दà¥\87à¤\96à¥\80à¤\82 à¤¯à¤¾ à¤°à¤¿à¤¸à¥\8dà¤\9fà¥\8bर करीं $1?",
+       "viewdeleted": "$1 à¤¦à¥\87à¤\96ावल à¤\9cाय?",
+       "restorelink": "{{PLURAL:$1|एक ठो हटावल संपादन|$1 ठे हटावल संपादन}}",
+       "feedlinks": "फीड:",
+       "feed-invalid": "à¤\85वà¥\88ध à¤¸à¤¬à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dशन à¤«ीड प्रकार",
+       "feed-unavailable": "सिà¤\82डिà¤\95à¥\87शन à¤«à¥\80ड à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87à¤\82",
+       "site-rss-feed": "$1 आरएसएस फीड",
        "site-atom-feed": "$1 एटम फीड",
-       "page-rss-feed": "\"$1\" आर एस एस फिड",
+       "page-rss-feed": "\"$1\" आरएसएस फिड",
        "page-atom-feed": "\"$1\" एटम फीड",
        "red-link-title": "$1 (पन्ना मौजूद नइखे)।",
        "sort-descending": "उतरत क्रम में",
        "sort-ascending": "चढ़त क्रम में",
        "nstab-main": "पन्ना",
-       "nstab-user": "सदसà¥\8dय पन्ना",
+       "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता पन्ना",
        "nstab-media": "मीडिया पन्ना",
        "nstab-special": "विशेष पन्ना",
        "nstab-project": "प्रोजेक्ट पन्ना",
        "nstab-image": "फाइल",
-       "nstab-mediawiki": "सनà¥\8dदà¥\87श",
+       "nstab-mediawiki": "सनà¥\87सा",
        "nstab-template": "टेम्पलेट",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "मुख्य पन्ना",
-       "nosuchaction": "à¤\85à¤\88सन à¤\95à¥\8cनà¥\8b à¤\95ारà¥\8dरवाà¤\88 à¤¨à¤¾à¤¹à¤¿",
-       "nosuchactiontext": "à¤\87 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¥\8dरिया à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89à¤\86 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95à¤\89नà¥\8b à¤\97लत à¤\95ड़à¥\80 à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95à¤\87लà¥\87 à¤¹à¥\8bà¤\96ब।\nà¤\87 {{SITENAME}} à¤\95à¥\87 à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि भी हो सकत बा।",
-       "nosuchspecialpage": "à¤\85à¤\88सन à¤\95à¥\8cनà¥\8b à¤\96़ाश à¤ªà¤¨à¥\8dना à¤¨à¤¾à¤¹à¤¿",
-       "nospecialpagetext": "<strong>रउआ एगो अवैद्य विशेष पन्ना के अनुरोध कईले बानी।</strong>\n\nवैद्य विशेष पन्ना के सूची मिल सकत बा [[Special:SpecialPages|{{int:specialpages}}]] पर।",
-       "error": "तà¥\8dरà¥\81à¤\9fी",
-       "databaseerror": "डà¥\87à¤\9fाबà¥\87स à¤¤à¥\8dरà¥\81à¤\9fी",
-       "databaseerror-text": "डाà¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤¤à¥\8dरà¥\81à¤\9fि  à¤­à¤\87ल à¤¬à¤¾à¥¤\nसà¤\82भवतà¤\83 à¤¸à¥\89फ़्टवेयर में गड़बड़ी बा।",
-       "databaseerror-textcl": "डाà¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤¤à¥\8dरà¥\81à¤\9fि à¤\89तà¥\8dतà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\88ल बा।",
+       "nosuchaction": "à¤\85à¤\87सन à¤\95à¥\8cनà¥\8b à¤\95ारà¥\8dरवाà¤\88 à¤¨à¤\87à¤\96à¥\87",
+       "nosuchactiontext": "à¤\8f à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारà¥\8dरवाà¤\88 à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89वाà¤\81 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95वà¥\8dनà¥\8b à¤\97लत à¤\95ड़à¥\80 à¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल à¤\95à¤\87लà¥\87 à¤¹à¥\8bà¤\96ब।\n{{SITENAME}} à¤®à¥\87à¤\82 à¤\87सà¥\8dतमाल à¤¹à¥\8b à¤°à¤¹à¤² à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤\96राबà¥\80 à¤\95à¥\87 à¤²à¤\9aà¥\8dà¤\9bन भी हो सकत बा।",
+       "nosuchspecialpage": "à¤\85à¤\87सन à¤\95à¥\8cनà¥\8b à¤\96ास à¤ªà¤¨à¥\8dना à¤¨à¤\87à¤\96à¥\87",
+       "nospecialpagetext": "<strong>रउआँ एगो अवैध खास पन्ना के अनुरोध कइले बानी।</strong>\n\nबैध खास पन्नासभ के लिस्ट [[Special:SpecialPages|{{int:specialpages}}]] पर देखल जा सकत बा।",
+       "error": "à¤\96राबी",
+       "databaseerror": "डà¥\87à¤\9fाबà¥\87स à¤\96राबी",
+       "databaseerror-text": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¡à¤¾à¤\9fाबà¥\87स à¤\95à¥\8dवà¥\88रà¥\80 à¤\96राबà¥\80 à¤­à¤\87ल à¤¬à¤¾à¥¤\nसà¤\82भवतà¤\83 à¤¸à¥\89फ्टवेयर में गड़बड़ी बा।",
+       "databaseerror-textcl": "à¤\95à¥\8cनà¥\8bà¤\82 à¤¡à¤¾à¤\9fाबà¥\87स à¤\85नà¥\81रà¥\8bध à¤\96राबà¥\80 à¤\89तà¥\8dतà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\87ल बा।",
        "databaseerror-query": "अनुरोध: $1",
-       "databaseerror-function": "फ़à¤\82à¤\95à¥\8dशन: $1",
-       "databaseerror-error": "तà¥\8dरà¥\81à¤\9fि: $1",
-       "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल।\nअगर आ कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
-       "laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
-       "readonly": "डà¥\87à¤\9fाबà¥\87स à¤²à¥\89à¤\95 बा",
-       "enterlockreason": "लà¥\89à¤\95 à¤\95रà¥\87 à¤\95à¥\87 à¤\95ारण à¤¦à¤¿à¤¹à¥\80à¤\82, à¤¸à¤¾à¤¥à¥\87 à¤²à¥\89à¤\95 à¤\96à¥\81लà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95à¥\87 à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¤¿à¤¹à¥\80à¤\82।",
-       "readonlytext": "डाà¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\87ल à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\8fह à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨ à¤\95ि: $1",
-       "missing-article": "डà¥\87à¤\9fाबास à¤\8a à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤\95à¥\87 à¤¨à¤¾ à¤\96à¥\8bà¤\9c à¤ªà¤¾à¤\88ल à¤\9cà¥\8cन à¤\88 à¤\95à¥\87 à¤\96à¥\8bà¤\9cà¥\87 à¤\95à¥\87 à¤°à¤¹à¤², à¤¨à¤¾à¤®à¤¿à¤¤ \"$1\" $2.\nà¤\88 à¤¸à¤¬ à¤¸à¤¾à¤§à¤¾à¤°à¤£à¤¤: à¤¨à¤¿à¤®à¥\8dनलिà¤\96à¥\80त à¤\85पà¥\8dरà¤\9aलित à¤\85नà¥\8dतर à¤\85थवा à¤\8fà¤\97à¥\8b à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\87तिहास à¤\95à¥\87 à¤²à¤¿à¤\82à¤\95 à¤\9cà¥\8cन à¤®à¤¿à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾ à¤\95à¥\87 à¤\95ारण à¤­à¤\88ल।\n\nयदि à¤\88 à¤¬à¤¾à¤¤ à¤¨à¤\88à¤\96à¥\87, à¤¤ à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤®à¥\87à¤\82 à¤¬à¤\97 à¤ªà¤¾à¤µà¤¤ à¤¹à¥\8bà¤\96ब।\nà¤\95à¥\83पया à¤\88 à¤\8fà¤\97à¥\8b  [[Special:ListUsers/sysop|पà¥\8dरबनà¥\8dधà¤\95]] à¤\95à¥\87 à¤¯à¥\82 à¤\86र à¤\8fल à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤¨à¥\8bà¤\9f à¤¬à¤¨à¤¾के खबर करीं।",
-       "missingarticle-rev": "(सà¤\82शà¥\8bधन#: $1)",
+       "databaseerror-function": "फंक्शन: $1",
+       "databaseerror-error": "à¤\96राबà¥\80: $1",
+       "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल ह।\nअगर आप कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
+       "laggedslavemode": "<strong>चेतावनी:</strong> अइसन भी हो सकेला कि पन्ना पर हाल के अपडेट न होखे।",
+       "readonly": "डà¥\87à¤\9fाबà¥\87स à¤¤à¤¾à¤²à¤¾à¤¬à¤\82दà¥\80 बा",
+       "enterlockreason": "तालाबà¤\82दà¥\80 à¤\95à¥\87 à¤\95ारण à¤¦à¥\80à¤\82, à¤\86 à¤\85नà¥\81मान à¤¬à¤¤à¤¾à¤\88à¤\82 à¤\95ि à¤\95ब à¤¤à¤¾à¤²à¤¾à¤¬à¤\82दà¥\80 à¤¹à¤\9fà¥\80",
+       "readonlytext": "नया à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤¡à¤¾à¤\9fाबà¥\87स à¤ªà¤° à¤¤à¤¾à¤²à¤¾à¤¬à¤\82दà¥\80 à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nतालाबà¤\82दà¥\80 à¤\95रà¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\95à¥\87 à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारण: $1",
+       "missing-article": "डà¥\87à¤\9fाबास à¤\95à¥\87 à¤\93 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤  à¤¨à¤¾ à¤®à¤¿à¤²à¤² à¤\9cवन à¤®à¤¿à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤°à¤¹à¤², à¤\8fà¤\95र à¤¨à¤¾à¤\81व à¤°à¤¹à¤² \"$1\" $2।\nà¤\86मतà¥\8cर à¤ªà¤° à¤\85à¤\87सन à¤¤à¤¬ à¤¹à¥\8bला à¤ªà¥\81रान à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤\85à¤\82तर à¤¯à¤¾ à¤¹à¤\9fावल à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤\87तिहास à¤\95à¥\87 à¤\95ड़à¥\80 à¤\95à¥\87 à¤ªà¥\80à¤\9bा à¤\95à¤\87ल à¤\9cा à¤°à¤¹à¤² à¤¹à¥\8bà¤\96à¥\87।\n\nयदि à¤\88 à¤¬à¤¾à¤¤ à¤¨à¤\87à¤\96à¥\87, à¤¤à¤¬ à¤¹à¥\8b à¤¸à¤\95à¥\87ला à¤\86पà¤\95à¥\87 à¤\95à¥\8cनà¥\8bà¤\82 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤¬à¤\97 à¤®à¤¿à¤² à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87।\n[[Special:ListUsers/sysop|पà¥\8dरबà¤\82धà¤\95]] à¤\95à¥\87 à¤\88 à¤¯à¥\82à¤\86रà¤\8fल à¤¦à¥\87 के खबर करीं।",
+       "missingarticle-rev": "(बदलाव#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
-       "readonly_lag": "à¤\89पमà¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤\95à¥\87 à¤¬à¤°à¤¾à¤¬à¤° à¤ªà¤°à¤¾à¤µà¤°à¥\8dतित à¤¹à¥\8bत à¤¸à¤®à¤¯ à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर अपने आप लॉक हो गइल।",
+       "readonly_lag": "निà¤\9aला à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤\9cबलà¥\87 à¤®à¥\81à¤\96à¥\8dय à¤¡à¤¾à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर à¤\95à¥\87 à¤\97ति à¤ªà¤\95ड़ à¤ªà¤¾à¤µà¥\87, à¤¡à¤¾à¤\9fाबà¥\87स अपने आप लॉक हो गइल।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' ऍचटीटीपी हेडर भेजल गइल रहल बाकी ई रिक्वेस्ट एपीआइ राइट मॉड्यूल खातिर रहल।",
-       "internalerror": "à¤\86नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि",
-       "internalerror_info": "à¤\86नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fि: $1",
-       "internalerror-fatal-exception": "प्रकार के गंभीर अपवाद \"$1\"",
-       "filecopyerror": "\"$1\" फ़ाइल के \"$2\" पर प्रतिलिपि ना बन पाईल।",
-       "filerenameerror": "\"$1\" फ़ाइल के नाम बदल के \"$2\" नइखे रखल जा सकत।",
-       "filedeleteerror": "\"$1\" फ़ाइल के ना हटावल जा सकल।",
+       "internalerror": "à¤\85à¤\82दरà¥\82नà¥\80 à¤\96राबà¥\80",
+       "internalerror_info": "à¤\85à¤\82दरà¥\82नà¥\80 à¤\96राबà¥\80: $1",
+       "internalerror-fatal-exception": "\"$1\" प्रकार के घातक अपवाद",
+       "filecopyerror": "फाइल \"$1\" के \"$2\" पर नकल ना बन पावल।",
+       "filerenameerror": "फाइल \"$1\" के नाँव बदल के \"$2\" नइखे रखल जा सकत।",
+       "filedeleteerror": "फाइल \"$1\" के हटावल ना जा सकल।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी ना बनावल जा सकल।",
-       "directoryreadonlyerror": "निरà¥\8dदà¥\87शिà¤\95ा \"$1\" à¤¸à¤¿à¤°à¥\8dफ à¤ªà¤ à¤¨à¥\80य बा।",
-       "directorynotreadableerror": "निरà¥\8dदà¥\87शिà¤\95ा \"$1\" à¤ªà¤ à¤¨à¥\80य नइखे।",
-       "filenotfound": "\"$1\" फ़ाइल ना मिलल।",
-       "unexpected": "à¤\85नपà¥\87à¤\95à¥\8dषित à¤®à¥\82लà¥\8dय: \"$1\"=\"$2\".",
-       "formerror": "तà¥\8dरà¥\81à¤\9fि: à¤«à¤¼à¥\89रà¥\8dम à¤¸à¤¬à¤®à¤¿à¤\9f à¤¨à¤¾ à¤\95रल जा सकल।",
-       "badarticleerror": "à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\87 à¤\95ारà¥\8dय à¤¨à¤\87à¤\96à¥\87 à¤\95रल à¤\9cा à¤¸à¤\95त।",
-       "cannotdelete": "\"$1\" à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤\95à¥\87 à¤¹à¤\9fावल à¤¨à¤\87à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।\nशायद à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\87 à¤\95à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¹à¤¿ हटा चुकल होखे।",
+       "directoryreadonlyerror": "डाà¤\87रà¥\87à¤\95à¥\8dà¤\9fरà¥\80 \"$1\" à¤\96ालà¥\80 à¤ªà¤¢à¤¼à¥\87 à¤\96ातिर बा।",
+       "directorynotreadableerror": "डाà¤\87रà¥\87à¤\95à¥\8dà¤\9fरà¥\80 \"$1\" à¤ªà¤¢à¤¼à¥\87 à¤²à¤¾à¤¯à¤\95 नइखे।",
+       "filenotfound": "फाइल \"$1\" ना मिलल।",
+       "unexpected": "à¤\89मà¥\87द à¤¸à¥\87 à¤¹à¤\9f à¤\95à¥\87 à¤µà¥\88लà¥\8dयà¥\82: \"$1\"=\"$2\".",
+       "formerror": "à¤\96राबà¥\80: à¤«à¤¾à¤°à¥\8dम à¤\9cमा à¤¨à¤¾ à¤\95à¤\87ल जा सकल।",
+       "badarticleerror": "à¤\8f à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\88 à¤\95ाम à¤¨à¤¾ à¤¹à¥\8b à¤¸à¤\95à¥\80।",
+       "cannotdelete": "\"$1\" à¤¨à¤¾à¤\81व à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤\95à¥\87 à¤¨à¤¾ à¤¹à¤\9fावल à¤\9cा à¤¸à¤\95त à¤¬à¤¾à¥¤\nहà¥\8b à¤¸à¤\95à¥\87ला à¤\95à¥\87हà¥\82 à¤ªà¤¹à¤¿à¤²à¤¹à¥\80à¤\82 à¤\8fà¤\95रा à¤\95à¥\87 हटा चुकल होखे।",
        "cannotdelete-title": "\"$1\" पन्ना के हटावल नइखे जा सकत",
-       "delete-hook-aborted": "हà¥\81à¤\95 à¤¦à¥\8dवारा à¤¹à¤\9fायà¥\87à¤\95à¥\87 à¤\95à¥\8dरिया à¤¬à¥\80à¤\9aà¥\87 à¤®à¥\87à¤\82 à¤\9bà¥\8bड़ल à¤\97à¤\88ल।\nà¤\87 à¤\95à¤\89नà¥\8b à¤\95ारण à¤¨à¤\88à¤\96à¥\87 बतवले।",
-       "no-null-revision": "पनà¥\8dना \"$1\" à¤\96ातिर à¤¨à¤¯à¤¾ à¤\85शà¤\95à¥\8dत à¤¸à¤\82शोधन ना बन सकल",
+       "delete-hook-aborted": "हà¥\81à¤\95 à¤¦à¥\8dवारा à¤¹à¤\9fावà¥\87 à¤\95à¥\87 à¤\95ारà¥\8dरवाà¤\88 à¤¬à¥\80à¤\9aà¥\87 à¤®à¥\87à¤\82 à¤\9bà¥\8bड़ल à¤\97à¤\87ल।\nबिना à¤\95à¥\8cनà¥\8bà¤\82 à¤\95ारण बतवले।",
+       "no-null-revision": "पनà¥\8dना \"$1\" à¤\96ातिर à¤¨à¤¯à¤¾ à¤\96ालà¥\80 à¤¸à¤\82सोधन ना बन सकल",
        "badtitle": "खराब टाइटिल",
-       "badtitletext": "रà¤\89à¤\86 à¤¦à¥\8dवारा à¤\85नà¥\81रà¥\8bधित à¤¶à¥\80रà¥\8dषà¤\95 à¤\85यà¥\8bà¤\97à¥\8dय, à¤\96़ालà¥\80 à¤¯à¤¾ à¤\97लत à¤\9cà¥\81ड़ल à¤\85à¤\82तर-भाषà¥\80य à¤¯à¤¾ à¤\85à¤\82तर-विà¤\95ि à¤¶à¥\80रà¥\8dषà¤\95 à¤¬à¤¾à¥¤\nà¤\8f à¤®à¥\87à¤\82 à¤\8fà¤\95 à¤¯à¤¾ à¤\8fà¤\95 à¤¸à¥\87 à¤¢à¥\87र à¤\85à¤\87सन à¤\95à¥\85रà¥\87à¤\95à¥\8dà¤\9fर à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤\9cवन à¤¶à¥\80रà¥\8dषà¤\95 à¤®à¥\87à¤\82 à¤ªà¥\8dरयà¥\8bà¤\97 à¤¨à¤\87à¤\96à¥\87 à¤\95à¤\87ल à¤\9cा à¤¸à¤\95त।",
-       "title-invalid-empty": "माà¤\81à¤\97ल à¤\9cा à¤°à¤¹à¤² à¤ªà¤¨à¥\8dना à¤\9fाà¤\87à¤\9fिल à¤¯à¤¾ à¤¤ à¤\96ालà¥\80 à¤¬à¤¾ à¤¯à¤¾ à¤«à¤¿à¤° à¤\96ालà¥\80 à¤\95à¥\8cनà¥\8bà¤\82 à¤¨à¤¾à¤\81वसà¥\8dथान à¤\95à¥\87 à¤¨à¤¾à¤\81व à¤­à¤° à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¤\9fà¥\87।",
+       "badtitletext": "à¤\85नà¥\81रà¥\8bधित à¤\9fाà¤\87à¤\9fिल à¤\85वà¥\88ध, à¤\96ालà¥\80 à¤¯à¤¾ à¤\97लत à¤\9cà¥\81ड़ल à¤\85à¤\82तर-भाषà¥\80य à¤¯à¤¾ à¤\85à¤\82तर-विà¤\95ि à¤\9fाà¤\87à¤\9fिल à¤¬à¤¾à¥¤\nबà¥\81à¤\9dात à¤¬à¤¾ à¤\95ि à¤\8fह à¤®à¥\87à¤\82 à¤\9fाà¤\87à¤\9fिल à¤®à¥\87à¤\82 à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8b à¤¸à¤\95à¥\87 à¤²à¤¾à¤¯à¤\95 à¤\8fà¤\95 à¤¯à¤¾ à¤\8fà¤\95 à¤¸à¥\87 à¤¢à¥\87र à¤\95à¥\85रà¥\87à¤\95à¥\8dà¤\9fर à¤¬à¤¾।",
+       "title-invalid-empty": "माँगल जा रहल पन्ना टाइटिल या त खाली बा या फिर कौनों नाँवस्थान के नाँव भर दिहल गइल बाटे।",
        "title-invalid-utf8": "माँगल जा रहल पन्ना टाइटिल में अइसन UTF-8 सीक्वेंस बा जेवन मान्य नइखे।",
        "title-invalid-interwiki": "माँगल जा रहल पन्ना टाइटिल में इंटरविकि कड़ी बा जेवन टाइटिल में ना प्रयोग कइल जा सकत बा।",
        "title-invalid-talk-namespace": "माँगल जा रहल पन्ना टाइटिल एगो अइसन वार्ता पन्ना के रेफर करत बा जेवना के होखल संभव नइखे।",
        "title-invalid-magic-tilde": "माँगल जा रहल पन्ना टाइटिल में अमान्य जादुई टिल्ड सीक्वेंस (<nowiki>~~~</nowiki>) बाटे।",
        "title-invalid-too-long": "माँगल जा रहल पन्ना टाइटिल बहुत ढेर लंबा बा। ई UTF-8 की एनकोडिंग में $1 {{PLURAL:$1|बाइट|बाइट्स}} से ढेर ना होखे के चाहीं।",
        "title-invalid-leading-colon": "माँगल जा रहल पन्ना टाइटिल में सुरुआते में अमान्य कोलन (:) बाटे।",
-       "perfcached": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¡à¥\87à¤\9fा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤²à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤\85तà¤\83 à¤¹à¥\8b à¤¸à¤\95ता à¤¬à¤¾ à¤\95ि à¤\87 à¤\95à¥\87 à¤ªà¥\82रà¥\8dण à¤\85दà¥\8dयतन à¤¨à¤¾ à¤­à¤\87ल à¤¹à¥\8bà¤\96à¥\87। à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$1|à¤\8fà¤\95  à¤¨à¤¤à¥\80à¤\9cा|$1 à¤¨à¤¤à¥\80à¤\9cà¤\82}} à¤\89पलबà¥\8dध à¤¬à¤¾à¤¡à¤¼à¥\87।",
-       "perfcachedts": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¡à¥\87à¤\9fा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤¬à¤¾, à¤\86 à¤\8fà¤\95र à¤\85à¤\82तिम à¤\85पडà¥\87à¤\9f $1 à¤\95à¥\87 à¤­à¤\87ल à¤°à¤¹à¤²à¥¤ à¤\95à¥\88श à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$4|à¤\8fà¤\95  à¤¨à¤¤à¥\80à¤\9cा|$4 à¤¨à¤¤à¥\80à¤\9cाà¤\82}} उपलब्ध बा।",
-       "querypage-no-updates": "à¤\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤\85पडà¥\87à¤\9f à¤\95रल à¤\85यà¥\8bà¤\97à¥\8dय à¤¬à¤¾à¥¤ à¤\85भà¥\80 à¤\85हिà¤\9cा à¤\95à¥\87 à¤¡à¤¾à¤\9fा à¤\95à¥\87 à¤¤à¤¾à¤\9c़ा à¤¨à¤\87à¤\96à¥\87 à¤\95रल जा सकत।",
+       "perfcached": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\86à¤\81à¤\95ड़ा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤²à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤¹à¥\8b à¤¸à¤\95ता à¤¬à¤¾ à¤\95ि à¤\88 à¤\8fà¤\95दम à¤\85पडà¥\87à¤\9f à¤¨à¤¾ à¤¹à¥\8bà¤\96à¥\87। à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b  à¤¨à¤¤à¥\80à¤\9cा|$1 à¤¨à¤¤à¥\80à¤\9cा}} à¤\89पलबà¥\8dध à¤¬à¤¾।",
+       "perfcachedts": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\86à¤\81à¤\95ड़ा à¤\95à¥\88शà¥\87 à¤®à¥\87मà¥\8bरà¥\80 à¤¸à¥\87 à¤¬à¤¾, à¤\86 à¤\8fà¤\95र à¤\85à¤\82तिम à¤\85पडà¥\87à¤\9f $1 à¤\95à¥\87 à¤­à¤\87ल à¤°à¤¹à¤²à¥¤ à¤\95à¥\88श à¤®à¥\87मà¥\8bरà¥\80 à¤®à¥\87à¤\82 à¤\85धिà¤\95तम {{PLURAL:$4|à¤\8fà¤\95 à¤ à¥\8b à¤¨à¤¤à¥\80à¤\9cा|$4 à¤¨à¤¤à¥\80à¤\9cा}} उपलब्ध बा।",
+       "querypage-no-updates": "à¤\8fह à¤ªà¤¨à¥\8dना à¤¸à¥\87 à¤¸à¤\82बà¤\82धित à¤\85पडà¥\87à¤\9f à¤µà¤°à¥\8dतमान à¤®à¥\87à¤\82 à¤¨à¤¿à¤°à¤¸à¥\8dत à¤¬à¤¾à¥¤ à¤\85भà¥\80 à¤\85हिà¤\9cा à¤\95à¥\87 à¤¡à¤¾à¤\9fा à¤\95à¥\87 à¤¤à¤¾à¤\9cा à¤¨à¤\87à¤\96à¥\87 à¤\95à¤\87ल जा सकत।",
        "viewsource": "स्रोत देखीं",
        "viewsource-title": "$1 के स्रोत देखीं",
-       "actionthrottled": "à¤\95ारà¥\8dय समाप्त कर दिहल गइल बा",
-       "actionthrottledtext": "दुरुपयोग रोकथाम उपाय के रूप में, एह काम के बहुत कम समय में एक सीमा से अधिक बे करे के मना बा, आ रउआ ई सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद दोबारा कोसिस करीं।",
-       "protectedpagetext": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤\95ारà¥\8dयà¤\82 à¤¸à¥\87 à¤¬à¤\9aाव खातिर सुरक्षित कर दिहल गइल बा।",
+       "actionthrottled": "à¤\95ारà¥\8dरवाà¤\88 समाप्त कर दिहल गइल बा",
+       "actionthrottledtext": "दुरुपयोग रोकथाम उपाय के रूप में, एह काम के बहुत कम समय में एक सीमा से अधिक बे करे के मना बा, आ रउआ ई सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद दोबारा कोसिस करीं।",
+       "protectedpagetext": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤\95ारà¥\8dरवाà¤\88 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 खातिर सुरक्षित कर दिहल गइल बा।",
        "viewsourcetext": "रउआँ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
-       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>राà¤\89र à¤\86पन à¤¸à¤\82पादन à¤¸à¤¬</strong>के स्रोत देख सकत बानी आ ओकर नकल ले सकत बानी।",
-       "protectedinterface": "à¤\87 à¤ªà¤¨à¥\8dना à¤\87 à¤µà¤¿à¤\95à¥\80 à¤\95à¥\87 à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤ à¥\8dय à¤\95à¥\87 à¤¦à¥\87वà¥\87ला, à¤\86 à¤\87 à¤\95à¥\87 à¤\97लत à¤ªà¥\8dरयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤\nसभन à¤µà¤¿à¤\95ियन à¤\96ातिर à¤\85नà¥\81वाद à¤\9cà¥\8bड़à¥\87 à¤¯à¤¾ à¤¬à¤¦à¤²à¥\87 à¤\96ातिर à¤\95à¥\83पया à¤®à¥\80डियाविà¤\95ि à¤\95à¥\87 à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80यà¤\95रण à¤ªà¥\8dरà¤\95लà¥\8dप [https://translatewiki.net/ translatewiki.net] à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 करीं।",
-       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\85à¤\87सन à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¦à¤² à¤¬à¤¦à¤² à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80 à¤\9cवन à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रà¥\87ला। à¤\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¬à¤¦à¤²à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयवन à¤\95à¥\87 à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\87 à¤¶à¤\95à¥\8dलà¥\8bसà¥\82रत à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\86à¤\88।",
+       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>à¤\86पन à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन</strong>के स्रोत देख सकत बानी आ ओकर नकल ले सकत बानी।",
+       "protectedinterface": "à¤\88 à¤ªà¤¨à¥\8dना à¤\8fह à¤µà¤¿à¤\95ि à¤\95à¥\87 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफà¥\87स à¤ªà¤¾à¤  à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤²à¤¾, à¤\86 à¤¦à¥\81रà¥\82पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर à¤\8fà¤\95रा à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤\nबिनमà¥\8dर à¤\85नà¥\81रà¥\8bध à¤¬à¤¾ à¤\95ि, à¤¸à¤\97रà¥\80 à¤µà¤¿à¤\95ि à¤¸à¤­ à¤\96ातिर à¤\85नà¥\81वाद à¤\95रà¥\87 à¤¯à¤¾ à¤\85नà¥\81वाद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95रà¥\87 à¤\96ातिर à¤®à¥\80डियाविà¤\95ि à¤\95à¥\87 à¤²à¥\8bà¤\95लाà¤\87à¤\9cà¥\87शन à¤ªà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f [https://translatewiki.net/ translatewiki.net] à¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल करीं।",
+       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\85à¤\87सन à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80 à¤\9cवन à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤\95à¥\87 à¤\87à¤\82à¤\9fरफà¥\87स à¤ªà¤¾à¤  à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤²à¤¾à¥¤ à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bà¤\96à¥\87 à¤µà¤¾à¤²à¤¾ à¤¬à¤¦à¤²à¤¾à¤µ à¤\8fह à¤µà¤¿à¤\95ि à¤ªà¤° à¤\95à¥\87 à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤²à¤\89à¤\95à¥\87 à¤µà¤¾à¤²à¤¾ à¤\87à¤\82à¤\9fरफà¥\87स à¤\95à¥\87 à¤¸à¤\95लसà¥\82रत à¤\95à¥\87 à¤ªà¤°à¤­à¤¾à¤µà¤¿à¤¤ à¤\95रà¥\80।",
        "translateinterface": "सभन विकियन खातिर अनुवाद जोड़े या बदले खातिर मीडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "cascadeprotected": "ए पन्ना के संपादन कइल सुरक्षित क दिहल गइल बा काहें कि ई {{PLURAL:$1|पन्ना में, जौना के|पन्ना सब में, जिन्हन के}} \"कैस्केडिंग\" (बिस्तारित) सुरक्षा चालू क के सुरक्षित कइल गइल बा, में समाइल बाटे:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "passwordreset-emaildisabled": "इ विकि पर ई-मेल सुविधा अक्षम कर दिहल गईल बा।",
        "passwordreset-username": "प्रयोगकर्ता नाम",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बनल ई-मेल देखब?",
-       "passwordreset-capture-help": "अगर रउआ इ चेकबॉक्स पर टिक करत बानी त ई-मेल (अस्थायी गुप्तशब्द के साथ) रउआ के दिखावल जाई आ सदस्य के भेजल भी जाई।",
        "passwordreset-email": "ई-मेल पता:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
        "passwordreset-emailtext-ip": "केहु (शायद रउए, $1 आइ॰पी पता से) {{SITENAME}} ($4) पर आपन {{PLURAL:$3|गुप्तशब्द}} के रीसेट करे के अनुरोध कईले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी। रउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभी चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर आप {{PLURAL:$3|आपन}} गुप्तशब्द नइखी बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
        "tooltip-p-logo": "मुख्य पन्ना पर जाईं",
        "tooltip-n-mainpage": "मुख्य पन्ना पर जाईं",
        "tooltip-n-mainpage-description": "मुख्य पन्ना पर जाईं",
-       "tooltip-n-portal": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f à¤\95à¥\80 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\81, रउआँ का कर सकत बानी, कौनों चीज कहाँ खोजब",
+       "tooltip-n-portal": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f à¤\95à¥\80 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82, रउआँ का कर सकत बानी, कौनों चीज कहाँ खोजब",
        "tooltip-n-currentevents": "वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं",
        "tooltip-n-recentchanges": "विकि पर तुरंत भइल बदलाव के लिस्ट",
        "tooltip-n-randompage": "बेतरतीब पन्ना लोड करीं",
index 58781ab..25ac402 100644 (file)
        "nosuchaction": "এমন কোন কাজ নেই",
        "nosuchactiontext": "এই উআরএল এ নির্ধারিত কাজটি অবৈধ।\nআপনি হয়তো একটি ভুল লিঙ্ক দিয়েছেন অথবা ইউআরএল লিখতে ভুল করেছেন।\nএটি এমনও নির্দেশ করে যে {{SITENAME}} সাইটে ব্যবহৃত সফটওয়্যারটিতে একটি ত্রুটি রয়েছে।",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
-       "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতা অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
+       "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতা অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
        "error": "ত্রুটি",
        "databaseerror": "ডাটাবেস ত্রুটি",
        "databaseerror-text": "ডাটাবেজ অনুসন্ধান ত্রুটি।\nএটি সফটওয়্যারের একটি ত্রুটি হতে পারে।",
        "resetpass-submit-cancel": "বাতিল",
        "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।",
        "resetpass-recycled": "অনুগ্রহ করে বর্তমানে ব্যবহার করছেন এমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-temp-emailed": "à¦\86পনি à¦\87মà§\87à¦\87লà¦\95à§\83ত à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87à¦\9bà§\87ন।\nপà§\8dরবà§\87শ à¦\95রার à¦\9cনà§\8dয à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারন করতে হবে:",
+       "resetpass-temp-emailed": "à¦\86পনি à¦\87মà§\87à¦\87লà¦\95à§\83ত à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87à¦\9bà§\87ন।\nপà§\8dরবà§\87শ à¦\95রার à¦\9cনà§\8dয à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ করতে হবে:",
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
        "resetpass-validity-soft": "আপনার পাসওয়ার্ড বৈধ নয়: $1\n\nদয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
        "passwordreset": "পাসওয়ার্ড রিসেট",
-       "passwordreset-text-one": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নরায় à¦¸à§\87à¦\9f à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à§\8dমà¦\9fি পূরণ করুন।",
+       "passwordreset-text-one": "à¦\87মà§\87à¦\87লà§\87র à¦®à¦¾à¦§à§\8dযমà§\87 à¦\8fà¦\95à¦\9fি à¦\85সà§\8dথায়à§\80 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\87তà§\87 à¦\8fà¦\87 à¦«à¦°à¦® পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "passwordreset-disabled": "এই উইকিতে পাসওয়ার্ড রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।",
        "passwordreset-emaildisabled": "এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
        "blockedtext": "আপনার ব্যবহারকারী নাম বা আইপি ঠিকানার ঊপর নিষেধাজ্ঞা আরোপিত হয়েছে।\n\n$1 নিষেধাজ্ঞা আরোপ করেছেন। নিষেধের কারণ হিসেবে বলা হয়েছে:''$2''।\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ানাà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fà¦\95à¦\87 à¦\86à¦\87পি à¦ à¦¿à¦\95ানার à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à§\8dযবহার à¦\95রà¦\9bà§\87ন à¦¯à¦¾à¦\95à§\87 $1  à¦¦à§\8dবারা à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nবাধাদানà§\87র à¦¯à§\87 à¦\95ারণ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87:\n\n:''$2''\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়ার à¦\9aà§\87ষà§\8dà¦\9fা à¦\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 à¦¬à¦¾à¦§à¦¾à¦° à¦¬à§\8dযাপারà¦\9fি à¦\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ন\" à¦«à¦¿à¦\9aারà¦\9fি à¦¬à§\8dযবহার à¦\95রতà§\87 à¦\9aান, à¦¤à¦¬à§\87 à¦\86পনার [[Special:Preferences|পà¦\9bনà§\8dদ]] à¦\85পশনà§\87 à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87 à¦\8fবà¦\82 à¦\86পনার à¦¸à§\87à¦\9fি à¦¬à§\8dযবহারà§\87 à¦\95à§\8bন à¦¬à¦¾à¦§à¦¾ à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à¦¬à§\87 à¦¨à¦¾à¥¤\n\nà¦\86পনার à¦¬à¦°à§\8dতমান IP à¦ à¦¿à¦\95ানা à¦¹à¦\9aà§\8dà¦\9bà§\87 $3, à¦\8fবà¦\82 à¦¯à¦¾ à¦¬à¦¾à¦§à¦¾ à¦¦à¦¾à¦¨à§\87র à¦\86à¦\87ডি à¦¹à¦² $5।\nযেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
+       "autoblockedtext": "à¦\86পনার à¦\86à¦\87পি à¦ à¦¿à¦\95ানাà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\8fà¦\9fি à¦\86রà§\87à¦\95à¦\9cন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¦à§\8dবারা à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¯à¦¾à¦\95à§\87 $1 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন।\nযà§\87 à¦\95ারণà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87:\n\n:''$2''\n\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\81রà§\81র à¦¸à¦®à¦¯à¦¼: $8\n* à¦¬à¦¾à¦§à¦¾ à¦¶à§\87ষà§\87র à¦¸à¦®à¦¯à¦¼: $6\n* à¦¯à¦¾à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়ার à¦\9aà§\87ষà§\8dà¦\9fা à¦\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 à¦¬à¦¾à¦§à¦¾à¦° à¦¬à§\8dযাপারà¦\9fি à¦\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 à¦\9aান, à¦¤à¦¬à§\87 à¦\86পনার [[Special:Preferences|পà¦\9bনà§\8dদ]] à¦\85পশনà§\87 à¦\8fà¦\95à¦\9fি à¦¬à§\88ধ à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦¥à¦¾à¦\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 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¾à¦¨à§\87র à¦\86à¦\87ডি à¦¹à¦² #$5।\nযেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
        "whitelistedittext": "পাতায় সম্পাদনা করতে আবশ্যই $1 করতে হবে।",
        "confirmedittext": "কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।",
        "yourdiff": "পার্থক্য",
        "copyrightwarning": "অনুগ্রহ করে লক্ষ্য করুন {{SITENAME}}-তে সমস্ত অবদান $2-এর আওতায় প্রাপ্য (বিস্তারিত $1-তে দেখুন)। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে পুনর্বিতরণ করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না।<br />\nআপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।\n'''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-       "editpage-cannot-use-custom-model": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন করা যাবে না।",
+       "editpage-cannot-use-custom-model": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦°à§\82প পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
        "readonlywarning": "<strong>সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনি আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।</strong>\nআপনি চাইলে লেখাটি অনুলিপি করে ও কোন টেক্সট ফাইলে প্রতিলেপন করার দ্বারা ভবিষ্যতের জন্য সংরক্ষণ করতে পারেন।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "revdelete-modify-missing": "$1 আইডি সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: এটি ডাটাবেজ থেকে হারিয়ে গিয়েছে!",
        "revdelete-no-change": "'''সতর্কতা:''' $2, $1 তারিখ সম্বলিত তথ্যটিতে পূর্বেই অনুরোধকৃত সেটিংস রয়েছে।",
        "revdelete-concurrent-change": "$2, $1 তারিখ সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: আপনার সম্পাদনা শুরুর আগে কেউ এটির অবস্থা পরিবর্তন করেছেন।\nঅনুগ্রহ করে লগ দেখুন।",
-       "revdelete-only-restricted": "$2, $1 à¦¤à¦¾à¦°à¦¿à¦\96 à¦¸à¦®à§\8dবলিত à¦¤à¦¥à§\8dযà¦\9fি à¦²à§\81à¦\95ানà§\8b à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: à¦¤à¦¥à§\8dয à¦ªà§\8dরদরà§\8dশনà§\87র à¦\85নà§\8dযানà§\8dয à¦\85পশনà¦\97à§\81লà§\8b à¦¨à¦¿à¦°à§\8dধারন করা ব্যতিত আপনি এটি শুধুমাত্র প্রশাসকদের জন্য দেখার উপযোগী করতে পারবেন না।",
+       "revdelete-only-restricted": "$2, $1 à¦¤à¦¾à¦°à¦¿à¦\96 à¦¸à¦®à§\8dবলিত à¦¤à¦¥à§\8dযà¦\9fি à¦²à§\81à¦\95ানà§\8b à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: à¦¤à¦¥à§\8dয à¦ªà§\8dরদরà§\8dশনà§\87র à¦\85নà§\8dযানà§\8dয à¦¬à¦¿à¦\95লà§\8dপà¦\97à§\81লি à¦¨à¦¿à¦°à§\8dধারণ করা ব্যতিত আপনি এটি শুধুমাত্র প্রশাসকদের জন্য দেখার উপযোগী করতে পারবেন না।",
        "revdelete-reason-dropdown": "*সাধারণ অপসারণের কারণসমূহ\n** কপিরাইট লঙ্ঘন\n** অনুপযুক্ত ব্যক্তিগত তথ্য\n** অনুপযুক্ত ব্যবহারকারী নাম\n** সম্ভাব্য ক্ষতিকারক তথ্য",
        "revdelete-otherreason": "অন্য/বাড়তি কারণ:",
        "revdelete-reasonotherlist": "অন্য কারণ",
        "saveprefs": "সংরক্ষণ",
        "restoreprefs": "সকল পূর্বনির্ধারিত সেটিং ফিরিয়ে আনো (সকল অনুচ্ছেদে)",
        "prefs-editing": "সম্পাদনা",
-       "rows": "সারি:",
-       "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
        "stub-threshold": "অসম্পূর্ণ লিঙ্ক বিন্যাসের জন্য প্রান্তিক মাপ ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
-       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নরায় à¦¸à§\87à¦\9f করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
+       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\86পনার à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¡à¦¼à¦¤à§\87 à¦¸à¦\95à§\8dষম à¦¹à¦¬à§\87ন, à¦¤à¦¾à¦\87 à¦\8fà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রবà§\87ন à¦¨à¦¾à¥¤ [[Special:ResetTokens|à¦\86পনার à¦\8fà¦\9fি à¦ªà§\81নà¦\83নিরà§\8dধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
        "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী দল সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "gender-unknown": "যখন আপনাকে উল্লেখ করা হবে, সফটওয়্যার যখনই সম্ভব লিঙ্গ নিরপেক্ষ শব্দ ব্যবহার করবে",
        "gender-male": "তিনি (পুরুষ) উইকি পাতা সম্পাদনা করেন",
        "gender-female": "তিনি (মহিলা) উইকি পাতা সম্পাদনা করেন",
-       "prefs-help-gender": "সেটিংসের এই পরিবর্তন ঐচ্ছিক।\nসফটওয়্যারে মাধ্যমে লিঙ্গ অনুযায়ী সম্বধনের ক্ষেত্রে এটি ব্যবহৃত হয়।\nএই তথ্য সকলের জন্য উন্মুক্ত থাকেবে।",
+       "prefs-help-gender": "সà§\87à¦\9fিà¦\82সà§\87র à¦\8fà¦\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\90à¦\9aà§\8dà¦\9bিà¦\95।\nসফà¦\9fà¦\93য়à§\8dযারà§\87 à¦®à¦¾à¦§à§\8dযমà§\87 à¦²à¦¿à¦\99à§\8dà¦\97 à¦\85নà§\81যায়à§\80 à¦¸à¦®à§\8dবà§\8bধনà§\87র à¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\8fà¦\9fি à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à¥¤\nà¦\8fà¦\87 à¦¤à¦¥à§\8dয à¦¸à¦\95লà§\87র à¦\9cনà§\8dয à¦\89নà§\8dমà§\81à¦\95à§\8dত à¦¥à¦¾à¦\95à§\87বà§\87।",
        "email": "ই-মেইল",
        "prefs-help-realname": "আসল নাম দেওয়া অনাবশ্যক।\nযদি আসল নাম দেন, তবে আপনার কাজের স্বীকৃতি দানে তা ব্যবহার করা হবে।",
        "prefs-help-email": "ইমেইল ঠিকানা ঐচ্ছিক, তবে পাসওয়ার্ড ভুলে গেলে নতুন করে পাসওয়ার্ড নিতে এটির প্রয়োজন হবে।",
        "prefs-help-email-others": "আপনি আপনার পরিচয় প্রকাশ না করেও আপনার ব্যবহারকারী অথবা আলাপ পাতাটির মাধ্যমে অন্যদেরকে আপনার সাথে যোগাযোগ করতে দিতে পারেন।",
        "prefs-help-email-required": "ই-মেইল ঠিকানা আবশ্যক।",
        "prefs-info": "সাধারণ তথ্য",
-       "prefs-i18n": "à¦\86নà§\8dতরà§\8dà¦\9cাতিà¦\95িকরণ",
+       "prefs-i18n": "à¦\86নà§\8dতরà§\8dà¦\9cাতিà¦\95à§\80করণ",
        "prefs-signature": "স্বাক্ষর",
        "prefs-dateformat": "তারিখ বিন্যাস",
        "prefs-timeoffset": "সময় অফসেট",
        "userrights-lookup-user": "একজন ব্যবহারকারী নির্বাচন করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
-       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} জন্য ব্যবহারকারী অধিকার পরিবর্তন করছেন",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার পরিবর্তন করছেন",
+       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার দেখছেন",
        "userrights-editusergroup": "ব্যবহারকারীর দল সম্পাদনা করো",
+       "userrights-viewusergroup": "ব্যবহারকারী দল দেখা",
        "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো",
        "userrights-groupsmember": "সদস্য:",
        "userrights-groupsmember-auto": "শর্তহীন সদস্য",
        "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
-       "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারীগণ",
+       "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
        "group-suppress": "দমনকারী",
        "group-all": "(সমস্ত)",
        "group-user-member": "{{GENDER:$1|ব্যবহারকারী}}",
-       "group-autoconfirmed-member": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
+       "group-autoconfirmed-member": "{{GENDER:$1|স্বয়ংনিশ্চিতকৃত ব্যবহারকারী}}",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
        "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
        "grant-generic": "\"$1\" অধিকার স্তর",
+       "grant-group-page-interaction": "পাতার সাথে মিথস্ক্রিয়া",
+       "grant-group-file-interaction": "মিডিয়ার সাথে মিথস্ক্রিয়া",
+       "grant-group-watchlist-interaction": "আপনার নজরতালিকার সাথে মিথস্ক্রিয়া",
        "grant-group-email": "ইমেইল পাঠান",
+       "grant-group-high-volume": "উচ্চ পরিমানের কার্যকলাপ সম্পাদন",
        "grant-group-customization": "অনুকূলকরণ ও পছন্দ",
        "grant-group-administration": "প্রশাসনিক কাজ সঞ্চালন করুন",
        "grant-group-private-information": "আপনার সম্পর্কিত ব্যক্তিগত তথ্যে প্রবেশাধিকার পায়",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
        "grant-oversight": "ব্যবহারকারী লুকান ও ইতিহাস অপসারণ",
+       "grant-patrol": "পাতার পরিবর্তনে টহল দেয়া",
        "grant-privateinfo": "ব্যক্তিগত তথ্যে প্রবেশাধিকার",
        "grant-protect": "পাতাসমূহ সুরক্ষা ও অরক্ষিত করুন",
+       "grant-rollback": "পাতার পরিবর্তন ফেরত নেয়া",
        "grant-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "grant-uploadeditmovefile": "ফাইল আপলোড, প্রতিস্থাপন এবং স্থানান্তর",
        "grant-uploadfile": "নতুন ফাইল আপলোড করুন",
        "action-upload_by_url": "কোন ইউআরএল থেকে ফাইলটি আপলোড করো",
        "action-writeapi": "রাইট এপিআই ব্যবহার করুন",
        "action-delete": "পাতাটি মুছে ফেলো",
-       "action-deleterevision": "এই সংশোধনটি মুছে ফেলার",
-       "action-deletedhistory": "পাতার মুছে ফেলা ইতিহাস দেখাও",
+       "action-deleterevision": "সংশোধনটি মুছে ফেলার",
+       "action-deletelogentry": "লগের ভুক্তি অপসারণ করার",
+       "action-deletedhistory": "পাতার অপসারিত ইতিহাস দেখার",
+       "action-deletedtext": "অপসারিত সংশোধনের লেখা দেখার",
        "action-browsearchive": "অপসারিত পাতায় অনুসন্ধান করুন",
-       "action-undelete": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\8b",
-       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦ªà¦°à§\8dযালà§\8bà¦\9aনা à¦\8fবà¦\82 à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রà§\81ন",
+       "action-undelete": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রার",
+       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦ªà¦°à§\8dযালà§\8bà¦\9aনা à¦\8fবà¦\82 à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রার",
        "action-suppressionlog": "এই ব্যক্তিগত লগ দেখার",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দেয়ার",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করার",
        "action-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন",
        "action-siteadmin": "ডাটাবেজ বন্ধ অথবা খুলুন",
        "action-sendemail": "ই-মেইল পাঠাও",
+       "action-editmyoptions": "নিজের পছন্দসমূহ সম্পাদনা করার",
        "action-editmywatchlist": "আপনার নজরতালিকা পরিবর্তন করুন",
        "action-viewmywatchlist": "আপনার নজরতালিকা দেখুন",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
        "enhancedrc-history": "ইতিহাস",
-       "recentchanges": "সাম্প্রতিক পরিবর্তনসমূহ",
+       "recentchanges": "সাম্প্রতিক পরিবর্তন",
        "recentchanges-legend": "সাম্প্রতিক পরিবর্তনের পছন্দসমূহ",
        "recentchanges-summary": "এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-noresult": "নির্ধারিত সময়ের মধ্যে কোনো পরিবর্তন পাওয়া যায়নি।",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "recentchanges-submit": "দেখাও",
+       "rcfilters-filter-editsbyself-label": "আপনার নিজস্ব সম্পাদনা",
+       "rcfilters-filter-editsbyself-description": "আপনার দ্বারা সম্পাদনা।",
+       "rcfilters-filter-editsbyother-label": "অন্যদের দ্বারা সম্পাদনা",
+       "rcfilters-filter-editsbyother-description": "অন্য ব্যবহারকারীদের দ্বারা করা সম্পাদনা (আপনার না)।",
+       "rcfilters-filtergroup-userExpLevel": "ব্যবহারকারীর অভিজ্ঞতা স্তর",
+       "rcfilters-filter-userExpLevel-newcomer-label": "নতুন আগত",
+       "rcfilters-filter-userExpLevel-learner-label": "শিক্ষার্থী",
+       "rcfilters-filter-userExpLevel-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "apisandbox-results": "ফলাফল",
        "apisandbox-sending-request": "API অনুরোধ পাঠানো হচ্ছে...",
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
+       "apisandbox-request-params-json": "JSON প্যারামিটার:",
        "apisandbox-request-url-label": "অনুরোধের URL:",
        "apisandbox-request-time": "অনুরোধের সময়: {{PLURAL:$1|$1 মি.সে.}}",
        "apisandbox-results-fixtoken": "টোকেন সংশোধন ও পুনরায় জমা",
        "logempty": "মিলে যায় এমন কিছু লগে পাওয়া যায়নি।",
        "log-title-wildcard": "এই টেক্সট দিয়ে শুরু হওয়া শিরোনামগুলি অনুসন্ধান করা হোক",
        "showhideselectedlogentries": "নির্বাচিত লগগুলো দেখাও/লুকাও",
+       "log-edit-tags": "নির্বাচিত লগের ভুক্তির ট্যাগ সম্পাদনা করুন",
        "checkbox-select": "নির্বাচন: $1",
        "checkbox-all": "সব",
        "checkbox-none": "কোনটিই নয়",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "activeusers-from": "ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
        "activeusers-groups": "এই দলভুক্ত ব্যবহারকারী দেখান:",
+       "activeusers-excludegroups": "এই দলভুক্ত ব্যবহারকারী বাদ দিন:",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
        "listgrouprights": "দলগত ব্যবহারকারী অধিকার",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
        "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
+       "listgrouprights-namespaceprotection-restrictedto": "অধিকার যা ব্যবহারকারীকে সম্পাদনা করার অনুমতি দেয়",
        "listgrants": "কার্যভার",
        "listgrants-summary": "নিম্নে ব্যবহারকারী অধিকারের সাথে যুক্ত প্রবেশাধিকারসহ তাদের কার্যভারের একটি তালিকা দেয়া হয়েছে। ব্যবহারকারীরা তাদের অ্যাকাউন্ট ব্যবহার করতে অ্যাপ্লিকেশনকে অনুমোদন দিতে পারে, কিন্তু কার্যভারের উপর ভিত্তি করে সীমিত অনুমতি ব্যবহারকারীরা অ্যাপ্লিকেশনকে দিতে পারবেন। মূলত, একটি অ্যাপ্লিকেশন একজন ব্যবহারকারীর দেয়া অধিকারের অতিরিক্ত অধিকার ব্যবহার করতে পারবে না। পৃথক অধিকার সম্পর্কে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] দেখুন।",
        "listgrants-grant": "কার্যভার",
        "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
-       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}।",
+       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$2|আপনার}} ইমেল ঠিকানা {{GENDER:$1|তাঁর}} কাছে প্রকাশ করা হবে।",
        "usermessage-summary": "বাদবাকি সিস্টেম বার্তা",
        "usermessage-editor": "সিস্টেম ম্যাসেঞ্জার",
        "usermessage-template": "MediaWiki:ব্যবহারকারী বার্তা",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
-       "changecontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন",
-       "changecontentmodel-legend": "বিষয়বসà§\8dতà§\81র à¦®à¦¡à§\87ল পরিবর্তন করুন",
+       "changecontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦°à§\82প পরিবর্তন",
+       "changecontentmodel-legend": "বিষয়বসà§\8dতà§\81র à¦°à§\82প পরিবর্তন করুন",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "changecontentmodel-reason-label": "কারণ:",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
-       "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর মডেল উপলব্ধ নয়",
-       "log-name-contentmodel": "বিষয়বস্তুর মডেল পরিবর্তন লগ",
-       "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর মডেল \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
+       "changecontentmodel-nodirectediting": "$1 বিষয়বস্তুর রূপ সরাসরি সম্পাদনা করা সমর্থন করে না",
+       "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর রূপ উপলব্ধ নয়",
+       "log-name-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তন লগ",
+       "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর রূপ \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectlogpage": "সুরক্ষা লগ",
        "ipboptions": "২ ঘণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
-       "ipb-disableusertalk": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨à¦\95à§\83ত à¦\85বসà§\8dথায় à¦¨à¦¿à¦\9aের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
+       "ipb-disableusertalk": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨à¦\95à§\83ত à¦\85বসà§\8dথায় à¦¨à¦¿à¦\9cের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
        "ipb-change-block": "এই একই সেটিংসসহ ব্যবহারকারীকে আবারও বাধা প্রদান করো",
        "ipb-confirm": "বাধা নিশ্চিতকরণ",
        "badipaddress": "আইপি (IP) ঠিকানাটি অগ্রহনযোগ্য",
        "cant-move-to-user-page": "আপনার কোনো পাতা ব্যবহারকারী পাতার স্থানান্তরের অনুমতি নেই (ব্যবহারকারী উপপাতা ব্যতিত)।",
        "cant-move-category-page": "আপনার বিষয়শ্রেণী পাতা স্থানান্তরের অনুমতি নেই।",
        "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
+       "cant-move-subpages": "আপনার উপপাতা স্থানান্তরের অনুমতি নেই।",
        "newtitle": "নতুন শিরোনাম:",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা স্থানান্তর করুন",
        "pageinfo-length": "পাতার দৈর্ঘ্য (বাইটে)",
        "pageinfo-article-id": "পাতার আইডি",
        "pageinfo-language": "পাতার তথ্যের ভাষা",
-       "pageinfo-content-model": "পাতার বিষয়বস্তুর মডেল",
+       "pageinfo-language-change": "পরিবর্তন",
+       "pageinfo-content-model": "পাতার বিষয়বস্তুর রূপ",
        "pageinfo-content-model-change": "পরিবর্তন",
        "pageinfo-robot-policy": "রোবটের মাধ্যমে ইন্ডেক্স করা হচ্ছে",
        "pageinfo-robot-index": "অনুমোদিত",
        "tag-filter": "[[Special:Tags|ট্যাগ]] ছাকনী:",
        "tag-filter-submit": "ছাকনী",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)",
+       "tag-mw-contentmodelchange": "বিষয়বস্তুর রূপ পরিবর্তন",
+       "tag-mw-contentmodelchange-description": "সম্পাদনা যা একটি পাতার [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel বিষয়বস্তুর রূপ পরিবর্তন] করে",
        "tags-title": "ট্যাগসমূহ",
        "tags-intro": "এই পাতায় সফটওয়্যারটি একটি সম্পাদনা চিহ্নিত করার জন্য যে সকল ট্যাগ ব্যবহার করে তার তালিকা ও বর্ণনা রয়েছে।",
        "tags-tag": "ট্যাগ নাম",
        "feedback-useragent": "ব্যবহারকারী এজেন্ট:",
        "searchsuggest-search": "{{SITENAME}} অনুসন্ধান",
        "searchsuggest-containing": "যা আছে...",
-       "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
-       "api-error-blocked": "আপনাকে সম্পাদনা করা থেকে বাধা দেয়া হয়েছে।",
-       "api-error-copyuploaddisabled": "এই সার্ভারে ইউআরএল-এর মাধ্যমে আপলোড করার সুবিধা নিস্ক্রিয় রয়েছে।",
-       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের বিষয় সমৃদ্ধ {{PLURAL:$1|অন্য ফাইল|কিছু অন্য ফাইল}} রয়েছে।",
-       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1|অপর একটি ফাইল|কয়েকটি ফাইল}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
-       "api-error-empty-file": "আপনার জমাকৃত ফাইলটি খালি।",
        "api-error-emptypage": "নতুন পাতা তৈরি হচ্ছে, খালি পাতা গ্রহণযোগ্য নয়।",
-       "api-error-fetchfileerror": "অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।",
-       "api-error-fileexists-forbidden": "\"$1\" নামের একটি ফাইল রয়েছে, প্রতিস্থাপন সম্ভব নয়।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" নামে শেয়ার্ড রিপোজিরীতে একটি ফাইল রয়েছে, প্রতিস্থাপন সম্ভব নয়।",
-       "api-error-file-too-large": "আপনার জমাকৃত ফাইলটি অনেক বড়।",
-       "api-error-filename-tooshort": "এই ফাইল নামটি খুবই ছোট।",
-       "api-error-filetype-banned": "এই ধরনের ফাইল নিষিদ্ধ।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।",
-       "api-error-filetype-missing": "এই ফাইলটির কোনো এক্সটেনশন নেই।",
-       "api-error-hookaborted": "যে পরিবর্তনটি আপনি করার চেষ্টা করেছিলেন তা এক্সটেনশন হুক দ্বারা বাতিলকৃত হয়েছে।",
-       "api-error-http": "অভ্যন্তরীণ ত্রুটি: সার্ভারে সংযোগ প্রদান করা সম্ভব হচ্ছে না।",
-       "api-error-illegal-filename": "ফাইলের এই নামটি গ্রহণযোগ্য নয়।",
-       "api-error-internal-error": "অভ্যন্তরীণ ত্রুটি: এই উইকিতে আপনার আপলোড প্রক্রিয়াকরণ করার সময় কোনো ত্রুটি দেখা দিয়েছে।",
-       "api-error-invalid-file-key": "অভ্যন্তরীণ ত্রুটি: অস্থায়ী সংরক্ষণশালায় ফাইলটি খুঁজে পাওয়া যায়নি।",
-       "api-error-missingparam": "অভ্যন্তরীণ ত্রুটি: অনুরোধে কিছু প্যারামিটারের ঘাটতি রয়েছে।",
-       "api-error-missingresult": "অভ্যন্তরীণ ত্রুটি: সফলভাবে অনুলিপি করা হয়েছে কিনা তা নিশ্চিত করা সম্ভব হয়নি।",
-       "api-error-mustbeloggedin": "ফাইল আপলোড করার জন্য আপনাকে অবশ্যই এই উইকিতে প্রবেশ করতে হবে।",
-       "api-error-mustbeposted": "অভ্যন্তরীণ ত্রুটি: এই অনুরোধের জন্য এইচটিটিপি পোস্ট প্রয়োজন।",
-       "api-error-noimageinfo": "আপলোড সফল হয়েছে, কিন্তু ফাইলটি সম্পর্কে সার্ভার কোন তথ্য প্রদান করে নি।",
-       "api-error-nomodule": "অভ্যন্তরীণ ত্রুটি: কোন আপলোড মডিউল সেট করা হয়নি।",
-       "api-error-ok-but-empty": "অভ্যন্তরীণ ত্রুটি: সার্ভার হতে কোন সাড়া পাওয়া যাচ্ছে না।",
-       "api-error-overwrite": "ইতিমধ্যেই রয়েছে এমন কোনো ফাইলের প্রতিস্থাপন গ্রহণযোগ্য নয়।",
-       "api-error-stashfailed": "অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।",
        "api-error-publishfailed": "অভ্যন্তরীন ত্রুটি: সার্ভার অস্থায়ী ফাইলটি প্রকাশ করতে ব্যর্থ হয়েছে।",
-       "api-error-stasherror": "স্ট্যাশে আপলোডের সময় চিত্র আপলোডের সময় একটি সমস্যা দেখা দিয়েছে।",
-       "api-error-stashfilestorage": "স্ট্যাশে ফাইল সংরক্ষণের সময় একটি ত্রুটি হয়েছে।",
-       "api-error-timeout": "কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।",
-       "api-error-unclassified": "একটি অজানা ত্রুটি দেখা দিয়েছে",
-       "api-error-unknown-code": "অজানা ত্রুটি: \"$1\"",
-       "api-error-unknown-error": "অভ্যন্তরীণ ত্রুটি: আপনার ফাইলটি আপলোড করার সময় কিছু সমস্যা হয়েছে।",
+       "api-error-stashfailed": "অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।",
        "api-error-unknown-warning": "অজানা সতর্কীকরণ: $1",
        "api-error-unknownerror": "অজানা ত্রুটি: \"$1\"।",
-       "api-error-uploaddisabled": "এই উইকির জন্য আপলোড সুবিধা নিস্ক্রিয় রয়েছে।",
-       "api-error-verification-error": "সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।",
        "duration-seconds": "$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}",
        "duration-minutes": "$1 {{PLURAL:$1|মিনিট|মিনিট}}",
        "duration-hours": "$1 {{PLURAL:$1|ঘণ্টা}}",
        "pagelang-language": "ভাষা",
        "pagelang-use-default": "ডিফল্ট ভাষা ব্যবহার করুন",
        "pagelang-select-lang": "ভাষা নির্বাচন করুন",
+       "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
        "right-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "sessionprovider-nocookies": "কুকি নিষ্ক্রিয় করা। নিশ্চিত করুন যে আপনার কুকি সক্রিয় আছে এবং আবার শুরু করুন।",
        "randomrootpage": "অজানা মূল পাতা",
        "log-action-filter-block": "বাধাদানের ধরন:",
+       "log-action-filter-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তনের ধরন:",
        "log-action-filter-delete": "অপসারণের ধরন:",
        "log-action-filter-import": "আমদানির ধরন:",
        "log-action-filter-managetags": "ট্যাগ ব্যবস্থাপনা কার্যের ধরন:",
        "log-action-filter-block-block": "বাধাদান",
        "log-action-filter-block-reblock": "বাধাদান পরিবর্তন",
        "log-action-filter-block-unblock": "বাধা অপসারণ",
-       "log-action-filter-contentmodel-change": "বিষয়বস্তুর মডেল পরিবর্তন",
+       "log-action-filter-contentmodel-change": "বিষয়বস্তুর রূপ পরিবর্তন",
+       "log-action-filter-contentmodel-new": "অ-মানক বিষয়বস্তুর রূপসহ পাতা তৈরি",
        "log-action-filter-delete-delete": "পাতা অপসারণ",
        "log-action-filter-delete-restore": "পাতা পুনঃরুদ্ধার",
        "log-action-filter-delete-event": "লগ অপসারণ",
        "authmanager-create-disabled": "অ্যাকাউন্ট সৃষ্টিকরণ নিষ্ক্রিয় করা হয়েছে।",
        "authmanager-create-from-login": "আপনার একাউন্ট তৈরি করতে, ক্ষেত্রগুলি পূরণ করুন।",
        "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
+       "authmanager-authplugin-setpass-failed-message": "প্রমাণীকরণ প্লাগইন পাসওয়ার্ড পরিবর্তন করতে অস্বীকৃতি জানিয়েছে।",
+       "authmanager-authplugin-create-fail": "প্রমাণীকরণ প্লাগইন অ্যাকাউন্ট তৈরি করতে অস্বীকৃতি জানিয়েছে।",
        "authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
        "authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
        "authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "authmanager-provider-password": "পাসওয়ার্ড-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-password-domain": "পাসওয়ার্ড ও ডোমেইন-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
+       "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-login-continue": "প্রবেশ অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
+       "authpage-cannot-create": "অ্যাকাউন্ট সৃষ্টি আরম্ভ করা সম্ভব নয়।",
+       "authpage-cannot-create-continue": "অ্যাকাউন্ট সৃষ্টি অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
+       "authpage-cannot-link": "অ্যাকাউন্ট সংযোগ করা আরম্ভ করা সম্ভব নয়।",
+       "authpage-cannot-link-continue": "অ্যাকাউন্ট সংযোগ করা অব্যাহত রাখা সম্ভব নয়। সম্ভবত আপনার সেশনের সময় শেষ হয়েছে।",
        "cannotauth-not-allowed-title": "অনুমতি অস্বীকৃত",
        "cannotauth-not-allowed": "আপনি এই পাতাটি ব্যবহার করতে অনুমতিপ্রাপ্ত নন।",
        "changecredentials": "পরিচয়পত্র পরিবর্তন করুন",
        "removecredentials-success": "আপনার পরিচয়পত্র সরানো হয়েছে।",
        "credentialsform-provider": "পরিচয়পত্রের ধরন:",
        "credentialsform-account": "অ্যাকাউন্টের নাম:",
+       "cannotlink-no-provider-title": "আর কোন সংযোগযোগ্য অ্যাকাউন্ট নেই",
+       "cannotlink-no-provider": "আর কোন সংযোগযোগ্য অ্যাকাউন্ট নেই।",
        "linkaccounts": "অ্যাকাউন্ট সংযোগ করুন",
        "linkaccounts-success-text": "অ্যাকাউন্টটি সংযোগ করা হয়েছে।",
        "linkaccounts-submit": "অ্যাকাউন্ট সংযুক্ত করুন",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন"
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন",
+       "revid": "সংশোধন $1",
+       "pageid": "পাতার আইডি $1"
 }
index 0bdaf65..f1b084d 100644 (file)
@@ -4,7 +4,8 @@
                        "Usingha",
                        "Uttam Singha, Dec 2006",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "MtDu"
                ]
        },
        "tog-underline": "লিঙ্কর তলে দুরগ দিক:",
        "variants": "ভেরিয়েন্টহানি",
        "errorpagetitle": "লাল",
        "returnto": "$1-ত আলথকে যাগা।",
-       "tagline": "মুক্ত বিশ্বকোষ উইকিপিডিয়াত্ত",
+       "tagline": "মুক্ত বিশ্বকোষ উইকিপিডিয়াত্ত {{SITENAME}}",
        "help": "পাংলাক",
        "search": "বিসারিয়া চা",
        "searchbutton": "বিসারানি",
index 407a2a7..a0d4c05 100644 (file)
@@ -44,7 +44,9 @@
        "tog-showhiddencats": "نشودادن دسته بندیهای قایم شده",
        "underline-always": "همیشه",
        "underline-never": "هرگز",
-       "underline-default": "پیش نمایش مرورگر",
+       "underline-default": "پۈسدإ آ دوڤارتإ نيأر پيش فرز",
+       "editfont-sansserif": "فونت سان سئریف",
+       "editfont-serif": "فونت سريف",
        "sunday": "یکشنبه",
        "monday": "دوشنبه",
        "tuesday": "سه‌شنبه",
        "oct": "ئوکتوبر",
        "nov": "نوڤامر",
        "dec": "دئسامر",
+       "january-date": "جانڤيأ $1",
+       "february-date": "فإڤريأ $1",
+       "march-date": "مارس  $1",
+       "april-date": "آڤريل $1",
+       "may-date": "مإی $1",
+       "june-date": "جۈأن $1",
+       "july-date": "جۈلای $1",
        "period-am": "دم سوڤ",
        "period-pm": "پسين",
        "pagecategories": "{{PLURAL:$1|دسته|دسته ها}}",
        "about": "درباره",
        "newwindow": "(پنجره تازه واز کن)",
        "cancel": "لغو",
+       "moredotdotdot": "بيشدر",
        "mypage": "بألگأ",
        "mytalk": "چأک چنأ",
        "anontalk": "چأک چنأ",
        "qbbrowse": "قأرز کردن",
        "qbedit": "اصلاح",
        "qbpageoptions": "اي بألگأ",
+       "qbmyoptions": "بألگإ آ مو",
        "faq": "اف ای کیو",
        "faqpage": "Project:اف ای کیو",
        "namespaces": "نوم ڤأرگأ آ",
        "help": "راهنما",
        "search": "پئی جوٙری",
        "searchbutton": "پئی جوٙری",
+       "go": "رۉ",
        "searcharticle": "برو",
        "history": "گزارش صفحه",
        "history_short": "گزارش تاریخی",
        "editthispage": "اصلاح ای صفحه",
        "delete": "حذف",
        "protect": "حفاظت وحمایت",
+       "protect_change": "آلإشت کونين",
        "newpage": "صفحه تازه",
        "talkpage": "بحث ای صفحه",
        "talkpagelinktext": "چأک چئنە",
        "disclaimers": "تیە پوٙشنا",
        "disclaimerpage": "Project: تیە پوشنیدٙئنئ کولی",
        "edithelp": "کمک برای اصلاح",
+       "helppage-top-gethelp": "هومیاري",
        "mainpage": "سأرآسوٙنە",
        "mainpage-description": "صفحه اصلی",
        "policy-url": "Project:خط مشی",
        "toc": "محتواها",
        "showtoc": "نمایش",
        "hidetoc": "قایم",
+       "collapsible-expand": "گأپ کلۈن کردن",
        "confirmable-yes": "هرإ",
        "confirmable-no": "نأ",
        "thisisdeleted": "دیدن یا اعاده $1?",
        "userlogin-yourname-ph": "نوم کاریاريتونأ بزنين",
        "yourpassword": "رمز:",
        "userlogin-yourpassword": "رازينإ گوڤأرتن",
+       "userlogin-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
+       "createacct-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
+       "createacct-yourpasswordagain": "پشت راسدکاري رازينإ گوڤأرتن",
+       "createacct-yourpasswordagain-ph": "ز نۉ رازينإ گوڤأرتن نأ بزأ",
+       "userlogin-remembermypassword": "مۈنإ مإن سامۈنإ ڤاڌار",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
        "userlogin": "اویدن به سیستم / درست کردن حساب کاربری",
        "createaccount": "درست کردن حساب کاربری",
        "gotaccount": "آیا تقریبا یه حساب کاربری دارین? '''$1'''.",
        "gotaccountlink": "اویدن به",
+       "userlogin-resetpassword-link": "رازینإ گوڤأرتن تۈ ز ڤيرتۈن رأهڌإ",
+       "userlogin-helplink2": "هومياري کردن سي ڤامإن أڤوڌن",
+       "createacct-emailoptional": "تيرنشۈن أنجومانامأ",
+       "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
+       "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
+       "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "loginsuccesstitle": "اویدن با بخت وتوفیق به سیستم",
        "loginsuccess": "''' ایسا اویدن به داخل سایت {{SITENAME}} بعنوان \"$1\".'''",
        "nosuchuser": "کاربری به ای نام وجود نداره \"$1\".\nحروف نام را چک کنین, یا [[Special:CreateAccount|درست کنین یه حساب کاربری تازه]].",
        "wrongpassword": "رمز وارد وابیده درست نه.\nلطفا دوباره سعی کنین.",
        "wrongpasswordempty": "رمز وارد وابیده عقیم یامبهم بی.\nلطفا دوباره سعی کنین.",
        "passwordtooshort": "رمز ایسا غیر معتبر یا کوتاه هده.\nآن وا داشته بوه حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکترها}} همچنین وا زه نام کاربریتو متفاوت بوه.",
-       "mailmypassword": "اÙ\85Û\8cÙ\84 Ø±Ù\85ز ØªØ§Ø²Ù\87",
+       "mailmypassword": "ز Ù\86Û\89 Ø¯Ø§Ú\8cÙ\86 Ø±Ø§Ø²Ù\8aÙ\86Ø¥ Ú¯Ù\88أرتÙ\86",
        "passwordremindertitle": "رمز موقتی تازه سی {{SITENAME}}",
        "passwordremindertext": "یه نفر (شاید خودتو, زه نشانی آی پی$1) درخواست یه رمز تازه کرده سی {{SITENAME}} ($4). یه رمز موقتی سی کاربر\n\"$2\" درست شده وگذاشته وابیده به\"$3\". ایر مطابق میل ایسا بوه, نیازه که داخل سیستم بوین ویه رمز تازه انتخاب کنین.\n\nایر آن فرد همچنین درخواست کرده بوه  یونه, یا ایر ایسا رمزتو را به خاط داشته این ,\nوسی مدت طولانی نه خوین هونه تغییر بدین, ایسا وا نادیده بگیرین ای پیام  را وهمچنان زه رمز قدیمی خوتو استفاده کنین",
        "noemail": "وجود نداره نشانی امیل ضبط وابده زه کاریر \"$1\".",
        "pt-createaccount": "راسد کردن هساڤ کارياري",
        "pt-userlogout": "ز سامۈنإ درأڤوڌن",
        "retypenew": "تایپ دوباره رمز:",
+       "botpasswords-label-create": "راس كردن",
+       "botpasswords-label-cancel": "أنجومشيڤ کردن",
+       "botpasswords-label-delete": "پاکسا کردن",
+       "botpasswords-label-resetpassword": "ز نۉ داڌن رازينإ گوأرتن",
+       "resetpass-submit-cancel": "أنجومشيڤ کردن",
        "passwordreset": "ز نۉ داڌن رازينإ گوأرتن",
+       "passwordreset-username": "نوم کارياري",
+       "passwordreset-domain": "پوشگر",
+       "passwordreset-email": "تيرنشۈن أنجومانامأ",
+       "changeemail-none": "(هيش كوم)",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "italic_sample": "متن شکسته",
        "sig_tip": "امضای ایسا و برچسب زمان",
        "hr_tip": "خط افقی (کم استفاده کنین)",
        "summary": "خلاصه:",
-       "subject": "موضوع/سرخط:",
+       "subject": "داسۈن",
        "minoredit": "ای یه اصلاح ریزه-رز",
        "watchthis": "پیگیری ای صفحه",
        "savearticle": "صفحه ضبط بوه",
        "template-semiprotected": "(نیمه حمایت وابیده)",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
+       "content-model-wikitext": "ڤيکي تکست",
+       "content-model-javascript": "جاڤا إسکريپت",
        "viewpagelogs": "نشودادن نمایه ها سی ای صفحه",
        "currentrev": "نسخه جاری",
+       "currentrev-asof": "آخرين ڤانيأري جۈر $1",
        "revisionasof": "اصلاح $1",
        "revision-info": "نوسقإ ڤانيأري ڤابيڌإ جۈر $1 ڤا $2",
        "previousrevision": "← اصلاح قبلی",
        "nextrevision": "نسخه بعدی →",
        "currentrevisionlink": "نسخه جاری",
        "cur": "فعلی",
+       "next": "نيایي",
        "last": "قبلی",
        "page_first": "اولین",
        "page_last": "آخری",
        "histlegend": "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />\n'شرح: (فعلی) = تفاوت با نسخه جاری\n(قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
-       "histfirst": "کهنه ترین",
-       "histlast": "تازه ترین",
+       "histfirst": "دينداتري",
+       "histlast": "تازإترين",
+       "historyempty": "(هالي)",
        "history-feed-item-nocomment": "$1 در $2",
+       "rev-delundel": "آلشد هال و بال ديإن",
+       "rev-showdeleted": "دياري کردن",
+       "revdelete-show-file-submit": "هأرإ",
        "history-title": "دڤارتإ دیئن ڤيرگار $1",
+       "difference-title": "فرخ مإنجقا ڤانإیريا \"$1\"",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn": "بعدی {{PLURAL:$1|$1}}",
        "nextn-title": "نيایي $1 {{PLURAL:$1|نتيجه|نتيجإآ}}",
+       "shown-title": "نإشۈن دائن $1 {{PLURAL:$1|نتيجأ|نتيجإ آ}} سي هر بألگأ",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-advanced": "پیشکرده",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
        "searchprofile-images-tooltip": "جانیاانه پی جوری کو",
+       "searchprofile-everything-tooltip": "همإ مإنۈنإ آ نأ پی جۈري کو(د ڤر گرهڌإ بألگإیل چأک چنأ)",
+       "searchprofile-advanced-tooltip": "نوم جایل نوم ديار نأ بگرد.",
        "search-result-size": "$1 ({{PLURAL:$2|1 ڤاجه یل|$2 ڤاجه یل}})",
        "search-redirect": "(ڤاگردۈني ز $1)",
        "search-section": "(بهرجا $1)",
+       "search-suggest": "منزۈرت یو بي:$1",
        "searchall": "همه",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "preferences": "اولویتها",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchanges-label-bot": "اي ڤيرایشد نأ یأ بوت أنجوم داڌإ",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نوابيه",
+       "recentchanges-label-plusminus": "أندازإ بألگأ ب شومار اي بایتا آلشد کردإ.",
        "recentchanges-legend-heading": "<strong>میراث:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو سإیل کونين ب[[Special:بألگإیل تازأ|نومگأ بإلگإیل تازأ]])",
        "rcnotefrom": "در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).",
        "rclistfrom": "نشودادن تغییرات تازه با شروع زه $3 $2",
        "rcshowhideminor": "اصلاحات کوچیک $1",
        "filehist-current": "جاری",
        "filehist-datetime": "تاریخ/زمان",
        "filehist-thumb": "عسگ کۈچير وابيه",
+       "filehist-thumbtext": "كۈچير کردن سی نوسقإ $1",
        "filehist-user": "کاربر",
        "filehist-dimensions": "ابعاد",
        "filehist-filesize": "اندازه فایل",
        "linkstoimage": "ذیل الذکر {{PLURAL:$1|لینکهای صفحه|$1 لینک صفحات}} به ای فایل:",
        "nolinkstoimage": "هیچ صفحه ای نه که لینک وابیده بوه به ای فایل",
        "sharedupload": "ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه",
+       "sharedupload-desc-here": "جانيایي کإ مإن $1 گاشا مإن پوروجأیل هإني ب کار گرهڌإ وابيڌإ.\nتۉزي سي [$2 file description page] مإن دإڤۈن دياري کردإ",
        "uploadnewversion-linktext": "آپلود کردن یه نسخه تازه زه ای فایل",
+       "upload-disallowed-here": "ايسا نترين اي جانيا نأ ز نۉ سوڤار کونين",
        "mimesearch": "MIME جستجو رو پایه",
        "listredirects": "لیست تغییر مسیرها",
        "unusedtemplates": "قالبها یا الگوهای استفاده نوابیده",
        "undeletebtn": "بازیافت",
        "namespace": "فضای نام:",
        "invert": "انتخاب برعکس بوه",
+       "tooltip-invert": "ز ري اي جأڤأ بپۈرنين و آلشدایي نأ کإ مإنجقا نوم ڤأرگأ إنتخاڤ ڤابيڌن أنجوم داڌإ ڤابيڌنإ قام کونين.",
        "namespace_association": "نوم جایل یأکاگرهڌأ",
+       "tooltip-namespace_association": "اي جأڤإ نأ ڤارسي کونين اي جأڤأ د ڤأرگرهڌإ چأک چنإ آ داسۈن نوم ڤأرگأ شريکي و نوم ڤأرگأ گولإڤورچينإ.",
        "blanknamespace": "(اصلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
        "mycontris": "هومياریا",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی |مورد بعدی $1}}",
        "whatlinkshere-links": "← لینکها",
        "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "ڤارو گونجایشدا $1",
        "whatlinkshere-hidelinks": "هوم پیڤأندا $1",
        "whatlinkshere-filters": "فيلترا",
        "blockip": "بستن کاربر",
        "tooltip-pt-mycontris": "یأ نومگأ ز هومياري {{GENDER:|ايسا}}",
        "tooltip-pt-login": "توصیه ابوه که به سیستم داخل بوین اما اجباری نه.",
        "tooltip-pt-logout": "رهدن زه سیستم",
+       "tooltip-pt-createaccount": "ايسا پشت گرم ڤابيڌينإ کإ یأ هساڤ راسد کونين و بياین ڤامإن. ب هرهال اي کار إژباري نارإ.",
        "tooltip-ca-talk": "صحبت درباره صفحه محتوا",
        "tooltip-ca-edit": "ڤيرایشت اي بلگه",
        "tooltip-ca-addsection": "شورۈ کردن یه بهرجا دیه",
        "tooltip-ca-watch": "اضاف کردن ای صفحه به لیست پیگیریهاتو",
        "tooltip-ca-unwatch": "حذف ای صفحه زه لیست پی‌گیری‌های ایسا",
        "tooltip-search": "جستن {{SITENAME}}",
+       "tooltip-search-go": "رۉ مإن بألگإیي کإ یأ نوم راستکي داشدإ بۈ.",
        "tooltip-search-fulltext": "بألگأ آنأ سي چونو نإڤشدإیي پإی جۈري کو",
        "tooltip-p-logo": "بإنیرين بإ سرآسۈنأ",
        "tooltip-n-mainpage": "دیدن صفحه اصلی",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
+       "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "previousdiff": "← اصلاح قدیمی",
        "nextdiff": "تفاوت بعدی→",
        "exif-orientation": "سرچشمأ",
        "exif-xresolution": "گپ نما کردن اوفقي",
        "exif-yresolution": "گپ نما کردن ز وارو",
+       "exif-datetime": "آلشد داین گات و مجال جانيا",
        "exif-make": "سازیار دیربین",
        "exif-model": "مودل ديربين",
        "exif-software": "نرم افزار ب کارگرهڌني",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "version": "ترجمه یا تفسیر",
        "specialpages": "صفحات ویژه",
-       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
+       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر :",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
        "logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
        "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
+       "logentry-newusers-create": "هساڤ کارياري $1 {{GENDER:$2|راسد ڤابي}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|سوڤار کرده}} $3",
        "searchsuggest-search": "جستن {{SITENAME}}"
 }
index 8962400..5e61cbc 100644 (file)
@@ -17,7 +17,8 @@
                        "아라",
                        "Pymouss",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Liammoù islinennet",
@@ -35,6 +36,8 @@
        "tog-watchdefault": "Ouzhpennañ ar pajennoù kemmet ganin da'm roll evezhiañ",
        "tog-watchmoves": "Ouzhpennañ ar pajennoù dilec'hiet ganin da'm roll evezhiañ",
        "tog-watchdeletion": "Ouzhpennañ ar pajennoù diverket ganin da'm roll evezhiañ",
+       "tog-watchuploads": "Ouzhpennañ em roll-evezhiañ ar restroù nevez a enporzhian.",
+       "tog-watchrollback": "Ouzhpennañ ar pajennoù ma'z on distro war ma roll evezhiañ.",
        "tog-minordefault": "Sellet ouzh ar c'hemmoù degaset ganin<br /> evel kemmoù dister dre ziouer",
        "tog-previewontop": "Rakwelet tres ar bajenn a-us ar prenestr skridaozañ",
        "tog-previewonfirst": "Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ",
        "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
        "tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
        "tog-shownumberswatching": "Diskouez an niver a lennerien",
-       "tog-oldsig": "Ar sinadur zo evit poent :",
+       "tog-oldsig": "Ho sinadur evit poent :",
        "tog-fancysig": "Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)",
-       "tog-uselivepreview": "Implijout Rakwelet prim (taol-arnod)",
+       "tog-uselivepreview": "Ober gant ar Rakwel prim",
        "tog-forceeditsummary": "Kemenn din pa ne skrivan netra er stern diverrañ",
        "tog-watchlisthideown": "Kuzhat ma c'hemmoù er rollad evezhiañ",
        "tog-watchlisthidebots": "Kuzhat kemmoù ar botoù er rollad evezhiañ",
        "tog-watchlisthideminor": "Kuzhat ar c'hemmoù dister er rollad evezhiañ",
        "tog-watchlisthideliu": "Er roll evezhiañ, kuzhat kemmoù an implijerien kevreet.",
+       "tog-watchlistreloadautomatically": "Adkargañ ar roll-evezhiañ bep tro ma vez cheñchet ur sil (rekis eo kaout JavaScript)",
        "tog-watchlisthideanons": "Er roll evezhiañ, kuzhat kemmoù an implijerien dianav",
        "tog-watchlisthidepatrolled": "Kuzhat ar c'hemmoù evezhiet diouzh ar roll evezhiañ",
+       "tog-watchlisthidecategorization": "Kuzhat rummatadur ar pajennoù",
        "tog-ccmeonemails": "Kas din un eilskrid eus ar posteloù a gasan da implijerien all",
        "tog-diffonly": "Arabat diskouez danvez ar pennadoù dindan an diforc'hioù",
        "tog-showhiddencats": "Diskouez ar rummadoù kuzhet",
-       "tog-norollbackdiff": "Na ziskouez an diff goude un distaoladenn",
+       "tog-norollbackdiff": "Na ziskouez an diforc'hioù goude un distro",
        "tog-useeditwarning": "Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ",
        "tog-prefershttps": "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
        "underline-always": "Atav",
        "newwindow": "(digeriñ en ur prenestr nevez)",
        "cancel": "Nullañ",
        "moredotdotdot": "Ha muioc'h c'hoazh...",
-       "morenotlisted": "N'eo ket klok ar roll-mañ.",
+       "morenotlisted": "Marteze eo diglok ar roll-mañ.",
        "mypage": "Ma zammig pajenn",
        "mytalk": "Ma c'haozeadennoù",
-       "anontalk": "Kaozeal gant ar chomlec'h IP-mañ",
+       "anontalk": "Kaozeal",
        "navigation": "Merdeiñ",
        "and": "&#32;ha(g)",
        "qbfind": "Klask",
        "searcharticle": "Mont",
        "history": "Istor ar bajenn",
        "history_short": "Istor",
+       "history_small": "istor",
        "updatedmarker": "kemmet abaoe ma zaol-sell diwezhañ",
        "printableversion": "Stumm da voullañ",
        "permalink": "Chomlec'h ar stumm-mañ",
        "talk": "Kaozeadenn",
        "views": "Gweladennoù",
        "toolbox": "Ostilhoù",
+       "tool-link-userrights": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "tool-link-userrights-readonly": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "tool-link-emailuser": "Kas ur postel d'an {{PLURAL:$1|an implijer-mañ|an implijerez-mañ}}",
        "userpage": "Pajenn implijer",
        "projectpage": "Pajenn meta",
        "imagepage": "Gwelet pajenn ar restr",
        "pool-timeout": "Aet eur dreist d'an termen gortoz evit ar stankadenn",
        "pool-queuefull": "Soulgarget eo ar servijerioù",
        "pool-errorunknown": "Fazi dianav",
+       "pool-servererror": "N'eo ket hegerz ar servij kontañ ($1).",
        "poolcounter-usage-error": "Fazi implij : $1",
        "aboutsite": "Diwar-benn {{SITENAME}}",
        "aboutpage": "Project:Diwar-benn",
        "laggedslavemode": "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
        "readonly": "Hizivadurioù stanket war ar bank roadennoù",
        "enterlockreason": "Merkit perak eo stanket hag istimit pegeit e chomo evel-henn",
-       "readonlytext": "Evit poent n'haller ket ouzhpennañ pe gemmañ netra er bank roadennoù mui. Un tamm kempenn boutin d'ar bank moarvat. goude-se e vo plaen an traoù en-dro.\n\nSetu displegadenn ar merour bet prennet ar bank gantañ : $1",
+       "readonlytext": "Evit poent n'haller ket ouzhpennañ pe gemmañ netra en diaz roadennoù mui. Un tamm kempenn boutin d'an diaz moarvat. Goude-se e vo plaen an traoù en-dro.\n\nSetu displegadenn ar merour bet prennet an diaz gantañ : $1",
        "missing-article": "N'eo ket bet kavet gant an diaz titouroù testenn ur bajenn en dije dleet kavout hag anvet \"$1\" $2.\n\nPeurliesañ e c'hoarvez evit bezañ heuliet liamm dispredet un diforc'h pe an istor war-du ur bajenn bet diverket abaoe.\n\nMard ned eo ket se eo, hoc'h eus marteze kavet un draen er meziant.\nKasit keloù d'ur [[Special:ListUsers/sysop|merer]], en ur verkañ dezhañ chomlec'h an URL.",
        "missingarticle-rev": "(adweladenn # : $1)",
        "missingarticle-diff": "(Dif : $1, $2)",
        "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
        "protectedpagetext": "Prennet eo bet ar bajenn-mañ kuit na vefe skrivet pe cheñchet un dra bennak enni",
        "viewsourcetext": "Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ",
-       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
+       "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho <strong>kemmoù</strong> d'ar bajenn-mañ.",
        "protectedinterface": "Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.",
        "editinginterface": "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [https://translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
        "cascadeprotected": "Gwarezet eo ar bajenn-mañ; n'haller ket kemmañ anezhi ken p'he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
        "virus-scanfailed": "Skannadenn c'hwitet (kod $1)",
        "virus-unknownscanner": "diviruzer dianav :",
        "logouttext": "'''Digevreet oc'h bremañ.'''\n\nNotit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h kevreet c'hoazh, betek ma vo riñset krubuilh ho merdeer ganeoc'h.",
+       "cannotlogoutnow-title": "N'haller ket digevreañ bremañ",
+       "cannotlogoutnow-text": "N'haller ket digevreañ pa vezer oc'h implijout $1.",
        "welcomeuser": "Degemer mat $1 !",
        "welcomecreation-msg": "Krouet eo bet ho kont implijer.\nNa zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].",
        "yourname": "Anv implijer :",
        "createacct-yourpasswordagain-ph": "Skrivit ar ger-tremen adarre",
        "userlogin-remembermypassword": "Derc'hel ac'hanon kevreet",
        "userlogin-signwithsecure": "Implijout ur gevreadenn suraet",
+       "cannotlogin-title": "N'haller ket kevreañ",
+       "cannotlogin-text": "N'haller ket kevreañ.",
+       "cannotloginnow-title": "N'haller ket kevreañ bremañ",
+       "cannotloginnow-text": "N'haller ket kevreañ pa vezer oc'h implijout $1.",
+       "cannotcreateaccount-title": "N'haller ket krouiñ kontoù",
+       "cannotcreateaccount-text": "N'eo ket gweredekaet ar c'hrouiñ kontoù war-eeun er wiki-mañ.",
        "yourdomainname": "Ho tomani",
        "password-change-forbidden": "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
        "externaldberror": "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
        "login": "Kevreañ",
+       "login-security": "Gwiriit hoc'h identelezh",
        "nav-login-createaccount": "Krouiñ ur gont pe kevreañ",
        "userlogin": "Kevreañ / krouiñ ur gont",
        "userloginnocreate": "Kevreañ",
        "userlogin-resetpassword-link": "Ankouaet ho ker-tremen ganeoc'h ?",
        "userlogin-helplink2": "Skoazell evit kevreañ",
        "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
+       "userlogin-reauth": "Ret eo deoc'h adkevreañ evit prouiñ ez oc'h mat {{GENDER:$1|$1}}",
        "userlogin-createanother": "Krouiñ ur gont all",
        "createacct-emailrequired": "Chomlec'h postel",
        "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
        "createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
        "createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
+       "createaccountmail-help": "Gallout a ra bezañ implijet evit krouiñ ur gont evit unan bennak all hep gouzout ar ger-tremen.",
        "createacct-realname": "Anv gwir (diret)",
        "createaccountreason": "Abeg :",
        "createacct-reason": "Abeg",
        "createacct-reason-ph": "Perak emaoc'h o krouiñ ur gont all",
+       "createacct-reason-help": "Kemennadenn embannet e marilh ar c'hrouiñ kontoù",
        "createacct-submit": "Krouiñ ho kont",
        "createacct-another-submit": "Krouiñ ur gont",
+       "createacct-continue-submit": "Kenderc'hel da grouiñ ar gont",
+       "createacct-another-continue-submit": "Kenderc'hel da grouiñ ar gont",
        "createacct-benefit-heading": "{{SITENAME}} zo graet gant tud eveldoc'h.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|kemm}}",
        "createacct-benefit-body2": "pajenn{{PLURAL:$1|}}",
        "createacct-benefit-body3": "{{PLURAL:$1|c'henlabourer|kenlabourer}} nevez",
        "badretype": "Ne glot ket ar gerioù-tremen an eil gant egile.",
+       "usernameinprogress": "Emeur c'hoazh oc'h ober war-dro krouiñ ur gont evit an anv implijer-mañ. Gortozit un tamm bihan.",
        "userexists": "Implijet eo an anv implijer lakaet ganeoc'h dija.\nDibabit un anv all mar plij.",
        "loginerror": "Kudenn gevreañ",
        "createacct-error": "Ur fazi 'zo bet o krouiñ ar gont",
        "nocookiesnew": "Krouet eo bet ar gont implijer met n'oc'h ket kevreet. {{SITENAME}} a implij toupinoù evit ar c'hevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
        "nocookieslogin": "{{SITENAME}} a implij toupinoù evit kevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
        "nocookiesfornew": "N'eo ket bet krouet ar gont implijer peogwir n'eus ket bet gallet gwiriañ an orin anezhi.\nGwiriit eo bet gweredekaet an toupinoù, adkargit ar bajenn ha klaskit en-dro.",
+       "createacct-loginerror": "Krouet eo bet ar gont ervat met n'hallit ket kevreañ en un doare emgefre. [[Special:UserLogin|Kevreit gant an dorn]].",
        "noname": "N'hoc'h eus lakaet anv implijer ebet.",
        "loginsuccesstitle": "Kevreet oc'h.",
        "loginsuccess": "'''Kevreet oc'h bremañ ouzh {{SITENAME}} evel \"$1\".'''",
-       "nosuchuser": "N'eus ket eus an implijer \"$1\".\nKizidik eo anv an implijer ouzh ar pennlizherennoù\nGwiriit eo bet skrivet mat an anv ganeoc'h pe [[Special:CreateAccount|krouit ur gont nevez]].",
+       "nosuchuser": "N'eus ket eus an implijer \"$1\".\nKizidik eo anv an implijerien ouzh ar pennlizherennoù.\nGwiriit eo bet skrivet mat an anv ganeoc'h pe [[Special:CreateAccount|krouit ur gont nevez]].",
        "nosuchusershort": "N'eus perzhiad ebet gantañ an anv « $1 ». Gwiriit ar reizhskrivadur.",
        "nouserspecified": "Ret eo deoc'h spisaat un anv implijer.",
        "login-userblocked": "Stanket eo an implijer-mañ. N'eo ket aotret da gevreañ.",
        "wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
        "wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
        "passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
+       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 arouezenn.",
        "password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
        "password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
        "mailmypassword": "Adderaouekaat ar ger-tremen",
        "createaccount-text": "Unan bennak en deus krouet ur gont gant ho chomlec'h postel war {{SITENAME}} ($4) zo e anv \"$2\" hag a ra gant ar ger-tremen \"$3\".\nMat e vefe deoc'h kevreañ ha cheñch ho ker-tremen bremañ.\n\nNa daolit ket evezh ouzh ar c'hemenn-mañ m'eo bet krouet ar gont dre fazi.",
        "login-throttled": "Betek re oc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
        "login-abort-generic": "Dibosupl ho kevreañ - Dilezet",
+       "login-migrated-generic": "Dilec'hiet eo bet ho kont ha n'eus ket eus hoc'h anv implijer war ar wiki-mañ ken.",
        "loginlanguagelabel": "Yezh : $1",
        "suspicious-userlogout": "Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.",
        "createacct-another-realname-tip": "Diret eo skrivañ hoc'h anv gwir. Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
        "pt-login": "Kevreañ",
        "pt-login-button": "Kevreañ",
+       "pt-login-continue-button": "Kenderc'hel da gevreañ",
        "pt-createaccount": "Krouiñ ur gont",
        "pt-userlogout": "Digevreañ",
        "php-mail-error-unknown": "Fazi dianav en arc'hwel postel () PHP",
        "newpassword": "Ger-tremen nevez :",
        "retypenew": "Adskrivañ ar ger-tremen nevez :",
        "resetpass_submit": "Cheñch ar ger-tremen ha kevreañ",
-       "changepassword-success": "Cheñchet eo bet ho ker-tremen !",
+       "changepassword-success": "Cheñchet eo bet ho ker-tremen ervat !",
        "changepassword-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+       "botpasswords": "Gerioù-tremen ar botoù",
+       "botpasswords-summary": "Aotren a ra <em>gerioù-tremen ar botoù</em> implijout kont un implijer dre an API hep ober gant titouroù-kred pennañ ar gont. Ur wech kevreet dre ger-tremen ur bot e c'hall gwirioù an implijer bezañ strishaet.\n\nMa n'ouzit ket mat perak e c'hallfec'h kaout c'hoant d'ober se, eo furoc'h chom hep en ober. Den ebet ne zlefe goulenn diganeoc'h biken genel unan hag e reiñ dezhañ.",
+       "botpasswords-disabled": "Diweredekaet eo gerioù-tremen ar botoù.",
+       "botpasswords-no-central-id": "Evit gallout implijout gerioù-tremen botoù e ranker kevreañ gant ur gont kreizennet.",
+       "botpasswords-existing": "Gerioù-tremen botoù a zo anezho",
+       "botpasswords-createnew": "Krouiñ ur ger-tremen bot nevez",
+       "botpasswords-editexisting": "Cheñch ger-tremen ur bot a zo anezhañ c'hoazh",
        "botpasswords-label-appid": "Anv ar robot",
        "botpasswords-label-create": "Krouiñ",
        "botpasswords-label-update": "Hizivaat",
        "botpasswords-label-cancel": "Nullañ",
        "botpasswords-label-delete": "Dilemel",
        "botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
+       "botpasswords-label-grants": "Aotreoù a c'haller ober ganto :",
+       "botpasswords-label-grants-column": "Aotreet",
        "botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
        "botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
        "botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
        "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
        "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
        "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+       "botpasswords-not-exist": "N'eus ger-tremen bot ebet anvet \"$2\" gant an implijer \"$1\".",
        "resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
+       "resetpass_forbidden-reason": "N'haller ket cheñch ar gerioù-termen : $1",
        "resetpass-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "resetpass-submit-loggedin": "Cheñch ger-tremen",
        "resetpass-submit-cancel": "Nullañ",
-       "resetpass-wrong-oldpass": "Direizh eo ar ger-tremen a-vremañ pe da c'hortoz.",
+       "resetpass-wrong-oldpass": "Direizh eo ar ger-tremen dibad pe an hini a-vremañ. Moarvat ez eus bet cheñchet ger-tremen ganeoc'h c'hoazh pe goulennet ur ger-tremen dibad nevez.",
        "resetpass-recycled": "Ret eo d'ho ker-tremen nevez bezañ disheñvel diouzh ho ker-tremen a vremañ.",
        "resetpass-temp-emailed": "Kevreet e oac'h bet gant ur c'hod dibad kaset deoc'h dre bostel.\nEvit echuiñ kevreañ e rankit lakaat ur ger-tremen nevez amañ :",
        "resetpass-temp-password": "Ger-tremen da c'hortoz :",
        "passwordreset-emaildisabled": "Ne c'haller ket ober gant posteloù er wiki-mañ.",
        "passwordreset-username": "Anv implijer :",
        "passwordreset-domain": "Domani :",
-       "passwordreset-capture": "Gwelet ar postel ?",
-       "passwordreset-capture-help": "Ma askit al logell-mañ e vo diskouezet deoc'h ar postel (gant ar ger-tremen da c'hortoz) war un dro pa vo kaset d'an implijer.",
        "passwordreset-email": "Postel :",
        "passwordreset-emailtitle": "Titouroù kont war {{SITENAME}}",
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
        "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
-       "changeemail": "Kemmañ ar chomlec'h postel",
+       "passwordreset-nocaller": "Ret eo merkañ anv ur galver",
+       "passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+       "passwordreset-invalidemail": "Chomlec'h postel direizh",
+       "passwordreset-nodata": "N'eus bet lakaet anv implijer na chomlec'h postel ebet",
+       "changeemail": "Kemmañ pe dilemel ar chomlec'h postel",
        "changeemail-header": "Kemmañ chomlec'h postel ar gont",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
        "changeemail-submit": "Cheñch chomlec'h postel",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+       "changeemail-nochange": "Merkit ur chomlec'h postel all.",
        "resettokens": "Adderaouekaat ar jedoueroù",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "resettokens-tokens": "Jedoueroù :",
        "missingcommenttext": "Skrivit hoc'h evezhiadenn a-is.",
        "missingcommentheader": "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
        "summary-preview": "Rakwelet an diverrañ :",
-       "subject-preview": "Rakwelet danvez/titl :",
+       "subject-preview": "Rakwelet an danvez :",
+       "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
        "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Elfenn goullo",
+       "content-json-empty-array": "Taolenn c'houllo",
+       "deprecated-self-close-category": "Pajennoù a ra gant tikedennoù HTML emserriñ direizh",
        "expensive-parserfunction-warning": "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv|galv}}, ha {{PLURAL:$1|$1 galv|$1 galv}} zo.",
        "expensive-parserfunction-category": "Pagjennoù enno re a c'halvoù koustus e-keñver an arc'hwelioù parser.",
        "post-expand-template-inclusion-warning": "Diwallit : re a batromoù zo war ar bajenn-mañ.\nLod anezho a vo lakaet a-gostez.",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
        "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
+       "mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
+       "mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
+       "mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "searchprofile-advanced-tooltip": "Klask en esaouennoù anv personelaet",
        "search-result-size": "$1 ({{PLURAL:$2|1 ger|$2 ger}})",
        "search-result-category-size": "{{PLURAL:$1|1|$1}} ezel ({{PLURAL:$2|1|$2}} is-rummad, {{PLURAL:$3|1|$3}} restr)",
-       "search-redirect": "(adkas $1)",
+       "search-redirect": "(adkas adal $1)",
        "search-section": "(rann $1)",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "prefs-rc": "Kemmoù diwezhañ",
        "prefs-watchlist": "Roll evezhiañ",
        "prefs-editwatchlist": "Kemmañ ar roll evezhiañ",
+       "prefs-editwatchlist-edit": "Gwelet ha lemel titloù a-ziwar ho roll evezhiañ",
        "prefs-editwatchlist-raw": "Kemmañ ar roll evezhiañ (mod diginkl)",
        "prefs-editwatchlist-clear": "Diverkañ ho roll evezhiañ",
        "prefs-watchlist-days": "Niver a zevezhioù da ziskouez er rollad evezhiañ :",
        "prefs-watchlist-token": "Jedouer evit ar roll evezhiañ :",
        "prefs-misc": "Penndibaboù liesseurt",
        "prefs-resetpass": "Cheñch ar ger-tremen",
-       "prefs-changeemail": "Cheñch chomlec'h postel",
+       "prefs-changeemail": "Cheñch ar chomlec'h postel pe dilemel anezhañ",
        "prefs-setemail": "Termeniñ ur chomlec'h postel",
        "prefs-email": "Dibarzhioù postel",
        "prefs-rendering": "Neuz",
        "saveprefs": "Enrollañ ar penndibaboù",
        "restoreprefs": "Adlakaat an holl arventennoù dre ziouer (en holl gevrennoù)",
        "prefs-editing": "Prenestr skridaozañ",
-       "rows": "Linennoù :",
-       "columns": "Bannoù",
        "searchresultshead": "Klask",
        "stub-threshold": "Bevenn uhelañ evit al liammoù war-du an danvez pennadoù ($1) :",
+       "stub-threshold-sample-link": "skouer",
        "stub-threshold-disabled": "Diweredekaet",
        "recentchangesdays": "Niver a zevezhioù da ziskouez er c'hemmoù diwezhañ :",
        "recentchangesdays-max": "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Merañ statud an implijerien",
-       "userrights-lookup-user": "Merañ strolladoù an implijer",
+       "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
-       "editusergroup": "Kemmañ ar strolladoù implijerien",
-       "editinguser": "Kemmañ gwirioù an implijer '''[[User:$1|$1]]''' $2",
+       "editusergroup": "Kargañ strolladoù implijerien",
+       "editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Kemmañ strolladoù an implijer",
-       "saveusergroups": "Enrollañ ar strolladoù implijer",
+       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "userrights-groupsmember": "Ezel eus :",
        "userrights-groupsmember-auto": "Ezel emplegat eus :",
        "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
        "userrights-reason": "Abeg :",
        "userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
        "userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
-       "userrights-nologin": "Ret eo deoc'h [[Special:UserLogin|bezañ enrollet]] gant ur gont merour a-benn reiñ gwirioù implijer.",
-       "userrights-notallowed": "N'oc'h ket aotreet da ouzhpennañ na da lemel gwirioù an implijerien.",
        "userrights-changeable-col": "Ar strolladoù a c'hallit cheñch",
        "userrights-unchangeable-col": "Ar strolladoù n'hallit ket cheñch",
        "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
-       "userrights-removed-self": "Lamet ho peus ho kwirioù deoc'h-c'hwi. Dre se ne c'hallit ket ken mont d'ar bajenn-mañ.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "group-autoconfirmed": "Implijerien bet kadarnaet ent emgefre",
        "group-bot": "Robotoù",
        "group-sysop": "Merourien",
        "group-bureaucrat": "Burevidi",
-       "group-suppress": "Dindan evezh",
+       "group-suppress": "Diverkerien",
        "group-all": "(pep tra)",
        "group-user-member": "{{GENDER:$1|implijer}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Implijer bet kadarnaet ent emgefre}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|merour}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureviad}}",
-       "group-suppress-member": "{{GENDER:$1|evezhier}}",
+       "group-suppress-member": "{{GENDER:$1|diverker|diverkerez}}",
        "grouppage-user": "{{ns:project}}:Implijerien",
        "grouppage-autoconfirmed": "{{ns:project}}: Implijerien bet kadarnaet ent emgefre",
        "grouppage-bot": "{{ns:project}}:Botoù",
        "grouppage-sysop": "{{ns:project}}:Merourien",
        "grouppage-bureaucrat": "{{ns:project}}: Burevidi",
-       "grouppage-suppress": "{{ns:project}}: Dindan evezh",
+       "grouppage-suppress": "{{ns:project}}: Diverkerien",
        "right-read": "Lenn ar pajennoù",
        "right-edit": "Kemmañ ar pajennoù",
        "right-createpage": "Krouiñ pajennoù (estreget pajennoù kaozeal)",
        "right-createtalk": "Krouiñ pajennoù kaozeal",
        "right-createaccount": "Krouiñ kontoù implijer nevez",
+       "right-autocreateaccount": "Kevreañ ent emgefre gant ur gont implijer diavaez",
        "right-minoredit": "Merkañ ar c'hemmoù evel kemmoù dister",
        "right-move": "Adenvel pajennoù",
        "right-move-subpages": "Dilec'hiañ ar pajennoù gant o ispajennoù",
        "right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
        "right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
        "right-sendemail": "Kas ur postel d'an implijerien all",
-       "right-passwordreset": "Gwelet ar posteloù assevel gerioù-tremen",
        "grant-group-email": "Kas ur postel",
+       "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "grant-createeditmovepage": "Krouiñ, aozañ ha dilec'hiañ pajennoù",
-       "grant-editmywatchlist": "Aozañ ho roll evezhiañ",
-       "grant-editpage": "Aoañ pajennoù a zo anezho dija",
-       "grant-editprotected": "Aozañ pajennoù gwarezet",
+       "grant-editmyoptions": "Kemmañ ho penndibaboù implijer.",
+       "grant-editmywatchlist": "Kemmañ ho roll evezhiañ",
+       "grant-editpage": "Kemmañ pajennoù a zo anezho c'hoazh",
+       "grant-editprotected": "Kemmañ pajennoù gwarezet",
+       "grant-protect": "Gwareziñ ha diwareziñ pajennoù",
+       "grant-rollback": "Distreiñ war ar c'hemmoù er pajennoù",
        "grant-sendemail": "Kas ur postel d'an implijerien all",
-       "grant-viewdeleted": "Gwelet an titouroù dilamet",
+       "grant-uploadfile": "Enporzhiañ restroù nevez",
+       "grant-basic": "Gwirioù diazez",
+       "grant-viewdeleted": "Gwelet ar restroù ha pajennoù dilamet",
        "grant-viewmywatchlist": "Gwelet ho roll evezhiañ",
        "newuserlogpage": "Marilh ar c'hontoù krouet",
        "newuserlogpagetext": "Marilh krouiñ ar c'hontoù implijer.",
        "rightslogtext": "Setu marilh ar c'hemmoù statud bet c'hoarvezet d'an implijerien.",
        "action-read": "lenn ar bajenn-mañ",
        "action-edit": "kemmañ ar bajenn-mañ",
-       "action-createpage": "krouiñ pajennoù",
+       "action-createpage": "krouiñ ar bajenn-mañ",
        "action-createtalk": "krouiñ pajennoù kaozeal",
        "action-createaccount": "krouiñ ar gont implijer-mañ",
        "action-history": "gwelet istor ar bajenn-mañ",
        "action-userrights-interwiki": "Kemmañ gwirioù an implijerien war wikioù all",
        "action-siteadmin": "Prennañ pe dibrennañ ar bank roadennoù",
        "action-sendemail": "Kas posteloù",
+       "action-editmyoptions": "Kemmañ ho penndibaboù",
        "action-editmywatchlist": "kemmañ ho roll evezhiañ",
        "action-viewmywatchlist": "gwelet ho roll evezhiañ",
        "action-viewmyprivateinfo": "Gwelet ho titouroù prevez",
        "action-editmyprivateinfo": "aozañ ho titouroù prevez",
+       "action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
+       "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|abaoe ho kweladenn diwezhañ}}",
        "enhancedrc-history": "istor",
        "recentchanges-label-plusminus": "Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù",
        "recentchanges-legend-heading": "<strong>Alc'hwez :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
-       "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
+       "recentchanges-submit": "Diskouez",
+       "rcfilters-activefilters": "Siloù oberiant",
+       "rcfilters-invalid-filter": "Sil direizh",
+       "rcfilters-filterlist-title": "Siloù",
+       "rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
+       "rcfilters-filter-registered-label": "Marilhet",
+       "rcfilters-filter-unregistered-label": "Divarilh",
+       "rcfilters-filter-unregistered-description": "Aozerien n'int ket kevreet.",
+       "rcfilters-filter-editsbyself-label": "Kemmet ganeoc'h",
+       "rcfilters-filter-editsbyself-description": "Kemmet ganeoc'h",
+       "rcfilters-filter-editsbyother-label": "Kemmet gant tud all",
+       "rcfilters-filter-editsbyother-description": "Kemmoù graet gant implijerien all (ket ganeoc'h).",
+       "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ an implijer",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Tud nevez-deuet",
+       "rcfilters-filter-userExpLevel-learner-label": "Deskarded",
+       "rcfilters-filter-userExpLevel-experienced-label": "Implijerien arroutet",
+       "rcfilters-filter-userExpLevel-experienced-description": "Ouzhpenn 30 devezh oberiantiz ha 500 kemm.",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Kemmoù graet gant ostilhoù emgefre.",
+       "rcfilters-filter-humans-label": "Den (ket ur robot)",
+       "rcfilters-filter-minor-label": "Kemmoù dister",
+       "rcfilters-filtergroup-changetype": "Seurt kemm",
+       "rcfilters-filter-categorization-label": "Kemmoù rummad",
+       "rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "rcshowhideminor-show": "Diskouez",
        "rcshowhidemine": "$1 ma c'hemmoù",
        "rcshowhidemine-show": "Diskouez",
        "rcshowhidemine-hide": "Kuzhat",
+       "rcshowhidecategorization-show": "Diskouez",
+       "rcshowhidecategorization-hide": "Kuzhat",
        "rclinks": "Diskouez an/ar $1 kemm diwezhañ c'hoarvezet e-pad an/ar $2 devezh diwezhañ.<br />$3",
        "diff": "diforc'h",
        "hist": "ist",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]",
        "rc_categories": "Bevenn ar rummadoù (dispartiañ gant \"|\")",
-       "rc_categories_any": "An holl",
+       "rc_categories_any": "Unan e-touez ar re zibabet",
        "rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ",
        "newsectionsummary": "/* $1 */ rann nevez",
        "rc-enhanced-expand": "Diskouez ar munudoù",
        "recentchangeslinked-summary": "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).\nE '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
+       "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "reuploaddesc": "Distreiñ d'ar furmskrid.",
        "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
        "upload-http-error": "Ur fazi HTTP zo bet : $1",
        "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
+       "upload-dialog-title": "Kargañ ar restr",
        "upload-dialog-button-cancel": "Nullañ",
+       "upload-dialog-button-back": "Kent",
        "upload-dialog-button-done": "Graet",
        "upload-dialog-button-save": "Enrollañ",
        "upload-dialog-button-upload": "Enporzhiañ",
        "upload-form-label-infoform-description": "Deskrivadur",
        "upload-form-label-usage-title": "Implij",
        "upload-form-label-usage-filename": "Anv ar restr",
+       "upload-form-label-own-work": "Setu aze ma zammig labour din-me",
        "upload-form-label-infoform-categories": "Rummadoù",
        "upload-form-label-infoform-date": "Deiziad",
        "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
        "protectedpages-performer": "Gwareziñ an implijer",
        "protectedpages-params": "Arventennoù gwareziñ",
        "protectedpages-reason": "Abeg",
+       "protectedpages-submit": "Diskwel ar pajennoù",
        "protectedpages-unknown-timestamp": "Dianav",
        "protectedpages-unknown-performer": "Implijer dianav",
        "protectedtitles": "Titloù gwarezet",
        "protectedtitlesempty": "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
+       "protectedtitles-submit": "Diskwel an titloù",
        "listusers": "Roll an implijerien",
        "listusers-editsonly": "Na ziskouez nemet an implijerien o deus degaset un dra bennak",
        "listusers-creationsort": "Renket dre urzh krouiñ",
        "nopagetext": "N'eus ket eus ar bajenn dal merket ganeoc'h.",
        "pager-newer-n": "{{PLURAL:$1|1 nevesoc'h|$1 nevesoc'h}}",
        "pager-older-n": "{{PLURAL:$1|1 koshoc'h|$1 koshoc'h}}",
-       "suppress": "Dindan evezh",
+       "suppress": "Dilemel",
        "querypage-disabled": "Diweredekaet eo bet ar bajenn dibar-mañ evit aesaat d'ar reizhiad un tammig.",
+       "apihelp": "Skoazell an API",
        "apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
        "apisandbox": "Poull-traezh API",
        "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
        "apisandbox-submit": "Sevel ar goulenn",
        "apisandbox-reset": "Riñsañ",
        "apisandbox-retry": "Klask en-dro",
+       "apisandbox-helpurls": "Liammoù skoazell",
        "apisandbox-examples": "Skouerioù",
        "apisandbox-dynamic-parameters": "Arventenn ouzhpenn",
        "apisandbox-dynamic-parameters-add-label": "Ouzhpennañ un arventenn:",
        "apisandbox-results": "Disoc'hoù",
        "apisandbox-request-url-label": "Goulenn URL :",
        "apisandbox-request-time": "Pad ar goulenn: $1",
+       "apisandbox-continue": "Kenderc'hel",
+       "apisandbox-continue-clear": "Riñsañ",
+       "apisandbox-multivalue-all-values": "$1 (An holl dalvoudoù)",
        "booksources": "Oberennoù dave",
        "booksources-search-legend": "Klask en oberennoù dave",
        "booksources-isbn": "ISBN :",
        "booksources-search": "Klask",
        "booksources-text": "Ur roll liammoù a gas da lec'hiennoù all ma werzher levrioù kozh ha nevez a gavot a-is; marteze e kavot eno titouroù pelloc'h war al levrioù a glaskit :",
        "booksources-invalid-isbn": "Evit doare n'eo ket reizh an ISBN merket; gwiriit ha n'oc'h ket faziet en ur eilañ adal ar vammenn orin.",
+       "magiclink-tracking-isbn": "Pajennoù a ra gant liammoù burzhudus ISBN",
        "specialloguserlabel": "Implijer :",
        "speciallogtitlelabel": "Bukadenn (titl pe implijer) :",
        "log": "Marilhoù",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
        "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
+       "listgrants": "Aotreoù",
+       "listgrants-grant": "Aotren",
        "listgrants-rights": "Gwirioù",
        "trackingcategories": "Rummadoù evezhiañ",
        "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
+       "trackingcategories-desc": "Dezverkoù evit degemer rummadoù",
        "broken-file-category-desc": "Er bajenn-mañ ez eus ul liamm restr torr (ul liamm da enframmañ ur restr pa n'eus ket eus ar restr-se).",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "trackingcategories-disabled": "Diweredekaet eo ar rummad",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
        "changecontentmodel-title-label": "Anv ar bajenn",
        "changecontentmodel-reason-label": "Abeg :",
+       "changecontentmodel-submit": "Kemmañ",
+       "logentry-contentmodel-change-revertlink": "disteuler",
+       "logentry-contentmodel-change-revert": "disteuler",
        "protectlogpage": "Log_gwareziñ",
        "protectlogtext": "Setu aze a-is roll ar c'hemmoù degaset ouzh live gwareziñ ar pajennoù.\nSellet ouzh ar [[Special:ProtectedPages|roll ar pajennoù gwarezet]] evit kaout roll ar pajennoù gwarezet bremañ.",
        "protectedarticle": "{{Gender:.|en|he}} deus gwarezet [[$1]]",
        "sp-contributions-username": "Anv implijer pe chomlec'h IP :",
        "sp-contributions-toponly": "Na ziskouez nemet an adweladennoù diwezhañ",
        "sp-contributions-newonly": "Diskouez an aozadennoù a zo krouidigezhioù pajennoù hepken",
+       "sp-contributions-hideminor": "Kuzhat ar c'hemmoù dister",
        "sp-contributions-submit": "Klask",
        "whatlinkshere": "Pajennoù liammet",
        "whatlinkshere-title": "Pajennoù liammet ouzh \"$1\"",
        "whatlinkshere-hideredirs": "$1 adkas",
        "whatlinkshere-hidetrans": "$1 treuzkluzadur",
        "whatlinkshere-hidelinks": "$1 liamm",
-       "whatlinkshere-hideimages": "$1 ar restroù liammet",
+       "whatlinkshere-hideimages": "$1 al liammoù war-zu ar restr",
        "whatlinkshere-filters": "Siloù",
        "whatlinkshere-submit": "Mont",
        "autoblockid": "Emstankañ #$1",
        "ipb-unblock": "Distankañ un implijer pe ur chomlec'h IP",
        "ipb-blocklist": "Teuler ur sell ouzh roll an dud stanket evit poent",
        "ipb-blocklist-contribs": "Degasadennoù evit $1",
+       "ipb-blocklist-duration-left": "$1 a chom",
        "unblockip": "Distankañ ur chomlec'h IP",
        "unblockiptext": "Grit gant ar furmskrid a-is evit adsevel ar moned skrivañ ouzh ur chomlec'h IP bet stanket a-gent.",
        "ipusubmit": "Paouez gant ar stankadenn-mañ",
        "lockdbsuccesstext": "Prennet eo bank roadennnoù {{SITENAME}}.\n\n<br />Na zisoñjit ket e zibrennañ pa vo bet kaset da benn vat hoc'h oberiadenn drezalc'h.",
        "unlockdbsuccesstext": "Dibrennet eo bank roadennoù {{SITENAME}}.",
        "lockfilenotwritable": "N'haller ket skrivañ war restr prennañ ar bank roadennoù. A-benn prennañ-dibrennañ ar bank e rankit bezañ aotreet da skrivañ war ar servijer Kenrouedad.",
+       "databaselocked": "Prennet eo an diaz roadennoù c'hoazh.",
        "databasenotlocked": "N'eo ket prennet an diaz roadennoù.",
        "lockedbyandtime": "(gant $1 d'an $2 da $3)",
        "move-page": "Dilec'hiañ $1",
        "export-download": "Aotren enrollañ evel ur restr",
        "export-templates": "Lakaat ar patromoù e-barzh ivez",
        "export-pagelinks": "Lakaat ar pajennoù liammet e-barzh betek un donder a :",
+       "export-manual": "Ouzhpennañ pajennoù gant an dorn :",
        "allmessages": "Roll kemennoù ar reizhiad",
        "allmessagesname": "Anv",
        "allmessagesdefault": "Kemennadenn dre ziouer",
        "tooltip-feed-atom": "Magañ ar red Atom evit ar bajenn-mañ",
        "tooltip-t-contributions": "Gwelet roll degasadennoù {{GENDER:$1|this user}} an implijer-mañ",
        "tooltip-t-emailuser": "Kas ur postel d'an implijer-mañ",
+       "tooltip-t-info": "Titouroù ouzhpenn a-zivout ar bajenn-mañ",
        "tooltip-t-upload": "Enporzhiañ ur skeudenn pe ur restr media war ar servijer",
        "tooltip-t-specialpages": "Roll an holl bajennoù dibar",
        "tooltip-t-print": "Stumm moulladus ar bajenn-mañ",
        "spam_reverting": "Distreiñ d'ar stumm diwezhañ hep liamm davet $1",
        "spam_blanking": "Diverkañ an holl stummoù enno liammoù davet $1",
        "spam_deleting": "An holl stummoù enno liammoù war-zu $1, o tiverkañ",
-       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n<trong>Arabat<strong> merkañ tra pe dra amañ !",
+       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n<strong>Arabat</strong> merkañ tra pe dra amañ !",
        "pageinfo-title": "Titouroù evit \"$1\"",
        "pageinfo-not-current": "Hon digarezit, ne c'haller ket reiñ an titouroù-mañ evit an adweloù kozh.",
        "pageinfo-header-basic": "Titouroù diazez",
        "pageinfo-length": "Ment ar bajenn (en oktedoù)",
        "pageinfo-article-id": "Niverenn ar bajenn",
        "pageinfo-language": "Yezh ar bajenn",
+       "pageinfo-language-change": "kemmañ",
        "pageinfo-content-model": "Patrom endalc'had ar bajenn",
+       "pageinfo-content-model-change": "kemmañ",
        "pageinfo-robot-policy": "Menegeriñ gant robotoù",
        "pageinfo-robot-index": "Aotreet",
        "pageinfo-robot-noindex": "Diaotreet",
        "pageinfo-category-pages": "Niver a bajennoù",
        "pageinfo-category-subcats": "Niver a isrummadoù",
        "pageinfo-category-files": "Niver a restroù",
+       "pageinfo-user-id": "ID an implijer",
        "markaspatrolleddiff": "Merkañ evel gwiriet",
        "markaspatrolledtext": "Merkañ ar pennad-mañ evel gwiriet",
        "markedaspatrolled": "Merkañ evel gwiriet",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
        "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
+       "confirm-markpatrolled-button": "Mat eo",
        "deletedrevision": "Diverket stumm kozh $1.",
        "filedeleteerror-short": "Fazi e-ser diverkañ ar restr : $1",
        "filedeleteerror-long": "Fazioù zo bet kavet e-ser diverkañ ar restr :\n\n$1",
        "confirm-unwatch-button": "Mat eo",
        "confirm-unwatch-top": "Lemel ar bajenn-mañ a-ziwar ho roll evezhiañ",
        "confirm-rollback-button": "Mat eo",
+       "confirm-rollback-top": "Disteurel ar c'hemmoù graet er bajenn-mañ ?",
        "quotation-marks": "« $1 »",
        "imgmultipageprev": "&larr; pajenn gent",
        "imgmultipagenext": "pajenn war-lerc'h &rarr;",
        "watchlistedit-raw-done": "Nevesaet eo bet ho roll evezhiañ.",
        "watchlistedit-raw-added": "Ouzhpennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
        "watchlistedit-raw-removed": "Tennet ez eus bet {{PLURAL:$1|1 pajenn|$1 pajenn}} :",
-       "watchlistedit-clear-title": "Roll evezhiañ goulloet",
+       "watchlistedit-clear-title": "Diverkañ ar roll-evezhiañ",
        "watchlistedit-clear-legend": "Diverkañ ar roll-evezhiañ",
        "watchlistedit-clear-explain": "Lamet e vo an holl ditloù eus ho roll evezhiañ",
        "watchlistedit-clear-titles": "Titloù :",
+       "watchlistedit-clear-submit": "Riñsañ ar roll-evezhiañ (da vat e vo !)",
        "watchlistedit-clear-done": "Goulloet eo bet ho roll evezhiañ.",
        "watchlistedit-clear-removed": "Dilamet ez eus bet {{PLURAL:$1|1 titl|$1 a ditloù}} :",
        "watchlistedit-too-many": "Re a bajennoù zo da ziskwel amañ.",
        "version-entrypoints": "URLoù ar poent mont e-barzh",
        "version-entrypoints-header-entrypoint": "Poent mont e-barzh",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Levraouegoù staliet",
        "version-libraries-library": "Levraoueg",
        "version-libraries-version": "Stumm",
        "version-libraries-license": "Aotre-implijout",
        "version-libraries-description": "Deskrivadur",
+       "version-libraries-authors": "Aozerien",
        "redirect-submit": "Mont",
        "redirect-lookup": "Klask :",
        "redirect-value": "Talvoud :",
        "redirect-page": "ID ar bajenn",
        "redirect-revision": "Adwel ar bajenn",
        "redirect-file": "Anv ar restr",
+       "redirect-logid": "ID ar marilh",
        "redirect-not-exists": "Talvoud n'eo ket bet kavet",
        "fileduplicatesearch": "Klask ar restroù e doubl",
        "fileduplicatesearch-summary": "Klask restroù e doubl war diazez talvoudennoù krennet.",
        "tags-active-yes": "Ya",
        "tags-active-no": "Ket",
        "tags-edit": "aozañ",
+       "tags-delete": "diverkañ",
        "tags-activate": "gweredekaat",
        "tags-deactivate": "diweredekaat",
        "tags-hitcount": "$1 {{PLURAL:$1|kemm|kemm}}",
+       "tags-create-heading": "Krouiñ un dikedenn nevez",
+       "tags-create-tag-name": "Anv an dikedenn :",
        "tags-create-reason": "Abeg :",
        "tags-create-submit": "Krouiñ",
+       "tags-create-no-name": "Rekis eo merkañ anv un dikedenn.",
+       "tags-delete-title": "Diverkañ an dikedenn",
        "tags-delete-reason": "Abeg :",
        "tags-activate-reason": "Abeg :",
        "tags-activate-submit": "Gweredekaat",
        "tags-deactivate-reason": "Abeg :",
        "tags-deactivate-submit": "Diweredekaat",
        "tags-edit-existing-tags-none": "''Hini ebet''",
+       "tags-edit-new-tags": "Tikedennoù nevez :",
+       "tags-edit-add": "Ouzhpennañ an tikedennoù-mañ :",
+       "tags-edit-remove": "Dilemel an tikedennoù-mañ :",
+       "tags-edit-remove-all-tags": "(dilemel an holl dikedennoù)",
+       "tags-edit-chosen-placeholder": "Diuzañ un nebeud tikedennoù",
        "tags-edit-reason": "Abeg :",
+       "tags-edit-success": "Lakaet eo bet ar c'hemmoù da dalvezout",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "htmlform-cloner-create": "Ouzhpennañ muioc'h",
        "htmlform-cloner-delete": "Dilemel",
        "htmlform-cloner-required": "Un dalvoudenn a zo ret da vihanañ.",
+       "htmlform-date-placeholder": "BBBB-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "BBBB-MM-DD HH:MM:SS",
+       "htmlform-title-not-exists": "N'eus ket eus $1.",
+       "htmlform-user-not-exists": "N'eus ket eus <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Un anv implijer direizh eo <strong>$1</strong>.",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
        "logentry-delete-restore": "Assavet eo bet ar bajenn $3 gant $1",
        "logentry-delete-event": "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
        "feedback-submit": "Kas",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
        "feedback-thanks-title": "Trugarez !",
-       "searchsuggest-search": "Klask",
+       "searchsuggest-search": "Klask e {{SITENAME}}",
        "searchsuggest-containing": "ennañ...",
-       "api-error-badaccess-groups": "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
-       "api-error-copyuploaddisabled": "Diweredekaet eo an enporzhioù dre URL war ar servijer-mañ.",
-       "api-error-duplicate": "Bez' {{PLURAL:$1|ez eus restr all|restr all}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
-       "api-error-duplicate-archive": "Bez' e oa {{PLURAL:$1|ur restr all|restroù all}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
-       "api-error-empty-file": "Ar restr hoc'h eus roet a oa goullo.",
        "api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
-       "api-error-fetchfileerror": "Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask adtapout ar restr.",
-       "api-error-fileexists-forbidden": "Bez' ez eus c'hoazh eus ur restr anvet \"$1\" ha n'hall ket bezañ friket.",
-       "api-error-fileexists-shared-forbidden": "Bez' ez eus c'hoazh eus ur restr anvet \"$1\" er c'havlec'h kenrannañ restroù ha n'hall ket bezañ friket anezhi.",
-       "api-error-file-too-large": "Ar restr hoc'h eus roet a oa re vras.",
-       "api-error-filename-tooshort": "Re verr eo anv ar restr.",
-       "api-error-filetype-banned": "Difennet eo ar seurt restroù",
-       "api-error-filetype-banned-type": "N'eo ket $1{{PLURAL:$4|ur seurt restr aotreet | seurtoù restroù aotreet}}. $2 zo {{PLURAL:$3|ar seurt restroù|ar seurtoù restroù}} degemeret.?",
-       "api-error-filetype-missing": "Un astenn a vank d'ar restr.",
-       "api-error-hookaborted": "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
-       "api-error-http": "Fazi diabarzh : dibosupl kevreañ d'ar servijer.",
-       "api-error-illegal-filename": "N'eo ket aotreet anv ar restr.",
-       "api-error-internal-error": "Fazi diabarzh : aet ez eus un dra bennak a dreuz en ur dretiñ hoc'h enporzhiadenn war ar wiki.",
-       "api-error-invalid-file-key": "Fazi diabarzh : n'eo ket bet kavet ar restr er stokañ da c'hortoz.",
-       "api-error-missingparam": "Fazi diabarzh : Arventennoù a vank er reked.",
-       "api-error-missingresult": "Fazi diabarzh : dibosupl termeniñ hag eilet eo bet an traoù ervat.",
-       "api-error-mustbeloggedin": "Ret eo deoc'h bezañ kevreet evit pellgargañ restroù.",
-       "api-error-mustbeposted": "Un draen a zo er poellad-mañ ; ne implij ket an hentenn HTTP ret.",
-       "api-error-noimageinfo": "Kaset eo bet ar pellgargañ ervat met n'eus ket bet roet tamm titour ebet deomp diwar-benn ar restr gant ar servijer",
-       "api-error-nomodule": "Fazi diabarzh : tamm modulenn enporzhiañ ebet.",
-       "api-error-ok-but-empty": "Fazi diabarzh : respont ebet a-berzh ar servijer.",
-       "api-error-overwrite": "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
-       "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
        "api-error-publishfailed": "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
-       "api-error-timeout": "N'eo ket bet ar servijer evit respont en termen lakaet.",
-       "api-error-unclassified": "C'hoarvezet ez eus ur gudenn dianav.",
-       "api-error-unknown-code": "Fazi dianav : \"$1\"",
-       "api-error-unknown-error": "Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask enporzhiañ ho restr.",
+       "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
        "api-error-unknown-warning": "Kemenn diwall dianav : $1",
        "api-error-unknownerror": "Fazi dianav : \"$1\".",
-       "api-error-uploaddisabled": "Diweredekaat eo an enporzh war ar wiki-mañ.",
-       "api-error-verification-error": "Pe eo brein ar restr pe eo fall an astenn anezhi.",
        "duration-seconds": "$1 {{PLURAL:$1|eilenn|eilenn}}",
        "duration-minutes": "$1 {{PLURAL:$1|munut|munut}}",
        "duration-hours": "($1 {{PLURAL:$1|eurvezh|eurvezh}})",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
-       "pagelanguage": "Diuzañ yezh ar bajenn",
+       "pagelanguage": "Kemmañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-use-default": "Implijout ar yezh dre ziouer",
        "pagelang-select-lang": "Dibab ar yezh",
+       "pagelang-submit": "Kas",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
        "log-name-pagelang": "Cheñch yezh",
        "mediastatistics-header-office": "Burev",
        "mediastatistics-header-text": "Testenn",
        "mediastatistics-header-archive": "Furmadoù gwasket",
+       "mediastatistics-header-total": "An holl restroù",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulenn|a virgulennoù}} dibenn zo bet lamet eus JSON",
        "json-error-unknown": "Ur gudenn a oa gant ar JSON. Fazi : $1",
        "json-error-depth": "Aet eur en tu all da zonder brasañ an torn",
        "json-error-state-mismatch": "JSON direizh pe stummet fall",
        "json-error-syntax": "Fazi ereadur",
        "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze",
+       "headline-anchor-title": "Liamm war-zu ar rannbennad-mañ",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin astennet",
        "special-characters-group-ipa": "LFE (IPA)",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
-       "randomrootpage": "Pajenn wrizienn dargouezhek"
+       "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
+       "randomrootpage": "Pajenn wrizienn dargouezhek",
+       "log-action-filter-block": "Seurt bloc'had :",
+       "log-action-filter-all": "An holl",
+       "log-action-filter-block-block": "Stankañ",
+       "log-action-filter-block-unblock": "Distankañ",
+       "log-action-filter-protect-protect": "Gwarez",
+       "log-action-filter-protect-unprotect": "Diwarez",
+       "log-action-filter-rights-autopromote": "Kemm emgefre",
+       "authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
+       "authmanager-authn-no-local-user-link": "Reizh eo an titouroù kred lakaet met n'int ket liammet ouzh implijer ebet eus ar wiki-mañ. Ma kevreit en ur mod all pe ma krouit ur gont implijer nevez e c'hallot liammañ ho titouroù kred kent ouzh ar gont-mañ.",
+       "authmanager-change-not-supported": "N'haller ket cheñch an titouroù kred rak netra na rafe ganto.",
+       "authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
+       "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
+       "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
+       "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "authmanager-retype-help": "Adkadarnaat ar ger-tremen.",
+       "authmanager-email-label": "Postel",
+       "authmanager-email-help": "Chomlec'h postel",
+       "authmanager-realname-label": "Anv gwir",
+       "authmanager-realname-help": "Anv gwir an implijer",
+       "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
+       "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
+       "authprovider-resetpass-skip-label": "Lammat",
+       "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
+       "authform-newtoken": "Jedouer a vank. $1",
+       "authform-notoken": "Jedouer a vank",
+       "authform-wrongtoken": "Jedouer fall",
+       "specialpage-securitylevel-not-allowed-title": "Berzet",
+       "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
+       "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "cannotauth-not-allowed-title": "Aotre nac'het",
+       "cannotauth-not-allowed": "N'oc'h ket aotreet d'ober gant ar bajenn-mañ",
+       "changecredentials": "Kemmañ an titouroù kred",
+       "changecredentials-submit": "Kemmañ an titouroù kred",
+       "changecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "removecredentials": "Lemel an titouroù kred",
+       "removecredentials-submit": "Lemel an aotreoù",
+       "removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "credentialsform-provider": "Seurt titouroù kred :",
+       "credentialsform-account": "Anv ar gont :",
+       "cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
+       "cannotlink-no-provider": "N'eus kont ebet da liammañ.",
+       "linkaccounts": "Kontoù liammet",
+       "linkaccounts-success-text": "Liammet eo bet ar gont.",
+       "linkaccounts-submit": "Liammañ ar c'hontoù",
+       "unlinkaccounts": "Diliammañ ar c'hontoù",
+       "unlinkaccounts-success": "Diliammet eo bet ar gont.",
+       "revid": "Adweladenn $1",
+       "pageid": "ID ar bajenn $1"
 }
index 05b3b12..2a17f15 100644 (file)
        "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
        "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registrovan.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
-       "clearyourcache": "'''Pažnja:''' Nakon što sačuvate izmjene, morate \"osvježiti\" keš memoriju vašeg pretraživača da bi ste vidjeli nova podešenja.'''\n*'''Firefox / Safari:''' držite ''Shift'' tipku i kliknite na ''Reload'' dugme ili pritisnite ''Ctrl-F5'' ili ''Ctrl-R'' (''⌘-R'' na Macu)\n*'''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Macu)\n*'''Internet Explorer:''' držite tipku ''Ctrl'' i kliknite na ''Refresh'' ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite \"keš\" preko izbornika ''Tools → Preferences''",
+       "clearyourcache": "<strong>Napomena:</strong> Nakon što sačuvate izmjene, možda ćete morati osvježiti keš preglednika da biste vidjeli izmjene.\n* <strong>Firefox / Safari:</strong> Držite <em>Shift</em> i kliknite na <em>Reload</em> ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Macu)\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Macu)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl</em> i kliknite na <em>Refresh</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Idite na <em>Menu → Settings</em> (<em>Opera → Preferences</em> na Macu) i zatim <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
        "userjsyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
        "usercsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Ovaj pregled još uvijek nije sačuvan!'''",
        "saveprefs": "Sačuvaj",
        "restoreprefs": "Vrati sve postavke na podrazumijevane (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona:",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
        "stub-threshold-sample-link": "primjer",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapisnike.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ sažetka vašeg spiska izmjena. Ko god da ga zna, moći će ga čitati. Ne dijelite ga ni s kim. Ako je potrebno, [[Special:ResetTokens|možete ga ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
-       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} $1 su sačuvana.",
+       "savedrights": "Korisničke grupe {{GENDER:$1|korisnika|korisnice}} $1 su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
+       "gender-unknown": "Kad Vas spominje, softver će pokušati izbjegavati rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ovih podešavanja nije obavezno.\nSoftver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova će informacija biti javna.",
        "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: Možete koristiti tipke sa lijevom i desnom strelicom za kretanje kroz kartice.",
        "userrights": "Postavke korisničkih prava",
-       "userrights-lookup-user": "Menadžment korisničkih grupa",
+       "userrights-lookup-user": "Izaberi korisnika",
        "userrights-user-editname": "Upišite korisničko ime:",
-       "editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
+       "editusergroup": "Uredi korisničke grupe",
        "editinguser": "Mijenjate korisnička prava korisnika <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Uredi korisničke grupe",
        "saveusergroups": "Sačuvaj {{GENDER:$1|korisničke}} grupe",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "specialpage-empty": "Nema rezultata za ovaj izvještaj.",
        "lonelypages": "Siročad",
-       "lonelypagestext": "Slijedeće stranice nemaju linkove na ostalim stranicama na ovoj {{SITENAME}}.",
+       "lonelypagestext": "Sljedeće stranice nisu povezane niti su uključene transkluzijom u druge stranice na {{GRAMMAR:dativ|{{SITENAME}}}}.",
        "uncategorizedpages": "Nekategorisane stranice",
        "uncategorizedcategories": "Nekategorisane kategorije",
        "uncategorizedimages": "Slike bez kategorije",
        "pageinfo-category-files": "Broj datoteka",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
+       "markaspatrolledtext-file": "Označi ovu verziju datoteke kao patroliranu",
        "markedaspatrolled": "Označeno kao patrolirano",
        "markedaspatrolledtext": "Izabrana revizija [[:$1]] je bila označena kao patrolirana.",
        "rcpatroldisabled": "Patroliranje nedavnih izmjena onemogućeno",
        "autoredircomment": "Preusmjereno na [[$1]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "feedback-useragent": "Korisnički agent:",
        "searchsuggest-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanja putem URL-a su onemogućena na ovom serveru.",
-       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je bila prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji i ne može biti zamijenjena.",
-       "api-error-fileexists-shared-forbidden": "Datoteka s imenom \"$1\" već postoji u zajedničkom spremištu i ne može biti prepisana.",
-       "api-error-file-too-large": "Datoteka koju ste poslali je bila prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nije dopušteni vrsta datoteke|su nedopušteni vrste datoteke|su nedopušteni vrste datoteka}}. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je obustavljena preko kuke proširenja.",
-       "api-error-http": "Unutrašnja greška: ne može se spojiti na server.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.",
-       "api-error-invalid-file-key": "Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtjevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste postavljali datoteke.",
-       "api-error-mustbeposted": "Postoji greška u ovom softveru; ne koristi pravilan HTTP metod.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: nema odgovora od servera.",
-       "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.",
-       "api-error-stasherror": "Dogodila se greška pri postavljaju datoteke u skladište.",
-       "api-error-stashedfilenotfound": "Skladištena datoteka nije pronađena pri pokušaju postavljanja iste iz skladišta.",
-       "api-error-stashpathinvalid": "Putanja na kojoj je trebala biti skladištena datoteka je neispravna.",
-       "api-error-stashfilestorage": "Dogodila se greška pri postavljaju datoteke u skladište.",
-       "api-error-stashzerolength": "Server nije mogao skladištiti datoteku jer joj je veličina iznosila 0.",
-       "api-error-stashnotloggedin": "Morate biti prijavljeni kako biste sačuvali datoteke u skladište postavljanja.",
-       "api-error-stashwrongowner": "Datoteka kojoj ste pokušali pristupiti u skladištu ne pripada vama.",
-       "api-error-stashnosuchfilekey": "Datotečni ključ kome ste pokušali pristupiti u skladištu ne pripada vama.",
-       "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
-       "api-error-unclassified": "Desila se nepoznata greška",
-       "api-error-unknown-code": "Nepoznata greška: \"$1\"",
-       "api-error-unknown-error": "Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.",
+       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata greška: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje je onemogućeno na ovoj wiki.",
-       "api-error-verification-error": "Ova datoteka je možda oštećenja ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
index 2c3c41c..d39368c 100644 (file)
        "searcharticle": "Vés-hi",
        "history": "Historial de canvis",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualitzat des de la darrera visita",
        "printableversion": "Versió per a impressora",
        "permalink": "Enllaç permanent",
        "missingarticle-rev": "(revisió#: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "readonly_lag": "La base de dades s'ha bloquejat automàticament mentre els servidors esclaus se sincronitzen amb el mestre",
+       "nonwrite-api-promise-error": "L'encapçalament HTTP 'Promise-Non-Write-API-Action' ha estat enviat però la petició era a mòdul d'escriptura de l'API.",
        "internalerror": "Error intern",
        "internalerror_info": "Error intern: $1",
        "internalerror-fatal-exception": "Excepció fatal del tipus «$1»",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "createacct-another-email-ph": "Introduïu una adreça de correu electrònic",
        "createaccountmail": "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
+       "createaccountmail-help": "Pot utilitzar-se per crear un compte per a una altra persona sense necessitar una contrasenya.",
        "createacct-realname": "Nom real (opcional)",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "eauthentsent": "S'ha enviat un correu electrònic a la direcció especificada. Abans no s'enviï cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
        "throttled-mailpassword": "Ja se us ha enviat un correu electrònic de reinicialització de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}.\nPer a prevenir abusos, només s'envia un correu electrònic de reinicialització de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
        "mailerror": "S'ha produït un error en enviar el missatge: $1",
-       "acct_creation_throttle_hit": "Des de la vostra adreça IP ja {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en l'últim dia i aquest és el màxim permès en aquest wiki per aquest període de temps.\nAixí, des d'aquesta adreça IP no es poden crear més comptes actualment.",
+       "acct_creation_throttle_hit": "Des de la vostra adreça IP {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en aquest wiki durant $2 i aquest és el màxim permès per aquest període de temps.\nAixí, des d'aquesta adreça IP no es poden crear més comptes actualment.",
        "emailauthenticated": "S'ha autenticat la vostra adreça electrònica el $2 a les $3.",
        "emailnotauthenticated": "La vostra adreça de correu electrònic <strong>encara no està autenticada</strong>. No rebrà cap missatge de correu electrònic per a cap de les següents funcionalitats.",
        "noemailprefs": "Especifiqueu una adreça electrònica per activar aquestes característiques.",
        "botpasswords-created-title": "S'ha creat la contrasenya del bot",
        "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
        "botpasswords-updated-title": "Contrasenya de bot actualitzada",
+       "botpasswords-updated-body": "La contrasenya pel bot «$1» de l'usuari «$2» ha estat actualitzada.",
        "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
        "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
        "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. Si us plau, guardeu-la de cara al futur.",
        "invalid-content-data": "Dades de contingut no vàlides",
        "content-not-allowed-here": "No és permès el contingut \"$1\" a la pàgina [[$2]]",
        "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
+       "editpage-invalidcontentmodel-title": "Model de contingut no permès",
+       "editpage-invalidcontentmodel-text": "El model de contingut «$1» no és permès.",
        "editpage-notsupportedcontentformat-title": "No s'admet el format del contingut",
        "editpage-notsupportedcontentformat-text": "No s'admet el format del contingut $1 pel model de contingut $2.",
        "content-model-wikitext": "wikitext",
        "content-json-empty-object": "Objecte buit",
        "content-json-empty-array": "Matriu buida",
        "deprecated-self-close-category": "Pàgines que usen etiquetes HTML autotancades no vàlides",
+       "deprecated-self-close-category-desc": "La pàgina conté etiquetes HTML auto-tancades no vàlides, com ara <code>&lt;b/></code> o <code>&lt;span/></code>.  El seu comportament canviarà aviat per ser consistents amb l'especificació HTML5, per tant el seu ús en text wiki és obsolet.",
        "duplicate-args-warning": "<strong>Avís:</strong> [[:$1]] crida [[:$2]] amb més d'un valor pel paràmetre «$3». Només s'utilitzarà el darrer valor proporcionat.",
        "duplicate-args-category": "Pàgines amb arguments duplicats en utilització de plantilles",
        "duplicate-args-category-desc": "La pàgina conté crides a plantilles que fan servir duplicats d'arguments, com ara <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "saveprefs": "Desa les preferències",
        "restoreprefs": "Restaura les preferències per defecte",
        "prefs-editing": "Caixa d'edició",
-       "rows": "Files",
-       "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
        "stub-threshold": "Límit per a formatar com a enllaç a esborrany ($1):",
        "stub-threshold-sample-link": "mostra",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Carrega els grups d'usuari",
        "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
+       "viewinguserrights": "Visualització del drets de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Edita els grups d'usuaris",
+       "userrights-viewusergroup": "Mostra els grups d'usuari",
        "saveusergroups": "Desa els grups d'{{GENDER:$1|usuari}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "grant-basic": "Permisos bàsics",
        "grant-viewdeleted": "Mostra fitxers eliminats i pàgines",
        "grant-viewmywatchlist": "Modifica la llista de seguiment",
+       "grant-viewrestrictedlogs": "Visualització d'entrades de registre restringides",
        "newuserlogpage": "Registre de creació d'usuaris",
        "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.",
        "rightslog": "Registre dels permisos d'usuari",
        "action-upload_by_url": "carregar aquest fitxer des d'una adreça URL",
        "action-writeapi": "fer servir l'API d'escriptura",
        "action-delete": "esborrar aquesta pàgina",
-       "action-deleterevision": "esborrar aquesta revisió",
-       "action-deletedhistory": "visualitzar l'historial esborrat d'aquesta pàgina",
+       "action-deleterevision": "suprimeix les revisions",
+       "action-deletelogentry": "suprimeix les entrades de registre",
+       "action-deletedhistory": "mostra l'historial esborrat d'una pàgina",
+       "action-deletedtext": "mostra el text de la revisió eliminada",
        "action-browsearchive": "cercar pàgines esborrades",
-       "action-undelete": "recuperar aquesta pàgina",
-       "action-suppressrevision": "revisar i recuperar aquesta revisió oculta",
+       "action-undelete": "restaura les pàgines",
+       "action-suppressrevision": "revisa i restaura les revisions ocultes",
        "action-suppressionlog": "visualitzar aquest registre privat",
        "action-block": "blocar aquest usuari perquè no pugui editar",
        "action-protect": "canviar els nivells de protecció d'aquesta pàgina",
        "action-userrights-interwiki": "modificar permisos d'usuari en altres wikis",
        "action-siteadmin": "bloquejar o desbloquejar la base de dades",
        "action-sendemail": "enviar missatges de correu",
+       "action-editmyoptions": "modifiqueu les vostres preferències",
        "action-editmywatchlist": "edita la llista de seguiment",
        "action-viewmywatchlist": "mostra la llista de seguiment",
        "action-viewmyprivateinfo": "mostra la informació personal",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
+       "rcfilters-activefilters": "Filtres actius",
+       "rcfilters-search-placeholder": "Canvis recents dels filtres (navegueu o comenceu a escriure)",
+       "rcfilters-invalid-filter": "Filtre no vàlid",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
+       "rcfilters-filtergroup-authorship": "Modifica l'autoria",
+       "rcfilters-filter-editsbyself-label": "Les vostres modificacions",
+       "rcfilters-filter-editsbyself-description": "Modificacions vostres.",
+       "rcfilters-filter-editsbyother-label": "Modificacions d'altres",
+       "rcfilters-filter-editsbyother-description": "Modificacions creades per altres usuaris (no vostres)",
+       "rcfilters-filtergroup-userExpLevel": "Nivell d'experiència d'usuari",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novells",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Editors novells: menys de 10 edicions i 4 dies d'activitat.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprenents",
+       "rcfilters-filter-userExpLevel-learner-description": "Més dies d'activitat i més edicions que els 'Novells' però menys que els 'Usuaris experimentats'.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuaris experimentats",
+       "rcfilters-filter-userExpLevel-experienced-description": "Més de 30 dies d'activitat i més de 500 edicions.",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "fileexists-forbidden": "Ja hi existeix un fitxer amb aquest nom i no es pot sobreescriure.\nSi us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ja hi ha un fitxer amb aquest nom en el fons comú de fitxers.\nSi encara voleu pujar el fitxer, torneu enrere i pugeu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "La càrrega és un duplicat exacte de la versió actual de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "La càrrega és un duplicat exacte {{PLURAL:$2|d'una versió antiga|de versions antigues}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}",
        "file-deleted-duplicate": "S'ha suprimit anteriorment un fitxer idèntic a aquest ([[:$1]]). Hauríeu de comprovar el registre de supressions del fitxer abans de tornar-lo a carregar.",
        "file-deleted-duplicate-notitle": "Un fitxer idèntic a aquest fitxer havia estat suprimit abans, i també el títol. Hauríeu de demanar a algú que pugui veure les dades suprimides del fitxer que revisi la situació abans de procedir a tornar a carregar-lo.",
        "apihelp": "Ajuda de l'API",
        "apihelp-no-such-module": "No s'ha trobat el mòdul \"$1\".",
        "apisandbox": "Pàgina de proves de l'API",
+       "apisandbox-jsonly": "Es necessita JavaScript per utilitzar l'espai de proves API.",
        "apisandbox-api-disabled": "L'API està desactivada en aquest lloc.",
        "apisandbox-intro": "Utilitzeu aquesta pàgina per experimentar amb l'<nowiki />'''API de web service de MediaWiki'''.\nVisiteu [https://www.mediawiki.org/wiki/API:Main_page la documentació de l'API] per a més informació sobre l'ús de l'API. Exemple: [https://www.mediawiki.org/wiki/API#A_simple_example recuperar el contingut d'una Pàgina Principal]. Seleccioneu una acció per veure més exemples.\n\nTingueu en compte que, encara que això és una pàgina de proves, les accions que feu en aquesta pàgina poden modificar la wiki.",
+       "apisandbox-fullscreen": "Expandeix el plafó",
+       "apisandbox-fullscreen-tooltip": "Expandeix el plafó de l'entorn de proves per tal que ocupi la finestra del navegador.",
        "apisandbox-unfullscreen": "Mostra la pàgina",
+       "apisandbox-unfullscreen-tooltip": "Redueix el plafó de l'entorn de proves per tal que els enllaços de navegació de MediaWiki siguin disponibles.",
        "apisandbox-submit": "Fes sol·licitud",
        "apisandbox-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-dynamic-error-exists": "Ja existeix un paràmetre anomenat \"$1\".",
        "apisandbox-deprecated-parameters": "Paràmetres obsolets",
        "apisandbox-submit-invalid-fields-title": "Alguns camps no són vàlids",
+       "apisandbox-submit-invalid-fields-message": "Corregiu els camps marcats i torneu-ho a provar.",
        "apisandbox-results": "Resultats",
        "apisandbox-sending-request": "S'està enviant una sol·licitud API...",
+       "apisandbox-loading-results": "S'estan reben els resultats de l'API...",
+       "apisandbox-results-error": "S'ha produït un error en carregar la resposta de la consulta de l'API: $1.",
        "apisandbox-request-url-label": "Sol·licita URL:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Corregeix el testimoni i torna-ho a enviar",
+       "apisandbox-results-fixtoken-fail": "No s'ha pogut recuperar el testimoni «$1».",
+       "apisandbox-alert-page": "Els camps en aquesta pàgina no són vàlids.",
+       "apisandbox-alert-field": "El valor d'aquest camp no és vàlid.",
        "apisandbox-continue": "Continua",
        "apisandbox-continue-clear": "Neteja",
        "apisandbox-multivalue-all-namespaces": "$1 (tots els espais de noms)",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
        "magiclink-tracking-rfc": "Pàgines que usen enllaços màgics RFC",
+       "magiclink-tracking-rfc-desc": "Aquesta pàgina utilitza enllaços màgics RFC. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "magiclink-tracking-pmid": "Pàgines que usen enllaços màgics PMID",
+       "magiclink-tracking-pmid-desc": "Aquesta pàgina utilitza enllaços màgics PMID. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "magiclink-tracking-isbn": "Pàgines que usen enllaços màgics d'ISBN",
+       "magiclink-tracking-isbn-desc": "Aquesta pàgina utilitza enllaços màgics ISBN. Vegeu [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] per saber com canviar-los.",
        "specialloguserlabel": "Realitzador:",
        "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "linksearch-error": "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
        "listusersfrom": "Mostra usuaris començant per:",
        "listusers-submit": "Mostra",
-       "listusers-noresult": "No s'han trobat coincidències de noms d'usuaris. Si us plau, busqueu també amb variacions per majúscules i minúscules.",
+       "listusers-noresult": "No s’ha trobat cap usuari.",
        "listusers-blocked": "({{GENDER:$1|blocat|blocada}})",
        "activeusers": "Llista d'usuaris actius",
        "activeusers-intro": "Aquí hi ha una llista d'usuaris que han tingut algun tipus d'activitat en {{PLURAL:$1|el darrer dia|els darrers $1 dies}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acció|accions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}",
        "activeusers-from": "Mostra els usuaris començant per:",
+       "activeusers-groups": "Mostra els usuaris que pertanyen als grups:",
        "activeusers-excludegroups": "Exclou els usuaris que pertanyen als grups:",
        "activeusers-noresult": "No s'han trobat usuaris.",
        "activeusers-submit": "Mostra els usuaris actius",
        "trackingcategories-name": "Nom del missatge",
        "trackingcategories-desc": "Criteris d'inclusió de categoria",
        "restricted-displaytitle-ignored": "Pàgines amb títols a mostrar ignorats",
+       "restricted-displaytitle-ignored-desc": "La pàgina té un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> que ha estat ignorat perquè no és equivalent al títol actual de la pàgina.",
        "noindex-category-desc": "La pàgina conté una paraula màgica <code><nowiki>__NOINDEX__</nowiki></code> (i és en un espai de noms on està permesa) i per tant no està indexada per robots.",
        "index-category-desc": "La pàgina conté un <code><nowiki>__INDEX__</nowiki></code> (i és en un espai de noms on està permès) i per tant està indexat per robots quan normalment no ho seria.",
        "post-expand-template-inclusion-category-desc": "La mida de la pàgina és més gran que <code>$wgMaxArticleSize</code> un cop expandides totes les plantilles, per tant algunes plantilles no s'han expandit.",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
-       "emailuserfooter": "Aquest missatge de correu electrònic l'ha {{GENDER:$1|enviat}} $1 a {{GENDER:$2|$2}} amb la funció «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Aquest missatge de correu electrònic l'ha {{GENDER:$1|enviat}} $1 a {{GENDER:$2|$2}} amb la funció «{{int:emailuser}}» de {{SITENAME}}. {{GENDER:$2|El vostre}} correu electrònic serà enviat directament {{GENDER:$1|al remitent|a la remitent}} original, revelant-li {{GENDER:$2|la vostra}} adreça de correu.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "watchnologin": "No heu iniciat la sessió",
        "addwatch": "Afegeix a llista de seguiment",
        "addedwatchtext": "S'ha afegit «[[:$1]]» i la seva pàgina de discussió a la vostra [[Special:Watchlist|llista de seguiment]].",
+       "addedwatchtext-talk": "«[[:$1]]» i la seva pàgina associada han estat afegides a la vostra [[Special:Watchlist|llista de seguiment]].",
        "addedwatchtext-short": "S’ha afegit la pàgina «$1» a la vostra llista de seguiment.",
        "removewatch": "Treu de la llista de seguiment",
        "removedwatchtext": "S'ha tret «[[:$1]]» i la seva pàgina de discussió de la vostra [[Special:Watchlist|llista de seguiment]].",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}",
        "rollbackfailed": "No s'ha pogut revocar",
+       "rollback-missingparam": "Paràmetres necessaris que falten en la sol·licitud.",
        "rollback-missingrevision": "No es poden carregar les dades de revisió.",
        "cantrollback": "No s'han pogut revertir les edicions; el darrer col·laborador és l'únic autor de la pàgina.",
        "alreadyrolled": "No es pot revertir la darrera modificació de [[:$1]]\nde l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Algú altre ja ha modificat o revertit la pàgina.\n\nLa darrera modificació l'ha fet l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
        "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
+       "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
        "changecontentmodel": "Canvia el model de contingut d'una pàgina",
        "changecontentmodel-emptymodels-title": "No hi ha models de contingut",
        "changecontentmodel-emptymodels-text": "El contingut a [[:$1]] no pot convertir-se a cap tipus.",
        "log-name-contentmodel": "Registre de canvis del model de contingut",
-       "log-description-contentmodel": "Esdeveniments relacionats amb els models de contingut d'una pàgina",
+       "log-description-contentmodel": "Aquesta pàgina llista els canvis al model de contingut de les pàgines, i les pàgines que van ser creades amb un model de contingut diferent del que és per defecte.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|va crear}} la pàgina $3 utilitzant un model de contingut no per defecte («$5»)",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "reverteix",
        "logentry-contentmodel-change-revert": "reverteix",
        "modifiedarticleprotection": "ha canviat el nivell de protecció de «[[$1]]»",
        "unprotectedarticle": "ha desprotegit \"[[$1]]\"",
        "movedarticleprotection": "ha traslladat els ajustaments de protecció des de «[[$2]]» a «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Ha protegit}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ha canviat el nivell de protecció}} de «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Ha suprimit la protecció}} de «[[$1]]»",
        "protect-title": "Canviant la protecció de «$1»",
        "protect-title-notallowed": "Mostra el nivell de protecció de \" $1 \"",
        "prot_1movedto2": "[[$1]] mogut a [[$2]]",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
        "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
        "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
+       "namespace-nosubpages": "L'espai de noms «$1» no permet subpàgines.",
        "newtitle": "Títol nou:",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "tooltip-minoredit": "Marca-ho com una modificació menor",
        "tooltip-save": "Deseu els canvis",
        "tooltip-publish": "Publica els canvis",
-       "tooltip-preview": "Reviseu els vostres canvis, feu-ho abans de desar res!",
+       "tooltip-preview": "Previsualitzeu els vostres canvis. Feu-ho abans de desar res.",
        "tooltip-diff": "Mostra quins canvis heu fet al text",
        "tooltip-compareselectedversions": "Vegeu les diferències entre les dues versions seleccionades d'aquesta pàgina.",
        "tooltip-watch": "Afegiu aquesta pàgina a la vostra llista de seguiment",
        "pageinfo-length": "Mida de la pàgina (en bytes)",
        "pageinfo-article-id": "ID de la pàgina",
        "pageinfo-language": "Llengua del contingut de la pàgina",
+       "pageinfo-language-change": "canvia",
        "pageinfo-content-model": "Plantilla de contingut de pàgina",
        "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "log-show-hide-patrol": "$1 el registre de patrulla",
        "log-show-hide-tag": "$1 el registre d’etiquetes",
        "confirm-markpatrolled-button": "D'acord",
+       "confirm-markpatrolled-top": "Voleu marcar la revisió $3 de $2 com a patrullada?",
        "deletedrevision": "S'ha eliminat la revisió antiga $1.",
        "filedeleteerror-short": "Error en suprimir el fitxer: $1",
        "filedeleteerror-long": "S'han produït errors en suprimir el fitxer:\n\n$1",
        "htmlform-cloner-create": "Afegeix més",
        "htmlform-cloner-delete": "Suprimeix",
        "htmlform-cloner-required": "Cal com a mínim un valor.",
+       "htmlform-date-placeholder": "AAAA-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "El valor que heu especificat no és una data reconeguda. Proveu d'utilitzar el format AAAA-MM-DD.",
+       "htmlform-time-invalid": "El valor que heu especificat no és una hora reconeguda. Proveu d'utilitzar el format HH:MM:SS.",
+       "htmlform-datetime-invalid": "El valor que heu especificat no és una data i hora reconeguda. Proveu d'utilitzar el format AAAA-MM-DD HH:MM:SS.",
        "htmlform-title-badnamespace": "[[:$1]] no es troba en l'espai de noms \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" és un títol de pàgina no editable",
        "htmlform-title-not-exists": "$1 no existeix.",
        "htmlform-user-not-exists": "<strong>$1</strong> no existeix.",
        "htmlform-user-not-valid": "<strong>$1</strong> no és nom d'usuari vàlid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha esborrat}} la pàgina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|ha esborrat}} la redirecció $3 sobreescrivint-la",
        "logentry-delete-restore": "$1 ha restaurat $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
        "logentry-newusers-create2": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
        "logentry-newusers-byemail": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
        "logentry-newusers-autocreate": "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|ha traslladat}} els valors de protecció de $4 a $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|ha protegit}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
        "feedback-useragent": "Agent d'usuari:",
        "searchsuggest-search": "Cerca a {{SITENAME}}",
        "searchsuggest-containing": "que conté ...",
-       "api-error-autoblocked": "S'ha blocat la vostra IP automàticament perquè la va utilitzar un usuari blocat.",
-       "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
        "api-error-badtoken": "Error intern: argument incorrecte.",
-       "api-error-blocked": "Heu estat blocat per poder editar.",
-       "api-error-copyuploaddisabled": "Les càrregues via URL estan desactivades en aquest servidor.",
-       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|un altre fitxer|altres fitxers}} en aquest lloc web amb el mateix contingut.",
-       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|un altre fitxer|altres fitxers}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
-       "api-error-empty-file": "El fitxer que heu tramès està buit.",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
-       "api-error-fetchfileerror": "Error intern: quelcom no ha funcionat en accedir al fitxer.",
-       "api-error-fileexists-forbidden": "Ja existeix un fitxer amb el nom «$1» i no pot sobreescriure's.",
-       "api-error-fileexists-shared-forbidden": "Ja existeix un fitxer amb el nom «$1» al repositori de fitxers compartits i no pot sobreescriure's.",
-       "api-error-file-too-large": "El fitxer que heu tramès és massa gran.",
-       "api-error-filename-tooshort": "El nom del fitxer és massa curt.",
-       "api-error-filetype-banned": "Aquest tipus de fitxer està prohibit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|no és un tipus de fitxer permès|no són tipus de fitxer permesos}}. {{PLURAL:$3|El tipus de fitxer permès és|Els tipus de fitxer permesos són}} $2.",
-       "api-error-filetype-missing": "El nom de fitxer no té extensió.",
-       "api-error-hookaborted": "Un mòdul d'extensió ha cancel·lat la modificació que heu intentat fer.",
-       "api-error-http": "Error intern: no es pot connectar al servidor.",
-       "api-error-illegal-filename": "El nom del fitxer no està permès.",
-       "api-error-internal-error": "Error intern: el procés de càrrega en el wiki no ha funcionat.",
-       "api-error-invalid-file-key": "Error intern: no s'ha trobat el fitxer al dipòsit temporal.",
-       "api-error-missingparam": "Error intern: falten paràmetres a la petició.",
-       "api-error-missingresult": "Error intern: no s'ha pogut determinar si la còpia ha reeixit.",
-       "api-error-mustbeloggedin": "Cal que estigueu autenticats en un compte d'usuari per a poder carregar fitxers.",
-       "api-error-mustbeposted": "Error intern: la sol·licitud necessita HTTP POST.",
-       "api-error-noimageinfo": "La pujada s'ha realitzat amb èxit, però el servidor no ha proporcionat cap informació del fitxer.",
-       "api-error-nomodule": "Error intern: no està definit el mòdul de càrregues.",
-       "api-error-ok-but-empty": "Error intern: no hi ha resposta del servidor.",
-       "api-error-overwrite": "No està permès sobreescriure un fitxer existent.",
-       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
-       "api-error-stasherror": "S'ha produït un error en carregar el fitxer al dipòsit.",
-       "api-error-stashedfilenotfound": "No s'ha trobat el fitxer de l'espai temporal quan es provava de carregar-lo d'allà.",
-       "api-error-stashpathinvalid": "El camí on s'havia de trobar el fitxer de l'espai temporal no és vàlid.",
-       "api-error-stashfilestorage": "S'ha produït un error en emmagatzemar el fitxer en l'espai temporal.",
-       "api-error-stashzerolength": "El servidor no ha pogut desar el fitxer a l'espai temporal perquè tenia longitud zero.",
-       "api-error-stashnotloggedin": "Cal haver iniciat una sessió per desar fitxers en l'espai temporal de càrrega.",
-       "api-error-stashwrongowner": "El fitxer que provàveu d'accedir en l'espai temporal no us pertany.",
-       "api-error-stashnosuchfilekey": "La clau de fitxer que provàveu d'accedir en l'espai temporal no existeix.",
-       "api-error-timeout": "El servidor no ha respost en el temps esperat.",
-       "api-error-unclassified": "S'ha produït un error desconegut",
-       "api-error-unknown-code": "Error desconegut: «$1»",
-       "api-error-unknown-error": "Error intern: quelcom no ha funcionat en intentar carregar el fitxer.",
+       "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
        "api-error-unknown-warning": "Avís desconegut: $1",
        "api-error-unknownerror": "Error desconegut: «$1».",
-       "api-error-uploaddisabled": "Estan desactivades les càrregues en aquest wiki",
-       "api-error-verification-error": "Aquest fitxer pot estar danyat, o tenir una extensió incorrecta.",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "pagelang-use-default": "Utilitza l'idioma per defecte",
        "pagelang-select-lang": "Selecciona un idioma",
        "pagelang-submit": "Envia",
+       "pagelang-nonexistent-page": "La pàgina $1 no existeix.",
+       "pagelang-unchanged-language": "La pàgina $1 ja està configurada en la llengua: $2.",
+       "pagelang-unchanged-language-default": "La pàgina $1 ja està configurada en la llengua de contingut per defecte del wiki.",
+       "pagelang-db-failed": "La base de dades no ha pogut canviar la llengua de la pàgina.",
        "right-pagelang": "Canvia l'idioma de la pàgina",
        "action-pagelang": "canvia l'idioma de la pàgina",
        "log-name-pagelang": "Registre de canvi de llengua",
        "sessionprovider-nocookies": "Pot ser que les galetes estiguin inhabilitades. Assegureu-vos que teniu les galetes habilitades i inicieu de nou.",
        "randomrootpage": "Pàgina arrel aleatòria",
        "log-action-filter-block": "Tipus de blocatge:",
+       "log-action-filter-contentmodel": "Tipus de modificació del model de contingut:",
        "log-action-filter-delete": "Tipus de supressió:",
        "log-action-filter-import": "Tipus d'importació:",
        "log-action-filter-managetags": "Tipus d'acció de gestió d'etiquetes:",
        "log-action-filter-block-block": "Bloca",
        "log-action-filter-block-reblock": "Bloca la modificació",
        "log-action-filter-block-unblock": "Desbloca",
+       "log-action-filter-contentmodel-change": "Canvi del model de contingut",
        "log-action-filter-delete-delete": "Supressió de pàgines",
        "log-action-filter-delete-delete_redir": "Sobreescriptura de la redirecció",
        "log-action-filter-delete-restore": "Restauració de pàgines",
        "log-action-filter-delete-event": "Registre de supressió",
        "log-action-filter-delete-revision": "Supressió de revisions",
+       "log-action-filter-import-upload": "Importació mitjançant càrrega d'XML",
        "log-action-filter-managetags-create": "Creació de l'etiqueta",
        "log-action-filter-managetags-delete": "Supressió de l'etiqueta",
        "log-action-filter-managetags-activate": "Activació de l'etiqueta",
        "authmanager-authplugin-setpass-failed-title": "El canvi de contrasenya ha fallat",
        "authmanager-authplugin-setpass-bad-domain": "Domini invàlid.",
        "authmanager-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
+       "authmanager-username-help": "Nom d'usuari per a l'autenticació.",
+       "authmanager-password-help": "Contrasenya per a l'autenticació.",
+       "authmanager-domain-help": "Domini per a l'autenticació externa.",
        "authmanager-retype-help": "Contrasenya de nou per confirmar",
        "authmanager-email-label": "Correu electrònic",
        "authmanager-email-help": "Adreça electrònica",
        "cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
        "changecredentials": "Canvi de dades credencials",
        "changecredentials-submit": "Canvia les dades credencials",
+       "changecredentials-success": "Les vostres credencials han estat canviades.",
+       "removecredentials": "Suprimeix les credencials",
+       "removecredentials-submit": "Suprimeix les credencials",
+       "removecredentials-invalidsubpage": "$1 no és un tipus de credencial vàlid.",
+       "removecredentials-success": "S'ha suprimit les vostres credencials.",
        "credentialsform-provider": "Tipus de dades credencials:",
        "credentialsform-account": "Nom del compte:",
        "cannotlink-no-provider-title": "No hi ha cap compte enllaçable",
        "unlinkaccounts": "Desenllaça els comptes",
        "unlinkaccounts-success": "El compte s'ha desenllaçat.",
        "authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?",
-       "restrictionsfield-label": "Intervals d'IP permesos:"
+       "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:",
+       "revid": "revisió $1",
+       "pageid": "ID de pàgina $1"
 }
index c61e871..4c638d0 100644 (file)
@@ -18,7 +18,7 @@
        "tog-hideminor": "Къайладаха жима нисдарш керла могӀам юкъара",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-hidecategorization": "Ð\9aÑ\8aайлаÑ\8fÑ\85а Ð°Ð³Ó\80онийн ÐºÐ°Ñ\82егоÑ\80еÑ\88",
+       "tog-hidecategorization": "Ð\90гÓ\80онаÑ\88на Ñ\82Ó\80е ÐºÐ°Ñ\82егоÑ\80еÑ\88 Ñ\82оÑ\85аÑ\80 ÐºÑ\8aайладаккÑ\85а",
        "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а, хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
@@ -29,6 +29,7 @@
        "tog-watchdefault": "ТӀетоха ас нисйина агӀонаш тергаме могӀам чу",
        "tog-watchmoves": "ТӀетоха ас цӀерш хийцина агӀонаш тергаме могӀам чу",
        "tog-watchdeletion": "ТӀетоха ас дӀаяьхна агӀонаш тергаме могӀанан чу",
+       "tog-watchuploads": "Аса чуяьхна файлаш тергаме могӀам юкъатоха",
        "tog-watchrollback": "Аса нисдар юхудаькхина агӀо сан тергаме могӀанан тӀетуху",
        "tog-minordefault": "Къастам бе нисйиначарн хlумцадеш кегийра долушсанна",
        "tog-previewontop": "Чуяккха хьалххьажар тадаран кора хьалха",
        "tog-watchlisthidebots": "Къайладаха тергаме могӀам чура ботан нисдинарш",
        "tog-watchlisthideminor": "Къайладаха кегийра нисдарш тергаме могӀам чура",
        "tog-watchlisthideliu": "Къайладаха бовзийтина болу декъашхойн нисдарш тергаме могӀам чура",
+       "tog-watchlistreloadautomatically": "Литтарна хийцам хилча авто-карлабаккха тергаме могӀам (оьшу JavaScript)",
        "tog-watchlisthideanons": "Къайладаха къайлаха болу декъашхойн нисдарш тергаме могӀам чура",
        "tog-watchlisthidepatrolled": "Къайладаха хьаьжина долу нисдарш тергаме могӀам чура",
+       "tog-watchlisthidecategorization": "АгӀонашна тӀе категореш тохар къайладаккха",
        "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.",
        "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш",
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
        "listingcontinuesabbrev": "(кхин дlа)",
        "index-category": "Меттигтерахьйо агӀонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
-       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
+       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх ца бен файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "article": "Яззам",
        "newwindow": "(керлачу корехь)",
        "views": "Хьажарш",
        "toolbox": "ГӀирсаш",
        "tool-link-userrights": "{{GENDER:$1|Декъашхочун}} бакъо хийцар",
+       "tool-link-userrights-readonly": "Хьажа {{GENDER:$1|декъашхочун}} тобанаш",
        "tool-link-emailuser": "Язде {{GENDER:$1|декъашхочунга}} кехат",
        "userpage": "Хьажа декъашхочуьна агӀоне",
        "projectpage": "Хьажа кхолламан агӀоне",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "userlogin-remembermypassword": "Системин чохь Ӏойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
+       "cannotlogin-title": "Чудаха таро яц",
+       "cannotlogin-text": "Чудаха таро яц",
        "cannotloginnow-title": "ХӀинца чудаха таро яц",
+       "cannotloginnow-text": "$1 лелочу хенахь чудаха таро яц.",
+       "cannotcreateaccount-title": "Декъашхочун дӀаяздар кхолла йиш яц",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "externaldberror": "Арахьара хаамийн базан гӀоьнца аутентификаци ечу хенахь гӀалат даьлла я хьа дӀаяздаран хийцам бан бакъонаш яц.",
        "savearticle": "АгӀо дӀаязъян",
        "savechanges": "Ӏалашбе хийцамаш",
        "publishpage": "АгӀо кхолла",
+       "publishchanges": "АгӀо дӀаязъян",
        "preview": "Хьалххе хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина болу хийцамашка хьажар",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''",
        "missingsummary": "'''Дагадаийтар.''' Ахьа хийцамаш лаьцна доца яздина дац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
+       "selfredirect": "<strong>Тергам бе:</strong> Ахьа кхуллуш ю из-за цӀе йолу агӀонан тӀе дӀасхьажорг.\nХийла мега, ДӀасхьажорг кхолла я таян ахьа хаьржина нийса йоцу агӀо.\nАхьа «{{int:savearticle}}» кнопка юха а тӀетаӀа яхь агӀо кхуллура ю.",
        "missingcommenttext": "Дехар до дӀаязбе хайн хаам лахахь.",
        "missingcommentheader": "'''Дагадаийтар.''' Ахьа хӀокху къамелан дӀахьедар/корта билгал бина бац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
        "summary-preview": "Цуьнах лаьцна хирду:",
        "content-model-text": "цхьалхе йоза",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Еса объект",
+       "content-json-empty-array": "Еса меттиг",
        "duplicate-args-warning": "Тидам: [[:$1]] кхойкху [[:$2]] «дегӀан_хатӀ» «$3» параметран цхьаннал сов маьӀна долу карточка.\nТӀаьххьара къастийна долу маьӀна бен лелор дац.",
        "duplicate-args-category": "Кепийн кхайкхамашкахь аргументаш юх-юха лелош йолу агӀонаш",
        "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
        "prefs-personal": "Долахь болу хаамаш",
        "prefs-rc": "Керла нисдарш",
        "prefs-watchlist": "Тергаме могӀам",
+       "prefs-editwatchlist": "Тергаме могӀаман хийцам",
+       "prefs-editwatchlist-label": "Сан тергаме могӀаман чура дӀаяздаршна хийцам:",
+       "prefs-editwatchlist-edit": "Сан тергаме могӀамам чура цӀерш дӀаяхар а, хьажар а",
+       "prefs-editwatchlist-raw": "Тергаме могӀам йоза санна нисбан",
+       "prefs-editwatchlist-clear": "Тергаме могӀам цӀанбан",
        "prefs-watchlist-days": "Денойн дукхалла:",
        "prefs-watchlist-days-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "prefs-watchlist-edits": "Тергаме могӀам чохь гойтучу нисдарийн максимум дукхалла:",
        "saveprefs": "Ӏалашдан",
        "restoreprefs": "МеттахӀоттабе гӀирс Iад битарца",
        "prefs-editing": "Тадар",
-       "rows": "МогӀанаш:",
-       "columns": "БӀогӀамаш:",
        "searchresultshead": "Лахар",
        "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
        "stub-threshold-sample-link": "масала",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "recentchanges-submit": "Гайта",
+       "rcfilters-filterlist-title": "Литтарш",
+       "rcfilters-filterlist-noresults": "Литтарш цакарий",
+       "rcfilters-filtergroup-authorship": "Нисде авторалла",
+       "rcfilters-filter-editsbyself-label": "Хьан дисдарш",
+       "rcfilters-filter-editsbyself-description": "Хьан нисдарш.",
+       "rcfilters-filter-editsbyother-label": "Кхечу декъашхойн нисдарш",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Керланиш",
+       "rcfilters-filter-userExpLevel-learner-label": "Доьшуш берш",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам {{CURRENTYEAR}} шеран {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTTIME}} бина болу",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "uploadstash-nofiles": "Хьан къайла файлаш яц.",
        "uploadstash-errclear": "Файлаш дӀацӀанъян цаелира.",
        "uploadstash-refresh": "Карлабаккха файлийн могӀам",
+       "uploadstash-thumbnail": "гайта миниатюра",
        "img-auth-accessdenied": "ТӀекхача магийна дац",
        "img-auth-streaming": "Тоба дӀаелар «$1».",
        "http-invalid-url": "ГӀалате URL: $1",
        "undelete-show-file-submit": "ХӀаъ",
        "namespace": "ЦӀерийн меттигаш:",
        "invert": "Хаьржинарг къайлаяккха",
-       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн анан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)",
+       "tooltip-whatlinkshere-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн меттигийн агӀонийн хьажоргаш къайлаяха.",
        "namespace_association": "Йихкина меттиг",
        "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта",
        "blanknamespace": "(Коьрта)",
        "revertmove": "юхаяккха",
        "delete_and_move_text": "== ДӀаяккха хьокъ ю ==\nИ цӀе йолу аг1о «[[:$1]]» йолуш ю. \nЛаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?",
        "delete_and_move_confirm": "ХӀаъ, дӀаяккха хӀара агӀо",
-       "delete_and_move_reason": "Ð\94Ó\80аÑ\8fÑ\8cккÑ\85ина Ñ\86Ó\80е Ñ\85ийÑ\86а Ñ\8f Ñ\82аÑ\80о Ñ\85илийÑ\82а  Â«[[$1]]»",
+       "delete_and_move_reason": "ДӀаяьккхина цӀе хийца таро хилийта  «[[$1]]»",
        "selfmove": "АгӀона цӏе хийца йиш яц: и цӏе хӏокху агӏона йолуш ю.",
        "immobile-source-page": "ХӀокху агӏона цӏе хийца йиш яц.",
        "bad-target-model": "Йиш яц хийца $1 оцу $2: цхьаьна ца догӀу моделин хаамаш.",
        "exif-copyright": "Авторан бакъо ерг",
        "exif-exifversion": "Верси Exif",
        "exif-flashpixversion": "Ловш йолу верси FlashPix",
-       "exif-colorspace": "Ð\91еÑ\81наÑ\88ан Ñ\85Ñ\8cал",
+       "exif-colorspace": "Ð\91еÑ\81нийн Ð¼ÐµÑ\82Ñ\82иг",
        "exif-componentsconfiguration": "Бесара компонентин конфигураци",
-       "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
+       "exif-compressedbitsperpixel": "Бесан кӀоргалла дацдиначул - цхьаьна",
        "exif-pixelxdimension": "Суьртан шоралла",
        "exif-pixelydimension": "Суьртан локхалла",
        "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
-       "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
+       "exif-datetimeoriginal": "Дуьххьарлера терахь а, хан а",
        "exif-datetimedigitized": "Оцифровк йина терахь а, хан а",
        "exif-subsectime": "Файлан хийцам баран хан секундашкахь",
        "exif-subsectimeoriginal": "Оригинал хенан секундан дакъа",
        "exif-exposurebiasvalue": "Сурт доккхуш яла оьшу серло меттаяло",
        "exif-maxaperturevalue": "Минимальни оьзан дукхалла",
        "exif-meteringmode": "Сурт доккхуш яла серло юьстаран хьал",
-       "exif-flash": "Серлона статус",
+       "exif-lightsource": "Серло схьайолу меттиг",
+       "exif-flash": "Серлонан статус",
        "exif-focallength": "Фокусни бохалла",
        "exif-focalplanexresolution": "X магийна фокалан тӀапа",
        "exif-focalplaneyresolution": "Y магийна фокалан тӀапа",
        "exif-exposuremode": "Сурт доккхуш йолу серлон хьал харжар",
        "exif-whitebalance": "Къайн баланс",
        "exif-digitalzoomratio": "Терхьаш дукха хиларан коэффициент",
-       "exif-scenecapturetype": "СÑ\83Ñ\80Ñ\82 Ð´Ð¾ÐºÐºÑ\85Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð¼ÐµÑ\82Ñ\82иган Ñ\82айп",
+       "exif-scenecapturetype": "СÑ\86енан ÐºÐµп",
        "exif-contrast": "Къастам",
        "exif-saturation": "Ӏаьбна",
        "exif-sharpness": "Къаьсташ хилар",
        "exif-xyresolution-i": "$1 тӏадамаш дюйман",
        "exif-xyresolution-c": "$1 тӀадамаш сантиметрна",
        "exif-exposureprogram-1": "Куьйгаца",
+       "exif-exposureprogram-2": "Программин раж (лартӀахь)",
        "exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
        "exif-meteringmode-0": "Хууш дац",
        "exif-meteringmode-1": "Юкъара",
        "exif-flash-function-1": "Серло яц",
        "exif-focalplaneresolutionunit-2": "дюйм",
        "exif-sensingmethod-1": "Билгала ца йинарг",
-       "exif-filesource-3": "Терахьийн суртдохку аппарат",
+       "exif-filesource-3": "Терахьийн суртдокху аппарат",
        "exif-scenetype-1": "Сурт даьккхина нис дуьххьал",
        "exif-customrendered-0": "ХӀума дийна дац",
        "exif-customrendered-1": "Нийса доцу кечдар",
        "confirm-watch-top": "ТӀетоха хӀара агӀо хьан тергаме могӀам юкъа?",
        "confirm-unwatch-button": "ХӀаъ",
        "confirm-unwatch-top": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?",
-       "comma-separator": ",&#32;",
+       "comma-separator": " a,&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← хьалха йоьду агӀо",
        "imgmultipagenext": "тӀаьхьа йоьгӀу агӀо →",
        "autosumm-newblank": "Кхоьллина еса агӀо",
        "lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "lag-warn-high": "Сервераш синхронизаци еш тӀехьайисарна, {{PLURAL:$1|$1 секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
-       "watchlistedit-normal-title": "ТеÑ\80гаме Ð¼Ð¾Ð³Ó\80анийн Ñ\85ийÑ\86амаÑ\88",
+       "watchlistedit-normal-title": "ТеÑ\80гаме Ð¼Ð¾Ð³Ó\80аман Ñ\85ийÑ\86ам",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-normal-explain": "Лахахь гойту хьан тергаме могӀамехь йолу агӀонаш.\nДӀаяздарш дӀадаха билгалде уьш такха тӀетаӀе кнопка «{{int:Watchlistedit-normal-submit}}».\nКхин хьа йиш ю [[Special:EditWatchlist/raw|йозан кепар могӀом нисба ]].",
        "watchlistedit-normal-submit": "ДӀадаха дӀаяздарш",
        "htmlform-user-not-exists": "<strong>$1</strong> яц.",
        "htmlform-user-not-valid": "<strong>$1</strong> — декъашхочун магийна йоцу цӀе.",
        "logentry-delete-delete": "$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|дӀаяьккхина}} $3 дӀасахьажорг гӀоьнца",
        "logentry-delete-restore": "$1 {{GENDER:$2|меттахӀоттайина|меттахӀоттайина}} агӀо $3",
        "logentry-delete-event": "$1 {{GENDER:$2|хийцина}} гуш хилар {{PLURAL:$5|1=$5 дӀаяздаран|$5 дӀаяздаршан}} тептаран → $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|хийцина}} {{PLURAL:$5|1=$5 верси|$5 версеш}} гуш хилар $3: $4 агӀорахь",
        "removecredentials": "ДӀадаха декъашхойн дӀаяздарш",
        "removecredentials-submit": "ДӀадаха декъашхойн дӀаяздарш",
        "credentialsform-provider": "ДӀаяздарийн тайпа:",
-       "credentialsform-account": "Декъашхочун цӀе:"
+       "credentialsform-account": "Декъашхочун цӀе:",
+       "userjsispublic": "Тергам бе: JavaScript бухара агӀонаш чохь къайлаха хаамаш хийла ца беза, уьш массо декъашхойн тӀекхочуш йолу дера.",
+       "usercssispublic": "Тергам бе: CSS бухара агӀонаш чохь къайлаха хаамаш хийла ца беза, уьш массо декъашхойн тӀекхочуш йолу дера."
 }
index 18887a3..0d9d219 100644 (file)
        "loginerror": "ھەڵەی چوونەژوورەوە",
        "createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
        "createaccounterror": "ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1",
-       "nocookiesnew": "ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.\nتۆ شەکرۆکەکەت لەکارخستووە.\nتکایە شەکرۆکەکە کارا بکە و پاشان بە ناوی بەکارھێنەر و تێپەڕوشە بچۆ ژوورەوە.",
+       "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
index d1d4670..8771631 100644 (file)
        "searcharticle": "Jít na",
        "history": "Historie stránky",
        "history_short": "Historie",
+       "history_small": "historie",
        "updatedmarker": "změněno od poslední návštěvy",
        "printableversion": "Verze k tisku",
        "permalink": "Trvalý odkaz",
        "eauthentsent": "Na zadanou adresu byl zaslán potvrzovací e-mail.\nŽádné další zprávy vám však na tuto adresu nebudou odeslány, dokud podle instrukcí v e-mailu nepotvrdíte, že tato adresa skutečně patří vám.",
        "throttled-mailpassword": "Během {{PLURAL:$1|poslední hodiny|posledních $1 hodin}} již bylo heslo jednou zasláno.\nKvůli prevenci zneužívání lze heslo zaslat jen jednou za $1 {{PLURAL:$1|hodinu|hodiny|hodin}}.",
        "mailerror": "Chyba při zasílání e-mailu: $1",
-       "acct_creation_throttle_hit": "Uživatelé používající vaši IP adresu už dnes vytvořili $1 {{PLURAL:$1|účet|účty|účtů}}, což je dovolené maximum.\nProto není v tuto chvíli dovoleno z této IP adresy zakládat další účty.",
+       "acct_creation_throttle_hit": "Uživatelé používající vaši IP adresu za poslední $2 vytvořili už $1 {{PLURAL:$1|účet|účty|účtů}}, což je pro toto období maximum.\nProto není v tuto chvíli dovoleno z této IP adresy zakládat další účty.",
        "emailauthenticated": "Vaše e-mailová adresa byla ověřena $2 v $3.",
        "emailnotauthenticated": "Vaše e-mailová adresa dosud nebyla ověřena.\nU následujících funkcí nebudou zasílány žádné e-maily.",
        "noemailprefs": "Pro zprovoznění následujících možností musíte zadat svou e-mailovou adresu.",
        "blockedtitle": "Uživatel zablokován",
        "blockedtext": "<strong>Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.</strong>\n\nZablokování {{GENDER:$4|provedl|provedla}} $1.\nUdaným důvodem bylo <em>$2</em>.\n\n* Začátek blokování: $8\n* Zablokování vyprší: $6\n* Blokovaný uživatel: $7\n\nPokud chcete zablokování prodiskutovat, můžete kontaktovat {{GENDER:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].\nUvědomte si, že nemůžete použít funkci „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.\nVaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
        "autoblockedtext": "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nZablokování můžete prodiskutovat se správcem $1 nebo některým z dalších [[{{MediaWiki:Grouppage-sysop}}|správců]].\n\nUvědomte si však, že funkci „Poslat e-mail tomuto uživateli“ nemůžete použít, pokud nemáte ve svém [[Special:Preferences|uživatelském nastavení]] zadaný platný e-mail a nebylo vám zablokováno jeho užívání.\n\nVaše současná IP adresa je $3, číslo vašeho zablokování je #$5.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
+       "systemblockedtext": "Vaše IP adresa byla automaticky zablokována softwarem MediaWiki.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "blockednoreason": "důvod nebyl zadán",
        "whitelistedittext": "Pro editaci se musíte $1.",
        "confirmedittext": "Pro editaci stránek je vyžadováno potvrzení vaší e-mailové adresy.\nNa stránce [[Special:Preferences|nastavení]] zadejte a nechte potvrdit svou e-mailovou adresu.",
        "saveprefs": "Uložit nastavení",
        "restoreprefs": "Obnovit všechna výchozí nastavení (ve všech sekcích)",
        "prefs-editing": "Editace",
-       "rows": "Řádky:",
-       "columns": "Sloupce:",
        "searchresultshead": "Vyhledávání",
        "stub-threshold": "Limit pro formátování odkazu jako pahýl ($1):",
        "stub-threshold-sample-link": "příklad",
        "userrights-user-editname": "Zadejte uživatelské jméno:",
        "editusergroup": "Načíst uživatelské skupiny",
        "editinguser": "Úprava práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Prohlížení práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Upravit uživatelské skupiny",
+       "userrights-viewusergroup": "Zobrazit uživatelské skupiny",
        "saveusergroups": "Uložit {{GENDER:$1|uživatelské}} skupiny",
        "userrights-groupsmember": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
        "userrights-groupsmember-auto": "Automaticky {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupin}}:",
        "action-upload_by_url": "nahrát tento soubor z URL adresy",
        "action-writeapi": "používat API pro zápis",
        "action-delete": "smazat tuto stránku",
-       "action-deleterevision": "smazat tuto revizi",
-       "action-deletedhistory": "zobrazit historii smazaných revizí této stránky",
+       "action-deleterevision": "mazat revize",
+       "action-deletelogentry": "mazat protokolovací záznamy",
+       "action-deletedhistory": "prohlížet si smazanou historii stránky",
+       "action-deletedtext": "prohlížet si smazané texty revizí",
        "action-browsearchive": "hledat smazané stránky",
-       "action-undelete": "obnovit tuto stránku",
-       "action-suppressrevision": "zkontrolovat a obnovit tuto skrytou revizi",
+       "action-undelete": "obnovovat stránky",
+       "action-suppressrevision": "prohlížet si a obnovovat skryté revize",
        "action-suppressionlog": "prohlédnout si tento skrytý protokolovací záznam",
        "action-block": "znemožnit tomuto uživateli editování",
        "action-protect": "změnit úrovně ochrany této stránky",
        "action-userrights-interwiki": "upravovat práva uživatelů na jiných wiki",
        "action-siteadmin": "zamykat nebo odemykat databázi",
        "action-sendemail": "posílat e-maily",
+       "action-editmyoptions": "měnit svá uživatelská nastavení",
        "action-editmywatchlist": "upravovat vlastní seznam sledovaných stránek",
        "action-viewmywatchlist": "prohlížet vlastní seznam sledovaných stránek",
        "action-viewmyprivateinfo": "prohlížet si své soukromé údaje",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Zobrazit",
+       "rcfilters-activefilters": "Aktivní filtry",
+       "rcfilters-filtergroup-authorship": "Autorství editace",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "withoutinterwiki-summary": "Tyto stránky neobsahují žádný mezijazykový odkaz:",
        "withoutinterwiki-legend": "Prefix",
        "withoutinterwiki-submit": "Zobrazit",
-       "fewestrevisions": "Stránky s nejméně verzemi",
+       "fewestrevisions": "Stránky s nejméně editacemi",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajty|bajtů}}",
        "ncategories": "$1 {{PLURAL:$1|kategorie|kategorie|kategorií}}",
        "ninterwikis": "$1 {{PLURAL:$1|mezijazykový odkaz|mezijazykové odkazy|mezijazykových odkazů}}",
        "apisandbox-sending-request": "Odesílá se API požadavek…",
        "apisandbox-loading-results": "Přijímají se API výsledky…",
        "apisandbox-results-error": "Došlo k chybě při načítání odpovědi na API dotaz: $1.",
+       "apisandbox-request-params-json": "Parametry v JSON:",
        "apisandbox-request-url-label": "URL požadavku:",
        "apisandbox-request-time": "Trvání požadavku: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Opravit token a znovu odeslat",
        "emailccsubject": "Kopie Vaší zprávy pro uživatele $1: $2",
        "emailsent": "E-mail odeslán",
        "emailsenttext": "Váš e-mail byl odeslán.",
-       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailuser}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
+       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailuser}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2. Váš e-mail bude odeslán přímo {{GENDER:$1|původnímu odesílateli, čímž mu|původní odesílatelce, čímž jí}} prozradíte svou e-mailovou adresu.",
        "usermessage-summary": "Doručena zpráva od systému.",
        "usermessage-editor": "Systémový poslíček",
        "watchlist": "Sledované stránky",
        "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
-       "changecontentmodel": "Změna modelu obsahu stránky",
+       "changecontentmodel": "Změnit model obsahu stránky",
        "changecontentmodel-legend": "Změnit model obsahu",
        "changecontentmodel-title-label": "Název stránky",
        "changecontentmodel-model-label": "Nový model obsahu",
        "changecontentmodel-emptymodels-title": "Nejsou k dispozici žádné modely obsahu",
        "changecontentmodel-emptymodels-text": "Obsah stránky [[:$1]] nelze zkonvertovat na žádný typ.",
        "log-name-contentmodel": "Kniha změn modelů obsahu",
-       "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
+       "log-description-contentmodel": "Na této stránce jsou zaznamenány změny modelu obsahu stránek a stránky, které byly vytvořeny s modelem obsahu různým od výchozího.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|založil|založila}} stránku $3 za použití nestandardního modelu obsahu „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} model obsahu stránky $3 z „$4“ na „$5“",
        "logentry-contentmodel-change-revertlink": "vrátit",
        "proxyblockreason": "Vaše IP adresa byla zablokována, protože funguje jako otevřený proxy server. Kontaktujte svého poskytovatele internetového připojení nebo technickou podporu a informujte je o tomto vážném bezpečnostním problému.",
        "sorbsreason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.",
        "sorbs_create_account_reason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet",
+       "softblockrangesreason": "Anonymní příspívání z vaší IP adresy ($1) není dovoleno. Prosíme přihlaste se.",
        "xffblockreason": "IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1",
        "cant-see-hidden-user": "Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.",
        "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
        "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
        "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
+       "cant-move-subpages": "Nemáte oprávnění přesouvat podstránky.",
+       "namespace-nosubpages": "Ve jmenném prostoru „$1“ nejsou podstránky povoleny.",
        "newtitle": "Nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "pageinfo-length": "Velikost stránky (v bajtech)",
        "pageinfo-article-id": "ID stránky",
        "pageinfo-language": "Jazyk obsahu stránky",
+       "pageinfo-language-change": "změnit",
        "pageinfo-content-model": "Model obsahu stránky",
        "pageinfo-content-model-change": "změnit",
        "pageinfo-robot-policy": "Indexování roboty",
        "feedback-useragent": "Uživatelský agent:",
        "searchsuggest-search": "Hledat na {{GRAMMAR:6sg|{{SITENAME}}}}",
        "searchsuggest-containing": "obsahující…",
-       "api-error-autoblocked": "Vaše IP adresa byla automaticky zablokována, protože ji používal zablokovaný uživatel.",
-       "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
        "api-error-badtoken": "Vnitřní chyba: špatný token.",
-       "api-error-blocked": "Byla vám zablokována možnost editace.",
-       "api-error-copyuploaddisabled": "Načítání z URL je na tomto severu zakázáno.",
-       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje jiný soubor|existují jiné soubory}} se shodným obsahem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Soubor|Soubory}} se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.",
-       "api-error-empty-file": "Načtený soubor je prázdný.",
        "api-error-emptypage": "Zakládání prázdných stránek není dovoleno.",
-       "api-error-fetchfileerror": "Vnitřní chyba: došlo k chybě při stahování souboru.",
-       "api-error-fileexists-forbidden": "Soubor s názvem „$1“ už existuje a nelze ho přepsat.",
-       "api-error-fileexists-shared-forbidden": "Soubor s názvem „$1“ už existuje ve sdíleném úložišti a nelze ho přepsat.",
-       "api-error-file-too-large": "Načtený soubor je příliš velký.",
-       "api-error-filename-tooshort": "Název souboru je příliš krátký.",
-       "api-error-filetype-banned": "Tento typ souboru je zakázán.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je nedovolený formát souborů|jsou nedovolené formáty souborů}}. {{PLURAL:$3|Povolený formát souborů je|Povolené formáty souborů jsou}} $2.",
-       "api-error-filetype-missing": "Tento soubor nemá příponu.",
-       "api-error-hookaborted": "Zamýšlená úprava byla zakázána rozšiřujícím modulem.",
-       "api-error-http": "Vnitřní chyba: nepodařilo se připojit k serveru.",
-       "api-error-illegal-filename": "Tento název souboru není dovolen.",
-       "api-error-internal-error": "Vnitřní chyba: došlo k chybě při zpracování vašeho načteného souboru.",
-       "api-error-invalid-file-key": "Vnitřní chyba: soubor nebyl nalezen v dočasném úložišti.",
-       "api-error-missingparam": "Vnitřní chyba: chybí parametry požadavku.",
-       "api-error-missingresult": "Vnitřní chyba: nelze určit, zda kopírování bylo úspěšné.",
-       "api-error-mustbeloggedin": "K načtení souborů musíte být přihlášen.",
-       "api-error-mustbeposted": "Vnitřní chyba: požadavek musí být prostřednictvím HTTP POST.",
-       "api-error-noimageinfo": "Načtení bylo úspěšné, ale server neposkytl o souboru žádné informace.",
-       "api-error-nomodule": "Interní chyba: není nastaven načítací modul.",
-       "api-error-ok-but-empty": "Interní chyba: ze serveru nepřišla odpověď.",
-       "api-error-overwrite": "Není dovoleno přepsat existující soubor.",
-       "api-error-ratelimited": "Pokoušíte se načíst v krátkém časovém rozmezí načíst více souborů, než je na této wiki dovoleno.\nZkuste to znovu za několik minut.",
-       "api-error-stashfailed": "Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.",
        "api-error-publishfailed": "Vnitřní chyba: Serveru se nepodařilo zveřejnit dočasný soubor.",
-       "api-error-stasherror": "Při načítání souboru do skrýše došlo k chybě.",
-       "api-error-stashedfilenotfound": "Při pokusu o načtení souboru ze skrýše nebyl uložený soubor nalezen.",
-       "api-error-stashpathinvalid": "Cesta, na které měl být soubor uložen ve skrýši, je neplatná.",
-       "api-error-stashfilestorage": "Při ukládání souboru do skrýše došlo k chybě.",
-       "api-error-stashzerolength": "Server nemohl soubor uložit do skrýše, protože má nulovou délku.",
-       "api-error-stashnotloggedin": "Pro ukládání souboru do skrýše musíte být přihlášeni.",
-       "api-error-stashwrongowner": "Soubor, ke kterému se ve skrýši pokoušíte přistoupit, vám nepatří.",
-       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterému se ve skrýši pokoušíte přistoupit, neexistuje.",
-       "api-error-timeout": "Server neodpověděl v očekávaném čase.",
-       "api-error-unclassified": "Došlo k neznámé chybě.",
-       "api-error-unknown-code": "Neznámá chyba: „$1“.",
-       "api-error-unknown-error": "Vnitřní chyba: došlo k chybě při pokusu o načtení souboru.",
-       "api-error-unknown-warning": "Neznámé varování: $1",
+       "api-error-stashfailed": "Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.",
+       "api-error-unknown-warning": "Neznámé varování: „$1“.",
        "api-error-unknownerror": "Neznámá chyba: „$1“.",
-       "api-error-uploaddisabled": "Načítání souborů je na této wiki vypnuto.",
-       "api-error-verification-error": "Soubor je možná poškozen nebo má špatnou příponu.",
-       "api-error-was-deleted": "Soubor s tímto názvem byl již dříve načten a později smazán.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuty|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|hodina|hodiny|hodin}}",
        "pagelang-language": "Jazyk",
        "pagelang-use-default": "Použít implicitní jazyk",
        "pagelang-select-lang": "Vybrat jazyk",
+       "pagelang-reason": "Důvod",
        "pagelang-submit": "Odeslat",
+       "pagelang-nonexistent-page": "Stránka $1 neexistuje.",
+       "pagelang-unchanged-language": "Stránka $1 již má nastavený jazyk $2.",
+       "pagelang-unchanged-language-default": "Stránka $1 již má jako jazyk nastavený výchozí jazyk obsahu wiki.",
+       "pagelang-db-failed": "Databázi se nepodařilo změnit jazyk stránky.",
        "right-pagelang": "Změnit jazyk stránky",
        "action-pagelang": "měnit jazyk stránky",
        "log-name-pagelang": "Kniha změn jazyků",
        "usercssispublic": "Uvědomte si prosím, že podstránky s CSS by neměly obsahovat tajné údaje, protože jsou viditelné ostatním uživatelům.",
        "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í<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "revize $1",
+       "pageid": "Stránka s ID $1"
 }
index 5b56d6d..c72b598 100644 (file)
        "searcharticle": "Gå til",
        "history": "Historik",
        "history_short": "Historik",
+       "history_small": "historik",
        "updatedmarker": "opdateret siden seneste besøg",
        "printableversion": "Udskriftsvenlig udgave",
        "permalink": "Permanent henvisning",
        "saveprefs": "Gem indstillinger",
        "restoreprefs": "Gendan alle standardindstillinger (i alle sektioner)",
        "prefs-editing": "Redigering",
-       "rows": "Rækker",
-       "columns": "Kolonner",
        "searchresultshead": "Søgeresultater",
        "stub-threshold": "Grænse før formatering af stublink ($1):",
        "stub-threshold-disabled": "Deaktiveret",
        "action-upload_by_url": "lægge denne fil op fra en URL-adresse",
        "action-writeapi": "bruge skrive-API'et",
        "action-delete": "slette denne side",
-       "action-deleterevision": "slette denne version",
-       "action-deletedhistory": "se denne sides slettede historik",
+       "action-deleterevision": "slette siderevisioner",
+       "action-deletedhistory": "se en sides slettede historik",
        "action-browsearchive": "søge i slettede sider",
-       "action-undelete": "gendanne denne side",
-       "action-suppressrevision": "se og gendanne denne skjulte version",
+       "action-undelete": "gendanne sider",
+       "action-suppressrevision": "se og gendanne skjulte siderevisioner",
        "action-suppressionlog": "se denne private log",
        "action-block": "blokere denne bruger fra at redigere",
        "action-protect": "ændre på beskyttelsen af denne side",
        "action-userrights-interwiki": "ændre brugerrettigheder for brugere på andre wikier",
        "action-siteadmin": "låse eller låse databasen op",
        "action-sendemail": "sende e-mail",
+       "action-editmyoptions": "ændre dine indstillinger",
        "action-editmywatchlist": "rediger din overvågningsliste",
        "action-viewmywatchlist": "se din overvågningsliste",
        "action-viewmyprivateinfo": "se din private information",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Vis",
+       "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-invalid-filter": "Ugyldigt filter",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarne brugere",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
        "rclistfrom": "Vis nye ændringer startende fra den $3 kl. $2",
        "rcshowhideminor": "$1 mindre ændringer",
        "uploadstash-badtoken": "Udførelse af handlingen mislykkedes, måske fordi dine redigerings legitimationsoplysninger udløbet. Prøv igen.",
        "uploadstash-errclear": "Rydning af filerne mislykkedes.",
        "uploadstash-refresh": "Opdatér filoversigten",
+       "uploadstash-thumbnail": "vis miniature",
        "invalid-chunk-offset": "Ugyldig segmentstart",
        "img-auth-accessdenied": "Adgang nægtet",
        "img-auth-nopathinfo": "PATH_INFO mangler.\nDin server er ikke sat op til at give denne information.\nDen bruger måske CGI og understøtter ikke img_auth.\nSe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "protectedpages-performer": "Beskyttende bruger",
        "protectedpages-params": "Beskyttelsesparametre",
        "protectedpages-reason": "Årsag",
+       "protectedpages-submit": "Vis sider",
        "protectedpages-unknown-timestamp": "Ukendt",
        "protectedpages-unknown-performer": "Ukendt bruger",
        "protectedtitles": "Beskyttede sidenavne",
        "protectedtitles-summary": "Denne side indeholder en liste over titler, der i øjeblikket er beskyttet fra oprettelse. For en liste over eksisterende sider, der er beskyttet, se [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Der er ingen sidetitler der er beskyttet med disse parametre.",
+       "protectedtitles-submit": "Vis sidetitler",
        "listusers": "Brugerliste",
        "listusers-editsonly": "Vis kun brugere med redigeringer",
        "listusers-creationsort": "Sorter efter oprettelsesdato",
        "apisandbox-unfullscreen": "Vis side",
        "apisandbox-submit": "Lav forespørgsel",
        "apisandbox-reset": "Ryd",
+       "apisandbox-retry": "Forsøg igen",
        "apisandbox-examples": "Eksempler",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parameternavn",
        "apisandbox-results": "Resultater",
        "apisandbox-request-url-label": "Forespurgt URL:",
        "apisandbox-request-time": "Forespørgselstid: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "Fortsæt",
+       "apisandbox-continue-clear": "Ryd",
+       "apisandbox-multivalue-all-namespaces": "$1 (alle navnerum)",
+       "apisandbox-multivalue-all-values": "$1 (alle værdier)",
        "booksources": "Bogkilder",
        "booksources-search-legend": "Søgning efter bøger",
        "booksources-search": "Søg",
        "booksources-text": "Dette er en liste med henvisninger til Internetsider, som sælger nye og brugte bøger. Der kan der også findes yderligere informationer om bøgerne. {{SITENAME}} er ikke forbundet med nogen af dem.",
        "booksources-invalid-isbn": "Det angivne ISBN-nummer ser forkert ud. Tjek med kilden om det er skrevet korrekt.",
+       "magiclink-tracking-isbn": "Sider, der bruger automatiske ISBN-henvisninger",
        "specialloguserlabel": "Udført af:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "log": "Loglister",
        "log-title-wildcard": "Søg i titler som begynder med teksten",
        "showhideselectedlogentries": "Vis/skjul de markerede loghændelser",
        "log-edit-tags": "Rediger tags i valgte logposter",
+       "checkbox-select": "Vælg: $1",
        "checkbox-all": "Alle",
        "checkbox-none": "Ingen",
        "allpages": "Alle sider",
        "sessionfailure-title": "Sessionsfejl",
        "sessionfailure": "Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Tryk på \"tilbage\"-knappen og genindlæs den side du kom fra, og prøv dernæst igen.",
        "changecontentmodel-title-label": "Sidetitel",
+       "changecontentmodel-model-label": "Ny indholdsmodel",
        "changecontentmodel-reason-label": "Begrundelse:",
        "protectlogpage": "Skrivebeskyttelseslog",
        "protectlogtext": "Herunder er en liste over ændringer til sidebeskyttelser.\nSe [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sidebeskyttelser, der er i kraft i øjeblikket.",
        "sp-contributions-newbies-title": "Brugerbidrag fra nye konti",
        "sp-contributions-blocklog": "blokeringslog",
        "sp-contributions-suppresslog": "undertrykte brugerbidrag",
-       "sp-contributions-deleted": "slettede brugerbidrag",
+       "sp-contributions-deleted": "slettede {{GENDER:$1|brugerbidrag}}",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "loglister",
        "sp-contributions-talk": "diskussion",
        "sp-contributions-username": "IP-adresse eller brugernavn:",
        "sp-contributions-toponly": "Vis kun redigeringer, der er aktuelle versioner",
        "sp-contributions-newonly": "Vis kun redigeringer, der er sideoprettelser",
+       "sp-contributions-hideminor": "Skjul mindre ændringer",
        "sp-contributions-submit": "Søg",
        "whatlinkshere": "Hvad henviser hertil",
        "whatlinkshere-title": "Sider der linker til \"$1\"",
        "ipb-unblock": "Frigive IP-adresse/bruger",
        "ipb-blocklist": "Vis alle blokeringer som er i kraft",
        "ipb-blocklist-contribs": "Bidrag fra {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 tilbage",
        "unblockip": "Ophæv blokering af bruger",
        "unblockiptext": "Brug formularen herunder for at gendanne skriveadgangen for en tidligere blokeret IP-adresse eller bruger.",
        "ipusubmit": "Ophæv blokeringen",
        "movenotallowedfile": "Du har ikke tilladelse til at flytte filer.",
        "cant-move-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra undersider).",
        "cant-move-to-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra til brugerundersider).",
+       "namespace-nosubpages": "Navnerummet \"$1\" tillader ikke undersider.",
        "newtitle": "Ny titel:",
        "move-watch": "Overvåg siden",
        "movepagebtn": "Flyt side",
        "thumbnail-temp-create": "Kunne ikke oprette midlertidig miniaturefil",
        "thumbnail-dest-create": "Kunne ikke gemme miniaturebillede til destinationen",
        "thumbnail_invalid_params": "Ugyldige parametre for miniaturebillede",
+       "thumbnail_toobigimagearea": "Fil med mål større end $1",
        "thumbnail_dest_directory": "Kataloget kan ikke oprettes.",
        "thumbnail_image-type": "Billedtypen understøttes ikke",
        "thumbnail_gd-library": "Ufuldstændig konfiguration af GD-biblioteket: funktionen $1 mangler",
        "tooltip-ca-nstab-category": "Se kategorisiden",
        "tooltip-minoredit": "Marker dette som en mindre ændring",
        "tooltip-save": "Gem dine ændringer",
+       "tooltip-publish": "Offentliggør dine ændringer",
        "tooltip-preview": "Forhåndsvis dine ændringer, brug venligst denne funktion inden du gemmer!",
        "tooltip-diff": "Vis hvilke ændringer du har lavet i teksten.",
        "tooltip-compareselectedversions": "Se forskellene imellem de to valgte versioner af denne side.",
        "patrol-log-page": "Kontrollog",
        "patrol-log-header": "Patruljerede versioner.",
        "log-show-hide-patrol": "$1 patruljeringslog",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marker version $3 af $2 som patruljeret?",
        "deletedrevision": "Slettede gammel version $1",
        "filedeleteerror-short": "Fejl under sletning af fil: $1",
        "filedeleteerror-long": "Der opstod en fejl under sletningen af filen:\n\n$1",
        "watchlistedit-raw-done": "Din overvågningsliste blev opdateret.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 side|$1 sider}} er tilføjet:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 side|$1 sider}} er fjernet:",
-       "watchlistedit-clear-title": "Ryddet overvågningsliste",
+       "watchlistedit-clear-title": "Ryd overvågningsliste",
        "watchlistedit-clear-legend": "Ryd overvågningsliste",
        "watchlistedit-clear-explain": "Alle siderne vil blive fjernet fra din overvågningsliste",
        "watchlistedit-clear-titles": "Sider:",
        "watchlisttools-edit": "Rediger overvågningsliste",
        "watchlisttools-raw": "Rediger rå overvågningsliste",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "Advarsel: Standardsorteringsnøglen \"$2\" tilsidesætter den tidligere sorteringsnøgle \"$1\".",
        "version": "Information om MediaWiki",
        "version-extensions": "Installerede udvidelser",
        "tags-actions-header": "Handlinger",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nej",
-       "tags-source-extension": "Defineret af en tilføjelse",
+       "tags-source-extension": "Defineret af programmellet",
        "tags-source-none": "Anvendes ikke længere",
        "tags-edit": "redigér",
        "tags-delete": "slet",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Der kræves mindst en værdi.",
        "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
+       "htmlform-time-placeholder": "TT:MM:SS",
+       "htmlform-datetime-placeholder": "ÅÅÅÅ-MM-DD TT:MM:SS",
+       "htmlform-title-not-exists": "$1 findes ikke.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettede}} omdirigering $3 ved overskrivning",
        "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4",
        "feedback-thanks-title": "Tak!",
        "searchsuggest-search": "Søg på {{SITENAME}}",
        "searchsuggest-containing": "indeholder...",
-       "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "api-error-badtoken": "Intern fejl: ugyldigt mærke.",
-       "api-error-copyuploaddisabled": "At lægge filer op via hjemmesideadresser er slået fra på denne server.",
-       "api-error-duplicate": "Der er allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet.",
-       "api-error-duplicate-archive": "Der var allerede {{PLURAL:$1|en anden fil|nogle andre filer}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.",
-       "api-error-empty-file": "Den fil du indsendte var tom.",
        "api-error-emptypage": "Det er ikke tilladt at oprette nye, tomme sider.",
-       "api-error-fetchfileerror": "Intern fejl: noget gik galt under hentningen af filen.",
-       "api-error-fileexists-forbidden": "En fil med navnet \"$1\" findes allerede, og den kan ikke overskrives.",
-       "api-error-fileexists-shared-forbidden": "En fil med navnet \"$1\" eksisterer allerede i det delte filsystem og kan ikke overskrives.",
-       "api-error-file-too-large": "Den fil du indsendte var for stor.",
-       "api-error-filename-tooshort": "Filnavnet er for kort.",
-       "api-error-filetype-banned": "Denne type fil er ikke tilladt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|er ikke en tilladt filtype|er ikke tilladte filtyper}}. Tilladt {{PLURAL:$3|filtype er|filtyper er}} $2.",
-       "api-error-filetype-missing": "Filen mangler en filendelse.",
-       "api-error-hookaborted": "Ændringen, du forsøgte at gøre, blev afbrudt af en udvidelsestilkobling.",
-       "api-error-http": "Intern fejl: Kan ikke forbinde til serveren.",
-       "api-error-illegal-filename": "Filnavnet er ikke tilladt.",
-       "api-error-internal-error": "Intern fejl: noget gik galt med behandlingen af din filoplægning på wikien.",
-       "api-error-invalid-file-key": "Intern fejl: filen blev ikke fundet på den midlertidige lagerplads.",
-       "api-error-missingparam": "Intern fejl: manglende parametre i anmodning.",
-       "api-error-missingresult": "Intern fejl: kunne ikke afgøre om kopieringen lykkedes.",
-       "api-error-mustbeloggedin": "Du skal være logget på for at kunne lægge filer op.",
-       "api-error-mustbeposted": "Intern fejl: anmodningen kræver brug af HTTP POST.",
-       "api-error-noimageinfo": "Oplægningen lykkedes, men serveren gav os ikke nogen oplysninger om filen.",
-       "api-error-nomodule": "Intern fejl: intet modul til oplægning indstillet.",
-       "api-error-ok-but-empty": "Intern fejl: intet svar fra serveren.",
-       "api-error-overwrite": "Det er ikke tilladt at overskrive en eksisterende fil.",
-       "api-error-stashfailed": "Intern fejl: serveren kunne ikke gemme midlertidig fil.",
        "api-error-publishfailed": "Intern fejl: serveren kunne ikke udgive midlertidig fil.",
-       "api-error-timeout": "Serveren svarede ikke tilbage inden for den forventede tid.",
-       "api-error-unclassified": "En ukendt fejl opstod.",
-       "api-error-unknown-code": "Ukendt fejl: \"$1\"",
-       "api-error-unknown-error": "Intern fejl: noget gik galt under forsøget på at lægge din fil op.",
-       "api-error-unknown-warning": "Ukendt advarsel: $1",
+       "api-error-stashfailed": "Intern fejl: serveren kunne ikke gemme midlertidig fil.",
+       "api-error-unknown-warning": "Ukendt advarsel: \"$1\".",
        "api-error-unknownerror": "Ukendt fejl: \"$1\".",
-       "api-error-uploaddisabled": "Oplægning af filer er slået fra på denne wiki.",
-       "api-error-verification-error": "Denne fil kan være beskadiget, eller den har måske en forkert filendelse.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minutter}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timer}}",
        "expand_templates_generate_xml": "Vis analysetræ som XML",
        "expand_templates_generate_rawhtml": "Vis rå HTML",
        "expand_templates_preview": "Forhåndsvisning",
-       "pagelanguage": "Valg af sidesprog",
+       "pagelanguage": "Ændr sidens sprog",
        "pagelang-name": "Side",
        "pagelang-language": "Sprog",
        "pagelang-use-default": "Brug standardsprog",
        "pagelang-select-lang": "Vælg sprog",
+       "pagelang-reason": "Begrundelse",
        "right-pagelang": "Ændre sidesproget",
        "mediastatistics": "Mediestatistik",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-type",
        "mediastatistics-table-extensions": "Mulige filendelser",
        "mediastatistics-table-count": "Antal filer",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "side eksisterer ikke endnu",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Tilføj en kategori...",
        "randomrootpage": "Tilfældig stamside",
        "log-action-filter-block": "Blokeringstype:",
+       "log-action-filter-delete": "Sletningstype:",
+       "log-action-filter-import": "Importtype:",
        "log-action-filter-move": "Flyttetype:",
        "log-action-filter-patrol": "Patruljeringstype:",
        "log-action-filter-protect": "Beskyttelsestype:",
+       "log-action-filter-all": "Alle",
        "log-action-filter-block-block": "Blokering",
        "log-action-filter-block-reblock": "Ændring af blokering",
+       "log-action-filter-block-unblock": "Ophævelse af blokering",
        "log-action-filter-delete-delete": "Sidesletning",
+       "log-action-filter-delete-delete_redir": "Overskrivning af omdirigering",
        "log-action-filter-delete-restore": "Sidegendannelse",
        "log-action-filter-delete-event": "Logsletning",
        "log-action-filter-delete-revision": "Revisionssletning",
        "log-action-filter-move-move": "Flytning uden overskrivelse af omdirigeringer",
        "log-action-filter-move-move_redir": "Flytning med overskrivelse af omdirigeringer",
+       "log-action-filter-newusers-autocreate": "Automatisk oprettelse",
        "log-action-filter-patrol-patrol": "Manuel patruljering",
        "log-action-filter-patrol-autopatrol": "Automatisk patruljering",
        "log-action-filter-protect-protect": "Beskyttelse",
        "log-action-filter-protect-modify": "Ændring af beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
        "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
-       "authmanager-provider-temporarypassword": "Midlertidig adgangskode"
+       "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+       "cannotauth-not-allowed-title": "Adgang nægtet",
+       "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
+       "credentialsform-account": "Kontonavn:"
 }
index 8be8c9a..ec0313e 100644 (file)
        "searcharticle": "Seite",
        "history": "Versionen",
        "history_short": "Versionsgeschichte",
+       "history_small": "Versionsgeschichte",
        "updatedmarker": "Änderung seit deinem letzten Besuch",
        "printableversion": "Druckversion",
        "permalink": "Permanenter Link",
        "blockedtitle": "Benutzer ist gesperrt",
        "blockedtext": "'''Dein Benutzername oder deine IP-Adresse wurde gesperrt.'''\n\nDie Sperrung wurde vom Administrator $1 durchgeführt.\nAls Grund wurde ''$2'' angegeben.\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\nDu kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\nDeine aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
        "autoblockedtext": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.\nAls Grund wurde angegeben:\n\n:''$2''\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\n\nDu kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\n\nDeine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
+       "systemblockedtext": "Dein Benutzername oder deine IP-Adresse wurde von MediaWiki automatisch gesperrt.\nDer angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
        "blockednoreason": "keine Begründung angegeben",
        "whitelistedittext": "Du musst dich $1, um Seiten bearbeiten zu können.",
        "confirmedittext": "Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige deine E-Mail in den [[Special:Preferences|Einstellungen]].",
        "saveprefs": "Einstellungen speichern",
        "restoreprefs": "Standardeinstellungen wiederherstellen (in allen Abschnitten)",
        "prefs-editing": "Bearbeiten",
-       "rows": "Zeilen:",
-       "columns": "Spalten:",
        "searchresultshead": "Suche",
        "stub-threshold": "Linkformatierung kleiner Seiten ($1):",
        "stub-threshold-sample-link": "Beispiel",
        "action-writeapi": "die API mit Schreibzugriffen zu verwenden",
        "action-delete": "Seiten zu löschen",
        "action-deleterevision": "Versionen zu löschen",
+       "action-deletelogentry": "Logbucheinträge zu löschen",
        "action-deletedhistory": "die Liste der gelöschten Versionen zu sehen",
+       "action-deletedtext": "gelöschten Versionstext anzusehen",
        "action-browsearchive": "nach gelöschten Seiten zu suchen",
-       "action-undelete": "die Seite wiederherzustellen",
-       "action-suppressrevision": "die versteckte Version einzusehen und wiederherzustellen",
+       "action-undelete": "Seiten wiederherzustellen",
+       "action-suppressrevision": "versteckte Versionen einzusehen und wiederherzustellen",
        "action-suppressionlog": "das private Logbuch einzusehen",
        "action-block": "den Benutzer zu sperren",
        "action-protect": "den Schutzstatus von Seiten zu ändern",
        "action-userrights-interwiki": "die Rechte von Benutzern in anderen Wikis zu ändern",
        "action-siteadmin": "die Datenbank zu sperren oder freizugeben",
        "action-sendemail": "E-Mails zu senden",
+       "action-editmyoptions": "deine Einstellungen zu bearbeiten",
        "action-editmywatchlist": "deine Beobachtungsliste zu bearbeiten",
        "action-viewmywatchlist": "deine Beobachtungsliste anzusehen",
        "action-viewmyprivateinfo": "deine privaten Informationen einzusehen",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Anzeigen",
+       "rcfilters-activefilters": "Aktive Filter",
+       "rcfilters-restore-default-filters": "Standardfilter wiederherstellen",
+       "rcfilters-clear-all-filters": "Alle Filter löschen",
+       "rcfilters-search-placeholder": "Letzte Änderungen filtern (durchsuchen oder beginne mit der Eingabe)",
+       "rcfilters-invalid-filter": "Ungültiger Filter",
+       "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
+       "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-filtergroup-registration": "Benutzerregistrierung",
+       "rcfilters-filter-registered-label": "Angemeldet",
+       "rcfilters-filter-registered-description": "Angemeldete Autoren.",
+       "rcfilters-filter-unregistered-label": "Unangemeldet",
+       "rcfilters-filter-unregistered-description": "Autoren, die nicht angemeldet sind.",
+       "rcfilters-filtergroup-authorship": "Bearbeitungs-Autorenschaft",
+       "rcfilters-filter-editsbyself-label": "Deine eigenen Bearbeitungen",
+       "rcfilters-filter-editsbyself-description": "Bearbeitungen von dir.",
+       "rcfilters-filter-editsbyother-label": "Bearbeitungen von anderen",
+       "rcfilters-filter-editsbyother-description": "Bearbeitungen von anderen Benutzern (nicht von dir).",
+       "rcfilters-filtergroup-userExpLevel": "Erfahrungsniveau (nur für angemeldete Benutzer)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Neulinge",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Weniger als 10 Bearbeitungen und eine Aktivität von weniger als 4 Tagen.",
+       "rcfilters-filter-userExpLevel-learner-label": "Anfänger",
+       "rcfilters-filter-userExpLevel-learner-description": "Eine Aktivität von mehreren Tagen und mehr Bearbeitungen als „Neulinge“, aber weniger als „Erfahrene Benutzer“.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfahrene Benutzer",
+       "rcfilters-filter-userExpLevel-experienced-description": "Eine Aktivität von mehr als 30 Tagen und mehr als 500 Bearbeitungen.",
+       "rcfilters-filtergroup-automated": "Automatisierte Beiträge",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Bearbeitungen, die von automatisierten Werkzeugen durchgeführt wurden.",
+       "rcfilters-filter-humans-label": "Mensch (kein Bot)",
+       "rcfilters-filter-humans-description": "Bearbeitungen, die von menschlichen Autoren durchgeführt wurden.",
+       "rcfilters-filtergroup-significance": "Bedeutung",
+       "rcfilters-filter-minor-label": "Kleine Änderungen",
+       "rcfilters-filter-minor-description": "Bearbeitungen, die der Autor als geringfügig markiert hat.",
+       "rcfilters-filter-major-label": "Nicht-kleine Änderungen",
+       "rcfilters-filter-major-description": "Bearbeitungen, die nicht als geringfügig markiert wurden.",
+       "rcfilters-filtergroup-changetype": "Typ der Änderung",
+       "rcfilters-filter-pageedits-label": "Seitenbearbeitungen",
+       "rcfilters-filter-pageedits-description": "Änderungen am Wikiinhalt oder an Diskussionen, Kategoriebeschreibungen …",
+       "rcfilters-filter-newpages-label": "Seitenerstellungen",
+       "rcfilters-filter-newpages-description": "Bearbeitungen, die zu neuen Seiten führen.",
+       "rcfilters-filter-categorization-label": "Kategorieänderungen",
+       "rcfilters-filter-categorization-description": "Einträge von Seiten, die zu Kategorien hinzugefügt oder aus ihnen entfernt wurden.",
+       "rcfilters-filter-logactions-label": "Protokollierte Aktionen",
+       "rcfilters-filter-logactions-description": "Administrative Aktionen, Benutzerkontenerstellungen, Seitenlöschungen, hochgeladene Dateien …",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "uncategorizedcategories": "Nicht kategorisierte Kategorien",
        "uncategorizedimages": "Nicht kategorisierte Dateien",
        "uncategorizedtemplates": "Nicht kategorisierte Vorlagen",
+       "uncategorized-categories-exceptionlist": " # Enthält eine Liste der Kategorien, die nicht auf Spezial:Nicht_kategorisierte_Kategorien erwähnt werden sollen. Eine pro Zeile. Beginne mit „*“. Zeilen, die mit einem anderen Zeichen beginnen (inklusive Leerzeichen), werden ignoriert. Für Kommentare verwende „#“.",
        "unusedcategories": "Verwaiste Kategorien",
        "unusedimages": "Verwaiste Dateien",
        "wantedcategories": "Gewünschte Kategorien",
        "changecontentmodel-emptymodels-title": "Keine Inhaltsmodelle verfügbar",
        "changecontentmodel-emptymodels-text": "Der Inhalt auf [[:$1]] kann zu keinem Typ konvertiert werden.",
        "log-name-contentmodel": "Inhaltsmodell-Änderungs-Logbuch",
-       "log-description-contentmodel": "Ereignisse bezüglich den Inhaltsmodellen einer Seite",
+       "log-description-contentmodel": "Diese Seite listet Änderungen an dem Inhaltsmodell von Seiten auf sowie Seiten, die mit einem Inhaltsmodell erstellt wurden, das nicht dem Standard entspricht.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|erstellte}} die Seite $3 mit einem Nicht-Standard-Inhaltsmodell „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|änderte}} das Inhaltsmodell der Seite $3 von „$4“ nach „$5“",
        "logentry-contentmodel-change-revertlink": "zurücksetzen",
        "proxyblockreason": "Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.",
        "sorbsreason": "Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.",
        "sorbs_create_account_reason": "Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.",
+       "softblockrangesreason": "Anonyme Beiträge von deiner IP-Adresse ($1) sind nicht erlaubt. Bitte melde dich an.",
        "xffblockreason": "Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1",
        "cant-see-hidden-user": "Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.",
        "ipbblocked": "Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
        "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
        "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
+       "cant-move-subpages": "Du hast keine Berechtigung, um Unterseiten zu verschieben.",
+       "namespace-nosubpages": "Der Namensraum „$1“ erlaubt keine Unterseiten.",
        "newtitle": "Neuer Titel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "movepage-page-exists": "Die Seite „$1“ ist bereits vorhanden und kann nicht automatisch überschrieben werden.",
        "movepage-page-moved": "Die Seite „$1“ wurde nach „$2“ verschoben.",
        "movepage-page-unmoved": "Die Seite „$1“ konnte nicht nach „$2“ verschoben werden.",
-       "movepage-max-pages": "Die Maximalanzahl von $1 {{PLURAL:$1|Seite|Seiten}} wurde verschoben, Alle weiteren Seiten können nicht automatisch verschoben werden.",
+       "movepage-max-pages": "Es wurde die Maximalanzahl von {{PLURAL:$1|einer Seite|$1 Seiten}} verschoben. Alle weiteren Seiten können nicht automatisch verschoben werden.",
        "movelogpage": "Verschiebungs-Logbuch",
        "movelogpagetext": "Dies ist eine Liste aller verschobenen Seiten.",
        "movesubpage": "{{PLURAL:$1|Unterseite|Unterseiten}}",
        "pageinfo-length": "Seitenlänge (in Bytes)",
        "pageinfo-article-id": "Seitenkennnummer",
        "pageinfo-language": "Seiteninhaltssprache",
+       "pageinfo-language-change": "ändern",
        "pageinfo-content-model": "Seiteninhaltsmodell",
        "pageinfo-content-model-change": "ändern",
        "pageinfo-robot-policy": "Indizierung durch Suchmaschinen",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "{{SITENAME}} durchsuchen",
        "searchsuggest-containing": "enthält …",
-       "api-error-autoblocked": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem gesperrten Benutzer verwendet wurde.",
-       "api-error-badaccess-groups": "Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
-       "api-error-blocked": "Du wurdest für das Bearbeiten gesperrt.",
-       "api-error-copyuploaddisabled": "Das Hochladen via URL wurde auf diesem Server deaktiviert.",
-       "api-error-duplicate": "Es gibt im Wiki bereits {{PLURAL:$1|eine andere Datei|mehrere andere Dateien}} gleichen Inhalts.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war bereits eine andere Datei|waren bereits andere Dateien}} gleichen Inhalts vorhanden. Sie {{PLURAL:$1|wurde|wurden}} allerdings gelöscht.",
-       "api-error-empty-file": "Die hochgeladene Datei war leer.",
        "api-error-emptypage": "Es ist nicht erlaubt, neue leere Seiten zu erstellen.",
-       "api-error-fetchfileerror": "Interner Fehler: Beim Abrufen der Datei ist ein Fehler aufgetreten.",
-       "api-error-fileexists-forbidden": "Eine Datei namens „$1“ ist bereits vorhanden und kann nicht überschrieben werden.",
-       "api-error-fileexists-shared-forbidden": "Eine Datei namens „$1“ ist bereits im gemeinsamen Dateirepositorium vorhanden und kann daher nicht überschrieben werden.",
-       "api-error-file-too-large": "Die hochgeladene Datei war zu groß.",
-       "api-error-filename-tooshort": "Der Dateiname ist zu kurz.",
-       "api-error-filetype-banned": "Diese Dateiendung ist gesperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ist ein nicht zulässiger Dateityp|sind nicht zulässige Dateitypen}}. {{PLURAL:$3|Ein zulässiger Dateityp ist|Zulässige Dateitypen sind}} $2.",
-       "api-error-filetype-missing": "Die hochzuladende Datei hat keine Dateiendung.",
-       "api-error-hookaborted": "Der Versuch, die Änderung durchzuführen, wurde von einer Parsererweiterung (API) abgebrochen.",
-       "api-error-http": "Interner Fehler: Es konnte keine Verbindung zum Server hergestellt werden.",
-       "api-error-illegal-filename": "Der Dateiname ist nicht erlaubt.",
-       "api-error-internal-error": "Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei ins Wiki aufgetreten.",
-       "api-error-invalid-file-key": "Interner Fehler: Die Datei wurde nicht im temporären Speicher gefunden.",
-       "api-error-missingparam": "Interner Fehler: Der Anfrage fehlen Parameter.",
-       "api-error-missingresult": "Interner Fehler: Es konnte nicht festgestellt werden, ob das Kopieren erfolgreich war.",
-       "api-error-mustbeloggedin": "Um Dateien hochladen zu können, musst du angemeldet sein.",
-       "api-error-mustbeposted": "Es liegt ein Programmfehler vor (es wird die falsche HTTP-Methode verwendet).",
-       "api-error-noimageinfo": "Das Hochladen war erfolgreich, aber der Server kann keine Informationen zur Datei anzeigen.",
-       "api-error-nomodule": "Interner Fehler: Es wurde kein Modul zum Hochladen festgelegt.",
-       "api-error-ok-but-empty": "Interner Fehler: Der Server reagiert nicht.",
-       "api-error-overwrite": "Das Überschreiben einer vorhandenen Datei ist nicht erlaubt.",
-       "api-error-ratelimited": "Du versuchst, mehr Dateien in kurzer Zeit hochzuladen, als dieses Wiki erlaubt.\nBitte versuche es in einigen Minuten erneut.",
-       "api-error-stashfailed": "Interner Fehler: Der Server konnte keine temporäre Datei speichern.",
        "api-error-publishfailed": "Interner Fehler: Der Server konnte die temporäre Datei nicht veröffentlichen.",
-       "api-error-stasherror": "Beim Hochladen der Datei gab es einen Fehler.",
-       "api-error-stashedfilenotfound": "Die vorab gespeicherte Datei wurde beim Versuch, sie vom Speicher hochzuladen, nicht gefunden.",
-       "api-error-stashpathinvalid": "Der Pfad, unter dem die gespeicherte Datei gefunden werden sollte, war ungültig.",
-       "api-error-stashfilestorage": "Beim Speichern der Datei in den Speicher gab es einen Fehler.",
-       "api-error-stashzerolength": "Der Server konnte die Datei nicht speichern, da sie eine Länge von Null hat.",
-       "api-error-stashnotloggedin": "Du musst angemeldet sein, um Dateien in den Hochladespeicher zu speichern.",
-       "api-error-stashwrongowner": "Die Datei, auf die du im Speicher zugreifen möchtest, gehört nicht dir.",
-       "api-error-stashnosuchfilekey": "Der Dateischlüssel, auf den du im Speicher zugreifen möchtest, ist nicht vorhanden.",
-       "api-error-timeout": "Der Server hat nicht innerhalb der erwarteten Zeit reagiert.",
-       "api-error-unclassified": "Ein unbekannter Fehler ist aufgetreten.",
-       "api-error-unknown-code": "Unbekannter Fehler: „$1“",
-       "api-error-unknown-error": "Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei aufgetreten.",
-       "api-error-unknown-warning": "Unbekannte Warnung: $1",
+       "api-error-stashfailed": "Interner Fehler: Der Server konnte keine temporäre Datei speichern.",
+       "api-error-unknown-warning": "Unbekannte Warnung: „$1“.",
        "api-error-unknownerror": "Unbekannter Fehler: „$1“",
-       "api-error-uploaddisabled": "Das Hochladen ist in diesem Wiki deaktiviert.",
-       "api-error-verification-error": "Die hochzuladende Datei ist entweder fehlerhaft oder hat keine Dateinamenserweiterung.",
-       "api-error-was-deleted": "Eine Datei mit diesem Namen wurde kürzlich hochgeladen und anschließend gelöscht.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekunde|Sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minute|Minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|Stunde|Stunden}}",
        "pagelang-language": "Sprache",
        "pagelang-use-default": "Standardsprache verwenden",
        "pagelang-select-lang": "Sprache auswählen",
+       "pagelang-reason": "Grund",
        "pagelang-submit": "Übermitteln",
+       "pagelang-nonexistent-page": "Die Seite $1 ist nicht vorhanden.",
+       "pagelang-unchanged-language": "Die Seite $1 ist bereits auf die Sprache $2 festgelegt.",
+       "pagelang-unchanged-language-default": "Die Seite $1 ist bereits auf die Standardinhaltssprache des Wikis festgelegt.",
+       "pagelang-db-failed": "Die Datenbank konnte die Seitensprache nicht ändern.",
        "right-pagelang": "Seitensprache ändern",
        "action-pagelang": "die Seitensprache zu ändern",
        "log-name-pagelang": "Sprachenänderungs-Logbuch",
        "usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>",
+       "revid": "Version $1",
+       "pageid": "Seitenkennung $1"
 }
index 95eee19..096bbaf 100644 (file)
                        "Kumkumuk",
                        "Gırd",
                        "Velg",
-                       "1917 Ekim Devrimi"
+                       "1917 Ekim Devrimi",
+                       "Gambollar",
+                       "Dılmıc"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "tog-hideminor": "Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne",
-       "tog-hidepatrolled": "Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne",
-       "tog-newpageshidepatrolled": "Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne",
+       "tog-hidepatrolled": "Vurnayışanê qontrol kerdeyan perra vurnayışê peyêni de bınımne",
+       "tog-newpageshidepatrolled": "Pelanê qontrol kerdeyan lista peranê  neweyan de bınımne",
        "tog-hidecategorization": "Pera kategorizasyoni bınımne",
        "tog-extendwatchlist": "Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê",
        "tog-usenewrc": "Vurnayışê ke pela vurnayışanê peyênan û lista seyrkerdışi derê inan grube ke.",
        "tog-watchrollback": "Pelê ke mı peyser ardi inan lista mına seyrkerdışi ke",
        "tog-minordefault": "Vurnayışanê xo pêrune ''vurnayışo qıckek'' nışan bıde",
        "tog-previewontop": "Verqayti pela nuştışi ser de bımocne",
-       "tog-previewonfirst": "Vurnayışo verên de verqayti tım bımocne",
+       "tog-previewonfirst": "Vurnayışo verên de verqayti tım bımotne",
        "tog-enotifwatchlistpages": "Jû pele ya ki dosyawa ke lista mına seyrkerdışi de vurnae, mı rê e-mail bırışe",
        "tog-enotifusertalkpages": "Pela mına werênayışi ke vurnayê mı rê e-poste bırışe",
        "tog-enotifminoredits": "Pelan de vurnayışanê qıckekan u dosyan de ki mı rê e-mail bırışe",
        "tog-enotifrevealaddr": "Adresa e-posteyê mı posteyê xeberan de bımocne",
-       "tog-shownumberswatching": "Amarê karberanê seyrkerdoğan bımocne",
+       "tog-shownumberswatching": "Amarê karberanê seyr kerdoğan bımotne",
        "tog-oldsig": "İmzaya mewcud:",
        "tog-fancysig": "İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)",
        "tog-uselivepreview": "Verqayto giyane bıgureyne",
        "tog-forceeditsummary": "Mı ke xulasa veng verdaye, hay a mı ser de",
-       "tog-watchlisthideown": "Vurnayışanê mı lista mına seyrkerdışi de bınımne",
-       "tog-watchlisthidebots": "Lista seyrkerdışi ra vurnayışanê boti bınımne",
-       "tog-watchlisthideminor": "Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne",
-       "tog-watchlisthideliu": "Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne",
+       "tog-watchlisthideown": "Vurnayışanê mı lista mına seyr kerdışi de bınımne",
+       "tog-watchlisthidebots": "Lista seyr kerdışi ra vurnayışanê boti bınımne",
+       "tog-watchlisthideminor": "Vurnayışanê qıckekan lista mına seyr kerdışi de bınımne",
+       "tog-watchlisthideliu": "Lista seyr kerdışi ra vurnayışanê karberanê cı kewteyan bınımne",
        "tog-watchlistreloadautomatically": "Filtra vıriyayış dı listey seyri otomatikman anewe kı",
-       "tog-watchlisthideanons": "Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne",
-       "tog-watchlisthidepatrolled": "Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne",
+       "tog-watchlisthideanons": "Lista seyr kerdışi ra vurnayışanê karberanê anoniman bınımne",
+       "tog-watchlisthidepatrolled": "Lista seyr kerdışi ra vurnayışanê qontrol kerdeyan bınımne",
        "tog-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
        "tog-ccmeonemails": "E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe",
-       "tog-diffonly": "Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê",
-       "tog-showhiddencats": "Kategoriyanê nımneya bıasne",
+       "tog-diffonly": "Zerrekê muhtevay, qıyasê versiyonan de tek ferqan bımocne",
+       "tog-showhiddencats": "Kategoriyanê nımneya bımotné",
        "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de tım greyo itimadın bıkarne",
        "underline-always": "Tım",
        "underline-never": "Qet",
-       "underline-default": "Cild ya zi cıgeyrayoğo hesebiyaye",
+       "underline-default": "Cild ya zi cı geyrayoğo hesebiyaye",
        "editfont-style": "Cayê vurnayışi de terzê nuştışi:",
-       "editfont-default": "Cıgeyrayoğo hesabiyaye",
-       "editfont-monospace": "Terzê nusteyê sabıtcagırewtoği",
+       "editfont-default": "Browsero standard",
+       "editfont-monospace": "Terzê nusteyê sabıt mesafi",
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Kırê",
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Sıbate",
+       "february": "Sıbat",
        "march": "Adar",
-       "april": "Nisane",
-       "may_long": "Gulane",
+       "april": "Lisan",
+       "may_long": "Gulan",
        "june": "Heziran",
-       "july": "Temuze",
+       "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
        "october": "Tışrino Verên",
        "november": "Tışrino Peyên",
-       "december": "Kanun",
+       "december": "Gağan",
        "january-gen": "Çele",
-       "february-gen": "Sıbate",
+       "february-gen": "Sıbat",
        "march-gen": "Adar",
-       "april-gen": "Nisane",
-       "may-gen": "Gulane",
+       "april-gen": "Lisan",
+       "may-gen": "Gulan",
        "june-gen": "Heziran",
-       "july-gen": "Temuze",
+       "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
        "october-gen": "Tışrino Verên",
        "november-gen": "Tışrino Peyên",
-       "december-gen": "Kanun",
+       "december-gen": "Gağan",
        "jan": "Çel",
        "feb": "Sbt",
        "mar": "Adr",
-       "apr": "Nsn",
+       "apr": "Lsn",
        "may": "Gln",
        "jun": "Hez",
        "jul": "Tmz",
        "sep": "Kşk",
        "oct": "Tşv",
        "nov": "Tşp",
-       "dec": "Kan",
+       "dec": "n",
        "january-date": "$1 Çele",
-       "february-date": "$1 Sıbate",
+       "february-date": "$1 Sıbat",
        "march-date": "$1 Adar",
-       "april-date": "$1 Nisane",
-       "may-date": "$1 Gulane",
+       "april-date": "$1 Lisan",
+       "may-date": "$1 Gulan",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
        "october-date": "$1 Tışrino Verên",
        "november-date": "$1 Tışrino Peyên",
-       "december-date": "$1 Kanun",
-       "period-am": "AM",
-       "period-pm": "PM",
+       "december-date": "$1 Gağan",
+       "period-am": "VD",
+       "period-pm": "BD",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
-       "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
-       "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
+       "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
+       "category-empty": "''Ena kategori dı hewna qet nuştey ya zi medya çıni yê.''",
+       "hidden-categories": "{{PLURAL:$1|Kategoriya nımıte|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
        "category-subcat-count": "{{PLURAL:$2|Na kategoriye de tenya na bınkategoriye esta.|Na kategoriye de, $2 ra pêro piya, {{PLURAL:$1|bınkategoriye esta|$1 bınkategoriy estê}}.}}",
        "category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|na kategoriya bınêne esta|nê $1 kategoriyê bınêni estê}}.",
-       "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pele na kategoriye dera|$1 enê peli na kategoriye derê}}.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
+       "category-article-count": "{{PLURAL:$2|Na kategori dı teyna ena wesiqe est a.| $2 wesiqe ra {{PLURAL:$1|ena kategori de yê|$1 wesiqey kategori de yê}}.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Pera cêrên|$1 Per cêrêni}} na kategori de yé",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
+       "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Pelê endeksıni",
-       "noindex-category": "Bê indeksın perri",
-       "broken-file-category": "Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê",
+       "index-category": "Perrê rêzıni",
+       "noindex-category": "Perrê bêrêzıni",
+       "broken-file-category": "Perrê  ke gıreyê dosyeyanê ğeletan muhtewa kenê",
        "categoryviewer-pagedlinks": "($1) ($2)",
-       "about": "Heqa cı de",
-       "article": "Pela zerreki",
-       "newwindow": "(pençereyê newey de beno a)",
-       "cancel": "İbtal",
+       "about": "Heqa",
+       "article": "Wesiqe",
+       "newwindow": "(Teqaya newi de abena)",
+       "cancel": "Peyd kı",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Pele",
-       "mytalk": "Mesac",
+       "mypage": "Per",
+       "mytalk": "Vaten",
        "anontalk": "Vaten",
        "navigation": "Pusula",
        "and": "&#32;u",
-       "qbfind": "Bıvêne",
+       "qbfind": "Bıvin",
        "qbbrowse": "Çım ra viyarne",
        "qbedit": "Bıvurne",
-       "qbpageoptions": "Ena pele",
-       "qbmyoptions": "Pelê mı",
+       "qbpageoptions": "Na perrer",
+       "qbmyoptions": "Perrê mı",
        "faq": "PVP",
-       "faqpage": "Project: PZP",
+       "faqpage": "Project: PVP",
        "actions": "Hereketi",
-       "namespaces": "Heruna nameyan",
+       "namespaces": "Heruna naman",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "errorpagetitle": "Xeta",
        "help": "Peşti",
        "search": "Cı geyre",
        "searchbutton": "Cı geyre",
-       "go": "Şo",
+       "go": "Şori",
        "searcharticle": "Şo",
-       "history": "Tarixê pele",
-       "history_short": "Tarix",
-       "updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
-       "printableversion": "Asayışê çap kerdışi",
-       "permalink": "Gıreyo bêpeyni",
-       "print": "Çap ke",
-       "view": "Bıvêne",
-       "view-foreign": "$1 de bıvêne",
+       "history": "Tarixê perrer",
+       "history_short": "Veror",
+       "updatedmarker": "cı kewtena mına peyêne ra dıme biyo rocane",
+       "printableversion": "Versiyonê çapkerdışi",
+       "permalink": "Gıreyo vınderde",
+       "print": "Bınuşne",
+       "view": "Bıvin",
+       "view-foreign": "$1 de bıvin",
        "edit": "Bıvurne",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraze",
        "create-local": "Şınasnayışê lokali cı ke",
-       "editthispage": "Ena pele bıvurne",
-       "create-this-page": "Na pele bınuse",
-       "delete": "Bestere",
-       "deletethispage": "Ena pele bestere",
+       "editthispage": "Na perrer bıvurne",
+       "create-this-page": "Na perer bıvıraz",
+       "delete": "Bestern",
+       "deletethispage": "Na perrer bestern",
        "undeletethispage": "Na perer mebesterne",
        "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
-       "viewdeleted_short": "{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne",
-       "protect": "Bışevekne",
+       "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
+       "protect": "Bıstarnê",
        "protect_change": "bıvurne",
-       "protectthispage": "Ena pele bıpawe",
-       "unprotect": "Starkerdışi bıvurne",
-       "unprotectthispage": "Starkerdışe ena peler bıvurne",
-       "newpage": "Pela newiye",
-       "talkpage": "Ena pele sero werêne",
-       "talkpagelinktext": "behs",
-       "specialpage": "Pella xısusi",
+       "protectthispage": "Ena perer bıpawe",
+       "unprotect": "Starnayışi bıvurne",
+       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "newpage": "Perra newi",
+       "talkpage": "Na per dı vatan kew",
+       "talkpagelinktext": "Mesac",
+       "specialpage": "Pera hısusi",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pera zerreki bıvin",
-       "talk": "Behs",
+       "talk": "Vaten",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
-       "tool-link-emailuser": "E-posta ya në{{GENDER:$1|karberi}}",
-       "userpage": "Pela karberi bıvêne",
-       "projectpage": "Pela proceyi bıvêne",
-       "imagepage": "Pera dosya bıasne",
-       "mediawikipage": "Pera mesaci bıasne",
-       "templatepage": "Pera şabloni bıasne",
+       "tool-link-userrights-readonly": "Grubanê {{GENDER:$1|karberi}} bıvin",
+       "tool-link-emailuser": "E-posta ya në {{GENDER:$1|karberi}}",
+       "userpage": "Perra karberi bıvin",
+       "projectpage": "Perra proji bıvin",
+       "imagepage": "Pera dosye bımotné",
+       "mediawikipage": "Pera mesaji bımotné",
+       "templatepage": "Pera şabloni bımotné",
        "viewhelppage": "Pera peşti bıvin",
-       "categorypage": "Pela kategoriya bıasne",
-       "viewtalkpage": "Werênayışi bıvêne",
-       "otherlanguages": "Zederna zıwani",
+       "categorypage": "Pera kategori bımotné",
+       "viewtalkpage": "Vaten bıvin",
+       "otherlanguages": "Zıwananê binan dı",
        "redirectedfrom": "($1 ra kırışı yê)",
-       "redirectpagesub": "Pela berdışi",
-       "redirectto": "Beno hetê:",
-       "lastmodifiedat": "Per roca $1, sehat $2 de biya anewe.",
+       "redirectpagesub": "Pera kırıştışi",
+       "redirectto": "Kırışêno:",
+       "lastmodifiedat": "Ena perre roca $1 de, saete $2 de arde ro cı.",
        "viewcount": "Ena pele {{PLURAL:$1|rae|$1 rey}} vêniya.",
-       "protectedpage": "Pela pawıtiye",
+       "protectedpage": "Pera pawıyayi",
        "jumpto": "Şo be:",
-       "jumptonavigation": "Pusula",
+       "jumptonavigation": "Navigasyon",
        "jumptosearch": "cı geyre",
        "view-pool-error": "Qaytê qısuri mekerên, serverê ma enıka zêde bar gırewto xo ser.\nHedê xo ra zêde karberi kenê ke seyrê na pele bıkerê.\nŞıma rê zehmet, tenê vınderên, heta ke reyna kenê ke ena pele kewê.\n\n$1",
        "generic-pool-error": "Üzgünüz, şu an sunucular aşırı yüklendi.\nÇok fazla kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.",
        "pool-errorunknown": "Xeta nêzanıtiye",
        "pool-servererror": "Amordoğa xızmeti ya istifade nëbena $1",
        "poolcounter-usage-error": "Xırab karyayış:$1",
-       "aboutsite": "Heqa {{SITENAME}} de",
+       "aboutsite": "Heqa {{SITENAME}} dı",
        "aboutpage": "Project:Heqa",
        "copyright": "Zerrekacı $1 bındı not biya.",
        "copyrightpage": "{{ns:project}}:Heqa telifi",
-       "currentevents": "Hediseyê rocaneyi",
-       "currentevents-url": "Project:Hediseyê rocaneyi",
+       "currentevents": "Hediseyê rocaney",
+       "currentevents-url": "Project:Hediseyê rocaney",
        "disclaimers": "Redê mesuliyeti",
-       "disclaimerpage": "Project:Redê mesulêtê pêroyi",
-       "edithelp": "Peştdariya vurnayışi",
+       "disclaimerpage": "Project:Redê mesulêtê pêro",
+       "edithelp": "Pastiyer vurnayış",
        "helppage-top-gethelp": "Peşti",
-       "mainpage": "Pela Seri",
-       "mainpage-description": "Pela seri",
+       "mainpage": "Perra Seri",
+       "mainpage-description": "Perra seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemaeti",
-       "portal-url": "Project:Portalë Å\9fëlıgi",
+       "portal-url": "Project:Portalê cemaeti",
        "privacy": "Politikay nımıtışi",
        "privacypage": "Project:Xısusiyetê nımıtışi",
        "badaccess": "Xeta mısadey",
        "badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
        "badaccess-groups": "No fealiyeto ke şıma waşt, tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.",
        "versionrequired": "No $1 MediaWiki lazımo",
-       "versionrequiredtext": "Seba gurenayışê na pele versiyonê MediaWiki $1 lazımo. \n[[Special:Version|Versiyonê pele]] bıvêne.",
+       "versionrequiredtext": "Gırweynayışê ena perre rê gani versiyonê $1ê MediaWiki bo. \n[[Special:Version|Versiyonê perre]] bıvêne.",
        "ok": "Temam",
        "pagetitle": "$1 – {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "editlink": "bıvurne",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
-       "toc": "Tedeestey",
-       "showtoc": "bımocne",
+       "toc": "Zerreki",
+       "showtoc": "bımotne",
        "hidetoc": "bınımne",
        "collapsible-collapse": "Teng kı",
        "collapsible-expand": "Hera ke",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} pêbawerê?",
-       "confirmable-yes": "Eya",
+       "confirmable-yes": "E",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "page-atom-feed": "\"$1\" Cıresnayışê atomi",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (perre çıniya)",
+       "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Pele",
-       "nstab-user": "Pella karberi",
-       "nstab-media": "Pela medya",
-       "nstab-special": "Pela xısusiye",
-       "nstab-project": "Pela proceyi",
+       "nstab-main": "Perre",
+       "nstab-user": "Pera karberi",
+       "nstab-media": "Perra medya",
+       "nstab-special": "Pera hısusi",
+       "nstab-project": "Perra proji",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "nstab-template": "Şablon",
-       "nstab-help": "Pela peşti",
-       "nstab-category": "Kategoriye",
-       "mainpage-nstab": "Pela seri",
+       "nstab-help": "Perra pasti",
+       "nstab-category": "Kategori",
+       "mainpage-nstab": "Perra seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.",
-       "nosuchspecialpage": "Pella xısusi ya unasin çınya",
+       "nosuchspecialpage": "Pela hısusiya wınasiyên çıniya.",
        "nospecialpagetext": "<strong>To yew pela xasa nêvêrdiye waşte.</strong>\n\nSeba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Xeta",
        "databaseerror": "Ğetay ardoği",
        "databaseerror-text": "Tabanda malumati de ğırabiya persayışi bi\nNa nusteber  zew ğırabin asınena.",
        "databaseerror-textcl": "Zu ğetaya erdamalumati persayışi ameya meydan.",
-       "databaseerror-query": "Perskerdış:$1",
+       "databaseerror-query": "Pers kerdış:$1",
        "databaseerror-function": "Fonksiyon: $1",
        "databaseerror-error": "Xeta: $1",
        "laggedslavemode": "Diqet: Pel de newe vıraşteyi belka çini .",
        "readonly": "database kılit biyo",
-       "enterlockreason": "Database kılit biyo",
+       "enterlockreason": "Kılit kerdışi rê tarixê abiyayışê kılit ra piya yew sebeb bınusê.",
        "readonlytext": "Qey pawıtış ri yew sebeb vace. Texmini yew tarix vace şıma key pawıtış wedarneni:  $1",
        "missing-article": "Banqa, pela be nameyê \"$1\" $2 ke gani bıbo, nêdiye.\n\nEna belki seba yew vurnayışo kıhan ya zi tarixê gıreyê yew pele esteriya.\n\nEke wına niyo, belki ''software'' de yew xeta esta.\nKerem kerên, naye be nameyê ''URL''yi yew [[Special:ListUsers/sysop|karber]]i ra vacên.",
        "missingarticle-rev": "(rewizyon#: $1)",
        "perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
        "perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
        "querypage-no-updates": "Rocanebiyayışê na pele nıka cadayiyê.\nDayiyi tiya nıka newe nêbenê.",
-       "viewsource": "Çımi bıvin",
+       "viewsource": "Çımey bıvêne",
        "viewsource-title": "Cı geyrayışê $1'i bıvin",
        "actionthrottled": "Kerden peysnaya",
        "actionthrottledtext": "Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.\nÇend deqey ra tepeya reyna bıcerrebnên.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "mypreferencesprotected": "Terciha timar kerdışire icazeta şıam çıniya.",
-       "ns-specialprotected": "Pelê xısusiyi nênê vurnayış.",
+       "ns-specialprotected": "Perrê xısusiy nêvırniyenê.",
        "titleprotected": "No sername terefê [[User:$1|$1]] ra, afernayene ra şevekiyayo.\nSebebê xo <em>$2</em> dero.",
-       "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abê no lakin depoy dosya da \"$2\" mod dê  salt wendi deyo.\n\nXızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: \"$3\".",
+       "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abêno lakin depoy dosya da \"$2\" mod dê  salt wendi de yo.\n\nXızmetkarê  kılit kerdışi wa bewniro enay wa çım ra ravyarn o: \"$3\".",
        "invalidtitle-knownnamespace": "Canemey \"$2\" u metnê \"$3\" xırabo",
        "invalidtitle-unknownnamespace": "Sernameye nêşınasiya yana amraiya canameyo  $1 u metno \"$2\" xırab",
        "exception-nologin": "Şıma cıkewtış nêvıraşto",
        "virus-badscanner": "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
-       "logouttext": "'''Şıma hesabra newke vicyay.'''\n\nWexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
+       "logouttext": "'''Henda şıma hesab ra veciyay.'''\n\nDiqat kerê ke tayê perri şenê hewna zey şıma kewtê ra cı bıasê, heta şıma ver-virê şanekerê (browserê) xo besterê.",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
-       "welcomeuser": "Ğeyr amey, $1!",
+       "welcomeuser": "Heyr amey, $1!",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Namey karberi:",
        "userlogin-yourname": "Namey karberi",
-       "userlogin-yourname-ph": "Nameyê xoyê karberi cı kewe",
+       "userlogin-yourname-ph": "Namey xoyê karberi cı kewe",
        "createacct-another-username-ph": "Nameyê karberi cı kewe",
        "yourpassword": "Parola",
        "userlogin-yourpassword": "Parola",
-       "userlogin-yourpassword-ph": "Parolaya xo cıkewe",
+       "userlogin-yourpassword-ph": "Parolay xo cı kewe",
        "createacct-yourpassword-ph": "Parola cıkewe",
        "yourpasswordagain": "Parola reyna bınusne:",
        "createacct-yourpasswordagain": "Parola tesdiq ke",
        "usernameinprogress": "Qandê nê karberi hesab vıraştışondewamnkeno.  Tay bıpawê",
        "userexists": "Jewna karber enê nami karneno.\nMara reca xorê jewna name bınusnê.",
        "loginerror": "Xetayê hesab ekerdışi",
-       "createacct-error": "Xetaya vıraştışê hesabi",
+       "createacct-error": "Xetay vıraştışê hesabi",
        "createaccounterror": "Hesab nêvırazyeno: $1",
        "nocookiesnew": "Hesabê karberi vıraziya, labelê şıma nêşay cı kewê.\nSemedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.\nŞıma çerezi qapan kerdi.\nRavêri inan akerê, dıma be name u parola şımawa newiye cı kewê.",
        "nocookieslogin": "Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.\nŞıma çerezi qapan kerdi.\nRavêri inan akerê u reyna bıcerrebnê.",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "Bıtexelne",
+       "botpasswords-label-cancel": "Peyd kı",
        "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants-column": "Dayen",
        "resetpass_forbidden": "parolayi nêvuryayi",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
-       "resetpass-submit-cancel": "Bıtexelne",
+       "resetpass-submit-cancel": "Peyd kı",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye wa paroloya şımaya verêne ra ferqıne bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
        "passwordreset-text-many": "{{PLURAL:$1|Qande parola yana e-posta reset kerdışi cayanra taynın pırkeri.}}",
        "passwordreset-disabled": "Parola reset kerdış ena viki sera qefılneyayo.",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
-       "passwordreset-username": "Nameyê karberi:",
+       "passwordreset-username": "Namey karberi:",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Adresa e-postey:",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "bold_tip": "Metno qalın",
        "italic_sample": "Metno çewt",
        "italic_tip": "Metno çewt",
-       "link_sample": "Sernameyê gırey",
-       "link_tip": "Gıreyê miyani",
-       "extlink_sample": "http://www.misal.com sernameyê gırey",
+       "link_sample": "Serekê gıri",
+       "link_tip": "Gırey Żerri",
+       "extlink_sample": "http://www.misal.com sernamey gırey",
        "extlink_tip": "Gırey teberi (xo vira mekerên http:// prefix)",
        "headline_sample": "metnê sernamey",
        "headline_tip": "Sewiya 2ıne sername",
        "image_sample": "Misal resim.jpg",
        "image_tip": "Dosya tewrkerdiye",
        "media_sample": "misal.jpg",
-       "media_tip": "Gıreyê dosya",
+       "media_tip": "Gırey dosye",
        "sig_tip": "İmzay şıma be morê zemani",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
        "minoredit": "No yew vurnayışo werdiyo",
-       "watchthis": "Bıewni ena perrer",
-       "savearticle": "Perrer qeyd kı",
-       "savechanges": "Vuryayışa qeyd kerê",
+       "watchthis": "Bewni ena per",
+       "savearticle": "Perre qeyd ke",
+       "savechanges": "Vurnayışan qeyd kı",
        "publishpage": "Perer bıhesırne",
        "publishchanges": "Vurnayışa vıla ke",
        "preview": "Verqayt",
-       "showpreview": "Ver asayışi bıvinê",
-       "showdiff": "Vurriyayışa bıasne",
+       "showpreview": "Verasayışi bımotne",
+       "showdiff": "Vurnayışan bımotne",
        "anoneditwarning": "<strong>İqaz:</strong> Şıma be hesabê xo nêkewtê cı. \nAdresê şımayê IP tarixê vırnayışê na pele de do qeyd bo. Eke şıma <strong>[$1 cıkewê]</strong> ya zi <strong>[$2 hesab vırazê]</strong>, vurnayışê şıma be zewbina kare ra nameyê şıma rê bar beno.",
        "anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
        "missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
        "token_suffix_mismatch": "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.\nVurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.\nEke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
        "edit_form_incomplete": "'''Qandê form dê vurnayışa tay wastera ma nêreşti; Vurnayışê ke şıma kerdê nêalızyayê, çım ra ravyarnê u fına bıcerbnê.'''",
        "editing": "$1 vuriyeno",
-       "creating": "$1 vırazeno.",
+       "creating": "$1 vıraziyeno.",
        "editingsection": "Per da $1 de şımaye kenê ke leti bıvurnê",
        "editingcomment": "$1 vuryeno (qısmo newe)",
        "editconflict": "Têverabiyayışê vurnayışi: $1",
        "nonunicodebrowser": "'''DİQET: Browserê şıma u unicode yewbini nêgeni. Qey izin dayişê vurnayişê pelan: Karakteri ke ASCII niyê; zerreyê qutiyê vurnayişi de kodi (cod) şiyes-şiyes aseni.'''",
        "editingold": "'''İkaz: Şımayé rewizyon da kehan da perer d vırnayış kené.'''\nVanése qeyd k,lakin rewziyoné veréni dé vınibé.",
        "yourdiff": "pêverronayiş",
-       "copyrightwarning": "'''Recaya iqazi:'''Sita {{SITENAME}} ra iştıraqi pêro umışiya $2 zerredeyo (teferuatan rê $1 bıvênê).\n\nİştıraqê şıma, şıma qayıl niyê ke yewna merdumi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştıraq mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
+       "copyrightwarning": "'''Recay iqazi:'''Sitey {{SITENAME}} ra iştıraki pêro umışiya $2 zerre deyo (teferuatan rê $1 bıvênê).\n\nİştırakê şıma, şıma qayıl niyê ke yewna merdımi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştırakiştıraq = iştırak. mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "editpage-cannot-use-custom-model": "Zerrekê  modelê ena peler şıma nêşenê bıvurnê",
        "longpageerror": "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
        "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
        "templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:",
        "templatesusedsection": "{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:",
-       "template-protected": "(kılit biyo)",
-       "template-semiprotected": "(nimey ena pele kılit biya)",
+       "template-protected": "(staryaye)",
+       "template-semiprotected": "(nime staryayış)",
        "hiddencategories": "Ena per de {{PLURAL:$1|1 kategoriyo nımıte|$1 kategoriyê nımıtey}} muhtewa benê:",
        "edittools": "<div id=\"specialcharss\" class=\"toccolours specialchars\" style=\"margin-top:.5em; padding: .3em .5em; font-size: 100%; color:#aaa; text-align:left;\" title=\"{{int:bw-edittools-tooltip}}\">\n<p class=\"specialbasic\" id=\"Standard\">\n'''{{int:bw-edittools-lead-in}}''' \n<charinsert>Á á É é Í í Ó ó Ú ú Ý ý</charinsert> –\n<charinsert>À à È è Ì ì Ò ò Ù ù </charinsert> –\n<charinsert> â Ê ê Î î Ô ô Û û </charinsert> –\n<charinsert>Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ</charinsert> –\n<charinsert>Æ æ Ø ø Œ œ ẞ ß </charinsert> –\n<charinsert>Å å Ů ů </charinsert> –\n<charinsert>àã Ẽ ẽ ɛ̃ Ĩ ĩ Ñ ñ Õ õ ɔ̃ Ũ ũ </charinsert> –\n<charinsert>Рð Þ þ </charinsert> –\n<charinsert>Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> –\n<charinsert>Ć ć Ĺ ĺ Ń ń Ŕ ŕ Ś ś Ý ý Ź ź </charinsert> –\n<charinsert>Č č Ď ď Ľ ľ Ň ň Ř ř Š š Ť ť Ž ž </charinsert> –\n<charinsert>Ǎ ǎ Ě ě Ǐ ǐ Ǒ ǒ Ǔ ǔ </charinsert> –\n<charinsert>Ā ā Ē ē Ī ī Ō ō Ū ū </charinsert> –\n<charinsert>ǖ ǘ ǚ ǜ </charinsert> –\n<charinsert>Ĉ ĉ Ĝ ĝ Ĥ ĥ Ĵ ĵ Ŝ ŝ Ŵ ŵ Ŷ ŷ </charinsert> –\n<charinsert>Ă ă Ğ ğ Ŭ ŭ </charinsert> –\n<charinsert>Ċ ċ Ė ė Ġ ġ Għ għ İ ı Ż ż </charinsert> –\n<charinsert>Ą ą Ę ę Į į Ų ų </charinsert> –\n<charinsert>Ő ő Ű ű </charinsert> –\n<charinsert>Đ đ Ħ ħ Ł ł Ŀ ŀ </charinsert> –\n<charinsert>Ɖ ɖ Ɛ ɛ Ƒ ƒ Ɣ ɣ Ŋ ŋ Ɔ ɔ Ʋ ʋ </charinsert> -\n<charinsert>Ə ə </charinsert> –\n<charinsert>– — ’</charinsert> –\n<charinsert>~ | ° ¹ ² ³ ⅛ ¼ ⅓ ⅜ ½ ⅝ ¾ ⅔ ⅞ € $ ¥ £ † × ← → ↔ ↑ ± ≠ © ® ™ ‰ «+» ‹+› „+“ „+” ‚+‘ ¡ ¿ …</charinsert> –\n<charinsert>&amp;nbsp; &nbsp; [[Category:+]] #REDIRECT[[+]] {{msg-mw|+|notext=1}} &#33;!FUZZY!! ~~~~  &lt;nowiki>+</nowiki></charinsert>\n<charinsert>ڈ ڑ ٹ </charinsert>\n<charinsert>ټ څ ځ ډ ړ ږ ښ ڼ ؤ ي ې ۍ ئ </charinsert>\n<charinsert>{{{+}}} {{+}} {{subst:+}} <noinclude>+</noinclude></charinsert>\n<charinsert>&lt;!--&nbsp;+&nbsp;--> &lt;br&nbsp;/></charinsert>\n</p></div>",
        "edittools-upload": "-",
-       "nocreatetext": "{{SITENAME}}, Pelê neweyi vıraştış re destur çino.\nşıma eşkeni tepiya şêri u eke şıma qayd biyaye yê [[Special:UserLogin|şıma eşkeni hesab akeri]], eke niye [[Special:UserLogin|şıma eşkeni qayd bıbiy]].",
+       "nocreatetext": "{{SITENAME}}, Perrê newey vıraştış rê destur çıniyo.\nŞıma şenê tepeya şorê u eke şıma qeydbiyayey [[Special:UserLogin|şıma şenê yew hesab akerê]], eke şıma niyê [[Special:UserLogin|şıma şenê qeyd bıbê]].",
        "nocreate-loggedin": "Desturê şıma çıniyo ke pelanê neweyan vırazê.",
        "sectioneditnotsupported-title": "Destekê vurnayışiê qısımi çıniyo",
        "sectioneditnotsupported-text": "Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
        "edit-conflict": "Têverabiyayışê vurnayışi.",
-       "edit-no-change": "Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.",
+       "edit-no-change": "Vırnayışê şıma qebul nêbı, çunke nuşte de yew vırnayış nêvıraziyo.",
        "postedit-confirmation-created": "Pele vıraziye.",
        "postedit-confirmation-restored": "Pele anciya vıraziye.",
        "postedit-confirmation-saved": "Vurnayışê to qeyd biyo.",
        "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırot",
        "undo-summary-username-hidden": "Rewizyona veri $1'i hewada",
        "cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
-       "viewpagelogs": "Qeydanê na pele bımocne",
-       "nohistory": "Verê vurnayışanê na pele çıniyo.",
+       "viewpagelogs": "Qeydanê na perrer bımotne",
+       "nohistory": "Verorê vurnayışanê na perer çıni yo.",
        "currentrev": "Çımraviyarnayışo rocane",
        "currentrev-asof": "$1 ra tepya mewcud weziyeta pela",
        "revisionasof": "Çımraviyarnayışê $1",
        "revision-info": "Vurnayışo ke $1 de terefê {{GENDER:$6|$2}}$7 ra biyo",
        "previousrevision": "← Çımraviyarnayışo kıhanêr",
        "nextrevision": "Rewizyono newên →",
-       "currentrevisionlink": "Tewr halê rocaniye bımocne",
+       "currentrevisionlink": "Tewr halê peyn",
        "cur": "ferq",
        "next": "bahdoyên",
        "last": "peyên",
        "page_first": "verên",
        "page_last": "peyên",
-       "histlegend": "Ferqê weçinayışi: Qutiya versiyonan seba têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne ro ne.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê verziyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi yo.",
+       "histlegend": "Ferqê weçinayışi: Qutiya versiyonan qandé  têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê versiyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vurnayışo werdi yo.",
        "history-fieldset-title": "Çımberz verori",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "histlast": "Peyênêr",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayti}})",
        "historyempty": "(veng)",
-       "history-feed-title": "Tarixê çımraviyarnayışi",
+       "history-feed-title": "Tarixê çım eştışi",
        "history-feed-description": "Wiki de tarixê çım ra viyarnayışë na perer",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
        "rev-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
-       "rev-delundel": "bımocne/bınımne",
-       "rev-showdeleted": "bımocne",
+       "rev-delundel": "bımotne/bınımne",
+       "rev-showdeleted": "bımotne",
        "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "suppressionlog": "qeydê pinani kerdışi",
        "suppressionlogtext": "Cêr de, kahyayan ra zerreko nımıte esto,eno listey besterneya u merdumê bloke kerdışiyo. \nListey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivinê.",
        "mergehistory": "vere cûye pelan bıhewelın",
-       "mergehistory-header": "No pel, reviyonê yew peli eşkeno yewna pelo newe de piyawano.\nno vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.",
-       "mergehistory-box": "revizyonê pelanî yew bike:",
-       "mergehistory-from": "Pela çımey:",
-       "mergehistory-into": "Pela destinasyonî",
+       "mergehistory-header": "Na per, revizyonê ju perer şena juna perer ra pêser kero.  \nNo vurnayişo ke şıma kenê kontrol bıkere ju pera kehen wa nêbo.",
+       "mergehistory-box": "revizyonê peran pêser kerê:",
+       "mergehistory-from": "Pera çımey:",
+       "mergehistory-into": "Pera hedef:",
        "mergehistory-list": "Tarixê vurnayışiyo yewbiyaye",
        "mergehistory-merge": "[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.",
-       "mergehistory-go": "Yew bıyaye vurriyayışa bıasne",
+       "mergehistory-go": "Pêser bıyaye vurriyayışa bımotné",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
        "mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
        "mergelog": "Qeydé zew kerdışi",
        "revertmerge": "Abırnê",
        "mergelogpagetext": "Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.",
-       "history-title": "Tarixê çımraviyarnayışê \"$1\"",
+       "history-title": "Verorê \"$1\"",
        "difference-title": "Pela \"$1\" ferqê çım ra viyarnayışan",
        "difference-title-multipage": "Ferkê pelan dê \"$1\" u \"$2\"",
        "difference-multipage": "(Ferqê pelan)",
        "lineno": "Xeta $1:",
        "compareselectedversions": "Rewizyonanê weçineyan pêver ke",
-       "showhideselectedversions": "Revizyonanê weçinıtan bımocne/bınımne",
+       "showhideselectedversions": "weçinaye revizyona bımotne/bınımne",
        "editundo": "Peyser bıgêre",
        "diff-empty": "(Babetna niyo)",
        "diff-multi-sameuser": "(Terefê eyni karberi ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})",
        "diff-multi-otherusers": "(Terefê {{PLURAL:$2|yew karberi|$2 karberan}} ra {{PLURAL:$1|yew revizyono miyanên nêmocno|$1 revizyonê miyanêni nêmocnê}})",
        "diff-multi-manyusers": "({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)",
        "difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
-       "searchresults": "Peyniyê cıgeyrayışi",
+       "searchresults": "Peyniyê cı geyrayışi",
        "searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
        "titlematches": "Tekê (zewcê) sernameyê pele",
        "textmatches": "Tekê (zewcê) nuştey pele",
        "prevn-title": "$1o verên  {{PLURAL:$1|netice|neticeyan}}",
        "nextn-title": "$1o ke yeno {{PLURAL:$1|netice|neticey}}",
        "shown-title": "Her pele sero $1 {{PLURAL:$1|netici|netica}} bımocne",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıvênên",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıviné",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "<strong>Na wiki de pela \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}",
        "searchprofile-articles": "Pelê zerreki",
-       "searchprofile-images": "Zafınmedya",
+       "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Pêro çi",
        "searchprofile-advanced": "Herayen",
        "searchprofile-articles-tooltip": "$1 de cı geyre",
        "searchprofile-images-tooltip": "Dosya cı geyre",
        "searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê werênayışi zi tey)",
-       "searchprofile-advanced-tooltip": "Cayê nameyanê xısusiyan de cı geyre",
+       "searchprofile-advanced-tooltip": "Cayê namanê xısusiyan de cı geyre",
        "search-result-size": "$1 ({{PLURAL:$2|1 çeku|$2 çekuy}})",
        "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})",
-       "search-redirect": "($1 ra kırışiyè)",
+       "search-redirect": "($1 ra kırışiyaya)",
        "search-section": "(qısmê $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(zerreyê dosya yewbini gêno)",
        "search-suggest": "To va: $1",
-       "search-rewritten": "Neticey $ ra asenê.  Herunda ney wa neticanë $2'i bıvin",
+       "search-rewritten": "Neticey $1 ra asenê. Herunda ney wa neticanë $2'i bıvin",
        "search-interwiki-caption": "Proceyê bıray",
        "search-interwiki-default": "$1 ra neticey:",
        "search-interwiki-more": "(véşi)",
        "searchall": "pêro",
        "showingresults": "#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.",
        "showingresultsinrange": "{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.",
-       "search-showingresults": "{{PLURAL:$4|Netice <strong>$1</strong> be <strong>$3</strong>|Neticeyi <strong>$1 - $2</strong> be <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>| <strong>$3</strong> netican ra <strong>$1 ra hetana $2</strong> asenê}}",
        "search-nonefound": "Zey perskerdışê şıma peyniye çıniya.",
        "search-nonefound-thiswiki": "Ena sita dı zey waşten da şıma theba nêvineya",
        "powersearch-legend": "Cıgeyrayışo hera",
-       "powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
+       "powersearch-ns": "Cayanê naman de cıgeyrayış:",
        "powersearch-togglelabel": "Kontrol ke:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Çıniyo",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pelê karberi",
        "prefs-personal": "Profilê karberi",
-       "prefs-rc": "Vurriyayışê peyêni",
-       "prefs-watchlist": "Lista seyrkerdışi",
+       "prefs-rc": "Vurnayışê peyêni",
+       "prefs-watchlist": "Lista Teqibi",
        "prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
        "prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
-       "prefs-editwatchlist-edit": "Sernamanê listey serkerdışanê xo bıasne u timar kerê",
+       "prefs-editwatchlist-edit": "Listey seyr kerdışê sernameyanê xo bımotné u timar kerê",
        "prefs-editwatchlist-raw": "Lista seyrkerdışia xame bıvurne",
        "prefs-editwatchlist-clear": "Lista serykerdışê xo pak kerê",
        "prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
        "saveprefs": "Qeyd ke",
        "restoreprefs": "Sazanê hesıbyaya pêron newe ke",
        "prefs-editing": "Vurnayış",
-       "rows": "Xeti:",
-       "columns": "Estûni:",
        "searchresultshead": "Cı geyre",
        "stub-threshold": "Qandé Taslağ  formati  sinor:$1",
        "stub-threshold-sample-link": "misal",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
        "savedprefs": "Tecihê şıma qeyd biy.",
-       "savedrights": "Qandé {{GENDER:$1|$1}} heqê karberi qeyd  biye.",
+       "savedrights": "{{GENDER:$1|$1}}  gruba karberi qeyd  biya.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "prefs-reset-intro": "ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.\nNa game tepeya nêerziyena.",
        "prefs-emailconfirm-label": "Tesdiqiya E-posta:",
        "youremail": "E-Mail (mecbur niyo) *:",
-       "username": "{{GENDER:$1|Nameyê karberi}}:",
+       "username": "{{GENDER:$1|Namey karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Wextê qeydbiyayışi",
        "prefs-help-prefershttps": "Na tercih, fına dekewten dı bena aktiv.",
        "prefswarning-warning": "Şıma tercihanê xo de vurnayışi kerdi ke ney hewna qeyd nêbiyê. \nEke şıma na pele ra bêtıknayışê \"$1\" ra veciyê, tercihê şıma newe nêbenê.",
        "userrights": "İdarey heqanê karberan",
-       "userrights-lookup-user": "Grubanê karberi/karbere idare bıke",
+       "userrights-lookup-user": "Jew karber bıweçin",
        "userrights-user-editname": "Yew nameyê karberi cı kewe:",
-       "editusergroup": "Grupanê {{GENDER:$1|karberi}} bıvurne",
+       "editusergroup": "Grupanê karberi bıvurne",
        "editinguser": "{{GENDER:$1|karber}} [[User:$1|$1]] heqanê $2'i vurne no",
        "userrights-editusergroup": "Grubanê karberi/karbere sero bıgureye (bıxebetiye)",
+       "userrights-viewusergroup": "Grubanê karberi bıvin",
        "saveusergroups": "Grubanê {{GENDER:$1|karberi}} qeyd bıke",
        "userrights-groupsmember": "Ezayê:",
        "userrights-groupsmember-auto": "Ezao daxıl/ezaa daxıle ê:",
        "group-bot": "Roboti",
        "group-sysop": "İdarekari",
        "group-bureaucrat": "Buroqrati",
-       "group-suppress": "Çımpawıtoği",
+       "group-suppress": "Pawıteri",
        "group-all": "(pêro)",
        "group-user-member": "{{GENDER:$1|karber}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "grouppage-autoconfirmed": "{{ns:project}}:Karberê ke otomatikmen biyê araşt",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:İdarekeri",
-       "grouppage-bureaucrat": "{{ns:project}}:Buroqrati",
+       "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
        "right-edit": "Pele bıvurne",
        "right-editmyuserjs": "JavaScript dosyaya karberinda ğo timar ke",
        "right-viewmywatchlist": "Lista seyr de xo bıvin",
        "right-editmywatchlist": "Listeya temaşiya karberinda ğo timar ke.Not  tay karfinayışi na icazet nédeyo zi pera dekeno de.",
-       "right-viewmyprivateinfo": "Bağse malumatané ğo bıasne (e-posta, nameyo raştay vs.)",
+       "right-viewmyprivateinfo": "Bağse malumatané ğo bımotné (e-posta, nameyo raştay vs.)",
        "right-editmyprivateinfo": "Melumatanê xoyê şexsiyan bıvurne (adresa e-postey, nameyo raştıkên uêb.)",
        "right-editmyoptions": "Tercihanê xo bıvurne",
        "right-rollback": "Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao",
        "grant-protect": "Şeveknayış u wedarıtışê şeveknayışê pelan",
        "grant-sendemail": "Karberanê binan rê e-posta bırışê",
        "grant-uploadeditmovefile": "Dosyaya bar ke, bıvurnê  yana berê",
-       "grant-uploadfile": "Dosyaya newi bar ke",
+       "grant-uploadfile": "Dosyanê newan bar kı",
        "grant-basic": "Heqê basiti",
        "grant-viewdeleted": "Besteryaya peran u dosyaya bıasne",
        "grant-viewmywatchlist": "Lista serykerdışê xo bıvêne",
        "action-upload_by_url": "na dosya yew URL ra bar ke",
        "action-writeapi": "ser nuşte API gure bike",
        "action-delete": "ena pele bestere",
-       "action-deleterevision": "nê çımraviyarnayışi bestere",
-       "action-deletedhistory": "tarixê ena pel ki estereyî biya, ey bivine",
+       "action-deleterevision": "revizyoni besternê",
+       "action-deletelogentry": "roceka dekerdan bestern",
+       "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena pele meestere",
-       "action-suppressrevision": "revizyone ki nimnaye biye reyna bivîne u restore bike",
+       "action-undelete": "ena perer mestern",
+       "action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-protect": "seviyeyê pawitişî se ena pele bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
        "action-siteadmin": "database kilit bike ya zi a bike",
        "action-sendemail": "e-posta bırşe",
+       "action-editmyoptions": "Tercihanê xo bıvurne",
        "action-editmywatchlist": "Listeyseyran de xo bıvırne",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "nchanges": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
        "enhancedrc-history": "tarix",
-       "recentchanges": "Vuriyayışê peyêni",
+       "recentchanges": "Vırnayışê peyêni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
-       "recentchanges-summary": "Wiki sero vurriyayışê peyêni asenê.",
+       "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vurnayışi yew pela newiye vıraşta.",
        "recentchanges-label-minor": "No yew vurnayışo werdiyo",
        "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
-       "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
+       "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayey cı",
        "recentchanges-legend-heading": "<strong>Kıtabekê Vurriyayışê peyêni:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Listey peranê  newan]] zi bıvinê)",
        "recentchanges-legend-plusminus": "''(±123)''",
-       "recentchanges-submit": "Bımocne",
+       "recentchanges-submit": "Bımotne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
-       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
-       "rcshowhideminor": "Vurriyayışanê werdiya $1",
-       "rcshowhideminor-show": "Bımocne",
+       "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
+       "rcshowhideminor": "Vurnayışê werdiy $1",
+       "rcshowhideminor-show": "Bımotne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
-       "rcshowhidebots-show": "Bımocne",
+       "rcshowhidebots-show": "Bımotne",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "karberanê qeydina $1",
-       "rcshowhideliu-show": "Bımocne",
+       "rcshowhideliu": "karberê qeydbiyay $1",
+       "rcshowhideliu-show": "Bımotne",
        "rcshowhideliu-hide": "Bınımne",
-       "rcshowhideanons": "karberanê bênameyan $1",
-       "rcshowhideanons-show": "Bımocne",
+       "rcshowhideanons": "$1 karberê bênamey",
+       "rcshowhideanons-show": "Bımotne",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
-       "rcshowhidepatr-show": "Bımocne",
+       "rcshowhidepatr-show": "Bımotne",
        "rcshowhidepatr-hide": "Bınımne",
        "rcshowhidemine": "vurnayışê mı $1",
-       "rcshowhidemine-show": "Bımocne",
+       "rcshowhidemine-show": "Bımotne",
        "rcshowhidemine-hide": "Bınımne",
-       "rcshowhidecategorization": "kategorizasyonê pele $1",
-       "rcshowhidecategorization-show": "Bımocne",
+       "rcshowhidecategorization": "kategorizasyoni $1",
+       "rcshowhidecategorization-show": "Bımotné",
        "rcshowhidecategorization-hide": "Bınımne",
-       "rclinks": "Peyniya $2 rocan de $1 vurriyayışan ra <br />$3 asenê",
+       "rclinks": "Peyni $2 rocan dı $1 vurnayışan ra <br />$3 bımotnı",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
-       "show": "Bımocne",
+       "show": "Bımotne",
        "minoreditletter": "q",
        "newpageletter": "N",
        "boteditletter": "b",
        "recentchangeslinked-toolbox": "Vurnayışê elaqeyıni",
        "recentchangeslinked-title": "Heqa \"$1\" de vurnayışi",
        "recentchangeslinked-summary": "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
-       "recentchangeslinked-page": "Nameyê pele:",
-       "recentchangeslinked-to": "Heruna pela ke yena dayene, vurnayışanê pelanê ke daye ra gırêdayiyê inan bımocne",
+       "recentchangeslinked-page": "Namey perrer:",
+       "recentchangeslinked-to": "Heruna perra kı yena dayene, vurnayışanê perranê ke daye ra gırêdayiyê inan bımotne",
        "recentchanges-page-added-to-category": "[[:$1]] kerd kategoriye miyan",
        "recentchanges-page-removed-from-category": "[[:$1]] kategoriye ra vet",
        "autochange-username": "MediaWiki vurnayışo otomatik",
-       "upload": "Dosya bar ke",
-       "uploadbtn": "Dosya bar ke",
+       "upload": "Dosye bar kı",
+       "uploadbtn": "Dosye bar kı",
        "reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
        "upload-tryagain": "Deskripyonê dosyayî ke vurîya ey qeyd bike",
        "uploadnologin": "Şıma cıkewtış nêvıraşto",
        "largefileserver": "Ena dosya zaf girde ke server kebul nikeno.",
        "emptyfile": "dosya ya ke şıma bar kerda veng asena, nameyê dosyayi şaş nusyaya belka.",
        "windows-nonascii-filename": "Na wiki namen de dosyayan de xısusi karaxtera karkerdışa peşti nêdana.",
-       "fileexists": "Nê nameyi ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> qontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
+       "fileexists": "Nê namey ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> kontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
        "filepageexists": "qey na dosya pelê eşkera kerdışi <strong>[[:$1]]</strong> na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.\nkılmnuşteyê şıma nêasena eke şıma qayili bıvini gani şıma pê dest bıvurni\n[[$1|resimo qıc]]",
        "fileexists-extension": "zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]\n* dosyaya ke bar biya: <strong>[[:$1]]</strong>\n* dosyaya ke ca ra esta: <strong>[[:$2]]</strong>\nkerem kere yewna name bıvıcinê",
        "fileexists-thumbnail-yes": "na dosya wina asena ke versiyona yew resmê qıc biyayeya ''(thumbnail)''. [[$1|thumb]]\nkerem kerê <strong>[[:$1]]</strong> na dosya konrol bıkerê .",
        "upload-too-many-redirects": "Eno URL de zaf redireksiyonî esto.",
        "upload-http-error": "Yew ğeletê HTTPî biyo: $1",
        "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
-       "upload-dialog-title": "Dosya bar ke",
+       "upload-dialog-title": "Dosya bar kı",
        "upload-dialog-button-cancel": "Bıterkın",
        "upload-dialog-button-done": "Temam",
        "upload-dialog-button-save": "Bışevekne",
        "filehist-help": "Seba diyayışê viyarteyê dosya tarixê ke qısımê tarix/zemani derê inan bıtıkne.",
        "filehist-deleteall": "pêro bestere",
        "filehist-deleteone": "bestere",
-       "filehist-revert": "reyna biyere",
+       "filehist-revert": "Peyd bıgi",
        "filehist-current": "nıkayên",
        "filehist-datetime": "Tarix/Zeman",
        "filehist-thumb": "Resmo qıckek",
        "imagelinks": "Gurenayışê dosya",
        "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
        "linkstoimage-more": "$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.\nlisteya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.\n[[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.",
-       "nolinkstoimage": "Pelanê ser ena dosyayê link biyê çin o.",
+       "nolinkstoimage": "Ena dosya rê gırê dayen ju per çıni ya.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Linkanê zafyerî]] ena pele ra link biyo bivîne.",
        "linkstoimage-redirect": "$1 (Dosya raçarnayış) $2",
        "duplicatesoffile": "a {{PLURAL:$1|dosya|$1 dosya}}, kopyayê na dosyayi ([[Special:FileDuplicateSearch/$2|teferruati]]):",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
        "upload-disallowed-here": "Şıma nêşenê serê na dosya ra bınusên.",
-       "filerevert": "$1 reyna biyere",
+       "filerevert": "$1 Peyd bıgi",
        "filerevert-legend": "Dosya raçarne",
        "filerevert-intro": "Ti ho ena dosyayê '''[[Media:$1|$1]]'''î  [$4 versiyonê $3, $2] rê reyna anî.",
        "filerevert-comment": "Sebeb:",
        "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard ($3)",
-       "filerevert-submit": "Reyna biyere",
+       "filerevert-submit": "Peyd bıgi",
        "filerevert-success": "'''[[Media:$1|$1]]''' peyser çarna ra [versiyonanê $4, $3, $2].",
        "filerevert-badversion": "Vesiyonê lokalê verniyê eno dosya pê ena pulêwext de çin o.",
        "filedelete": "$1 bestere",
        "mimesearch": "MIME bigêre",
        "mimesearch-summary": "Na pele, dosyayanê MIME goreyê tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
        "mimetype": "Babetê NIME",
-       "download": "Bar ke",
+       "download": "Bıselagnê",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
        "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
-       "randomincategory": "Kategori ra raşt amıyayi perr",
+       "randomincategory": "Ena kategoriye dı pela raştameye",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
-       "randomincategory-category": "Kategoriye:",
+       "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Kategori ra raştamayi per",
        "randomincategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
-       "statistics-header-pages": "İstatıstıkê perrer",
+       "statistics-header-pages": "İstatistikê perer",
        "statistics-header-edits": "İstatistikê vurnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
-       "statistics-articles": "Meqaley",
-       "statistics-pages": "Peli",
-       "statistics-pages-desc": "Wiki de peley pêro, kategoriy, hetenayışi wesaire...",
-       "statistics-files": "Dosyayê bar biye",
+       "statistics-articles": "Perê zerreki",
+       "statistics-pages": "Peri",
+       "statistics-pages-desc": "Peri heme, kategoriy, şabloni, moduli uçb.",
+       "statistics-files": "Barneyaye dosyey",
        "statistics-edits": "Ronayen da {{SITENAME}} ra newke amora vıryayışan",
        "statistics-edits-average": "Her pele sero nısbi vurnayış",
        "statistics-users": "[[Special:ListUsers|Karber]]ê qeydıni",
        "withoutinterwiki": "Perrê ke zıwananê binan rê gıreyê cı çıni yo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "withoutinterwiki-legend": "Verole",
-       "withoutinterwiki-submit": "Bımocne",
+       "withoutinterwiki-submit": "Bımotne",
        "fewestrevisions": "Perrê kı tewr tayn timaryayê",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
        "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
-       "uncategorizedimages": "Dosye yê  bêkategori",
+       "uncategorizedimages": "Dosyeyê kategorinêbiyay.",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nêkarênê",
+       "unusedcategories": "Kategoriyê ke nêguriyay",
        "unusedimages": "Dosyeyê ke nêguriyenê",
        "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Pelê ke waziyayê",
        "mostrevisions": "Pelan ke tewr zaf revizyonî biyê.",
        "prefixindex": "Verbenda pelli heme",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
-       "prefixindex-submit": "Bımocne",
+       "prefixindex-submit": "Bımotne",
        "prefixindex-strip": "Listeya réz bıyayışi",
-       "shortpages": "Perrê kılmeki",
-       "longpages": "Perrê  dergeki",
+       "shortpages": "Pelê kılmi",
+       "longpages": "Pelê dergi",
        "deadendpages": "Perrê kı perranê binan rê grey c çıni yo",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
        "protectedpages": "Pellê kı pawıyayeyè",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
        "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
-       "protectedtitles-submit": "Sernameyan bımocne",
+       "protectedtitles-submit": "Sereki bımotne",
        "listusers": "Listeyê Karberan",
-       "listusers-editsonly": "Teyna karberan bimucne ke ey nuştê",
+       "listusers-editsonly": "Teyna karberanê vurnayış kerdoğan bımotne",
        "listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
        "listusers-desc": "Kemeyen rézed ratn",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
-       "newpages": "Pelê newey",
-       "newpages-submit": "Bımocne",
+       "newpages": "Perrê newey",
+       "newpages-submit": "Bımotne",
        "newpages-username": "Nameyê karberi:",
-       "ancientpages": "Perrê kı rewnayo kı nêvuriya yê",
+       "ancientpages": "Tewr pelê kıhani",
        "move": "Bıkırışe",
        "movethispage": "Ena pele bıkırışe",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
        "apisandbox": "API qumdor",
        "apisandbox-fullscreen": "Panela hera kerdışi",
-       "apisandbox-unfullscreen": "Pele bımocne",
+       "apisandbox-unfullscreen": "Perrer bımotne",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
        "apisandbox-retry": "Fına",
        "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
-       "booksources": "Çıme kıtabi",
+       "booksources": "Çımey kıtabi",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cı geyre",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
-       "logeventslist-submit": "Bımocne",
-       "all-logs-page": "Qeydê umumi pêro",
+       "logeventslist-submit": "Bımotne",
+       "all-logs-page": "Heme qeydê pêroyi",
        "alllogstext": "qey {{SITENAME}}i mocnayişê heme rocaneyani.\ntipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.",
        "logempty": "Qeydan dı malumato unasin çıni yo.",
        "log-title-wildcard": "Sernameyê ke be nê nuşteyi ra destkenê pê, cıgeyre",
-       "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
+       "showhideselectedlogentries": "Motnayışê qeydê weçinayışê cı kerdeyan bıvurne",
        "log-edit-tags": "Etiketanê weçinayê qeydan bıvurnê",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
        "checkbox-invert": "Rageyre",
-       "allpages": "Pelli pêro",
+       "allpages": "Pêro peli",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
-       "allpagesfrom": "Pera liste kerdışi bıasne:",
-       "allpagesto": "Pelanê ke be ena herfe qediyenê bımocne:",
-       "allarticles": "Peli pêro",
+       "allpagesfrom": "Herfa kı pa liste bo:",
+       "allpagesto": "Perranê ke ena herfe qediyenê bımotne:",
+       "allarticles": "Peri pêro",
        "allinnamespace": "Peli pênro ( $1 cayênameyî)",
        "allpagessubmit": "Şo",
        "allpagesprefix": "herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:",
        "cachedspecial-viewing-cached-ts": "Na pela raşt niya, şımayê enewke versiyonê verhafızada na pela vinenê.",
        "cachedspecial-refresh-now": "Peyêni bıvin.",
        "categories": "Kategoriy",
-       "categories-submit": "Bımocne",
+       "categories-submit": "bımotne",
        "categoriespagetext": "{{PLURAL:$1|Kategoriya cêrene|Kategoriyanê cêrênan}} de peli ya zi medya estê.\n[[Special:UnusedCategories|Kategoriyê ke nêxebetiyenê]] tiya de nêmocniyayê.\n[[Special:WantedCategories|Kategoriyanê waşteyeyan]] de zi bıvêne.",
-       "categoriesfrom": "Kategoriyê ke be ninan dest pêkenê, bımocne:",
+       "categoriesfrom": "Kategoriyê ke ney ra sergendênê bımotne:",
        "deletedcontributions": "İştırakê karberi esterdi",
        "deletedcontributions-title": "İştırakê karberi esterdi",
        "sp-deletedcontributions-contribs": "iştiraki",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Heruna nameyi:",
+       "linksearch-ns": "Heruna namey:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: $1 (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "linksearch-error": "jokeri têna nameyê makina ya serekini de aseni/eseni.",
        "listusersfrom": "karber ê ke pey ıney detpêkeni ramocın:",
-       "listusers-submit": "Bımocne",
+       "listusers-submit": "Bımotne",
        "listusers-noresult": "karber nêdiyayo/a.",
        "listusers-blocked": "(blok biy)",
-       "activeusers": "Listey karberan de aktivan",
-       "activeusers-intro": "Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.",
+       "activeusers": "Lista karberanê aktifan",
+       "activeusers-intro": "Ena yew lista karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepiya iştirak kerdo inan motneno.",
        "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "usermessage-editor": "Xeberdarê sistemi",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Listey pawıteyan",
-       "mywatchlist": "Lista mına cıewniyayışi",
+       "mywatchlist": "Lista seyrkerdışi",
        "watchlistfor2": "Qandê $1 ($2)",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
        "watch": "Seyr ke",
-       "watchthispage": "Peller seyr kı",
+       "watchthispage": "Bewni ena per",
        "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
        "wlshowlast": "Peyni de  $1 seata u $2 roca  bıasne",
        "watchlist-hide": "Bınımne",
-       "watchlist-submit": "Bımocne",
+       "watchlist-submit": "Bımotne",
        "wlshowtime": "Periyoda zemani asenayışi:",
        "wlshowhideminor": "vurriyayışê werdiy",
        "wlshowhidebots": "boti",
        "delete-confirm": "\"$1\" bestere",
        "delete-legend": "Bestere",
        "historywarning": "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
-       "historyaction-submit": "Bımocne",
+       "historyaction-submit": "Bımotne",
        "confirmdeletetext": "Tı ho yew pele u tarixê pele wederneno.\nTı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.",
        "actioncomplete": "Kar bi temam",
        "actionfailed": "kar nêbı",
        "rollbackfailed": "Peyserardış nêbi",
        "cantrollback": "karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;\nyewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.\n\noyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Xulasaya vurnayışi: <em>$1</em>.",
+       "editcomment": "Xulasay vurnayışi: <em>$1</em> bi",
        "revertpage": "Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.",
        "revertpage-nouser": "No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o",
        "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
        "protect-locked-blocked": "seviyeya qedexe biyayeyan nevuriyeno.\n'''$1''' eyarê peli:",
        "protect-locked-dblock": "semedê kılidê database ya aktifi şıma neeşkeni seviyeya pawıtışi buvurni.\n'''$1''' eyarê no peli:",
        "protect-locked-access": "Karber hesabê şıma nêşeno  staryaye sewiyey ena peler bıvurno.\nHesıbyayê sazê pela da '''$1''' enêyê:",
-       "protect-cascadeon": "Ena pele nıka kılit biya, çıke na pele zerreyê lista {{PLURAL:$1|pela ke bınê şevekiyayışê qedemeyıni dera|pelê ke bınê şevekiyayışê qedemeyıni derê}}.\nTı şenê sewiyaya kılitkerdışi bıvurnê, feqat tı nêşenê şevekiyayışê qedemeyıni bıvurnê.",
+       "protect-cascadeon": "Ena pele nıka kılit biya, çıke na pele zerreyê lista {{PLURAL:$1|pela ke bınê staryayışi qedemeyıni dera|pelê ke bınê şevekiyayışê qedemeyıni derê}}.\nTı şenê sewiya ya kılit kerdışi bıvurnê, feqat tı nêşenê staryayışi qedemeyıni bıvurnê.",
        "protect-default": "Destur bıde karberan pêrune",
        "protect-fallback": "Tenya karberanê be izna \"$1\" rê destur bıde",
        "protect-level-autoconfirmed": "Karberanê neweyan u qeyd-nêbiyaoğan kılit ke",
        "restriction-level-sysop": "tam pawiyayo",
        "restriction-level-autoconfirmed": "nêm pawiyayo",
        "restriction-level-all": "kamci be sewiya",
-       "undelete": "Peranê esteryayan bıasne",
+       "undelete": "Peranê esteryayan bımotné",
        "undeletepage": "bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar",
        "undeletepagetitle": "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
-       "viewdeletedpage": "Pelanê esteriyayeyan bımocne",
+       "viewdeletedpage": "Perranê esteriyayan bıvin",
        "undeletepagetext": "{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.\nArşiv daimi pak beno.",
        "undelete-fieldset-title": "revizyonan tepiya bar ker",
        "undeleteextrahelp": "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyon}} esteriya yë",
+       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyoni}} esteriya yë",
        "undeletehistory": "eke şıma pel tepiya biyari heme revizyonî zi tepiya yeni.\neke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, revizyonê o pelê verıni zerreyê no pel de aseno.",
        "undeleterevdel": "eke pelo serın de netice bıdo ya zi revizyoni qısmen hewn a bıbiy hewn a kerdışi tepiya nêgeriyeno.",
        "undeletehistorynoadmin": "na madde hewn a biya. sebebê hewna kerdışi u teferruatê karber ê ke maddeyi vıraştı cêr de diyayî. revizyonê hewn a biyayeyani têna serkari vineni",
        "undelete-error-long": "hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "Eya",
-       "namespace": "Heruna nameyi:",
+       "namespace": "Namey herun:",
        "invert": "Weçinayışi dimlaşt ke",
        "tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
-       "namespace_association": "Heruna nameyanê elaqedaran",
+       "namespace_association": "Heruna namanê elaqedaran",
        "tooltip-namespace_association": "Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê",
-       "blanknamespace": "(Ser)",
-       "contributions": "İştırakê {{GENDER:$1|karber}}i",
-       "contributions-title": "Dekerdenê karber de $1",
+       "blanknamespace": "(Wesiqe)",
+       "contributions": "İştirakê {{GENDER:$1|karber}}i",
+       "contributions-title": "Dekerdenê karberê  $1",
        "mycontris": "İştıraki",
        "anoncontribs": "İştıraki",
        "contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
        "uctop": "(weziyet)",
        "month": "Aşme:",
        "year": "Serre:",
-       "sp-contributions-newbies": "Tenya iştıraqanê karberanê neweyan bımocne",
+       "sp-contributions-newbies": "Tenya iştırakanê karberanê newan bımotne",
        "sp-contributions-newbies-sub": "Qe hesebê newe",
-       "sp-contributions-newbies-title": "Îştîrakê karberî ser hesabê neweyî",
+       "sp-contributions-newbies-title": "Hesabanê neweyan rê iştırakê karberi",
        "sp-contributions-blocklog": "qeydê kılitkerdışi",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
        "whatlinkshere": "Linkê tedeestey",
-       "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
+       "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
-       "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
+       "linkshere": "Pera <strong>[[:$1]]</strong> rê gıre dayen perri",
        "nolinkshere": "Per da '''[[:$1]]''' rê pera ke gıre dana çıniya.",
-       "nolinkshere-ns": "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
+       "nolinkshere-ns": "Cayo ke namey rê weçinayo de qet perre '''[[:$1]]''' rê link nêbena.",
        "isredirect": "pera hetenayışi",
        "istemplate": "Açarnayene",
-       "isimage": "gıreyê dosya",
+       "isimage": "gırey dosye",
        "whatlinkshere-prev": "{{PLURAL:$1|veror|veror $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|verni|verni $1}}",
        "whatlinkshere-links": "← gırey",
        "whatlinkshere-hideredirs": "Hetenayışê $1",
-       "whatlinkshere-hidetrans": "Açarnayışê $1",
+       "whatlinkshere-hidetrans": "Çarnayışan $1",
        "whatlinkshere-hidelinks": "Gıreyê $1",
-       "whatlinkshere-hideimages": "Gıreyê dosya $1",
+       "whatlinkshere-hideimages": "Gıreyanê dosye $1",
        "whatlinkshere-filters": "Parzûn",
        "whatlinkshere-submit": "Şo",
        "autoblockid": "Otomatik vındarnayış #$1",
        "ipb-blocklist-duration-left": "$1 vet",
        "unblockip": "Hesabê karberî a bike",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
-       "ipusubmit": "Enê kılitkerdışi wedare",
+       "ipusubmit": "Enê kılit kerdışi wedarnê",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "unblocked-range": "Blokey $1'i wederya",
        "unblocked-id": "Blokê $1î wedariyayo",
        "ipblocklist-submit": "Cı geyre",
        "ipblocklist-localblock": "blokê mehelli",
        "ipblocklist-otherblocks": "{{PLURAL:$1|blokê|blokê}} bini",
-       "infiniteblock": "ebedî",
-       "expiringblock": "roca $1i saeta $2i de qediyena",
+       "infiniteblock": "ebedi",
+       "expiringblock": "$1, $2 de qediyeno",
        "anononlyblock": "teyna karbero anonim",
-       "noautoblockblock": "otoblok nihebitîyeno",
-       "createaccountblock": "Hesab viraştîş blok biyo",
-       "emailblock": "e-mail blok biyo",
-       "blocklist-nousertalk": "ti nieşken pele minaqaşe xo bivurne",
-       "ipblocklist-empty": "Lista kılitkerdışi venga.",
+       "noautoblockblock": "otobloke dariya we",
+       "createaccountblock": "Hesab vıraştene men biya",
+       "emailblock": "e-mail men kerd",
+       "blocklist-nousertalk": "Perra xo'ya suhbeti vırnaene nêbena",
+       "ipblocklist-empty": "Listay kılit kerdışi venga.",
        "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
-       "unblocklink": "bloki wedare",
-       "change-blocklink": "kılitkerdışi bıvurne",
+       "unblocklink": "blokey wedare",
+       "change-blocklink": "kılit kerdışi bıvurne",
        "contribslink": "iştıraki",
        "emaillink": "e-poste bırışe",
        "autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
        "movepage-page-unmoved": "pelê $1i nêkırışiyeno sernameyê $2i.",
        "movepage-max-pages": "tewr ziyed $1 {{PLURAL:$1|peli|peli}} kırışiya u hıni ziyedê ıney otomotikmen nêkırışiyeno.",
        "movelogpage": "Qeydê wegrotışi",
-       "movelogpagetext": "nameyê liste ya ke cêr de yo, pelê vuriyayeyani mocneno",
+       "movelogpagetext": "Cêr de listê da kırşiyayışanê perran pêrıne esta.",
        "movesubpage": "{{PLURAL:$1|Subpage|pelê bınıni}}",
        "movesubpagetext": "{{PLURAL:$1|pelê bınıni yê|pelê bınıni yê}} no $1 peli cer de yo.",
        "movenosubpage": "pelê bınıni yê no peli çino.",
        "movereason": "Sebeb:",
-       "revertmove": "peyser biya",
+       "revertmove": "Peyd bıgi",
        "delete_and_move_text": "==gani hewn a bıbıo/bıesteriyo==\n\n\" no [[:$1]]\" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?",
        "delete_and_move_confirm": "Eya, na pele bestere",
        "delete_and_move_reason": "\"[[$1]]\" qande nami re ca akerdışi re besteriyaye",
        "selfmove": "name yo ke şıma wazeni bıbo, ın name û name yo ke ca ra esto eyni yê /zepê yê. vurnayiş mumkin niyo.",
-       "immobile-source-namespace": "\"$1\" pelê cayi de nameyi nêkırışyenî",
+       "immobile-source-namespace": "Heruna namey \"$1\" rê perre nêşena bıkırışiyo",
        "immobile-target-namespace": "peli nêkırışiyeni \"$1\" cayê nameyan",
        "immobile-target-namespace-iw": "xetê benatê wikiyan, hedefê pelkırıştış niyo",
        "immobile-source-page": "nameyê no peli nêvuriyeno",
        "bad-target-model": "Hedefo ke waştiyayo zerreke cı babetna model karneno. Ke nêşeno $1 ra açarno $2.",
        "imagenocrossnamespace": "Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno",
        "nonfile-cannot-move-to-file": "Ekê dosya niyê, cade namande dosyaya nêahulneyênê",
-       "imagetypemismatch": "tipa dosyaya neweyi re pênêgıneno/nêgıneno pê",
+       "imagetypemismatch": "Tipê dosyey newey rê pê nêgıneno",
        "imageinvalidfilename": "nameyê dosyayi ya hedefi meqbul niyo.",
        "fix-double-redirects": "rayberdış ê ke sernameyê orjinali re işaret keni rocane bıker.",
        "move-leave-redirect": "pey de yew rayberdış roni",
        "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-anontalk": "vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker",
        "tooltip-pt-preferences": "Tercihê {{GENDER:|to}}",
-       "tooltip-pt-watchlist": "Lista pelanê ke to gırewtê seyrkerdış",
+       "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-pt-logout": "Bıveciye",
        "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.",
-       "tooltip-ca-talk": "Heqa zerrekê pele de werênayış",
+       "tooltip-ca-talk": "Heqa zerreki vaten",
        "tooltip-ca-edit": "Ena pele bıvurne",
        "tooltip-ca-addsection": "Bınleteyo newe akerê",
        "tooltip-ca-viewsource": "Ena pele kılit biya.\nŞıma şenê çımeyê aye bıvênê",
        "tooltip-ca-protect": "Ena pele bışevekne",
        "tooltip-ca-unprotect": "Starkerdışe ena peler bıvurne",
        "tooltip-ca-delete": "Ena pele bestere",
-       "tooltip-ca-undelete": "peli biyarê halê ver hewnakerdışi",
+       "tooltip-ca-undelete": "Perer fına zey verê esternayışi kerê",
        "tooltip-ca-move": "Ena pele bıkırışe",
        "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
        "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
        "tooltip-search-fulltext": "Pelan miyan de nê metıni cı geyre",
-       "tooltip-p-logo": "Pela seri bıvêne",
+       "tooltip-p-logo": "Şo pela seri",
        "tooltip-n-mainpage": "Şo pela seri",
        "tooltip-n-mainpage-description": "Şo pela seri",
-       "tooltip-n-portal": "Heqa proceyi de, kes çı şeno bıkero, çı koti vêniyeno",
+       "tooltip-n-portal": "Heqa procey de, kes çı şeno bıkero, çı kamca vêniyeno",
        "tooltip-n-currentevents": "Vurnayışanê peyênan de melumatê pey bıvêne",
-       "tooltip-n-recentchanges": "Wiki de yew lista vurriyayışanê peyênan",
+       "tooltip-n-recentchanges": "Wiki dı yew lista vurnayışanê peyênan",
        "tooltip-n-randompage": "Pelê da raştameyiye bar ke",
-       "tooltip-n-help": "Cayê peştigırewtışi",
+       "tooltip-n-help": "Caê doskerdışi",
        "tooltip-t-whatlinkshere": "Lista pelanê wikiya pêroina ke tiya gırê bena",
        "tooltip-t-recentchangeslinked": "Vurnayışê peyênê pelanê ke ena pela ra gırê biyê",
        "tooltip-feed-rss": "RSS feed qe ena pele",
        "tooltip-t-contributions": "{{GENDER:$1|Enê karberi}} ra listey iştirakan",
        "tooltip-t-emailuser": "Ena karber ri yew email bırış",
        "tooltip-t-upload": "Dosyeyan bar ke",
-       "tooltip-t-specialpages": "Yew lista pelanê xasanê pêroyinan",
-       "tooltip-t-print": "Hewl versiyona ploğnayışa na perer",
+       "tooltip-t-specialpages": "Listeya peranê hısusiyan hemın",
+       "tooltip-t-print": "Versiyono perre ro ke nuşterniyaye.",
        "tooltip-t-permalink": "Gırêyo daimi be ena versiyonê pele",
        "tooltip-ca-nstab-main": "Pela zerreki bıvêne",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
        "tooltip-preferences-save": "Terciha qeyd ke",
        "tooltip-summary": "Xulasa kılmek bınuse",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/************************************************\n * COMMON CSS\n *\n * Any CSS placed in this page will be used on \n * all skins, please think carefully about if it\n * belongs here (and not in one of the skin CSS\n * pages) before adding it. Thanks.\n ************************************************/\n\n/* <table class=\"highlighthovertable\"> */\ntable.highlighthovertable tr:hover,\ntable.highlighthovertable tr:hover td,\ntable.mw-ext-translate-groupstatistics tr:hover,\ntable.mw-ext-translate-groupstatistics tr:hover td {\n background-color: white;\n}\n\n\n/* Babel wrapper layout. */\n/* XXX: This is either redundant or should be in-core */\n/* @noflip */table.mw-babel-wrapper {\n\twidth:        238px;\n\tfloat:        right;\n\tclear:        right;\n\tmargin:       1em;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: #99B3FF;\n}\n\n/* Babel box layout. */\n/* @noflip */div.mw-babel-box {\n\tfloat:  left;\n\tclear:  left;\n\tmargin: 1px;\n}\n\ndiv.mw-babel-box table {\n\twidth: 238px;\n}\n\ndiv.mw-babel-box table th {\n\twidth:       238px;\n\twidth:       45px;\n\theight:      45px;\n\tfont-size:   14pt;\n\tfont-family: monospace;\n}\n\ndiv.mw-babel-box table td {\n\tfont-size:   8pt;\n\tpadding:     4pt;\n\tline-height: 1.25em;\n}\n\n/* Babel box colours. */\ndiv.mw-babel-box-0 {\n\tborder: solid #B7B7B7 1px;\n}\n\ndiv.mw-babel-box-1 {\n\tborder: solid #C0C8FF 1px;\n}\n\ndiv.mw-babel-box-2 {\n\tborder: solid #77E0E8 1px;\n}\n\ndiv.mw-babel-box-3 {\n\tborder: solid #99B3FF 1px;\n}\n\ndiv.mw-babel-box-4 {\n\tborder: solid #CCCC00 1px;\n}\n\ndiv.mw-babel-box-5 {\n\tborder: solid #F99C99 1px;\n}\n\ndiv.mw-babel-box-N {\n\tborder: solid #6EF7A7 1px;\n}\n\ndiv.mw-babel-box-0 table th {\n\tbackground-color: #B7B7B7;\n}\n\ndiv.mw-babel-box-1 table th {\n\tbackground-color: #C0C8FF;\n}\n\ndiv.mw-babel-box-2 table th {\n\tbackground-color: #77E0E8;\n}\n\ndiv.mw-babel-box-3 table th {\n\tbackground-color: #99B3FF;\n}\n\ndiv.mw-babel-box-4 table th {\n\tbackground-color: #CCCC00;\n}\n\ndiv.mw-babel-box-5 table th {\n\tbackground-color: #F99C99;\n}\n\ndiv.mw-babel-box-N table th{\n\tbackground-color: #6EF7A7;\n}\n\ndiv.mw-babel-box-0 table {\n\tbackground-color: #E8E8E8;\n}\n\ndiv.mw-babel-box-1 table {\n\tbackground-color: #F0F8FF;\n}\n\ndiv.mw-babel-box-2 table {\n\tbackground-color: #D0F8FF;\n}\n\ndiv.mw-babel-box-3 table {\n\tbackground-color: #E0E8FF;\n}\n\ndiv.mw-babel-box-4 table {\n\tbackground-color: #FFFF99;\n}\n\ndiv.mw-babel-box-5 table {\n\tbackground-color: #F9CBC9;\n}\n\ndiv.mw-babel-box-N table {\n\tbackground-color: #C5FCDC;\n}\n\n.babel-box td.babel-footer {\n\ttext-align: center;\n}\n\n/* Styling for portals. */\ndiv.table {\n    display:        table;\n    vertical-align: top;\n    width:          100%;\n}\n\ndiv.table-row {\n    display:        table-row;\n    vertical-align: top;\n}\n\ndiv.table-cell {\n    display:        table-cell;\n    vertical-align: top;\n}\n\nbody.ns-100 table.mw-babel-wrapper {\n    border:           solid 1px #bbbbbb;\n    background-color: #f0f0f0;\n    margin-left:      1em;\n}\n\n.graytext {\n    color: #aaa;\n}\n\n/* On [[Special:RecentChanges]] and [[Special:Watchlist]] make the new pages symbol bold green and the minor edit symbol gray. */\n.newpage {\n    color:       green;\n    font-weight: bold\n}\n\n.minoredit,\n.minor {\n    color: gray;\n}\n\n/* Monospace diffs, this makes more sense since diffs show what would be seen in the edit box. */\n/* Note: Anno 2012 many browsers don't use monospace in the textarea anymore by default, notably Chrome and Safari don't (unless the user overrides this in the preferences) */\n.diff-context,\n.diff-deletedline,\n.diff-addedline {\n    font-family: monospace, \"Courier New\";\n/* Just guess does the stupid wikidiff2 extensions add extra whitespace around..... */\n    white-space: -moz-pre-wrap;\n    white-space: pre-wrap;\n}\n \n.diffchange {\n    border: 1px dotted rgb( 170, 170, 170 );\n}\n\n/* It is unclear what the following CSS does, please add comments if you can clarify. */\n/* The box which is 400px high and if its content is longer, it gets the scrollbar */\n.scrollme {\n    overflow: scroll;\n    width:    100%;\n    height:   400px;\n}\n\n/* Standard Navigationsleisten, aka box hiding thingy from .de.  Documentation at [[Wikipedia:NavFrame]]. */\ndiv.Boxmerge, div.NavFrame { margin: 0; padding: 4px; border-collapse: collapse;}\ndiv.Boxmerge div.NavFrame { border-style: none; border-style: hidden; }\ndiv.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; }\ndiv.NavFrame div.NavHead { height: 1.6em; position:relative; }\ndiv.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; }\na.NavToggle { position: absolute; top: 0; right: 5px; }\n.note-flaggedrevs * a.NavToggle { right: 12px; } /* For [[Template:Flagged Revs]] */\n\n/* Template:Languages */\n.bw-languages {\n    border:          1px solid #aaaaaa;\n    padding:         0.2em;\n    border-collapse: collapse;\n    line-height:     1.2;\n    font-size:       95%;\n    margin:          1px 1px;\n}\n.bw-languages-title {\n    width:        180px;\n    border:       1px solid #aaaaaa;\n    background:   #EEF3E2;\n    padding:      0.5em;\n    font-weight:  bold;\n}\n.bw-languages-links { padding:0.5em; background:#F6F9ED; }\n\n/* Senseless in this project */\n#editpage-copywarn { display: none; }\n\n/* Hide warnings about bad links on MediaWiki:Common.css */\n.page-MediaWiki_Common_css .mw-translate-messagechecks { display: none; }\n\n/*******************\n** Faciliate RTL translation\n*******************/\n/* @noflip */\n#bodyContent .arabic a {\n\tpadding-right:0;\n\tbackground:none;\n}\n\n.vatop tr, tr.vatop, .vatop td, .vatop th {\n vertical-align: top;\n}\n\n.bw-languages {\n direction: ltr;\n}\n\n/* prevent wrapping of lines in LQT TOC if not necessary */\ntable.lqt_toc {\n\twidth: auto;\n}\n\n/* [[m:MediaZilla:35337]] */\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/152px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/202px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n\n/* qqq visibility, [[Thread:Support/Suggestion: Add this CSS to MediaWiki:Common.css]] */\n \n.mw-sp-translate-edit-info .mw-content-ltr {\n  background-position:left center;\n  padding-left:45px;\n}\nfieldset.mw-sp-translate-edit-info .mw-centent-rtl {\n  background-position:right center;\n  padding-right:45px;\n}\n\n/* Semantic MediaWiki - make special properties easier to identify */\n\n.smwbuiltin a,\n.smwbuiltin a.new {\n\tcolor: #FF8000;\n}\n\n/* Recentchangestext toggle link */\n.white-link a {\n    color: #fff;\n}",
-       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
        "anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
        "siteuser": "karberê {{SITENAME}}i $1",
        "anonuser": "karberê anonim o {{SITENAME}}i $1",
-       "lastmodifiedatby": "Ena per tewr peyên roca $2, $1 de terefê $3 ra vurmaya ya.",
+       "lastmodifiedatby": "Ena per tewr peyên roca $2, $1 de terefê $3 ra vurneya ya.",
        "othercontribs": "xebatê $1 ıney geriyayo diqqeti/geriyayo nezer.",
        "others": "bini",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|karber|karberan}} $1",
        "nocredits": "qey no peli hema/hona yew şınasnameyi mewcud niyo",
        "spamprotectiontitle": "filtreya spami yo pawıtışê verba-vındertışi",
        "spamprotectiontext": "pel o ke şıma waşt qeyd bıkeri hetê filtreya spami ra blok bı. ihtimalo gırdek o teber-gıreyê listeya sabıqayi ra yo.",
-       "spamprotectionmatch": "nuşte yo ke rıcnayoxê spami herikneno: $1",
+       "spamprotectionmatch": "nuşteyo ke rıcnayoxê spami herikneno: $1",
        "spambot_username": "wikimedya spam-pakkerdışi",
        "spam_reverting": "agêriyeno revizyon o ke tawayê $1 ıney piya çiniyo",
        "spam_blanking": "Revizyonê gredê $1 vineyay, wa weng kero",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Bınpelê na pela",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|serçarnayış|serçarnayışi}}; $3 {{PLURAL:$3|nêserçarnayış|nêserçarnayışi}})",
-       "pageinfo-firstuser": "Pela vıraşter",
-       "pageinfo-firsttime": "Demê pela vıraştışi",
+       "pageinfo-firstuser": "Vıraştoğê perrer",
+       "pageinfo-firsttime": "Vıraştena tarixê perrer",
        "pageinfo-lastuser": "Vurnayoğo peyên",
        "pageinfo-lasttime": "Deme u vurnayışo peyên",
        "pageinfo-edits": "Amarina vurnayışan pêro",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra",
-       "pageinfo-toolboxlink": "Melumatê pele",
+       "pageinfo-toolboxlink": "Melumatê perre",
        "pageinfo-redirectsto": "Beno hetê",
        "pageinfo-redirectsto-info": "melumat",
        "pageinfo-contentpage": "Zey jû pela zerreki hesebiyena",
        "pageinfo-protect-cascading": "Sıtarkerdeyi tiya cı ra yenê war",
        "pageinfo-protect-cascading-yes": "Eya",
        "pageinfo-protect-cascading-from": "Sıtarkerdey cı ra yenê war",
-       "pageinfo-category-info": "Şınasiya kategoriye",
+       "pageinfo-category-info": "Melumatê kategori",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
        "markaspatrolledtext": "Ena pele kontrol biyayi nışan ke",
        "markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
        "markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
-       "rcpatroldisabled": "Dewriyaya vurnayışê peyêni nêxebetiyena",
+       "rcpatroldisabled": "Dewriyay vırnayışê peyêni nêxebetiyena",
        "rcpatroldisabledtext": "Devriyeyê vurnayışê peyêni inke kefilnaye biyo u nihebitiyeno",
        "markedaspatrollederror": "Nişan nibeno ke devriye biyo",
        "markedaspatrollederrortext": "Ti gani revizyon işaret bike ke Nişanê devriye biyo",
        "variantname-shi": "shi",
        "metadata": "Melumato serên",
        "metadata-help": "Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.\nEg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.",
-       "metadata-expand": "Detayan bıasne",
+       "metadata-expand": "Detayan bımotné",
        "metadata-collapse": "melumati bınımne",
        "metadata-fields": "Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.\nÊ bini zey sayekerdoğan nımiyenê.\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-langitem": "'''$2:''' $1",
        "exif-primarychromaticities": "Kromaticitiyê eveli",
        "exif-ycbcrcoefficients": "Cayê rengi yê transformasyon metriksê koefişinti",
        "exif-referenceblackwhite": "Çiftyê siya u sipe değerê referansi",
-       "exif-datetime": "Zeman u tarixê vurnayişê dosyayi",
+       "exif-datetime": "Zeman u tarixê vurnayışê dosya",
        "exif-imagedescription": "Serê resimi",
        "exif-make": "Vıraştoğê kamera",
        "exif-model": "Modelê kamera",
-       "exif-software": "Software ke hebitiyeno",
+       "exif-software": "Karenaye nusnerek",
        "exif-artist": "Nuştoğ",
        "exif-copyright": "Wahirê copyrighti",
        "exif-exifversion": "Versiyonê Exif",
        "exif-usercomment": "Mışewreyê karberi",
        "exif-relatedsoundfile": "Derhekê dosya yê vengi",
        "exif-datetimeoriginal": "Demê afernayışê dayeyo sıfteyıni",
-       "exif-datetimedigitized": "Zeman û tarixê dicitalkerdışi",
+       "exif-datetimedigitized": "Dema  dijital kerdışi",
        "exif-subsectime": "ZemanTarix saniyeyibini",
        "exif-subsectimeoriginal": "ZemanTarixOricinal saniyeyibini",
        "exif-subsectimedigitized": "ZemanTarixDicital saniyeyibini",
        "exif-writer": "Nuştekar",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
-       "exif-iimcategory": "Kategoriye",
+       "exif-iimcategory": "Kategori",
        "exif-iimsupplementalcategory": "Kategoriyê temamkerdışi",
        "exif-datetimeexpires": "No peyra mekarênê",
        "exif-datetimereleased": "Bıroşe",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "version-skins": "Bar kerde bejni",
-       "version-specialpages": "Pellê xısusiy",
+       "version-specialpages": "Perê hısusiy",
        "version-parserhooks": "Çengelê Parserî",
        "version-variables": "Vurnayeyî",
        "version-antispam": "Spam vındarnayış",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Perrê Hısusi",
+       "specialpages": "Perrê hısusi",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-login": "Dekew / hesab vıraz",
        "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
        "specialpages-group-media": "Raporê medya û barkerdışi",
-       "specialpages-group-users": "Karberi u heqê ",
+       "specialpages-group-users": "Karberi u heqê inan",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "specialpages-group-pages": "Listeyê pelan",
        "specialpages-group-pagetools": "Haletê pelan",
        "tags-create-reason": "Sebeb:",
        "tags-create-submit": "Vıraze",
        "tags-edit-reason": "Sebeb:",
-       "comparepages": "Perra pêver kı",
+       "comparepages": "Pelan têversanê",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "compare-rev1": "Revizyonê 1i",
        "revdelete-summary-hid": "xulasaya vurnayışi nımıtiya",
        "revdelete-uname-hid": "nameyê karberi nımıteyo",
        "revdelete-content-unhid": "zerrek nênımıteyo",
-       "revdelete-summary-unhid": "xulasaya vurnayışi nênımıtiya",
+       "revdelete-summary-unhid": "xulasay vurnayışi musneyêna",
        "revdelete-uname-unhid": "nameyê karberi nênımıteyo",
        "revdelete-restricted": "vergırewtışê ke xızmekaran rê biye",
        "revdelete-unrestricted": "vergırewtışê ke xızmekaran rê dariyê we",
-       "logentry-move-move": "$1 pela $3 {{GENDER:$2|berd}} $4",
-       "logentry-move-move-noredirect": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
-       "logentry-move-move_redir": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
+       "logentry-move-move": "{| style=\"border:1px solid skyblue; margin-bottom: 1em\" cellspacing=\"0\" cellpadding=\"2\" width=\"60%\"\n\t\n| style=\"font: 100% verdana; color:black\" align=\"center\" bgcolor=\"greenyellow\" | $1,  pera $3'i {{GENDER:$2|kırışt}} $4\n|}",
+       "logentry-move-move-noredirect": "$1, pera $3'i bêhetenayış {{GENDER:$2|kırışt}} pera $4`i",
+       "logentry-move-move_redir": "Hetenayışi sera karber $1 pera $3'i  {{GENDER:$2|kırışt}} pera $4",
        "logentry-move-move_redir-noredirect": "Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4",
        "logentry-patrol-patrol": "$1 versiyono $4 ke {{GENDER:$2|nişan biyo}} pela $3 ra qontrol kerd",
        "logentry-patrol-patrol-auto": "Çımraviyarnayışê $4 pela $3 ke $1 otomatikman {{GENDER:$2|nişan biyo}} qontrol kerd",
        "revdelete-summary": "kılmvatışê vuriyayişi",
        "feedback-adding": "Pela rê peyxeberdar defêno...",
        "feedback-bugcheck": "Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.",
-       "feedback-bugnew": "Mı qontrol ke. Xetaya newi xeber ke",
+       "feedback-bugnew": "Mı kontrol kı. Xetay newi xeber kı.",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
-       "feedback-cancel": "Bıtexelne",
+       "feedback-cancel": "Peyd kı",
        "feedback-close": "Biya star",
-       "feedback-error1": "Xeta: API ra neticey ne vıcyay",
+       "feedback-error1": "Xeta: APIi ra peyniyê nêşınasiyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "feedback-error3": "Xeta: API ra cewab çıno",
        "feedback-message": "Mesac:",
        "feedback-thanks": "Teşekkur kemê! Vatışê şıma pela da \"[$2 $1]\" esta.",
        "searchsuggest-search": "{{SITENAME}} de cı geyre",
        "searchsuggest-containing": "estebiyaye...",
-       "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
-       "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
-       "api-error-copyuploaddisabled": "URL barkerdış ena waster dı qefılyayo.",
-       "api-error-duplicate": "Pele de xora be nê zerreki ra {{PLURAL:$1|dosyaya bine esta|dosyeyê bini estê}}.",
-       "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya zey na dosya|zerrey cı zey dosya}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
-       "api-error-empty-file": "Dosyaya ke şıma rışta venga.",
+       "api-error-badtoken": "Xetay zerreki: Antışo xırabın.",
        "api-error-emptypage": "Newi, pelaya veng vıraştışi rê mısade nêdeyêno.",
-       "api-error-fetchfileerror": "Xırabiya zerrek:Dosya grotış dı tay çi raşt nêşı.",
-       "api-error-fileexists-forbidden": "Jû dosya be nê nameyê \"$1\" ra xora esta, u naye sero nêşeno ke bınuşiyo.",
-       "api-error-fileexists-shared-forbidden": "Jû dosya be nameyê \"$1\" ra depoyê doyeyanê barekerdeyan de xora esta, u naye sero nêşeno ke bınuşiyo.",
-       "api-error-file-too-large": "Dosyaye ke şıma rışta zaf gırda.",
-       "api-error-filename-tooshort": "Namayê dosyayi zaf kilm a.",
-       "api-error-filetype-banned": "Tipê ena dosya qedexe biya.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|babetê dosyayo destûrın niyo|babetên dosyeyanê destûrınan niyê}}. {{PLURAL:$3|Babetê dosyayo destûrın|Babetên dosyeyanê destûrınan}}   $2.",
-       "api-error-filetype-missing": "Derganiya dosya kemiya",
-       "api-error-hookaborted": "Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.",
-       "api-error-http": "Xırabiya zerreki:Wasteriya irtabet bırya.",
-       "api-error-illegal-filename": "Ena nameyê dosyayi kebul nibena.",
-       "api-error-internal-error": "Xırabiye zerrek:Na wikide barkerdış de şıma dı çıyê raşt nêşı.",
-       "api-error-invalid-file-key": "Xırabiye zerrek:İdari  depokerdışê dosya nêvineya.",
-       "api-error-missingparam": "Xırabiye zerrek:Parametre waştış dı xırabin",
-       "api-error-missingresult": "Xırabiya zerrek:Kopya kerdışê cı nêbı.",
-       "api-error-mustbeloggedin": "Dosya barkerdışi re cıkewtış icab keno.",
-       "api-error-mustbeposted": "Zırabiya zerrek:HTTP POST waştış icab keno",
-       "api-error-noimageinfo": "Barkerdışê dosya temamya lakin wasterira marê malumat nêdeyayo.",
-       "api-error-nomodule": "Xırabiya zerrek:Sazkerdışê modul dê barkerdışi nêvıraziyayo.",
-       "api-error-ok-but-empty": "Xırabiya zerrek:Wastero cıwan nêdano.",
-       "api-error-overwrite": "Ser yew dosyayê ke hama esta, ser ey qeyd nibena.",
+       "api-error-publishfailed": "Xetay zerrey: Cıgeyrayoği nêşiya dosya rocane akero.",
        "api-error-stashfailed": "Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.",
-       "api-error-publishfailed": "Xetaya zerrey: Cıgeyrayoği nêşiya dosyaya rocaniye akero.",
-       "api-error-stasherror": "Dosya embari rê ke bar biye xeta veciye.",
-       "api-error-timeout": "Cıwab dayışê wasteri peyra mend.",
-       "api-error-unclassified": "Yew xeteyê nizanyeni biya.",
-       "api-error-unknown-code": "$1'dı jew xeta vıciye",
-       "api-error-unknown-error": "Zerre xırabin:Dasoya barkerdış de tay çi raşt nêşı.",
        "api-error-unknown-warning": "İqazo nêzanaye: \"$1\".",
        "api-error-unknownerror": "$1'dı jew xeta vıciye",
-       "api-error-uploaddisabled": "BArkerdış ena wikide qefılneyayo",
-       "api-error-verification-error": "Dosya xırabiya yana derganiya cı xıraba.",
        "duration-seconds": "$1 {{PLURAL:$1|saniya|saniyey}}",
        "duration-minutes": "$1 {{PLURAL:$1|deqa|deqey}}",
        "duration-hours": "($1 {{PLURAL:$1|seate|seati}})",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bayt|bayti}}",
        "limitreport-expansiondepth": "Tewr veşi herayina dergbiyayışi",
        "limitreport-expensivefunctioncount": "Amoriya fonksiyonde vay agozni",
-       "expandtemplates": "Å\9fablona hera kı",
+       "expandtemplates": "Å\9eablonan hera kı",
        "expand_templates_intro": "Na pela xususi metın geno u şablonê ke tedeyê reyna reyna hêra keno.\nU hem zi nê fonksiyonan hêra keno\n<nowiki>{{</nowiki>#language:…}}</code>, u zey nê parametreyan\n<nowiki>{{</nowiki>CURRENTDAY}}</code>\nEneri Medya wiki sera xo keno.",
        "expand_templates_title": "Sernameyê weziyeti, misal qandê {{FULLPAGENAME}}.:",
        "expand_templates_input": "sernameyê cıkewtışi:",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
        "mw-widgets-titleinput-description-redirect": "berd be $1",
-       "randomrootpage": "Raştamaye perra çımey",
+       "randomrootpage": "Pela raştmameya rıçıkıne",
        "log-action-filter-newusers": "Babetê hesabvıraştışi:",
        "changecredentials": "Malumatanê karberi bıvurnê",
-       "removecredentials": "Kamiyer wedarne",
+       "removecredentials": "Kamiye wedarne",
        "removecredentials-submit": "Kamiyer wedarne"
 }
index b6e1b18..49818cc 100644 (file)
        "accmailtitle": "पासवर्ड पठाइयो",
        "newarticle": "(नयाँ)",
        "newarticletext": "तमले अहिलसम्म नभयाका पानाको लिंङ्क पहिल्यायाका छौ ।\nयो पानो बनौनाखी तल्तिरको कोष्ठमी टाइप गरि । (और जाण्णाखीलेखा [$1 help page] हेर )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
-       "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल]] अथवा [[Special:UserLogin|प्रवेश गर]] ''",
+       "anontalkpagetext": "<em>यो कुरणीकाआनी पन्ना अज्ञात प्रयोगकर्ता खिलाइ हो जैले अइलसम्म खाता बनायेइको आथिन, अथवा जो यै पन्नाऽ उपयोग अद्दैन।</em>\nतवै हमले उनलाई पछ्याण्णाइ उनरो आइपी (IP) ठेगाना प्रयोग अद्दु पड्ड्या हुन्छ। \nतसो आइपी (IP) ठेगाना भौत प्रयोगकर्तानओ साजो होइसकन्छ।\nयदि तम अज्ञात प्रयोगकर्ता हौ रे तमलाई असजी लाग्द्या टिप्पणी अरीयाऽ अनुभव अरन्छऽ भण्याँ भविष्यमी अन्य अज्ञात प्रयोगकर्ताअनसँङ्ङा भ्रमबठेइ बाँच्चाइ कृपया [[Special:CreateAccount|खाता खोलऽ]] या [[Special:UserLogin|प्रवेश अरऽ]]''",
        "noarticletext": "यै लेखमी अहिल क्यै पन पाठ नाइथी  ।\nतमले और पृष्ठमी\n[[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्या]</span>.",
        "noarticletext-nopermission": "यै लेखमी अहिल केइ पन पाठ नाइथी  ।\nतमले और पानामी\n[[Special:Search/{{PAGENAME}}|यै पानाको शीर्षककी लेखा खोज]] गद्द सकन्छौ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पाना सम्बन्धित ढड्डामी खोज्न],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यै पानालाई सम्पादन गद्द] सकन्छौ</span>.",
        "userpage-userdoesnotexist": "\"$1\" प्रयोगकर्ता खाता दर्ता अरीया: आथिन।\nयेइ पान्नो बनुन/सम्पादन अद्द चाहन्छ: भण्या विचार अर:।",
        "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
        "rev-delundel": "दधेखाउने/लुकाउन्या",
        "rev-showdeleted": "धेकाउन्या",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\8dया/मà¥\87à¤\9fाà¤\88या à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\8dया/मà¥\87à¤\9fाà¤\88या à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-no-file": "खुलाइएको पाना अस्तित्वमी छैन",
        "revdelete-show-file-submit": "हो",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमी)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरू :",
-       "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-sample-link": "उदाहरण",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
        "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
-       "userrights-lookup-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¸à¤®à¥\82ह à¤µà¥\8dयवसà¥\8dथापन à¤\97र",
+       "userrights-lookup-user": "यà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\9bानऽ",
        "userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
-       "editusergroup": "{{GENDER:$1|प्रयोगकर्ता}}समूहहरू सम्पादन",
+       "editusergroup": "प्रयोगकर्ता समूहअन लोड अरऽ",
        "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
        "saveusergroups": "सुरक्षित {{GENDER:$1|प्रयोगकर्ता}} समूहहरू",
        "userrights-groupsmember": "को सदस्य:",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "{{SITENAME}} खोजऽ",
-       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल छ|भयाका  केहि अरु फाइलहरू छन्}} ।",
-       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल थियो|भयाका केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
        "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>",
        "default-skin-not-found": "ओह! तमरो विकिको पूर्व निर्धारित खोल जस्तो कि <code dir=\"ltr\">$wgDefaultSkin</code> मी बताइयाको<code>$1</code>, उपलब्ध नाईथिन् ।\n\nतमरो इन्स्टलेसन यी खोलहरूलाई सम्मिलित गर्दछ {{PLURAL:$4|खोल|खोलहरू}}। हेर [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: खोललाई सम्मिलित गर्नु] ताकि तमीलाई जानकारी होस् कि कसरि {{PLURAL:$4|उसलाई|उसलाई सम्मिलित गर्न सकियोस् र निर्धारितलाई तय गद्दे}}।\n\n$2\n\n; यदि तमीले अहिले मीडियाविकि इन्स्टाल गर्याका छौ:\n: तमीले सम्भवत गिटबठे इन्स्टाल गर्याका छौ, वा सिधै स्रोत कोडबठे गर्याका छौ जैको लागि कुनै अर्कै तारिका प्रयोग गरियाको छ । यो आशा अनुरूप छ । कोशिश गर केहि खोलहरू\n[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's मीडियाविकिको खोल डाइरेक्ट्रीबाट डाउनलोड गद्या], जैको लागि तमी:\n:* डाउनलोड गर [https://www.mediawiki.org/wiki/Download टरबल इन्स्टालर], जुन कयौं खोलहरू र विस्तारमी उपलब्ध छन्। तमी खोलहरूको कोड <code>skins/</code> त्यसको डाइरेक्ट्रीबाट कपी-पेस्ट गद्द सक्द्या हौ। \n:* व्यक्तिगत खोलहरू टरबलबठे डाउनलोड गर\n[https://www.mediawiki.org/wiki/Special:SkinDistributor मीडिया विकि] बठे।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins गिटको प्रयोग गरेर डाउनलोड गद्द सकन्छौ]।\n: यदि तमी विकासकर्ता हौ भण्या यसो गद्दा तमरो गिट-रिपजिटरीमी केहि हुनुहुँदैन । \n; यदि तमीले अहिले मीडियाविकिलाई अपग्रेड गर्याका छौ:\n: मीडियाविकि १.२४ र यैको नवीन रूप स्वतः रूपले खोलहरूलाई सक्षम गद्दैनन् (हेर [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:खोलहरूको स्वतः खोज])। तमी निम्नलिखितलाई पेस्ट गद्द सकन्छौ: {{PLURAL:$5|लाइन|लाइनहरू}}  <code>LocalSettings.php</code> मी ताकि {{PLURAL:$5|उसले|सबै}} सक्षम होस् जस्तो कि तमीले इन्स्टाल गर्याको {{PLURAL:$5|खोल|खोलहरू}}को मामिलामी:\n\n<pre dir=\"ltr\">$3</pre>\n\n; यदि तमीले अहिले परिवर्तन गर्याका छौ<code>LocalSettings.php</code>:\n: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।"
index 40d6931..2f0c263 100644 (file)
@@ -7,7 +7,8 @@
                        "Ushau97",
                        "Zhatre",
                        "לערי ריינהארט",
-                       "Glaisher"
+                       "Glaisher",
+                       "MtDu"
                ]
        },
        "tog-hideminor": "ކުދި އުނި އިތުރުތައް އެންމެފަހުގެ ބަދަލުތަކުގެ ލިސްޓުން ފޮރުއްވަވާ",
        "namespaces": "ނަންސްޕޭސަސް",
        "errorpagetitle": "ކުށް",
        "returnto": "އަނބުރާ $1 އަށް ވަޑައިގަންނަވާ!",
-       "tagline": "ވިކިޕީޑިއާ އިން",
+       "tagline": "ވިކިޕީޑިއާ އިން{{SITENAME}}",
        "help": "އެހީ",
        "search": "ހޯއްދަވާ",
        "searchbutton": "ހޯއްދަވާ",
index 3cfb2c2..b30ba0e 100644 (file)
        "nospecialpagetext": "<strong>Ζητήσατε μια μη έγκυρη ειδική σελίδα.</strong>\n\nΈνας κατάλογος έγκυρων ειδικών σελίδων μπορεί να βρεθεί στη σελίδα [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Σφάλμα",
        "databaseerror": "Σφάλμα στη βάση δεδομένων",
-       "databaseerror-text": "Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.\nΑυτό μπορεί να υποδεικνύει ένα σφάλμα στο λογισμικό.",
+       "databaseerror-text": "Παρουσιάστηκε σφάλμα ερωτήματος βάσης δεδομένων.\nΑυτό μπορεί να είναι ένδειξη προγραμματιστικού σφάλματος στο λογισμικό.",
        "databaseerror-textcl": "Παρουσιάστηκε ένα σφάλμα ερωτήματος βάσης δεδομένων.",
        "databaseerror-query": "Ερώτημα: $1",
        "databaseerror-function": "Λειτουργία: $1",
        "accountcreated": "Ο λογαριασμός δημιουργήθηκε",
        "accountcreatedtext": "Ο λογαριασμός χρήστη για τον/την [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|συζήτηση]]) έχει δημιουργηθεί.",
        "createaccount-title": "Δημιουργία λογαριασμού για {{SITENAME}}",
-       "createaccount-text": "Î\9aάÏ\80οιοÏ\82 Î´Î·Î¼Î¹Î¿Ï\8dÏ\81γηÏ\83ε Î­Î½Î±Î½ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Î³Î¹Î± Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η email Ï\83αÏ\82 Ï\83Ï\84ο {{SITENAME}} ($4) Î¼Îµ Ï\84ο Ï\8cνομα \"$2\", Î¼Îµ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 \"$3\". Î\98α Ï\80Ï\81έÏ\80ει Î½Î± Ï\83Ï\85νδεθείÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Ï\84Ï\8eÏ\81α.\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î³Î½Î¿Î®Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î¼Î®Î½Ï\85μα, Î±Î½ Î±Ï\85Ï\84Ï\8cÏ\82 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε ÎµÏ\83Ï\86αλμένα.",
+       "createaccount-text": "Î\9aάÏ\80οιοÏ\82 Î´Î·Î¼Î¹Î¿Ï\8dÏ\81γηÏ\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Î³Î¹Î± Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Ï\83αÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83Ï\84ο {{SITENAME}} ($4) Î¼Îµ Ï\8cνομα Â«$2» ÎºÎ±Î¹ Ï\83Ï\85νθημαÏ\84ικÏ\8c Â«$3». Î¤Ï\8eÏ\81α Î¸Î± Ï\80Ï\81έÏ\80ει Î½Î± Ï\83Ï\85νδεθείÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Î»Î»Î¬Î¾ÎµÏ\84ε Ï\84ο Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\83αÏ\82.\n\nÎ\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î±Î³Î½Î¿Î®Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î¼Î®Î½Ï\85μα, Î±Î½ Î±Ï\85Ï\84Ï\8cÏ\82 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î±Ï\80Ï\8c Î»Î¬Î¸Î¿Ï\82.",
        "login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "login-abort-generic": "Η είσοδος σας απέτυχε - Ματαίωση",
        "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "saveprefs": "Αποθήκευση",
        "restoreprefs": "Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων (σε όλα τα τμήματα)",
        "prefs-editing": "Επεξεργασία",
-       "rows": "Σειρές",
-       "columns": "Στήλες",
        "searchresultshead": "Αποτελέσματα αναζήτησης/Ρυθμίσεις",
        "stub-threshold": "Κατώφλι για μορφοποίηση ως επεκτάσιμου ($1):",
        "stub-threshold-sample-link": "δείγμα",
        "listgrouprights-namespaceprotection-header": "Περιορισμοί ονοματοχώρων",
        "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
        "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
-       "listgrants": "Î\95Ï\80ιÏ\87οÏ\81ηγήÏ\83εις",
-       "listgrants-grant": "Î\95Ï\80ιÏ\87οÏ\81ήγηση",
+       "listgrants": "ΠαÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Ï\80Ï\81Ï\8cÏ\83βαÏ\83ης",
+       "listgrants-grant": "ΠÏ\81Ï\8cÏ\83βαση",
        "listgrants-rights": "Δικαιώματα",
        "trackingcategories": "Κατηγορίες παρακολούθησης",
        "trackingcategories-summary": "Αυτή η σελίδα εμφανίζει τις κατηγορίες παρακολούθησης το περιεχόμενο των οποίων συμπληρώνεται αυτόματα από το λογισμικό MediaWiki. Τα ονόματά τους μπορεί να αλλαχθούν με την αλλαγή των σχετικών μηνυμάτων συστήματος στον ονοματοχώρο {{ns:8}}.",
        "pageinfo-toolboxlink": "Πληροφορίες σελίδας",
        "pageinfo-redirectsto": "Ανακατευθύνει σε",
        "pageinfo-redirectsto-info": "πληροφορίες",
-       "pageinfo-contentpage": "Î\9aαÏ\84αμετράται ως σελίδα περιεχομένου",
+       "pageinfo-contentpage": "ΠÏ\81οÏ\83μετράται ως σελίδα περιεχομένου",
        "pageinfo-contentpage-yes": "Ναι",
        "pageinfo-protect-cascading": "Οι προστασίες ξεκινούν τη διαδοχή τους από εδώ",
        "pageinfo-protect-cascading-yes": "Ναι",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Αναζήτηση σε {{SITENAME}}",
        "searchsuggest-containing": "περιέχει...",
-       "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
-       "api-error-copyuploaddisabled": "Το ανέβασμα από URL είναι απενεργοποιημένο σε αυτόν το διακομιστή.",
-       "api-error-duplicate": "Υπάρχει το{{PLURAL:$1|είναι ένα άλλο αρχείο|είναι κάποια άλλα αρχεία}} ήδη στο site με το ίδιο περιεχόμενο.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη άλλο αρχείο|Υπήρχαν ήδη άλλα αρχεία}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
-       "api-error-empty-file": "Το αρχείο που υποβάλλατε ήταν κενό.",
        "api-error-emptypage": "Η δημιουργία νέων, κενών σελιδών δεν επιτρέπετε.",
-       "api-error-fetchfileerror": "Εσωτερικό σφάλμα: κάτι πήγε στραβά κατά την ανάκτηση του αρχείου.",
-       "api-error-fileexists-forbidden": "Ένα αρχείο με το όνομα \"$1\" υπάρχει ήδη, και δεν είναι δυνατό να αντικατασταθεί.",
-       "api-error-fileexists-shared-forbidden": "Ένα αρχείο με όνομα \"$1\" υπάρχει ήδη στο χώρο φύλαξης κοινόχρηστων αρχείων και δεν είναι δυνατό να αντικατασταθεί.",
-       "api-error-file-too-large": "Το αρχείο που υποβάλλατε ήταν πολύ μεγάλο.",
-       "api-error-filename-tooshort": "Το όνομα αρχείου είναι πολύ μικρό.",
-       "api-error-filetype-banned": "Αυτός ο τύπος αρχείου έχει απαγορευτεί.",
-       "api-error-filetype-banned-type": "$1 δεν είναι {{PLURAL:$4|επιτρεπόμενος τύπος αρχείου|επιτρεπόμενοι τύποι αρχείων}}.  {{PLURAL:$3|Επιτρεπόμενος τύπος αρχείων|Επιτρεπόμενοι τύποι αρχείων}} είναι το $2.",
-       "api-error-filetype-missing": "Το αρχείο δεν έχει επέκταση.",
-       "api-error-hookaborted": "Η τροποποίηση που επιχειρήσατε να κάνετε ματαιώθηκε από ένα άγκιστρο της επέκτασης.",
-       "api-error-http": "Εσωτερικό σφάλμα: δεν είναι δυνατή η σύνδεση με το διακομιστή.",
-       "api-error-illegal-filename": "Αυτό το όνομα αρχείου δεν επιτρέπεται.",
-       "api-error-internal-error": "Εσωτερικό σφάλμα: κάτι πήγε στραβά με την επεξεργασία της επιφόρτωσής σας στο wiki.",
-       "api-error-invalid-file-key": "Εσωτερικό σφάλμα: το αρχείο δεν βρέθηκε στην προσωρινή αποθήκευση.",
-       "api-error-missingparam": "Εσωτερικό σφάλμα: λείπουν παράμετροι από το αίτημα.",
-       "api-error-missingresult": "Εσωτερικό σφάλμα: δεν ήταν δυνατό να προσδιοριστεί εάν η αντίγραφή ολοκληρώθηκε με επιτυχία.",
-       "api-error-mustbeloggedin": "Θα πρέπει να συνδεθείτε για να φορτώσετε τα αρχεία.",
-       "api-error-mustbeposted": "Εσωτερικό σφάλμα: το αίτημα απαιτεί HTTP POST.",
-       "api-error-noimageinfo": "Η αποστολή πέτυχε, αλλά ο διακομιστής δεν μας παρείχε πληροφορίες σχετικά με το αρχείο.",
-       "api-error-nomodule": "Εσωτερικό σφάλμα: δεν υπάρχει σετ επιφόρτωσης.",
-       "api-error-ok-but-empty": "Εσωτερικό σφάλμα: δεν υπάρχει απάντηση από το διακομιστή.",
-       "api-error-overwrite": "Αντικατάσταση ενός υπάρχοντος αρχείου δεν επιτρέπεται.",
-       "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
-       "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
-       "api-error-stashedfilenotfound": "Το κρυμμένο αρχείο δεν βρέθηκε κατά την προσπάθεια να το ανεβάσετε από αποθετήριό του.",
-       "api-error-stashpathinvalid": "Η διαδρομή, στην οποία το κρυμμένο αρχείο θα έπρεπε να έχει βρεθεί δεν ήταν έγκυρη.",
-       "api-error-stashfilestorage": "Παρουσιάστηκε ένα σφάλμα κατά την αποθήκευση του αρχείου στην κρύπτη.",
-       "api-error-stashzerolength": "Ο διακομιστής δεν θα μπορούσε να κρύψει το αρχείο, επειδή είχε μηδενικό μήκος.",
-       "api-error-stashnotloggedin": "Θα πρέπει να συνδεθείτε για να αποθηκεύσετε τα αρχεία στο αποθετήριο φόρτωσης.",
-       "api-error-stashnosuchfilekey": "Το κλειδί αρχείου στο οποίο προσπαθούσατε να αποκτήσετε πρόσβαση στο αποθετήριο δεν υπάρχει.",
-       "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
-       "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
-       "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
-       "api-error-unknown-error": "Εσωτερικό σφάλμα: κάτι πήγε στραβά, όταν προσπαθείσατε να φορτώσετε το αρχείο σας.",
+       "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-unknown-warning": "Άγνωστη προειδοποίηση: «$1».",
        "api-error-unknownerror": "Άγνωστο σφάλμα: «$1».",
-       "api-error-uploaddisabled": "Το ανέβασμα αρχείων είναι απενεργοποιημένο σε αυτό το wiki.",
-       "api-error-verification-error": "Αυτό το αρχείο μπορεί να είναι κατεστραμμένο, ή να έχει λανθασμένη επέκταση.",
        "duration-seconds": "$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}}",
        "duration-minutes": "$1 {{PLURAL:$1|λεπτό|λεπτά}}",
        "duration-hours": "$1 {{PLURAL:$1|ώρα|ώρες}}",
        "limitreport-templateargumentsize-value": "$1 από $2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Μεγαλύτερο βάθος ανάπτυξης",
        "limitreport-expensivefunctioncount": "Πλήθος ακριβών συναρτήσεων συντακτικού αναλυτή",
-       "expandtemplates": "Î\95Ï\80έκÏ\84εινε Ï\84α Ï\80Ï\81Ï\8cÏ\84Ï\85Ï\80α",
+       "expandtemplates": "Î\95Ï\80έκÏ\84αÏ\83η Ï\80Ï\81οÏ\84Ï\8dÏ\80Ï\89ν",
        "expand_templates_intro": "Αυτή η ειδική σελίδα παίρνει κείμενο και αναπτύσσει όλα τα πρότυπα σε αυτό αναδρομικά. \nΕπίσης αναπτύσσει συναρτήσεις συντακτικού αναλυτή όπως η\n<nowiki>{{</nowiki>#language:…}}, και μεταβλητές όπως η\n<nowiki>{{</nowiki>CURRENTDAY}}.\nΟυσιαστικά επεκτείνει οτιδήποτε βρίσκεται σε διπλές αγκύλες.",
        "expand_templates_title": "Τίτλων συμφραζόμενων, για την {{FULLPAGENAME}} κ.τ.λ.:",
        "expand_templates_input": "Κείμενο εισόδου:",
index 1a206aa..31bc41a 100644 (file)
                        "Reedy",
                        "Shirayuki",
                        "The Evil IP address",
-                       "Vogone"
+                       "Vogone",
+                       "Alluk.",
+                       "Andibing",
+                       "Aursani",
+                       "Caliburn",
+                       "Chase me ladies, I'm the Cavalry",
+                       "Codynguyen1116",
+                       "Don Alessandro",
+                       "Ed g2s",
+                       "EpochFail",
+                       "Esketti",
+                       "Issyl0",
+                       "Lemondoge",
+                       "Paladox",
+                       "SamanthaNguyen",
+                       "Usandaru555"
                ]
        },
+       "tog-underline": "Link underlining:",
+       "tog-hideminor": "Hide minor edits from recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits from recent changes",
+       "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-hidecategorization": "Hide categorisation of pages",
+       "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
+       "tog-usenewrc": "Group changes by page in recent changes and watchlist",
+       "tog-numberheadings": "Auto-number headings",
+       "tog-showtoolbar": "Show edit toolbar",
+       "tog-editondblclick": "Edit pages on double click",
+       "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
        "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
        "tog-watchdefault": "Add pages and files I edit to my watchlist",
        "tog-watchmoves": "Add pages and files I move to my watchlist",
        "tog-watchdeletion": "Add pages and files I delete to my watchlist",
+       "tog-watchrollback": "Add pages where I have performed a rollback to my watchlist",
+       "tog-minordefault": "Mark all edits minor by default",
+       "tog-previewontop": "Show preview before edit box",
+       "tog-previewonfirst": "Show preview on first edit",
+       "tog-enotifwatchlistpages": "Email me when a page or a file on my watchlist has changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page has changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": "Show the number of watching users",
+       "tog-oldsig": "Your existing signature:",
+       "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
+       "tog-uselivepreview": "ක්‍රියාත්මකව අති පෙරහුරුවක් පෙන්වන්න",
+       "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
+       "tog-watchlisthideown": "Hide my edits from the watchlist",
+       "tog-watchlisthidebots": "Hide bot edits from the watchlist",
+       "tog-watchlisthideminor": "Hide minor edits from the watchlist",
+       "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
+       "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "Do not show page content below diffs",
+       "tog-showhiddencats": "Show hidden categories",
+       "tog-norollbackdiff": "Don't show diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection when logged in",
+       "underline-always": "Always",
+       "underline-never": "Never",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "Edit area font style:",
+       "editfont-default": "Browser default",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "Sunday",
+       "monday": "Monday",
+       "tuesday": "Tuesday",
+       "wednesday": "Wednesday",
+       "thursday": "Thursday",
+       "friday": "Friday",
+       "saturday": "Saturday",
+       "sun": "Sun",
+       "mon": "Mon",
+       "tue": "Tue",
+       "wed": "Wed",
+       "thu": "Thu",
+       "fri": "Fri",
+       "sat": "Sat",
+       "january": "January",
+       "february": "February",
+       "march": "March",
+       "april": "April",
+       "may_long": "May",
+       "june": "June",
+       "july": "July",
+       "august": "August",
+       "september": "September",
+       "october": "October",
+       "november": "November",
+       "december": "December",
+       "january-gen": "January",
+       "february-gen": "February",
+       "march-gen": "March",
+       "april-gen": "April",
+       "may-gen": "May",
+       "june-gen": "June",
+       "july-gen": "July",
+       "august-gen": "August",
+       "september-gen": "September",
+       "october-gen": "October",
+       "november-gen": "November",
+       "december-gen": "December",
+       "jan": "Jan",
+       "feb": "Feb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Aug",
+       "sep": "Sep",
+       "oct": "Oct",
+       "nov": "Nov",
+       "dec": "Dec",
+       "january-date": "January $1",
+       "february-date": "February $1",
+       "march-date": "March $1",
+       "april-date": "April $1",
+       "may-date": "May $1",
+       "june-date": "June $1",
+       "july-date": "July $1",
+       "august-date": "August $1",
+       "september-date": "September $1",
+       "october-date": "October $1",
+       "november-date": "November $1",
+       "december-date": "December $1",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
        "category_header": "Pages in category ‘$1’",
+       "subcategories": "Subcategories",
        "category-media-header": "Media in category ‘$1’",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "Hidden categories",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Indexed pages",
+       "noindex-category": "Noindexed pages",
+       "broken-file-category": "Pages with broken file links",
+       "about": "About",
+       "article": "Content page",
+       "newwindow": "(opens in new window)",
+       "cancel": "Cancel",
+       "moredotdotdot": "More...",
+       "morenotlisted": "This list may be complete.",
+       "mypage": "Page",
+       "mytalk": "Talk",
+       "anontalk": "Talk",
+       "navigation": "Navigation",
+       "and": "&#32;and",
+       "qbfind": "Find",
+       "qbbrowse": "Browse",
+       "qbedit": "Edit",
+       "qbpageoptions": "This page",
+       "qbmyoptions": "My pages",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "actions": "Actions",
+       "namespaces": "Namespaces",
+       "variants": "Variants",
+       "navigation-heading": "Navigation menu",
+       "errorpagetitle": "Error",
+       "returnto": "Return to $1.",
+       "tagline": "From {{SITENAME}}",
+       "help": "Help",
+       "search": "Search",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
+       "searchbutton": "Search",
+       "go": "Go",
+       "searcharticle": "Go",
+       "history": "Page history",
+       "history_short": "History",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "Printable version",
+       "permalink": "Permanent link",
+       "print": "Print",
+       "view": "View",
+       "view-foreign": "View on $1",
+       "edit": "Edit",
+       "edit-local": "Edit local description",
+       "create": "Create",
+       "create-local": "Add local description",
+       "editthispage": "Edit this page",
+       "create-this-page": "Create this page",
+       "delete": "Delete",
+       "deletethispage": "Delete this page",
+       "undeletethispage": "Undelete this page",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "Protect",
+       "protect_change": "ترميميو",
+       "protectthispage": "Protect this page",
+       "unprotect": "تحفظ جي سطح بدلايو",
+       "unprotectthispage": "Change protection of this page",
+       "newpage": "New page",
+       "talkpage": "Discuss this page",
+       "talkpagelinktext": "Talk",
+       "specialpage": "Special page",
+       "personaltools": "Personal tools",
+       "articlepage": "View content page",
+       "talk": "Discussion",
+       "views": "Views",
+       "toolbox": "Tools",
+       "userpage": "View user page",
+       "projectpage": "View project page",
+       "imagepage": "View file page",
+       "mediawikipage": "View message page",
+       "templatepage": "View template page",
+       "viewhelppage": "View help page",
+       "categorypage": "View category page",
+       "viewtalkpage": "View discussion",
+       "otherlanguages": "Muilla kielillä",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "Redirect page",
+       "redirectto": "Redirect to:",
+       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
+       "protectedpage": "Protected page",
+       "jumpto": "Jump to:",
+       "jumptonavigation": "navigation",
+       "jumptosearch": "search",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "Timeout waiting for the lock",
+       "pool-queuefull": "Pool queue is full",
+       "pool-errorunknown": "Unknown error",
+       "pool-servererror": "The pool counter service is not available ($1).",
+       "poolcounter-usage-error": "Usage error: $1",
+       "aboutsite": "About {{SITENAME}}",
+       "aboutpage": "Project:About",
+       "copyright": "Content is available under $1 unless otherwise noted.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Current events",
+       "currentevents-url": "Project:Current events",
+       "disclaimers": "Disclaimers",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "Editing help",
+       "helppage-top-gethelp": "Help",
+       "mainpage": "Main Page",
+       "mainpage-description": "Main page",
+       "policy-url": "Project:Policy",
+       "portal": "Community portal",
+       "portal-url": "Project:Community portal",
+       "privacy": "Privacy policy",
+       "privacypage": "Project:Privacy policy",
+       "badaccess": "Permission error",
+       "badaccess-group0": "You are not allowed to execute the action you have requested.",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "Version $1 of MediaWiki required",
+       "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
+       "ok": "OK",
        "retrievedfrom": "Retrieved from ‘$1’",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "You have new messages on $1",
+       "editsection": "edit",
+       "editold": "edit",
+       "viewsourceold": "view source",
+       "editlink": "edit",
+       "viewsourcelink": "view source",
+       "editsectionhint": "Edit section: $1",
+       "toc": "Contents",
+       "showtoc": "show",
+       "hidetoc": "hide",
+       "collapsible-collapse": "Collapse",
+       "collapsible-expand": "Expand",
+       "confirmable-confirm": "Are {{GENDER:$1|you}} sure?",
+       "confirmable-yes": "Yes",
+       "confirmable-no": "No",
+       "thisisdeleted": "View or restore $1?",
+       "viewdeleted": "View $1?",
+       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Invalid subscription feed type.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 Atom feed",
        "page-rss-feed": "‘$1’ RSS feed",
        "page-atom-feed": "‘$1’ Atom feed",
+       "red-link-title": "$1 (page does not exist)",
+       "sort-descending": "Sort descending",
+       "sort-ascending": "Sort ascending",
+       "nstab-main": "Page",
+       "nstab-user": "User page",
+       "nstab-media": "Media page",
+       "nstab-special": "Special page",
+       "nstab-project": "Project page",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Message",
+       "nstab-template": "Template",
+       "nstab-help": "Help page",
+       "nstab-category": "Category",
+       "mainpage-nstab": "Main page",
+       "nosuchaction": "No such action",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "No such special page",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
        "missing-article": "The database did not find the text of a page that it should have found, named ‘$1’ $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
        "filecopyerror": "Could not copy file ‘$1’ to ‘$2’.",
        "filerenameerror": "Could not rename file ‘$1’ to ‘$2.’",
        "cannotdelete": "The page or file ‘$1’ could not be deleted.\nIt may have already been deleted by someone else.",
        "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
        "editinginterface": "'''Warning:''' You are editing a page which is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-       "cascadeprotected": "This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the ‘cascading’ option turned on:\n$2",
+       "cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "pt-login": "Log in",
+       "pt-createaccount": "Create account",
+       "botpasswords-no-central-id": "To use bot passwords, you must be logged in to a centralised account.",
+       "savearticle": "Save page",
+       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "loginreqlink": "log in",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
+       "template-protected": "(protected)",
+       "revisionasof": "Revision as of $1",
+       "previousrevision": "← Older revision",
+       "cur": "cur",
+       "lineno": "Line $1:",
+       "editundo": "undo",
+       "searchresults": "Search results",
+       "searchresults-title": "Search results for \"$1\"",
+       "prevn": "previous {{PLURAL:$1|$1}}",
+       "nextn": "next {{PLURAL:$1|$1}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "searchprofile-articles": "Content pages",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Everything",
+       "searchprofile-advanced": "Advanced",
+       "searchprofile-articles-tooltip": "Search in $1",
+       "searchprofile-images-tooltip": "Search for files",
+       "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
+       "searchprofile-advanced-tooltip": "Search in custom namespaces",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
        "prefs-i18n": "Internationalisation",
+       "right-writeapi": "Use of the write API",
+       "grant-group-customization": "Customisation and preferences",
+       "newuserlogpage": "User creation log",
+       "recentchanges": "Recent changes",
+       "recentchanges-legend": "Recent changes options",
+       "recentchanges-label-newpage": "This edit created a new page",
+       "recentchanges-label-minor": "This is a minor edit",
+       "recentchanges-label-bot": "This edit was performed by a bot",
+       "rclistfrom": "Show new changes starting from $2, $3",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhideliu": "$1 registered users",
+       "rclinks": "Show last $1 changes in last $2 days<br />$3",
+       "diff": "diff",
+       "hist": "hist",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
+       "recentchangeslinked-toolbox": "Related changes",
+       "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+       "upload": "Upload file",
        "license": "Licencing:",
        "license-header": "Licencing",
        "licenses-edit": "Edit licence options",
+       "file-anchor-link": "File",
+       "filehist": "File history",
+       "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
+       "filehist-current": "current",
+       "filehist-datetime": "Date/Time",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-user": "User",
+       "filehist-dimensions": "Dimensions",
+       "filehist-comment": "Comment",
+       "imagelinks": "File usage",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "randompage": "Random page",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "uncategorizedpages": "Uncategorised pages",
        "uncategorizedcategories": "Uncategorised categories",
        "uncategorizedimages": "Uncategorised files",
        "uncategorizedtemplates": "Uncategorised templates",
+       "newpages": "New pages",
+       "allpagessubmit": "Go",
+       "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorise applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "wlshowhidecategorization": "page categorisation",
+       "rollbacklink": "rollback",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been cancelled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
-       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalised).",
-       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
-       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
+       "protect_expiry_invalid": "Expiry time is invalid.",
+       "protect_expiry_old": "Expiry time is in the past.",
+       "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "protect-existing-expiry-infinity": "Existing expiry time: infinite",
+       "namespace": "Namespace:",
+       "invert": "Invert selection",
+       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "blanknamespace": "(Main)",
+       "whatlinkshere": "What links here",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalised).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipbexpiry": "Expiry:",
        "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behaviour/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "blocklink": "block",
+       "contribslink": "contribs",
+       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
+       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
        "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organisation and inform them of this serious security problem.",
-       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorised into the new one.",
+       "databaselocked": "The database is already locked.",
+       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
        "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
        "allmessages-filter": "Filter by customisation state:",
+       "thumbnail-more": "Enlarge",
        "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialised. The revision was reported to use content model $3 serialised as $4.",
+       "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory",
+       "tooltip-ca-talk": "Discussion about the content page",
+       "tooltip-ca-edit": "Edit this page",
+       "tooltip-ca-addsection": "Start a new section",
+       "tooltip-ca-history": "Past revisions of this page",
+       "tooltip-ca-watch": "Add this page to your watchlist",
+       "tooltip-search": "Search {{SITENAME}}",
+       "tooltip-search-go": "Go to a page with this exact name if it exists",
+       "tooltip-search-fulltext": "Search pages for this text",
+       "tooltip-p-logo": "Visit the main page",
+       "tooltip-n-mainpage": "Visit the main page",
+       "tooltip-n-mainpage-description": "Visit the main page",
+       "tooltip-n-portal": "About the project, what you can do, and where to find things",
+       "tooltip-n-currentevents": "Find background information on current events",
+       "tooltip-n-recentchanges": "A list of recent changes in the wiki",
+       "tooltip-n-randompage": "Load a random page",
+       "tooltip-n-help": "The place to find out",
+       "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
+       "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
+       "tooltip-feed-atom": "Atom feed for this page",
+       "tooltip-t-upload": "Upload files",
+       "tooltip-t-specialpages": "A list of all special pages",
+       "tooltip-t-print": "Printable version of this page",
+       "tooltip-t-permalink": "Permanent link to this revision of the page",
+       "tooltip-ca-nstab-main": "View the content page",
+       "tooltip-ca-nstab-special": "This is a special page, and it cannot be edited",
+       "tooltip-ca-nstab-image": "View the file page",
+       "tooltip-ca-nstab-category": "View the category page",
+       "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
+       "pageinfo-toolboxlink": "Page information",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "show-big-image": "Original file",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "metadata": "Metadata",
        "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-fields": "Image metadata fields listed in this message will be included on the image page display when the metadata table is collapsed.\nOthers will be hidden by default.\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-ycbcrcoefficients": "Colour space transformation matrix coefficients",
        "exif-colorspace": "Colour space",
        "exif-datetimedigitized": "Date and time of digitising",
        "exif-gpsdestdistance-k": "Kilometres",
        "exif-ycbcrpositioning-1": "Centred",
        "exif-iimcategory-lab": "Labour",
+       "namespacesall": "all",
        "confirmemail_invalidated": "Email address confirmation cancelled",
        "version-license": "MediaWiki Licence",
        "version-ext-license": "Licence",
        "version-license-not-found": "No detailed licence information was found for this extension.",
        "version-credits-summary": "We would like to recognise the following persons for their contribution to [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nMediaWiki 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 Licence for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public Licence] along with this programme; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
-       "feedback-error1": "Error: Unrecognised result from API",
+       "specialpages": "Special pages",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
-       "protect_expiry_invalid": "Expiry time is invalid.",
-       "protect_expiry_old": "Expiry time is in the past.",
-       "protect-existing-expiry": "Existing expiry time: $3, $2",
-       "protect-existing-expiry-infinity": "Existing expiry time: infinite",
-       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->"
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "feedback-error1": "Error: Unrecognised result from API",
+       "searchsuggest-search": "Search {{SITENAME}}"
 }
index 733f003..9f03ce9 100644 (file)
        "searcharticle": "Go",
        "history": "Page history",
        "history_short": "History",
+       "history_small": "history",
        "updatedmarker": "updated since my last visit",
        "printableversion": "Printable version",
        "permalink": "Permanent link",
        "blockedtitle": "User is blocked",
        "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "systemblockedtext": "Your username or IP address has been automatically blocked by MediaWiki.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.",
        "blockednoreason": "no reason given",
        "whitelistedittext": "Please $1 to edit pages.",
        "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
        "saveprefs": "Save",
        "restoreprefs": "Restore all default settings (in all sections)",
        "prefs-editing": "Editing",
-       "rows": "Rows:",
-       "columns": "Columns:",
        "searchresultshead": "Search",
        "stub-threshold": "Threshold for stub link formatting ($1):",
        "stub-threshold-sample-link": "sample",
        "action-upload_by_url": "upload this file from a URL",
        "action-writeapi": "use the write API",
        "action-delete": "delete this page",
-       "action-deleterevision": "delete this revision",
-       "action-deletedhistory": "view this page's deleted history",
+       "action-deleterevision": "delete revisions",
+       "action-deletelogentry": "delete log entries",
+       "action-deletedhistory": "view a page's deleted history",
+       "action-deletedtext": "view deleted revision text",
        "action-browsearchive": "search deleted pages",
-       "action-undelete": "undelete this page",
-       "action-suppressrevision": "review and restore this hidden revision",
+       "action-undelete": "undelete pages",
+       "action-suppressrevision": "review and restore hidden revisions",
        "action-suppressionlog": "view this private log",
        "action-block": "block this user from editing",
        "action-protect": "change protection levels for this page",
        "action-userrights-interwiki": "edit user rights of users on other wikis",
        "action-siteadmin": "lock or unlock the database",
        "action-sendemail": "send emails",
+       "action-editmyoptions": "edit your preferences",
        "action-editmywatchlist": "edit your watchlist",
        "action-viewmywatchlist": "view your watchlist",
        "action-viewmyprivateinfo": "view your private information",
        "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Show",
+       "rcfilters-activefilters": "Active filters",
+       "rcfilters-restore-default-filters": "Restore default filters",
+       "rcfilters-clear-all-filters": "Clear all filters",
+       "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
+       "rcfilters-invalid-filter": "Invalid filter",
+       "rcfilters-empty-filter": "No active filters. All contributions are shown.",
+       "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-filtergroup-registration": "User registration",
+       "rcfilters-filter-registered-label": "Registered",
+       "rcfilters-filter-registered-description": "Logged-in editors.",
+       "rcfilters-filter-unregistered-label": "Unregistered",
+       "rcfilters-filter-unregistered-description": " Editors who aren’t logged in.",
+       "rcfilters-filtergroup-authorship": "Edit authorship",
+       "rcfilters-filter-editsbyself-label": "Your own edits",
+       "rcfilters-filter-editsbyself-description": "Edits by you.",
+       "rcfilters-filter-editsbyother-label": "Edits by others",
+       "rcfilters-filter-editsbyother-description": "Edits created by other users (not you).",
+       "rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Newcomers",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
+       "rcfilters-filter-userExpLevel-learner-label": "Learners",
+       "rcfilters-filter-userExpLevel-learner-description": "More days of activity and edits than \"Newcomers\" but fewer than \"Experienced users\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Experienced users",
+       "rcfilters-filter-userExpLevel-experienced-description": "More than 30 days of activity and 500 edits.",
+       "rcfilters-filtergroup-automated": "Automated contributions",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Edits made by automated tools.",
+       "rcfilters-filter-humans-label": "Human (not bot)",
+       "rcfilters-filter-humans-description": "Edits made by human editors.",
+       "rcfilters-filtergroup-significance": "Significance",
+       "rcfilters-filter-minor-label": "Minor edits",
+       "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
+       "rcfilters-filter-major-label": "Non-minor edits",
+       "rcfilters-filter-major-description": "Edits not labeled as minor.",
+       "rcfilters-filtergroup-changetype": "Type of change",
+       "rcfilters-filter-pageedits-label": "Page edits",
+       "rcfilters-filter-pageedits-description": "Edits to wiki content, discussions, category descriptions....",
+       "rcfilters-filter-newpages-label": "Page creations",
+       "rcfilters-filter-newpages-description": "Edits that make new pages.",
+       "rcfilters-filter-categorization-label": "Category changes",
+       "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.",
+       "rcfilters-filter-logactions-label": "Logged actions",
+       "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads....",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "uncategorizedimages-summary": "",
        "uncategorizedtemplates": "Uncategorized templates",
        "uncategorizedtemplates-summary": "",
+       "uncategorized-categories-exceptionlist": " # Contains a list of categories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Unused categories",
        "unusedcategories-summary": "",
        "unusedimages": "Unused files",
        "changecontentmodel-emptymodels-title": "No content models available",
        "changecontentmodel-emptymodels-text": "The content on [[:$1]] cannot be converted to any type.",
        "log-name-contentmodel": "Content model change log",
-       "log-description-contentmodel": "Events related to the content models of a page",
+       "log-description-contentmodel": "This page lists changes to the content model of pages, and pages that were created with a content model other than the default.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
        "logentry-contentmodel-change-revertlink": "revert",
        "sorbs": "DNSBL",
        "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
        "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
+       "softblockrangesreason": "Anonymous contributions are not allowed from your IP address ($1). Please log in.",
        "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
        "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
        "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
        "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
        "cant-move-category-page": "You do not have permission to move category pages.",
        "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
+       "cant-move-subpages": "You do not have permission to move subpages.",
+       "namespace-nosubpages": "Namespace \"$1\" does not allow subpages.",
        "newtitle": "New title:",
        "move-watch": "Watch source page and target page",
        "movepagebtn": "Move page",
        "pageinfo-length": "Page length (in bytes)",
        "pageinfo-article-id": "Page ID",
        "pageinfo-language": "Page content language",
+       "pageinfo-language-change": "change",
        "pageinfo-content-model": "Page content model",
        "pageinfo-content-model-change": "change",
        "pageinfo-robot-policy": "Indexing by robots",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Search {{SITENAME}}",
        "searchsuggest-containing": "containing...",
-       "api-error-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
-       "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
        "api-error-badtoken": "Internal error: Bad token.",
-       "api-error-blocked": "You have been blocked from editing.",
-       "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-empty-file": "The file you submitted was empty.",
        "api-error-emptypage": "Creating new, empty pages is not allowed.",
-       "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
-       "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
-       "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
-       "api-error-file-too-large": "The file you submitted was too large.",
-       "api-error-filename-tooshort": "The filename is too short.",
-       "api-error-filetype-banned": "This type of file is banned.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
-       "api-error-filetype-missing": "The filename is missing an extension.",
-       "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
-       "api-error-http": "Internal error: Unable to connect to server.",
-       "api-error-illegal-filename": "The filename is not allowed.",
-       "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
-       "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
-       "api-error-missingparam": "Internal error: Missing parameters on request.",
-       "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
-       "api-error-mustbeloggedin": "You must be logged in to upload files.",
-       "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
-       "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
-       "api-error-nomodule": "Internal error: No upload module set.",
-       "api-error-ok-but-empty": "Internal error: No response from server.",
-       "api-error-overwrite": "Overwriting an existing file is not allowed.",
-       "api-error-ratelimited": "You're trying to upload more files in a short space of time than this wiki allows.\nPlease try again in a few minutes.",
-       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
-       "api-error-stasherror": "There was an error while uploading the file to stash.",
-       "api-error-stashedfilenotfound": "The stashed file was not found when attempting to upload it from the stash.",
-       "api-error-stashpathinvalid": "The path at which the stashed file should have been found was invalid.",
-       "api-error-stashfilestorage": "There was an error while storing the file in the stash.",
-       "api-error-stashzerolength": "The server could not stash the file, because it had zero length.",
-       "api-error-stashnotloggedin": "You must be logged in to save files in the upload stash.",
-       "api-error-stashwrongowner": "The file you were attempting to access in the stash does not belong to you.",
-       "api-error-stashnosuchfilekey": "The file key you were attempting to access in the stash does not exist.",
-       "api-error-timeout": "The server did not respond within the expected time.",
-       "api-error-unclassified": "An unknown error occurred.",
-       "api-error-unknown-code": "Unknown error: \"$1\".",
-       "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
+       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-unknown-warning": "Unknown warning: \"$1\".",
        "api-error-unknownerror": "Unknown error: \"$1\".",
-       "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
-       "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
-       "api-error-was-deleted": "A file of this name has been previously uploaded and subsequently deleted.",
        "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
        "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
        "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
        "pagelang-language": "Language",
        "pagelang-use-default": "Use default language",
        "pagelang-select-lang": "Select language",
+       "pagelang-reason": "Reason",
        "pagelang-submit": "Submit",
+       "pagelang-nonexistent-page": "The page $1 does not exist.",
+       "pagelang-unchanged-language": "The page $1 is already set to language $2.",
+       "pagelang-unchanged-language-default": "The page $1 is already set to the wiki's default content language.",
+       "pagelang-db-failed": "The database failed to change the page language.",
        "right-pagelang": "Change page language",
        "action-pagelang": "change the page language",
        "log-name-pagelang": "Language change log",
        "sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.",
        "randomrootpage": "Random root page",
        "log-action-filter-block": "Type of block:",
-       "log-action-filter-contentmodel": "Type of contentmodel modification:",
+       "log-action-filter-contentmodel": "Type of content model change:",
        "log-action-filter-delete": "Type of deletion:",
        "log-action-filter-import": "Type of import:",
        "log-action-filter-managetags": "Type of tag management action:",
        "log-action-filter-block-block": "Block",
        "log-action-filter-block-reblock": "Block modification",
        "log-action-filter-block-unblock": "Unblock",
-       "log-action-filter-contentmodel-change": "Change of Contentmodel",
-       "log-action-filter-contentmodel-new": "Creation of page with non-standard Contentmodel",
+       "log-action-filter-contentmodel-change": "Change of content model",
+       "log-action-filter-contentmodel-new": "Creation of page with non-default content model",
        "log-action-filter-delete-delete": "Page deletion",
        "log-action-filter-delete-delete_redir": "Redirect overwrite",
        "log-action-filter-delete-restore": "Page undeletion",
        "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revision $1",
+       "pageid": "page ID $1"
 }
index 31f0641..5eb0d21 100644 (file)
@@ -49,7 +49,8 @@
                        "Psychoslave",
                        "Orikrin1998",
                        "Gamliel Fishkin",
-                       "Kastanoto"
+                       "Kastanoto",
+                       "Rafaneta"
                ]
        },
        "tog-underline": "Substrekado de ligiloj:",
        "searcharticle": "Ek",
        "history": "Historio de paĝo",
        "history_short": "Historio",
+       "history_small": "historio",
        "updatedmarker": "ĝisdatigita de post mia lasta vizito",
        "printableversion": "Presebla versio",
        "permalink": "Konstanta ligilo",
        "views": "Vidoj",
        "toolbox": "Iloj",
        "tool-link-userrights": "Ŝanĝi grupojn de ĉi tiu {{GENDER:$1|uzanto}}",
+       "tool-link-userrights-readonly": "Vidi grupojn de {{GENDER:$1|uzanto}}",
        "tool-link-emailuser": "Sendi retpoŝton al ĉi tiu {{GENDER:$1|uzanto}}",
        "userpage": "Vidi uzantopaĝon",
        "projectpage": "Rigardi projektopaĝon",
        "botpasswords-label-delete": "Forigi",
        "botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
        "botpasswords-label-grants": "Uzeblaj permesdonoj:",
-       "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permesdonoj]] por pli da informo.",
+       "botpasswords-help-grants": "Rajtigiloj permesas aliron al rajtoj jam provizita al via uzantkonto. Ebligi rajtigilojn ĉi tie ne provizas aliron al ajnaj rajtoj ke via uzantkonto ne alie havus. Vidu la [[Special:MyLanguage/Special:ListGrants|tablo de rajtigiloj]] por pli da informo.",
        "botpasswords-label-grants-column": "Permeso donita",
        "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
        "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?",
        "passwordreset-emaildisabled": "Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.",
        "passwordreset-username": "Uzantnomo:",
        "passwordreset-domain": "Domajno:",
-       "passwordreset-capture": "Vidi la rezultan retpoŝton?",
-       "passwordreset-capture-help": "Se vi markis ĉi tiun skatoleton, la retpoŝto (kun provizora pasvorto) estos montrita al vi kaj estos sendita al la uzanto.",
        "passwordreset-email": "Retpoŝtadreso:",
        "passwordreset-emailtitle": "Kontaj detaloj en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iu (verŝajne vi, de IP-adreso $1) petis restarigon de via pasvorto por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi ensalutu kaj elektu novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas\nŝanĝi ĝin, vi povas ignori ĉi tiun mesaĝon kaj plu uzi vian \nmalnovan pasvorton.",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
        "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
-       "passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtoj}} por pasvorta restarigo estis {{PLURAL:$1|sendita|senditaj}}. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas montrita ĉi tie.",
-       "passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzanto}} malsukcesis: $1 La {{PLURAL:$3|uzantonomo kaj pasvorto|listo de uzantonomoj kaj pasvortoj}} estas montrita ĉi tie.",
        "passwordreset-nocaller": "Vokanto devas esti provizita",
        "passwordreset-nosuchcaller": "Vokanto ne ekzistas: $1",
        "passwordreset-ignored": "La pasvorta reensignado ne estis pritraktita. Eble neniu provizanto estis formita?",
        "blockedtitle": "La uzanto estas forbarita.",
        "blockedtext": "'''Via konto aŭ IP-adreso estis forbarita'''\n\nLa forbaro estis farita de $1.\nLa skribita kialo estas ''$2''.\n\n* Komenco de forbaro: $8\n* Findato de forbarado: $6\n* Intencita forbarito: $7\n\nVi rajtas kontakti $1 aŭ alian [[{{MediaWiki:Grouppage-sysop}}|administranton]] por pridiskuti la forbaradon.\nVi ne povas uzi la 'retpoŝtan' funkcion, escepte se vi indikis validan retpoŝtan adreson en viaj [[Special:Preferences|kontaj agordoj]] kaj vi ne estas blokita uzi ĝin.\nVia IP-adreso estas $3 kaj la ID de la forbarado estas $5.\nBonvolu mencii jenajn indikojn en viaj ĉi-temaj kontaktoj.",
        "autoblockedtext": "Via IP-adreso estas aŭtomate forbarita, ĉar uzis ĝin alia uzanto, kiun baris $1.\nLa donita kialo estas:\n\n:''$2''\n\n*Komenco de forbaro: $8\n*Limdato de la blokado: $6\n*Intencis forbari uzanton: $7\n\nVi povas kontakti $1 aŭ iun ajn el la aliaj [[{{MediaWiki:Grouppage-sysop}}|administrantojn]] por diskuti la blokon.\n\nNotu, ke vi ne povas uzi la servon \"Retpoŝtu ĉi tiu uzanton\" krom se vi havas validan retpoŝt-adreson registritan en viaj [[Special:Preferences|preferojn]], kaj vi estas ne blokita kontraŭ ĝia uzado.\n\nVia nuna IP-adreso estas $3, kaj la forbaro-identigo estas $5.\nBonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.",
+       "systemblockedtext": "Via salutnomo aŭ IPa adreso estis aŭtomate forbarita de MediaWiki.\nLa kialo donita estas:\n\n:<em>$2</em>\n\n* Komenco de forbaro: $8\n* Eksvalidiĝo de forbaro: $6\n* Intenca forbarulo: $7\n\nVia nuna IPa adreso estas $3.\nBonvolu inkluzivi ĉiuj supraj detaloj en ajnaj demandoj vi faras.",
        "blockednoreason": "neniu kialo estis donita",
        "whitelistedittext": "Vi devas $1 por redakti paĝojn.",
        "confirmedittext": "Vi devas konfirmi vian retpoŝtan adreson antaŭ ol redakti paĝojn. Bonvolu agordi kaj validigi vian retadreson per viaj [[Special:Preferences|preferoj]].",
        "search-external": "Ekstera serĉo",
        "searchdisabled": "<p>Oni provizore malŝaltis serĉadon per la plenteksta\nindekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>",
        "search-error": "Okazis eraro dum serĉado: $1",
+       "search-warning": "Okazis eraron dum serĉado: $1",
        "preferences": "Preferoj",
        "mypreferences": "Preferoj",
        "prefs-edits": "Nombro de redaktoj:",
        "saveprefs": "Konservi preferojn",
        "restoreprefs": "Restarigi ĉiujn defaŭltajn preferojn",
        "prefs-editing": "Redaktado",
-       "rows": "Linioj:",
-       "columns": "Kolumnoj:",
        "searchresultshead": "Serĉi",
        "stub-threshold": "Ligilformatigo de ĝermoj ($1):",
        "stub-threshold-sample-link": "specimeno",
        "prefs-help-recentchangescount": "Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.",
        "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
        "savedprefs": "Viaj preferoj estas konservitaj.",
-       "savedrights": "La uzanto-rajtoj de {{GENDER:$1|$1}} estis konservitaj.",
+       "savedrights": "La uzanto-grupoj de {{GENDER:$1|$1}} estis konservitaj.",
        "timezonelegend": "Horzono:",
        "localtime": "Loka tempo:",
        "timezoneuseserverdefault": "Uzi defaŭlton de servilo ($1)",
        "prefswarning-warning": "Vi faris ŝanĝojn al viaj agordoj, kiuj ankoraŭ ne estas konservitaj.\nSe vi foriros de tiu ĉi paĝo sen klaki al \"$1\", viaj agordoj ne estos ĝisdatigitaj.",
        "prefs-tabs-navigation-hint": "Konsileto: Vi povas uzi la maldekstran kaj dekstran sagajn klavojn por navigi inter la langetoj en la langeta listo.",
        "userrights": "Prizorgi rajtojn de uzantoj",
-       "userrights-lookup-user": "Administri grupojn de uzantoj",
+       "userrights-lookup-user": "Elekti uzanton",
        "userrights-user-editname": "Entajpu salutnomon:",
-       "editusergroup": "Redakti grupojn de {{GENDER:$1|uzanto}}",
+       "editusergroup": "Ŝargi uzantgrupojn",
        "editinguser": "Ŝanĝado de uzantorajtoj de la {{GENDER:$1|uzanto}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Vidi uzantorajtojn de {{GENDER:$1|uzanto}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Redakti grupojn de uzantoj",
+       "userrights-viewusergroup": "Vidi grupojn de uzantoj",
        "saveusergroups": "Konservi grupojn de {{GENDER:$1|uzantoj}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Implica membro de:",
        "userrights-reason": "Kialo:",
        "userrights-no-interwiki": "Vi ne rajtas redakti uzanto-rajtojn en aliaj vikioj.",
        "userrights-nodatabase": "Datumbazo $1 ne ekzistas aŭ ne estas loka.",
-       "userrights-nologin": "Vi devas [[Special:UserLogin|ensaluti]] per administranto-konto por doni uzanto-rajtojn.",
-       "userrights-notallowed": "Via konto ne rajtas doni aŭ forigi uzanto-rajtojn.",
        "userrights-changeable-col": "Grupoj kiujn vi povas ŝanĝi",
        "userrights-unchangeable-col": "Grupoj kiujn vi ne povas ŝanĝi",
        "userrights-conflict": "Konflikto ĉe la ŝanĝo de uzantorajtoj! Bonvolu kontroli kaj konfirmi viajn ŝanĝojn.",
-       "userrights-removed-self": "Vi nuligis viajn proprajn rajtojn, do vi ne plu rajtas aliri ĉi tiun paĝon.",
        "group": "Grupo:",
        "group-user": "Uzantoj",
        "group-autoconfirmed": "Aŭtomate konfirmitaj uzantoj",
        "right-userrights": "Redakti ĉiujn uzanto-rajtojn",
        "right-userrights-interwiki": "Redakti la rajtojn de uzantoj en aliaj vikioj",
        "right-siteadmin": "Ŝlosi kaj malŝlosi la datumbazon",
-       "right-override-export-depth": "Eksporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
+       "right-override-export-depth": "Elporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
        "right-sendemail": "Sendi retpoŝton al aliaj uzantoj",
-       "right-passwordreset": "Vidi retpoŝtojn de pasvorta restarado.",
        "right-managechangetags": "Kreado kaj (mal)aktivgo de [[Special:Tags|etikedoj]]",
        "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
        "right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj",
        "action-writeapi": "uzi la skriban API-on",
        "action-delete": "forigi ĉi tiun paĝon",
        "action-deleterevision": "forigi ĉi tiun version",
-       "action-deletedhistory": "vidi la forigitan historion de ĉi tiu paĝo",
+       "action-deletelogentry": "forigi protokolerojn",
+       "action-deletedhistory": "vidi historion de forigitaj versiojn de la paĝo",
+       "action-deletedtext": "vidi tekston el forigita versio",
        "action-browsearchive": "traserĉi forigitajn paĝojn",
-       "action-undelete": "malforigi ĉi tiun paĝon",
-       "action-suppressrevision": "kontroli kaj restarigi ĉi tiun kaŝitan version",
+       "action-undelete": "malforigi paĝojn",
+       "action-suppressrevision": "kontroli kaj restarigi kaŝitajn versiojn",
        "action-suppressionlog": "vidi ĉi tiun privantan protokolon",
        "action-block": "forari ĉi tiun uzanton de redaktado",
        "action-protect": "ŝanĝi la protektan nivelon por ĉi tiu paĝo",
        "action-userrights-interwiki": "redakti la rajtojn de uzantoj en aliaj vikioj",
        "action-siteadmin": "ŝlosi aŭ malŝlosi la datumbazon",
        "action-sendemail": "sendi retpoŝtojn",
+       "action-editmyoptions": "redakti viajn preferojn",
        "action-editmywatchlist": "modifi vian atento-liston",
        "action-viewmywatchlist": "vidi vian atento-liston",
        "action-viewmyprivateinfo": "vidi viajn privatajn informojn",
        "recentchanges-label-newpage": "Ĉi tiu redakto kreis novan paĝon",
        "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
        "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
-       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
+       "recentchanges-label-unpatrolled": "Ĉi tiu redakto ankoraŭ ne estis patrolita.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bitokoj",
        "recentchanges-legend-heading": "<strong>Klarigo:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
        "recentchanges-submit": "Montri",
+       "rcfilters-activefilters": "Aktivaj filtriloj",
+       "rcfilters-search-placeholder": "Filtri lastajn ŝanĝojn (vi povas elekti aŭ ekskribi)",
+       "rcfilters-invalid-filter": "Nevalida filtrilo",
+       "rcfilters-filterlist-title": "Filtriloj",
+       "rcfilters-filterlist-noresults": "Neniuj filtriloj troviĝis",
+       "rcfilters-filtergroup-registration": "Registrado de uzanto",
+       "rcfilters-filter-registered-label": "Registrita",
+       "rcfilters-filter-registered-description": "Ensalutitaj redaktantoj.",
+       "rcfilters-filter-unregistered-label": "Neregistrita",
+       "rcfilters-filter-unregistered-description": "Redaktantoj kiuj ne estas ensalutita.",
+       "rcfilters-filtergroup-authorship": "Redakta aŭtoreco",
+       "rcfilters-filter-editsbyself-label": "Viaj redaktoj",
+       "rcfilters-filter-editsbyself-description": "Viaj redaktoj.",
+       "rcfilters-filter-editsbyother-label": "Redaktoj de aliuloj",
+       "rcfilters-filter-editsbyother-description": "Redaktoj kreitaj far aliaj uzantoj (krom vi).",
+       "rcfilters-filtergroup-userExpLevel": "Spertonivelo (nur por registritaj uzantoj)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novuloj",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
+       "rcfilters-filter-userExpLevel-learner-label": "Lernantoj",
+       "rcfilters-filter-userExpLevel-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Spertaj uzantoj",
+       "rcfilters-filter-userExpLevel-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
+       "rcfilters-filtergroup-automated": "Aŭtomatigitaj kontribuoj",
+       "rcfilters-filter-bots-label": "Roboto",
+       "rcfilters-filter-bots-description": "Redaktoj farita de aŭtomatigitaj iloj.",
+       "rcfilters-filter-humans-label": "Homa (ne robota)",
+       "rcfilters-filter-humans-description": "Redaktoj farita de homaj redaktantoj.",
        "rcnotefrom": "Malsupre estas la {{PLURAL:$5|ŝanĝo|ŝanĝoj}} ekde <strong>$3, $4</strong> (montrante ĝis <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 etajn redaktojn",
        "apisandbox-continue": "Daŭrigi",
        "apisandbox-continue-clear": "Vakigi",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries daŭrigos] la lastan peton; {{int:apisandbox-continue-clear}} forviŝos parametrojn rilatajn al daŭrigo.",
+       "apisandbox-param-limit": "Enigi <kbd>max</kbd> por uzi la maksimuman limon.",
+       "apisandbox-multivalue-all-namespaces": "$1 (ĉiuj nomspacoj)",
+       "apisandbox-multivalue-all-values": "$1 (ĉiuj valoroj)",
        "booksources": "Librofontoj",
        "booksources-search-legend": "Serĉi librofontojn",
        "booksources-search": "Serĉi",
        "booksources-text": "Jen ligilaro al aliaj TTT-ejoj, kiuj vendas librojn,\nkaj/aŭ informumos pri la libro ligita.\nLa {{SITENAME}} ne estas komerce ligita al tiuj vendejoj, kaj la listo ne estu\nkomprenata kiel rekomendo aŭ reklamo.",
        "booksources-invalid-isbn": "La donata ISBN verŝajne estas nevalida; kontrolu pri erara kopiado el la originala fonto.",
+       "magiclink-tracking-rfc": "Paĝoj kiuj uzas [https://en.wikipedia.org/wiki/Help:Magic_links#RFC magiajn ligilojn] por [https://eo.wikipedia.org/wiki/Request_for_Comments peto pri komentoj]",
+       "magiclink-tracking-rfc-desc": "Ĉi tiu paĝo uzas magiajn ligilojn por [https://eo.wikipedia.org/wiki/Request_for_Comments peto pri komentoj]. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
+       "magiclink-tracking-pmid": "Paĝoj kiuj uzas magiajn ligilojn por PubMed",
+       "magiclink-tracking-pmid-desc": "Ĉi tiu paĝo uzas PubMed-aj magiaj ligoj. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
+       "magiclink-tracking-isbn": "Paĝoj kiuj uzas ISBNajn magiajn ligilojn",
+       "magiclink-tracking-isbn-desc": "Ĉi tiu paĝo uzas ISBNajn magiajn ligilojn. Vidi [https://www.mediawiki.org/wiki/special:MyLanguage/Helpo:Magiaj_ligoj mediawiki.org] pri kiel migri.",
        "specialloguserlabel": "Faranto:",
        "speciallogtitlelabel": "Celo (titolo aŭ  {{ns:user}}:salutnomo por uzanto):",
        "log": "Protokoloj",
        "activeusers-count": "$1 {{PLURAL:$1|ago|agoj}} dum la {{PLURAL:$3|lasta tago|lastaj $3 tagoj}}",
        "activeusers-from": "Montri uzantojn ekde:",
        "activeusers-groups": "Montri uzantojn apartenantajn al grupoj:",
+       "activeusers-excludegroups": "Ekskludi la uzantojn, kiuj grupanas:",
        "activeusers-noresult": "Neniuj uzantoj trovitaj.",
        "activeusers-submit": "Montri la agemajn uzantojn",
        "listgrouprights": "Gruprajtoj de uzantoj",
        "emailccsubject": "Kopio de via mesaĝo al $1: $2",
        "emailsent": "Retmesaĝo sendita",
        "emailsenttext": "Via retmesaĝo estas sendita.",
-       "emailuserfooter": "Ĉi tiu retpoŝtmesaĝo estis {{GENDER:$1|sendita}} de $1 al {{GENDER:$2|$2}} per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}.",
+       "emailuserfooter": "Ĉi tiu retpoŝtmesaĝo estis {{GENDER:$1|sendita}} de $1 al {{GENDER:$2|$2}} per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}. {{GENDER:$2|Via}} retpoŝto estos sendita rekte al la {{{{GENDER:$1|}}|originala sendinto}}, rivelanta {{GENDER:$2|via}} retpoŝta adreso al {{GENDER:$1|ili}}.",
        "usermessage-summary": "Lasanta sisteman mesaĝon.",
        "usermessage-editor": "Mesaĝanto de sistemo",
        "watchlist": "Mia atentaro",
        "changecontentmodel-emptymodels-title": "Neniu disponebla enhavomodelo",
        "changecontentmodel-emptymodels-text": "La enhavo en [[:$1]] ne transtipeblas al iu ajn tipo.",
        "log-name-contentmodel": "Ŝanĝprotokolo de enhavomodelo",
-       "log-description-contentmodel": "Eventoj rilataj kun la enhavomodeloj de paĝo",
+       "log-description-contentmodel": "Ĉi tiu paĝo montras ŝanĝojn de la enhavomodelo de paĝoj, kaj paĝojn kreitajn kun enhavomodelo aparta de la norma.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|kreis}} la paĝo $3 per uzado de ne-defaŭlta enhavomodelo \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ŝanĝis}} la enhavomodelon de la paĝo $3 el \"$4\" al \"$5\"",
        "logentry-contentmodel-change-revertlink": "restarigi",
        "modifiedarticleprotection": "ŝanĝis nivelon de protekto por \"[[$1]]\"",
        "unprotectedarticle": "forigis protektadon de \"[[$1]]\"",
        "movedarticleprotection": "movis protektadajn preferojn de \"[[$2]]\" al \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protektis}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ŝanĝis protektan nivelon}} por \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Forigis protekton}} por \"[[$1]]\"",
        "protect-title": "Protektante \"$1\"",
        "protect-title-notallowed": "Vidi protektadan nivelon de \"$1\"",
        "prot_1movedto2": "[[$1]] movita al [[$2]]",
        "whatlinkshere-hideredirs": "$1 alidirektilojn",
        "whatlinkshere-hidetrans": "$1 inkludojn",
        "whatlinkshere-hidelinks": "$1 ligilojn",
-       "whatlinkshere-hideimages": "$1 dosieraj ligoj",
+       "whatlinkshere-hideimages": "$1 dosier{{PLURAL:$1|a ligilo|aj ligiloj}}",
        "whatlinkshere-filters": "Filtriloj",
        "whatlinkshere-submit": "Ek",
        "autoblockid": "Aŭtomata forbaro #$1",
        "proxyblockreason": "Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aŭ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.",
        "sorbsreason": "Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.",
        "sorbs_create_account_reason": "Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.",
+       "softblockrangesreason": "Anonimaj kontribuoj ne estas permesataj de via IP-adreso ($1). Bonvolu ensaluti.",
        "xffblockreason": "La IP-adreso en la kapo de X-Forwarded-For, ĉu via aŭ de la prokurilo kiun vi uzas, estis forbarita. La origina forbarokialo estis: $1",
        "cant-see-hidden-user": "La uzanto kiun vi provas forbari jam estis forbarita kaj kaŝita. Kiel vi ne havas la rajton kaŝi uzanton, vi ne povas vidi aŭ redakti la forbaron de la uzanto.",
        "ipbblocked": "Vi ne povas forbari aŭ malforbari aliajn uzantojn, ĉar vi mem estas forbarita",
        "cant-move-to-user-page": "Vi ne rajtas movi paĝon al uzantopaĝo (krom al uzantosubpaĝo).",
        "cant-move-category-page": "Vi ne rajtas movi kategoriajn paĝojn.",
        "cant-move-to-category-page": "Vi ne rajtas movi paĝon al kategoria paĝo.",
+       "cant-move-subpages": "Vi ne rajtas movi subpaĝojn.",
+       "namespace-nosubpages": "Nomspaco \"$1\" ne permesas subpaĝojn.",
        "newtitle": "Nova titolo:",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomi paĝon",
        "semiprotectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel ĝi estas nur movebla de registritaj uzantoj.\nJen la lasta protokolero por via referenco:",
        "move-over-sharedrepo": "[[:$1]] ekzistas en komuna dosierujo. Movado de dosiero al ĉi tiu titolo anstataŭigos la komunan dosieron.",
        "file-exists-sharedrepo": "La elektita dosiernomo jam estas uzita en komun dosierujo.\nBonvolu elekti alian nomon.",
-       "export": "Eksporti paĝojn",
-       "exporttext": "Vi povas eksporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti importita en alian programon funkciantan per MediaWiki-softvaro per la [[Special:Import|import-paĝo]].\n\nPor eksporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
-       "exportall": "Eksporti ĉiujn paĝojn",
+       "export": "Elporti paĝojn",
+       "exporttext": "Vi povas elporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti enportita en alian programon funkciantan per MediaWiki per la [[Special:Import|enportpaĝo]].\n\nPor elporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Elporti ĉiujn paĝojn",
        "exportcuronly": "Entenas nur la aktualan version, ne la malnovajn.",
-       "exportnohistory": "----\n'''Notu:''' Eksportado de la plena historio de paĝoj per ĉi paĝo estis malebligita pro funkciigaj kialoj.",
+       "exportnohistory": "----\n'''Notu:''' Elportado de la plena historio de paĝoj per ĉi paĝo estis malebligita pro funkciigaj kialoj.",
        "exportlistauthors": "Inkluzivi plenan liston de kontribuantoj por ĉiu paĝo.",
        "export-submit": "Elporti",
        "export-addcattext": "Aldoni paĝojn el kategorio:",
        "thumbnail_gd-library": "Nekompleta GD-biblioteka konfiguro: mankas funkcio $1",
        "thumbnail_image-missing": "Dosiero verŝajne estas foriga: $1",
        "thumbnail_image-failure-limit": "Lastatempe estis tro multaj malsukcesaj provoj ($1 aŭ pli) por bildigi tiun ĉi miniaturon. Bonvolu reprovi poste.",
-       "import": "Importi paĝojn",
+       "import": "Enporti paĝojn",
        "importinterwiki": "Transvikia importo",
        "import-interwiki-text": "Elektu vikion kaj paĝan titolon por importi.\nDatoj de versioj kaj nomoj de redaktantoj estos konservitaj.\nĈiuj transvikaj importoj estas raportitaj ĉe la [[Special:Log/import|loglibro de importoj]].",
        "import-interwiki-sourcewiki": "Fonta vikio:",
        "import-mapping-subpage": "Importi kiel subpaĝojn de la jena paĝo:",
        "import-upload-filename": "Dosiernomo:",
        "import-comment": "Komento:",
-       "importtext": "Bonvolu eksporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin tien ĉi.",
+       "importtext": "Bonvolu elporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin ĉi tien.",
        "importstart": "Importante paĝojn...",
        "import-revision-count": "$1 {{PLURAL:$1|versio|versioj}}",
        "importnopages": "Neniu paĝo por importi.",
        "pageinfo-length": "Paĝgrandeco (en bajtoj)",
        "pageinfo-article-id": "Paĝa identigo",
        "pageinfo-language": "Lingvo de paĝa enhavo",
+       "pageinfo-language-change": "ŝanĝi",
        "pageinfo-content-model": "Modelo de paĝoenhavo",
        "pageinfo-content-model-change": "ŝanĝi",
        "pageinfo-robot-policy": "Indeksado per robotoj",
        "patrol-log-header": "Jen protokolo de patrolitaj versioj.",
        "log-show-hide-patrol": "$1 protokolo pri patrolado",
        "log-show-hide-tag": "$1 etikedan protokolon",
+       "confirm-markpatrolled-button": "Ek!",
+       "confirm-markpatrolled-top": "Marki version $3 el $2 kiel patrolita?",
        "deletedrevision": "Forigita malnova versio $1",
        "filedeleteerror-short": "Eraro dum forigo de dosiero: $1",
        "filedeleteerror-long": "Eraroj renkontritaj kiam forigante la dosieron:\n\n$1",
        "tags-deactivate": "malaktivigi",
        "tags-hitcount": "$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}",
        "tags-manage-no-permission": "Vi ne havas la rajton prilabori markilojn.",
-       "tags-manage-blocked": "Vi ne povas administri ŝanĝajn etikedojn dum blokita.",
+       "tags-manage-blocked": "Vi ne povas administri etikedojn de ŝanĝo dum {{GENDER:$1|vi}} estas forbaritaj.",
        "tags-create-heading": "Krei novan markilon",
        "tags-create-explanation": "Nove kreitaj etikedoj estos defaŭlte disponeblaj por uzado de uzantoj kaj robotoj.",
        "tags-create-tag-name": "Nomo de etikedo:",
        "tags-deactivate-not-allowed": "Ne eblas malaktivigi la etikedon \"$1\".",
        "tags-deactivate-submit": "Malaktivigi",
        "tags-apply-no-permission": "Vi ne havas permeson por aldoni ŝanĝo-etikedojn al viaj ŝanĝoj.",
-       "tags-apply-blocked": "Vi ne povas apliki etikedojn de ŝanĝo kune kun viaj ŝanĝoj dum blokita.",
+       "tags-apply-blocked": "Vi ne povas apliki etikedojn de ŝanĝo kune kun viaj ŝanĝoj dum {{GENDER:$1|vi}} estas forbarita.",
        "tags-apply-not-allowed-one": "La etikedon \"$1\" ne eblas aldoni permane.",
        "tags-apply-not-allowed-multi": "Ne estas permesite permane aldoni {{PLURAL:$2|jenan etikedon|jenajn etikedojn}}: $1",
        "tags-update-no-permission": "Vi ne havas permeson por aldoni aŭ forigi ŝanĝo-etikedojn de unuopaj revizioj aŭ protokoleroj.",
-       "tags-update-blocked": "Vi ne povas aldoni aŭ forigi etikedojn de ŝanĝo dum blokita.",
+       "tags-update-blocked": "Vi ne povas aldoni aŭ forigi etikedojn de ŝanĝo dum {{GENDER:$1|vi}} estas forbarita.",
        "tags-update-add-not-allowed-one": "Ne estas permesite permane aldoni la etikedon \"$1\".",
        "tags-update-add-not-allowed-multi": "Ne estas permesite permane aldoni {{PLURAL:$2|jenan etikedon|jenajn etikedojn}}: $1",
        "tags-update-remove-not-allowed-one": "Ne estas permesite permane forigi la etikedon \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> ne ekzistas.",
        "htmlform-user-not-valid": "<strong>$1</strong> ne estas valida salutnomo.",
        "logentry-delete-delete": "$1 forigis paĝon $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|forigis}} alidirektitan $3 per anstataŭigado",
        "logentry-delete-restore": "$1 restarigis paĝon $3",
        "logentry-delete-event": "$1 ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ŝanĝis}} videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4",
        "feedback-useragent": "Klienta aplikaĵo:",
        "searchsuggest-search": "Serĉi tra {{SITENAME}}",
        "searchsuggest-containing": "enhavas...",
-       "api-error-autoblocked": "Via IPa adreso estis blokita aŭtomate, ĉar ĝi estis uzita far forbara uzanto.",
-       "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "api-error-badtoken": "Interna eraro: fuŝaĵo.",
-       "api-error-blocked": "Vi estis blokita pri redakto.",
-       "api-error-copyuploaddisabled": "Alŝuto per URL-adreso estas malebligata en tiu ĉi servilo.",
-       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} en la retejo kun la sama enhavo.",
-       "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
-       "api-error-empty-file": "La dosiero kiun vi sendis estis malplena.",
        "api-error-emptypage": "Kreo de novaj malplenaj paĝoj ne estas permesita.",
-       "api-error-fetchfileerror": "Interna eraro: io misfunkciis dum la dosiera prenado.",
-       "api-error-fileexists-forbidden": "Dosiero nomata \"$1\" jam existas kaj ne estas surskribebla.",
-       "api-error-fileexists-shared-forbidden": "Dosiero nomata \"$1\" jam existas en la kunhavata dosier-datumbazo kaj ne estas surskribebla.",
-       "api-error-file-too-large": "La dosiero kiun vi alŝutis estis tro granda.",
-       "api-error-filename-tooshort": "La dosiernomo estas tro mallonga.",
-       "api-error-filetype-banned": "Ĉi tiu tipo de dosiero estas malpermesita.",
-       "api-error-filetype-banned-type": "$1 ne estas {{PLURAL:$4|permesita dosiero-tipo|permesitaj dosiero-tipoj}}. {{PLURAL:$3|Permesita dosiero-tipo|Permesitaj dosiero-tipoj}} estas $2.",
-       "api-error-filetype-missing": "Mankas sufikso de la dosiero.",
-       "api-error-hookaborted": "La ŝanĝo kiun vi provis fari estis haltigita de etendaĵa hoko.",
-       "api-error-http": "Interna eraro: ne eblas konektiĝi al la servilo.",
-       "api-error-illegal-filename": "La dosiernomo ne estas permesata.",
-       "api-error-internal-error": "Interna eraro: io misokazis en la prilaboro de via alŝuto en la vikio.",
-       "api-error-invalid-file-key": "Interna eraro: la dosiero ne troveblis en la dumtempa stokejo.",
-       "api-error-missingparam": "Interna eraro: mankantaj parametroj en la alŝutopeto.",
-       "api-error-missingresult": "Interna eraro: ne eblis eltrovi ĉu la kopiado sukcesis.",
-       "api-error-mustbeloggedin": "Vi devas esti ensalutinta por rajti alŝuti dosierojn.",
-       "api-error-mustbeposted": "Interna eraro: la peto necesigas alŝuton en formato HTTP.",
-       "api-error-noimageinfo": "La alŝuto sukcesis, sed la servilo ne donis ajnan informon pri la dosiero.",
-       "api-error-nomodule": "Interna eraro: ne troveblas alŝuta helpilaro.",
-       "api-error-ok-but-empty": "Interna eraro: nenia respondo de la servilo.",
-       "api-error-overwrite": "Anstataŭigo de ekzistanta dosiero ne permesatas.",
-       "api-error-ratelimited": "Vi provas alŝuti pli da dosieroj dum mallonga periodo ol ĉi tiu vikio permesas.\nBonvolu provi denove en kelkaj minutoj.",
-       "api-error-stashfailed": "Interna eraro: la servilo malsukcesis stoki provizoran dosieron.",
        "api-error-publishfailed": "Interna eraro: Servilo malsukcesis eldoni provizoran dosieron.",
-       "api-error-stasherror": "Eraro okazis dum alŝutado de la dosiero al dosierujo.",
-       "api-error-stashedfilenotfound": "Dum provo alŝuti dosieron de rezervujo ne estis la dosiero trovita.",
-       "api-error-stashpathinvalid": "La vojo en rezervujo, kie devus esti la dosiero trovita, estas malvalida.",
-       "api-error-stashfilestorage": "Okazis eraro dum konservado de dosiero al rezervujo.",
-       "api-error-stashzerolength": "La servilo ne povis konservi dosieron en rezervujon, ĉar ĝi havis nulan longecon.",
-       "api-error-stashnotloggedin": "Vi devas esti ensalutinta por konservi dosieron en alŝutan rezervujon.",
-       "api-error-stashwrongowner": "La rezervuja dosiero, kiun vi provis aliri, ne apartenas al vi.",
-       "api-error-stashnosuchfilekey": "La dosiera ŝlosilo, kiun vi provis aliri en rezervujo, ne ekzistas.",
-       "api-error-timeout": "La servilo ne respondis ene de la antaŭvidita tempo.",
-       "api-error-unclassified": "Okazis nekonata eraro",
-       "api-error-unknown-code": "Nekonata eraro: \"$1\"",
-       "api-error-unknown-error": "Interna eraro: io misokazis en la alŝuto de via dosiero.",
-       "api-error-unknown-warning": "Nekonata averto: $1",
+       "api-error-stashfailed": "Interna eraro: la servilo malsukcesis stoki provizoran dosieron.",
+       "api-error-unknown-warning": "Nekonata averto: \"$1\".",
        "api-error-unknownerror": "Nekonata eraro: \"$1\"",
-       "api-error-uploaddisabled": "Alŝutato estas malebligata en tiu ĉi vikio.",
-       "api-error-verification-error": "Tiu ĉi dosiero eble estas difektita, aŭ havas la malĝustan dosieran finaĵon.",
-       "api-error-was-deleted": "Dosiero kun ĉi tiu nomo estis antaŭe alŝutita kaj sekvente forigita.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundo|sekundoj}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutoj}}",
        "duration-hours": "$1 {{PLURAL:$1|horo|horoj}}",
        "pagelang-language": "Lingvo",
        "pagelang-use-default": "Uzi defaŭltan lingvon",
        "pagelang-select-lang": "Elekti la lingvon",
+       "pagelang-reason": "Kialo",
        "pagelang-submit": "Ek!",
+       "pagelang-nonexistent-page": "La paĝo $1 ne ekzistas.",
+       "pagelang-unchanged-language": "La paĝo $1 jam estas agordita al la lingvo $2.",
+       "pagelang-unchanged-language-default": "La paĝo $1 jam estas agordita al la norma enhav-lingvo de la vikio.",
+       "pagelang-db-failed": "La datumbazo ne povis ŝanĝi la lingvon de la paĝo.",
        "right-pagelang": "Ŝanĝi paĝan lingvon",
        "action-pagelang": "ŝanĝi la lingvon de la paĝo",
        "log-name-pagelang": "Protokolo pri lingvajn ŝanĝojn",
        "headline-anchor-title": "Ligilo al tiu ĉi sekcio",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latina etendita",
-       "special-characters-group-ipa": "IPA",
+       "special-characters-group-ipa": "IFA",
        "special-characters-group-symbols": "Simboloj",
        "special-characters-group-greek": "Greka",
        "special-characters-group-greekextended": "Greka etendita",
        "mw-widgets-dateinput-no-date": "Neniu dato elektita",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Serĉi aŭdvidaĵojn",
+       "mw-widgets-mediasearch-noresults": "Neniuj rezultoj trovitaj",
        "mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
        "mw-widgets-titleinput-description-redirect": "alidirekti al $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Aldoni kategorion",
        "sessionmanager-tie": "Kombini diversajn tipojn de ensaluta peto ne estas permisita: $1.",
        "sessionprovider-generic": "$1 seancoj",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
        "log-action-filter-block-block": "Forbari",
        "log-action-filter-block-reblock": "Forbari ŝanĝon",
        "log-action-filter-block-unblock": "Malforbari",
-       "log-action-filter-contentmodel-change": "Ŝanĝo de enhavomodelon",
+       "log-action-filter-contentmodel-change": "Ŝanĝo de enhavomodelo",
        "log-action-filter-contentmodel-new": "Kreo de paĝo kun ne-norma enhavomodelo",
        "log-action-filter-delete-delete": "Forviŝigado de paĝo",
+       "log-action-filter-delete-delete_redir": "Alidirekta anstataŭigo",
        "log-action-filter-delete-restore": "Malforviŝigado de paĝo",
        "log-action-filter-delete-event": "Forviŝigado de protokolo",
        "log-action-filter-delete-revision": "Forviŝigado de rivizio",
        "authmanager-authn-autocreate-failed": "Aŭtokreo de loka konto malsukcesis: $1",
        "authmanager-change-not-supported": "La provizitaj legitimaĵoj ne povas esti ŝanĝita, kiel nenio uzus ilin.",
        "authmanager-create-disabled": "kreado de kontoj estas malebligita",
-       "authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn sube.",
+       "authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn.",
        "authmanager-create-not-in-progress": "Konta kreo ne estas progresanta aŭ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
        "authmanager-create-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta kreo.",
        "authmanager-link-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta ligado.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Eraro: $1",
-       "edit-error-long": "Eraroj\n\n$1"
+       "revid": "revizio $1",
+       "pageid": "Identigilo de paĝo $1"
 }
index 6b8740b..7b76946 100644 (file)
        "qbfind": "Buscar",
        "qbbrowse": "Navegar",
        "qbedit": "Editar",
-       "qbpageoptions": "Opciones de página",
+       "qbpageoptions": "Esta página",
        "qbmyoptions": "Mis páginas",
        "faq": "Preguntas frecuentes",
        "faqpage": "Project:Preguntas frecuentes",
        "searcharticle": "Ir",
        "history": "Historial",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualizado desde mi última visita",
        "printableversion": "Versión para imprimir",
        "permalink": "Enlace permanente",
        "views": "Vistas",
        "toolbox": "Herramientas",
        "tool-link-userrights": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "tool-link-userrights-readonly": "Ver los grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "tool-link-emailuser": "Enviar un correo a {{GENDER:$1|este usuario|esta usuaria}}",
        "userpage": "Ver página de usuario",
        "projectpage": "Ver página del proyecto",
        "emailnotauthenticated": "Aún no has confirmado tu dirección de correo electrónico.\nHasta que lo hagas, las siguientes funciones no estarán disponibles.",
        "noemailprefs": "Especifica una dirección electrónica para habilitar estas características.",
        "emailconfirmlink": "Confirmar dirección de correo electrónico",
-       "invalidemailaddress": "La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección en el formato adecuado o deja el campo en blanco.",
+       "invalidemailaddress": "No se puede aceptar la dirección de correo electrónico, pues parece que tiene un formato no válido.\nPor favor, escribe una dirección bien formada o deja el campo en blanco.",
        "cannotchangeemail": "En este wiki no se pueden cambiar las direcciones de correo electrónico de las cuentas de usuario.",
        "emaildisabled": "Este sitio no puede enviar correos electrónicos.",
        "accountcreated": "Se ha creado la cuenta",
        "botpasswords-label-delete": "Borrar",
        "botpasswords-label-resetpassword": "Restablecer la contraseña",
        "botpasswords-label-grants": "Permisos aplicables:",
-       "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Véase la [[Special:ListGrants|lista de concesiones]] para más información.",
+       "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Habilitar una concesión aquí no proporciona acceso a ningún permiso que tu cuenta de usuario no tendría de otra manera. Véase la [[Special:ListGrants|lista de concesiones]] para más información.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "El nombre del bot \"$1\" no es válido.",
        "botpasswords-insert-failed": "No se pudo agregar el nombre del bot \"$1\". ¿Ya ha sido añadido?",
        "resetpass-validity-soft": "Tu contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o haz clic en \"{{int:authprovider-resetpass-skip-label}}\" para cambiarla más tarde.",
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
-       "passwordreset-text-many": "{{PLURAL:$1|Elige una de las opciones para recibir una contraseña temporal por correo electrónico.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Rellena uno de los campos para recibir una contraseña temporal por correo electrónico.}}",
        "passwordreset-disabled": "Se ha desactivado el restablecimiento de contraseñas en este wiki.",
        "passwordreset-emaildisabled": "Se han desactivado las funciones de correo electrónico en este wiki.",
        "passwordreset-username": "Nombre de usuario:",
        "blockedtitle": "El usuario está bloqueado",
        "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo lo hizo $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nTen en cuenta que no puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "systemblockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueado automáticamente por el software MediaWiki.\nLa razón dada es:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad de bloqueo: $6\n* Destinatario del bloqueo: $7\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
        "whitelistedittext": "Tienes que $1 para editar páginas.",
        "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
        "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
-       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de autocierre inválidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser coherente con la especificación de HTML5, por lo que su utilización en el wikitexto está en desuso.",
+       "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de autocierre no válidas, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamiento de estas cambiará pronto para ser consistente con la especificación de HTML5, por lo que su utilización en el wikitexto está obsoleta.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-external": "Búsqueda externa",
        "searchdisabled": "Las búsquedas en {{SITENAME}} están desactivadas.\nMientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.",
        "search-error": "Ha ocurrido un error al buscar: $1",
+       "search-warning": "Se ha producido un aviso al hacer la búsqueda: $1",
        "preferences": "Preferencias",
        "mypreferences": "Preferencias",
        "prefs-edits": "Cantidad de ediciones:",
        "saveprefs": "Guardar",
        "restoreprefs": "Restaurar la configuración predeterminada (en todas las secciones)",
        "prefs-editing": "Edición",
-       "rows": "Filas:",
-       "columns": "Columnas:",
        "searchresultshead": "Búsquedas",
        "stub-threshold": "Límite para enlazar con el estilo de esbozo ($1):",
        "stub-threshold-sample-link": "muestra",
        "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de páginas y registros.",
        "prefs-help-watchlist-token2": "Esta es la clave secreta del canal de suscripción de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
        "savedprefs": "Se han guardado tus preferencias.",
-       "savedrights": "Se han guardado los permisos de {{GENDER:$1|$1}}.",
+       "savedrights": "Se han guardado los grupos de {{GENDER:$1|usuario|usuaria}} de $1.",
        "timezonelegend": "Huso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar la hora del servidor ($1)",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
        "userrights": "Gestión de permisos de usuario",
-       "userrights-lookup-user": "Configurar grupos de usuarios",
+       "userrights-lookup-user": "Selecciona una cuenta de usuario",
        "userrights-user-editname": "Escribe un nombre de usuario:",
-       "editusergroup": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "editusergroup": "Cargar grupos de usuarios",
        "editinguser": "Cambio de los permisos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Visualización de los derechos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario| de la usuaria}}",
+       "userrights-viewusergroup": "Ver grupos de usuarios",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
        "right-upload": "Subir archivos",
        "right-reupload": "Subir una nueva versión de un archivo existente",
        "right-reupload-own": "Subir una nueva versión de un archivo creado por uno mismo",
-       "right-reupload-shared": "Sobreescribir localmente archivos del repositorio multimedia",
+       "right-reupload-shared": "Sobrescribir localmente archivos presentes en el repositorio multimedia compartido",
        "right-upload_by_url": "Subir un archivo a traves de un URL",
        "right-purge": "Purgar la caché en el servidor sin tener que dar confirmación",
        "right-autoconfirmed": "No resultar afectado por los límites de frecuencia de edición para las IP",
        "right-bot": "Ser tratado como un programa automático",
        "right-nominornewtalk": "No accionar el aviso de mensajes nuevos al realizar ediciones menores en páginas de discusión",
-       "right-apihighlimits": "Tener límites más altos para las peticiones a través de la API",
+       "right-apihighlimits": "Usar límites más altos en peticiones a través de la API",
        "right-writeapi": "Hacer uso de la API de escritura",
        "right-delete": "Borrar páginas",
        "right-bigdelete": "Borrar páginas con historiales grandes",
        "right-editusercssjs": "Editar las páginas de CSS y JavaScript de otros usuarios",
        "right-editusercss": "Editar las páginas de CSS de otros usuarios",
        "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
-       "right-editmyusercss": "Editar tus páginas de CSS",
+       "right-editmyusercss": "Editar tus archivos CSS",
        "right-editmyuserjs": "Editar tus archivos JavaScript",
        "right-viewmywatchlist": "Ver tu lista de seguimiento",
        "right-editmywatchlist": "Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aun sin este permiso.",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios",
        "right-changetags": "Agregar y quitar [[Special:Tags|etiquetas]] arbitrarias a revisiones individuales y entradas del registro",
-       "right-deletechangetags": "Eliminar [[Special:Tags|tags]] de la base de datos",
+       "right-deletechangetags": "Eliminar [[Special:Tags|etiquetas]] de la base de datos",
        "grant-generic": "Paquete de permisos \"$1\"",
        "grant-group-page-interaction": "Interactuar con páginas",
        "grant-group-file-interaction": "Interactuar con multimedia",
        "action-upload_by_url": "subir este archivo desde una URL",
        "action-writeapi": "utilizar la API de escritura",
        "action-delete": "borrar esta página",
-       "action-deleterevision": "borrar esta revisión",
-       "action-deletedhistory": "ver el historial borrado de esta página",
+       "action-deleterevision": "eliminar revisiones",
+       "action-deletelogentry": "borrar entradas del registro",
+       "action-deletedhistory": "ver el historial de ediciones borradas de una página",
+       "action-deletedtext": "ver texto de revisión borrada",
        "action-browsearchive": "buscar páginas borradas",
-       "action-undelete": "recuperar esta página",
-       "action-suppressrevision": "revisar y restaurar esta revisión oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "revisar y restaurar revisiones ocultas",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "bloquear a este usuario para que no edite",
        "action-protect": "cambiar los niveles de protección para esta página",
        "action-userrights-interwiki": "modificar los permisos de los usuarios en otros wikis",
        "action-siteadmin": "bloquear o desbloquear la base de datos",
        "action-sendemail": "enviar correos electrónicos",
+       "action-editmyoptions": "editar tus preferencias",
        "action-editmywatchlist": "editar tu lista de seguimiento",
        "action-viewmywatchlist": "ver tu lista de seguimiento",
        "action-viewmyprivateinfo": "ver tu información privada",
        "recentchanges-legend-heading": "<strong>Leyenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-restore-default-filters": "Restaurar filtros predeterminados",
+       "rcfilters-clear-all-filters": "Borrar todos los filtros",
+       "rcfilters-search-placeholder": "Filtrar cambios recientes (navega o empieza a escribir)",
+       "rcfilters-invalid-filter": "Filtro no válido",
+       "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "No se encontraron filtros",
+       "rcfilters-filtergroup-registration": "Registro de usuario",
+       "rcfilters-filter-registered-label": "Registrados",
+       "rcfilters-filter-registered-description": "Editores conectados.",
+       "rcfilters-filter-unregistered-label": "No registrados",
+       "rcfilters-filter-unregistered-description": "Editores no conectados.",
+       "rcfilters-filtergroup-authorship": "Editar autoría",
+       "rcfilters-filter-editsbyself-label": "Tus propias ediciones",
+       "rcfilters-filter-editsbyself-description": "Ediciones tuyas",
+       "rcfilters-filter-editsbyother-label": "Ediciones de otros",
+       "rcfilters-filter-editsbyother-description": "Ediciones creadas por otros usuarios (no por ti).",
+       "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (solo para usuarios registrados)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recién llegados",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 ediciones y 4 días de actividad.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
+       "rcfilters-filter-userExpLevel-learner-description": "Más días de actividad y ediciones que los «recién llegados», pero menos que los «usuarios experimentados».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuarios experimentados",
+       "rcfilters-filter-userExpLevel-experienced-description": "Más de 30 días de actividad y 500 ediciones.",
+       "rcfilters-filtergroup-automated": "Contribuciones automatizadas",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Ediciones realizadas por herramientas automatizadas.",
+       "rcfilters-filter-humans-label": "Ser humano (no bot)",
+       "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significación",
+       "rcfilters-filter-minor-label": "Ediciones menores",
+       "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.",
+       "rcfilters-filter-major-label": "Ediciones no menores",
+       "rcfilters-filter-major-description": "Ediciones no etiquetadas como menores.",
+       "rcfilters-filtergroup-changetype": "Tipo de cambio",
+       "rcfilters-filter-pageedits-label": "Ediciones de páginas",
+       "rcfilters-filter-pageedits-description": "Modificaciones del contenido wiki, discusiones, descripción de categorías...",
+       "rcfilters-filter-newpages-label": "Creaciones de páginas",
+       "rcfilters-filter-newpages-description": "Ediciones en las que se crean páginas nuevas.",
+       "rcfilters-filter-categorization-label": "Cambios de categorías",
+       "rcfilters-filter-categorization-description": "Registros de páginas añadidas o borradas de categorías.",
+       "rcfilters-filter-logactions-label": "Acciones registradas",
+       "rcfilters-filter-logactions-description": "Acciones administrativas, creación de cuentas, borrados de páginas, subidas de archivos...",
        "rcnotefrom": "Debajo aparece{{PLURAL:$5| el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfrom": "Mostrar cambios nuevos desde las $2 del $3",
        "rcshowhideminor": "$1 ediciones menores",
        "uploadstash-errclear": "Falló el borrado de los archivos.",
        "uploadstash-refresh": "Actualizar la lista de archivos",
        "uploadstash-thumbnail": "ver miniatura",
+       "uploadstash-exception": "No se pudo almacenar la carga en el área provisional ($1): «$2».",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
        "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "filedelete-intro-old": "Estás borrando la versión de <strong>[[Media:$1|$1]]</strong> del [$4 $2 a las $3].",
        "filedelete-comment": "Motivo:",
        "filedelete-submit": "Eliminar",
-       "filedelete-success": "<strong>$1</strong> ha sido borrado.",
+       "filedelete-success": "<strong>$1</strong> se ha borrado.",
        "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 ha sido borrada.",
        "filedelete-nofile": "<strong>$1</strong> no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de <strong>$1</strong> con los atributos especificados.",
        "statistics-users-active-desc": "Usuarios que han ejecutado una acción en {{PLURAL:$1|el último día|los últimos $1 días}}",
        "pageswithprop": "Páginas con una propiedad de página",
        "pageswithprop-legend": "Páginas con una propiedad de página",
-       "pageswithprop-text": "Esta página muestra las páginas que usan la propiedad de una página en particular",
+       "pageswithprop-text": "Esta página muestra las páginas que usan una determinada propiedad de página.",
        "pageswithprop-prop": "Nombre de la propiedad:",
        "pageswithprop-submit": "Ir",
        "pageswithprop-prophidden-long": "hay un largo valor en la propiedad texto oculta ($1)",
        "uncategorizedcategories": "Categorías sin categorizar",
        "uncategorizedimages": "Archivos sin categorizar",
        "uncategorizedtemplates": "Plantillas sin categorizar",
+       "uncategorized-categories-exceptionlist": "# Contiene una lista de categorías que no deberían figurar en Special:UncategorizedCategories. Una categoría por línea, empezando por «*». Las líneas que empiecen por otro carácter (espacios en blanco incluidos) se ignorarán. Usa «#» para añadir comentarios.",
        "unusedcategories": "Categorías sin uso",
        "unusedimages": "Archivos sin uso",
        "wantedcategories": "Categorías requeridas",
        "apisandbox-alert-field": "El valor de este campo no es válido.",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Vaciar",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] la última petición; {{int:apisandbox-continue-clear}} borrará los parámetros relativos a la continuación.",
        "apisandbox-param-limit": "Escribe <kbd>max</kbd> para usar el límite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Todos los espacios de nombres)",
+       "apisandbox-multivalue-all-values": "$1 (Todos los valores)",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
        "booksources-search": "Buscar",
        "allpagesbadtitle": "El título dado era inválido o tenía un prefijo de enlace inter-idioma o inter-wiki. Puede contener uno o más caracteres que no se pueden usar en títulos.",
        "allpages-bad-ns": "{{SITENAME}} no tiene un espacio de nombres llamado «$1».",
        "allpages-hide-redirects": "Ocultar redirecciones",
-       "cachedspecial-viewing-cached-ttl": "Usted está viendo una versión en caché de esta página, que puede tener hasta  $1 días de antigüedad.",
+       "cachedspecial-viewing-cached-ttl": "Estás viendo una versión de esta página que está almacenada en caché y que puede tener hasta $1 de antigüedad.",
        "cachedspecial-viewing-cached-ts": "Está viendo una versión en caché de esta página, que puede no estar completamente actualizada.",
-       "cachedspecial-refresh-now": "Ver lo más reciente.",
+       "cachedspecial-refresh-now": "Ver la más reciente.",
        "categories": "Categorías",
        "categories-submit": "Mostrar",
-       "categoriespagetext": "Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.\nNo se muestran aquí las [[Special:UnusedCategories|categorías sin uso]].\nVéase también las [[Special:WantedCategories|categorías requeridas]].",
+       "categoriespagetext": "Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.\nNo se muestran aquí las [[Special:UnusedCategories|categorías sin uso]].\nVéanse también las [[Special:WantedCategories|categorías requeridas]].",
        "categoriesfrom": "Mostrar categorías que empiecen por:",
        "deletedcontributions": "Contribuciones borradas de usuario",
        "deletedcontributions-title": "Contribuciones borradas de usuario",
        "emailccsubject": "Copia de tu mensaje a $1: $2",
        "emailsent": "Correo electrónico enviado",
        "emailsenttext": "Se ha enviado tu mensaje de correo electrónico.",
-       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}. {{GENDER:$2|Tu}} correo electrónico se enviará directamente {{GENDER:$1|al emisor|a la emisora}} original, y {{GENDER:$1|le}} revelará {{GENDER:$2|tu}} dirección de correo electrónico.",
        "usermessage-summary": "Dejando un mensaje de sistema.",
        "usermessage-editor": "Mensajero del sistema",
        "watchlist": "Lista de seguimiento",
        "changecontentmodel-emptymodels-title": "No hay modelos de contenido disponibles",
        "changecontentmodel-emptymodels-text": "El contenido de [[:$1]] no se puede convertir a ningún tipo.",
        "log-name-contentmodel": "Registro de cambios del modelo de contenido",
-       "log-description-contentmodel": "Eventos relacionados con los modelos de contenido de una página",
+       "log-description-contentmodel": "Esta página muestra cambios en el modelo de contenido de las páginas, así como las páginas creadas con un modelo de contenido distinto del estándar.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la página $3 usando un modelo de contenido no predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}} el modelo de contenido de la página $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "revertir",
        "unblock": "Desbloquear usuario",
        "blockip": "Bloquear {{GENDER:$1|al usuario|a la usuaria}}",
        "blockip-legend": "Bloquear usuario",
-       "blockiptext": "Usa el siguiente formulario para bloquear el acceso de escritura desde una dirección IP específica o nombre de usuario.\nEsto debería hacerse sólo para prevenir vandalismos, y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).\nPuedes bloquear intervalos IP con la sintaxis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; el intervalo más grande permitido es /$1 para IPv4 y /$2 para IPv6.",
+       "blockiptext": "Utiliza el siguiente formulario para bloquear el acceso de escritura a un determinado usuario o dirección IP.\nEsto debería hacerse solo para prevenir vandalismo y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).\nPuedes bloquear intervalos IP con la sintaxis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; el intervalo más grande permitido es /$1 para IPv4 y /$2 para IPv6.",
        "ipaddressorusername": "Dirección IP o nombre de usuario:",
        "ipbexpiry": "Caducidad:",
        "ipbreason": "Motivo:",
        "proxyblockreason": "Tu dirección IP ha sido bloqueada porque es un proxy abierto.\nContacta con tu proveedor de servicios de Internet o con tu servicio de asistencia técnica e infórmales de este grave problema de seguridad.",
        "sorbsreason": "Su dirección IP está listada como proxy abierto en DNSBL.",
        "sorbs_create_account_reason": "Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta",
+       "softblockrangesreason": "Las contribuciones anónimas desde tu dirección IP ($1) no están permitidas. Por favor, inicia sesión.",
        "xffblockreason": "Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1",
        "cant-see-hidden-user": "El usuario que estas intentando bloquear ya ha sido bloqueado y ocultado.\nDado que no tienes permisos suficientes no puedes ver ni editar el bloqueo de este usuario.",
        "ipbblocked": "No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
        "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
        "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
+       "cant-move-subpages": "No tienes permiso para trasladar subpáginas.",
+       "namespace-nosubpages": "El espacio de nombres «$1» no permite subpáginas.",
        "newtitle": "Título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "tooltip-minoredit": "Marcar este cambio como menor",
        "tooltip-save": "Guardar los cambios",
        "tooltip-publish": "Publicar tus cambios",
-       "tooltip-preview": "Previsualiza tus cambios. ¡Hazlo antes de grabar!",
+       "tooltip-preview": "Previsualiza tus cambios. Hazlo antes de guardarlos.",
        "tooltip-diff": "Mostrar los cambios que has hecho en el texto.",
        "tooltip-compareselectedversions": "Ver las diferencias entre las dos versiones seleccionadas de esta página.",
        "tooltip-watch": "Añadir esta página a tu lista de seguimiento",
        "pageinfo-length": "Longitud de la página (en bytes)",
        "pageinfo-article-id": "Identificador de la página",
        "pageinfo-language": "Idioma de la página",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modelo de contenido de la página",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indización por robots",
        "log-show-hide-patrol": "$1 registro de verificación",
        "log-show-hide-tag": "$1 registro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
-       "confirm-markpatrolled-top": "marcar la revisión $3 de $2 como revisada?",
+       "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como verificada?",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "filedeleteerror-long": "Se han producido errores mientras se borraba el archivo:\n\n$1",
        "newimages-showbots": "Mostrar cargas de bots",
        "newimages-hidepatrolled": "Ocultar las subidas verificadas",
        "noimages": "No hay nada que ver.",
+       "gallery-slideshow-toggle": "Alternar las miniaturas",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1",
        "exif-compression-6": "JPEG (antiguo)",
        "exif-copyrighted-true": "Con derechos de autor",
        "exif-copyrighted-false": "No se ha definido el estado del copyright",
+       "exif-photometricinterpretation-0": "Blanco y negro (blanco es 0)",
        "exif-photometricinterpretation-1": "Blanco y negro (el negro es 0)",
        "exif-photometricinterpretation-4": "Máscara de transparencia",
        "exif-photometricinterpretation-5": "Separados (Probablemente CMYK)",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 página ha sido borrada|$1 páginas han sido borradas}} de tu lista de seguimiento:",
        "watchlistedit-raw-title": "Editar lista de seguimiento en crudo",
        "watchlistedit-raw-legend": "Editar tu lista de seguimiento en modo texto",
-       "watchlistedit-raw-explain": "A continuación se listan las páginas en tu lista de seguimiento. Esta lista puede editarse añadiendo o eliminando líneas de la lista;\nun título por línea.\nCuando acabes, pulsa «{{int:Watchlistedit-raw-submit}}».\nTambién puedes [[Special:EditWatchlist|usar el editor estándar]].",
+       "watchlistedit-raw-explain": "A continuación se muestran los títulos de las páginas en tu lista de seguimiento. Puedes editar la lista añadiendo o eliminando títulos de la lista (un título por línea).\nCuando acabes, pulsa «{{int:Watchlistedit-raw-submit}}».\nTambién puedes [[Special:EditWatchlist|usar el editor estándar]].",
        "watchlistedit-raw-titles": "Páginas:",
        "watchlistedit-raw-submit": "Actualizar lista de seguimiento",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "version-libraries-license": "Licencia",
        "version-libraries-description": "Descripción",
        "version-libraries-authors": "Autores",
-       "redirect": "Redirigir por archivo, o identificador de usuario, página, revisión o registro",
+       "redirect": "Redirigir por archivo o por identificador de usuario, página, revisión o registro.",
        "redirect-summary": "Esta página especial redirige a un archivo (dado un nombre), a una página (dado un identificador de revisión o de página), a una página de usuario (dado un identificador numérico de usuario) o a una entrada del registro (dado un identificador de registro). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar:",
        "redirect-value": "Valor:",
-       "redirect-user": "Id. del usuario",
+       "redirect-user": "Identificador del usuario",
        "redirect-page": "Identificador de la página",
        "redirect-revision": "Revisión de página",
-       "redirect-file": "Nombre de archivo",
+       "redirect-file": "Nombre del archivo",
        "redirect-logid": "Identificador de registro",
        "redirect-not-exists": "No se encontró el valor",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "htmlform-user-not-exists": "<strong>$1</strong> no existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|borró}} la redirección $3 con un traslado",
        "logentry-delete-restore": "$1 restauró la página «$3»",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "feedback-useragent": "Agente de usuario:",
        "searchsuggest-search": "Buscar en {{SITENAME}}",
        "searchsuggest-containing": "que contiene...",
-       "api-error-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
-       "api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
-       "api-error-blocked": "Has sido bloqueado de editar.",
-       "api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
-       "api-error-duplicate": "Ya {{PLURAL:$1|existe otro archivo|existen otros archivos}} en el sitio con el mismo contenido.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía otro archivo|existían otros archivos}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue eliminado|fueron eliminados}}.",
-       "api-error-empty-file": "El archivo que enviaste estaba vacío.",
        "api-error-emptypage": "No se pueden crear páginas nuevas que estén vacías.",
-       "api-error-fetchfileerror": "Error interno: Algo salió mal mientras se obtenía el archivo.",
-       "api-error-fileexists-forbidden": "Ya existe el archivo \"$1\" y no se puede sobreescribir.",
-       "api-error-fileexists-shared-forbidden": "Ya existe \"$1\" en el repositorio de archivos compartidos y no se puede sobreescribir.",
-       "api-error-file-too-large": "El archivo que enviaste era demasiado grande.",
-       "api-error-filename-tooshort": "El nombre de archivo es demasiado corto.",
-       "api-error-filetype-banned": "Este tipo de archivo está prohibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|no es un tipo de archivo permitido|no son tipos de archivos permitidos}}. {{PLURAL:$3|El tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.",
-       "api-error-filetype-missing": "El archivo no tiene extensión de archivo.",
-       "api-error-hookaborted": "La modificación que intentaste hacer fue cancelada por una extensión.",
-       "api-error-http": "Error interno: No se puede conectar al servidor.",
-       "api-error-illegal-filename": "El nombre de archivo no está permitido.",
-       "api-error-internal-error": "Error interno: Algo salió mal al procesar tu subida en el wiki.",
-       "api-error-invalid-file-key": "Error interno: No se encontró el archivo en el almacenamiento temporal.",
-       "api-error-missingparam": "Error interno: Faltan parámetros en la solicitud.",
-       "api-error-missingresult": "Error interno: No se pudo determinar si la copia tuvo éxito.",
-       "api-error-mustbeloggedin": "Debes iniciar sesión para subir archivos.",
-       "api-error-mustbeposted": "Error interno: La solicitud requiere HTTP POST.",
-       "api-error-noimageinfo": "La carga se realizó correctamente, pero el servidor no nos dio ninguna información sobre el archivo.",
-       "api-error-nomodule": "Error interno: No hay un módulo de carga configurado.",
-       "api-error-ok-but-empty": "Error interno: No hay respuesta del servidor.",
-       "api-error-overwrite": "No se permite sobrescribir un archivo existente.",
-       "api-error-ratelimited": "Estás tratando de subir, en un corto periodo de tiempo, más archivos de los que este wiki permite.\nPor favor, inténtalo de nuevo dentro de algunos minutos.",
-       "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
        "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
-       "api-error-stasherror": "Ha ocurrido un error al subir el archivo al depósito.",
-       "api-error-stashedfilenotfound": "No se encontró el archivo del espacio temporal al intentar cargarlo.",
-       "api-error-stashpathinvalid": "La ruta donde debería encontrarse el archivo del espacio temporal no es válida.",
-       "api-error-stashfilestorage": "Ocurrió un error al almacenar el archivo en el espacio temporal.",
-       "api-error-stashzerolength": "El servidor no pudo almacenar el archivo en el espacio temporal porque este no contiene datos.",
-       "api-error-stashnotloggedin": "Debes acceder para guardar archivos en el espacio temporal de carga.",
-       "api-error-stashwrongowner": "El archivo del espacio temporal al que quieres acceder no te pertenece.",
-       "api-error-stashnosuchfilekey": "La clave de archivo del espacio temporal al que quieres acceder no existe.",
-       "api-error-timeout": "El servidor no respondió en el plazo previsto.",
-       "api-error-unclassified": "Ocurrió un error desconocido.",
-       "api-error-unknown-code": "Error desconocido: «$1»",
-       "api-error-unknown-error": "Error interno: Algo salió mal al intentar cargar el archivo.",
-       "api-error-unknown-warning": "Advertencia desconocida: $1",
+       "api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
+       "api-error-unknown-warning": "Advertencia desconocida: «$1».",
        "api-error-unknownerror": "Error desconocido: «$1».",
-       "api-error-uploaddisabled": "Las subidas están desactivadas en este wiki.",
-       "api-error-verification-error": "Este archivo puede estar dañado, o tiene una extensión incorrecta.",
-       "api-error-was-deleted": "Un archivo de este nombre se ha subido previamente y eliminado posteriormente.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Utilizar el idioma predeterminado",
        "pagelang-select-lang": "Seleccionar idioma",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "La página $1 no existe.",
+       "pagelang-unchanged-language": "La página $1 ya está configurada en $2.",
+       "pagelang-unchanged-language-default": "La página $1 ya está configurada en el idioma predeterminado del wiki.",
+       "pagelang-db-failed": "La base de datos no ha podido cambiar el idioma de la página.",
        "right-pagelang": "Cambiar el idioma de la página",
        "action-pagelang": "cambiar el idioma de la página",
        "log-name-pagelang": "Registro de cambios de idiomas",
        "default-skin-not-found-no-skins": "¡Vaya! La apariencia predeterminada de tu wiki, definida en <code>$wgDefaultSkin</code> como <code>$1</code>, no está disponible.\n\nNo tienes apariencias instaladas.\n\n; Si has instalado o actualizado MediaWiki recientemente:\n: Probablemente has instalado desde git, o directamente desde el código fuente usando algún otro método. Esto puede ocurrir en este caso. A partir de MediaWiki 1.24 ya no se incluye ninguna apariencia en el repositorio principal. Trata de instalar algunas apariencias desde el [https://www.mediawiki.org/wiki/Category:All_skins directorio de apariencias de mediawiki.org], ya sea:\n:* Descargando el [https://www.mediawiki.org/wiki/Download instalador tarball], que viene con varias apariencias y extensiones. Puedes copiar y pegar el directorio <code>skins/</code> desde ahí.\n:* Descargando tarballs individuales de cada apariencia de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git para descargar apariencias].\n: Hacer esto no debería interferir con tu repositorio de MediaWiki si eres un desarrollador de MediaWiki. Revisa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Configuración de apariencias] para información sobre cómo habilitar las apariencias y seleccionar la predeterminada.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activada)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>desactivada</strong>)",
-       "mediastatistics": "Estadísticas de multimedia",
-       "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Sólo se incluyen las versiones más recientes. Los archivos antiguos o eliminados están excluidos.",
+       "mediastatistics": "Estadísticas multimedia",
+       "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Solo se tiene en cuenta la versión más reciente de cada archivo. Los archivos antiguos o eliminados están excluidos.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ''byte''|$1 ''bytes''}} ($2; $3 %)",
        "mediastatistics-bytespertype": "Tamaño de archivo total para esta sección: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
        "mw-widgets-dateinput-no-date": "Ninguna fecha seleccionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Buscar multimedia",
+       "mw-widgets-mediasearch-noresults": "No se han encontrado resultados.",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Agregar una categoría...",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
        "sessionprovider-nocookies": "Puede que las cookies estén desactivadas. Actívalas y comienza de nuevo.",
        "randomrootpage": "Página raíz aleatoria",
        "log-action-filter-block": "Tipo de bloqueo:",
-       "log-action-filter-contentmodel": "Tipo de contentmodel modificación:",
+       "log-action-filter-contentmodel": "Tipo de modificación del modelo de contenido:",
        "log-action-filter-delete": "Tipo de eliminación:",
        "log-action-filter-import": "Tipo de importación:",
        "log-action-filter-managetags": "Tipo de administración de la etiqueta de acción:",
        "log-action-filter-block-reblock": "Modificación de bloqueo",
        "log-action-filter-block-unblock": "Desbloquear",
        "log-action-filter-contentmodel-change": "Cambio de modelo de contenido",
-       "log-action-filter-contentmodel-new": "Creación de página con modelo de contenidos no estándar",
+       "log-action-filter-contentmodel-new": "Creación de página con modelo de contenido no estándar",
        "log-action-filter-delete-delete": "Eliminación de páginas",
+       "log-action-filter-delete-delete_redir": "Sobrescritura de la redirección",
        "log-action-filter-delete-restore": "Restauración de páginas",
        "log-action-filter-delete-event": "Eliminación de registros",
        "log-action-filter-delete-revision": "Eliminación de revisión",
        "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
        "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 activar todo, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>",
+       "revid": "revisión $1",
+       "pageid": "ID de página $1"
 }
index b60983e..0765249 100644 (file)
        "searcharticle": "Mine",
        "history": "Ajalugu",
        "history_short": "Ajalugu",
+       "history_small": "ajalugu",
        "updatedmarker": "uuendatud pärast viimast külastust",
        "printableversion": "Prinditav versioon",
        "permalink": "Püsilink",
        "createacct-another-realname-tip": "Tegelik nimi on valikuline.\nKui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.",
        "pt-login": "Logi sisse",
        "pt-login-button": "Logi sisse",
+       "pt-login-continue-button": "Jätka sisselogimist",
        "pt-createaccount": "Loo konto",
        "pt-userlogout": "Logi välja",
        "php-mail-error-unknown": "Tundmatu tõrge PHP funktsioonis mail().",
        "blockedtitle": "Kasutaja on blokeeritud",
        "blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:''$2''\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa teisele kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi ega ole selle kasutamisest blokeeritud.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
+       "systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "blockednoreason": "põhjendust ei ole kirja pandud",
        "whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
        "confirmedittext": "Lehekülgi ei saa toimetada enne e-posti aadressi kinnitamist.\nPalun määra ja kinnita e-posti aadress [[Special:Preferences|eelistuste leheküljel]].",
        "invalid-content-data": "Vigased sisuandmed",
        "content-not-allowed-here": "Lehekülg [[$2]] ei tohi sisaldada $1i.",
        "editwarning-warning": "Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.\nKui oled sisse loginud, saad selle hoiatuse eelistuste alaosas \"{{int:prefs-editing}}\" keelata.",
+       "editpage-invalidcontentmodel-title": "Toetamata sisumudel",
+       "editpage-invalidcontentmodel-text": "Sisumudelit \"$1\" ei toetata.",
        "editpage-notsupportedcontentformat-title": "Sisuvormingu tugi puudub",
        "editpage-notsupportedcontentformat-text": "Sisumudelil $2 puudub sisuvormingu $1 tugi.",
        "content-model-wikitext": "vikitekst",
        "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
        "mergehistory-done": "Lehekülje $1 {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
        "mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
+       "mergehistory-fail-bad-timestamp": "Ajatempel on vigane.",
+       "mergehistory-fail-invalid-source": "Alliklehekülg on vigane.",
+       "mergehistory-fail-invalid-dest": "Sihtlehekülg on vigane.",
+       "mergehistory-fail-no-change": "Ajalugude liitmisel ei liidetud ühtegi redaktsiooni. Palun kontrolli lehekülgede ja aja parameetrid veelkord üle.",
+       "mergehistory-fail-permission": "Ajalugude liitmiseks vajalikud õigused puuduvad.",
+       "mergehistory-fail-self-merge": "Allik- ja sihtlehekülg on üks ja sama lehekülg.",
+       "mergehistory-fail-timestamps-overlap": "Alliklehekülje redaktsioonid kattuvad ajaliselt sihtlehekülje redaktsioonidega või on neist uuemad.",
        "mergehistory-fail-toobig": "Ajalugusid ei õnnestu liita, sest teisaldada tuleks rohkem kui {{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}, mis on piirmäär.",
        "mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
        "mergehistory-no-destination": "Sihtlehekülge $1 pole olemas.",
        "search-external": "Välisotsing",
        "searchdisabled": "Otsimine on preagu keelatud.\nVahepeal saad otsimiseks Google'it kasutada.\nPane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
        "search-error": "Otsimise ajal ilmnes tõrge: $1",
+       "search-warning": "Otsimisel esines hoiatus: $1",
        "preferences": "Eelistused",
        "mypreferences": "Eelistused",
        "prefs-edits": "Redigeerimiste arv:",
        "prefs-watchlist-token": "Jälgimisloendi luba:",
        "prefs-misc": "Muu",
        "prefs-resetpass": "Muuda parool",
-       "prefs-changeemail": "Muuda e-posti aadressi või eemalda see",
+       "prefs-changeemail": "muuda e-posti aadressi või eemalda see",
        "prefs-setemail": "Määra e-posti aadress",
        "prefs-email": "E-posti sätted",
        "prefs-rendering": "Ilme",
        "saveprefs": "Salvesta eelistused",
        "restoreprefs": "Taasta kõik vaike-eelistused (kõigil kaartidel)",
        "prefs-editing": "Toimetamine",
-       "rows": "Ridu:",
-       "columns": "Veerge:",
        "searchresultshead": "Otsingutulemite sätted",
        "stub-threshold": "Nupukese suurus lingivormistusel ($1):",
        "stub-threshold-sample-link": "näide",
        "prefs-namespaces": "Nimeruumid",
        "default": "vaikeväärtus",
        "prefs-files": "Failid",
-       "prefs-custom-css": "Kohandatud CSS",
-       "prefs-custom-js": "Kohandatud JavaScript",
+       "prefs-custom-css": "kohandatud CSS",
+       "prefs-custom-js": "kohandatud JavaScript",
        "prefs-common-css-js": "Kõigi kujunduste ühine CSS/JavaScript:",
        "prefs-reset-intro": "Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.\nToimingut ei saa hiljem tühistada.",
        "prefs-emailconfirm-label": "E-posti kinnitus:",
        "userrights-user-editname": "Sisesta kasutajanimi:",
        "editusergroup": "Laadi kasutajarühmad",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
+       "viewinguserrights": "{{GENDER:$1|Kasutaja}} <strong>[[User:$1|$1]]</strong> $2 õiguste vaatamine",
        "userrights-editusergroup": "Kasutajarühmade muutmine",
+       "userrights-viewusergroup": "Kasutajarühmade vaatamine",
        "saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
        "userrights-groupsmember": "Kuulub rühmadesse:",
        "userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
        "right-reupload-shared": "Asendada kohalikus vikis jagatud failivaramu faile",
        "right-upload_by_url": "Faile internetiaadressilt üles laadida",
        "right-purge": "Tühjendada lehekülje vahemälu kinnituseta",
-       "right-autoconfirmed": "Hoiduda IP-põhistest piirangumääradest",
+       "right-autoconfirmed": "Hoiduda IP-aadressi põhistest piirangumääradest",
        "right-bot": "Olla koheldud kui automaadistatud toimimisviis",
        "right-nominornewtalk": "Teha arutelulehekülgedel pisimuudatusi, ilma et lehekülg märgitaks uuena",
        "right-apihighlimits": "Kasutada API-päringutes kõrgemaid limiite",
        "action-upload_by_url": "seda faili internetiaadressilt üles laadida",
        "action-writeapi": "kirjutamise rakendusliidest kasutada",
        "action-delete": "seda lehekülge kustutada",
-       "action-deleterevision": "seda redaktsiooni kustutada",
-       "action-deletedhistory": "selle lehekülje kustutatud ajalugu vaadata",
+       "action-deleterevision": "redaktsioone kustutada",
+       "action-deletedhistory": "vaadata lehekülje kustutatud ajalugu",
        "action-browsearchive": "kustutatud lehekülgi otsida",
        "action-undelete": "lehekülgi taastada",
-       "action-suppressrevision": "seda peidetud redaktsiooni vaadata ega taastada",
+       "action-suppressrevision": "peidetud redaktsioone vaadata ega taastada",
        "action-suppressionlog": "seda eralogi vaadata",
        "action-block": "selle kasutaja redigeerimisõigust blokeerida",
        "action-protect": "selle lehekülje kaitsetasemeid muuta",
        "allpagesbadtitle": "Lehekülje pealkiri oli vigane või sisaldas teise viki või keele eesliidet.\nSee võib sisaldada üht või enamat märki, mida ei saa pealkirjades kasutada.",
        "allpages-bad-ns": "{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi \"$1\".",
        "allpages-hide-redirects": "Peida ümbersuunamised",
-       "cachedspecial-viewing-cached-ttl": "Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vana.",
+       "cachedspecial-viewing-cached-ttl": "Sa vaatad lehekülje vahemälus olevat versiooni, mis võib olla kuni $1 vana.",
        "cachedspecial-viewing-cached-ts": "Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.",
        "cachedspecial-refresh-now": "Vaata uusimat versiooni.",
        "categories": "Kategooriad",
        "usermessage-editor": "Süsteemiteadete edastaja",
        "watchlist": "Jälgimisloend",
        "mywatchlist": "Jälgimisloend",
-       "watchlistfor2": "Kasutaja $1 $2 jaoks",
+       "watchlistfor2": "Kasutaja $1 $2 jälgimisloend",
        "nowatchlist": "Sinu jälgimisloend on tühi.",
        "watchlistanontext": "Palun logi sisse, et oma jälgimisloendit näha või muuta.",
        "watchnologin": "Ei ole sisse logitud",
        "addwatch": "Lisa jälgimisloendisse",
        "addedwatchtext": "\"[[:$1]]\" ja selle arutelulehekülg on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" ja sellega seotud lehekülg on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].",
        "addedwatchtext-short": "Lehekülg \"$1\" on lisatud sinu jälgimisloendisse.",
        "removewatch": "Eemalda jälgimisloendist",
        "removedwatchtext": "\"[[:$1]]\" ja selle arutelulehekülg on [[Special:Watchlist|jälgimisloendist]] eemaldatud.",
+       "removedwatchtext-talk": "\"[[:$1]]\" ja sellega seotud lehekülg on sinu [[Special:Watchlist|jälgimisloendist]] eemaldatud.",
        "removedwatchtext-short": "Lehekülg \"$1\" on eemaldatud sinu jälgimisloendist.",
        "watch": "Jälgi",
        "watchthispage": "Jälgi seda lehekülge",
        "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
        "changecontentmodel-nodirectediting": "Sisumudel $1 ei võimalda otseredigeerimist.",
        "log-name-contentmodel": "Sisumudeli muutmislogi",
-       "log-description-contentmodel": "Lehekülje sisumudelite muutmisega seotud sündmused",
+       "log-description-contentmodel": "Siin on loetletud lehekülgede sisumudelite muudatused ning leheküljed, mis loodi vaikeväärtusest erineva sisumudeliga.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" sisumudeli: \"$4\" → \"$5\"",
        "logentry-contentmodel-change-revertlink": "võta tagasi",
        "logentry-contentmodel-change-revert": "tagasi võetud",
        "modifiedarticleprotection": "muutis lehekülje \"[[$1]]\" kaitsemäära",
        "unprotectedarticle": "eemaldas lehekülje \"[[$1]]\" kaitse",
        "movedarticleprotection": "teisaldas kaitsesätted leheküljelt \"[[$2]]\" leheküljele \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Kaitsti}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Muudeti}} lehekülje \"[[$1]]\" kaitsetase",
+       "unprotectedarticle-comment": "{{GENDER:$2|Eemaldati}} lehekülje \"[[$1]]\" kaitse",
        "protect-title": "Lehekülje \"$1\" kaitsemäära muutmine",
        "protect-title-notallowed": "Lehekülje \"$1\" kaitsemäära vaatamine",
        "prot_1movedto2": "Lehekülg \"[[$1]]\" teisaldatud pealkirja \"[[$2]]\" alla",
        "contributions-title": "Kasutaja $1 kaastöö",
        "mycontris": "Kaastöö",
        "anoncontribs": "Kaastöö",
-       "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) jaoks",
+       "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) kaastöö",
        "contributions-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "nocontribs": "Antud kriteeriumitele vastavaid muudatusi ei leitud.",
        "uctop": "(praegune)",
        "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
-       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Note:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Hoiatus!</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "export-download": "Salvesta failina",
        "export-templates": "Kaasa mallid",
        "export-pagelinks": "Kaasan viidatud lehed kuni tasemeni",
+       "export-manual": "Käsitsi lisatud leheküljed:",
        "allmessages": "Kõik süsteemi sõnumid",
        "allmessagesname": "Nimi",
        "allmessagesdefault": "Vaiketekst",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
        "newimages-showbots": "Näita robotite üles laaditud faile",
+       "newimages-hidepatrolled": "Peida kontrollitud failid",
        "noimages": "Uusi pilte ei ole.",
        "gallery-slideshow-toggle": "Lülita pisipildid ümber",
        "ilsubmit": "Otsi",
        "watchlistedit-clear-done": "Sinu jälgimisloend on tühjendatud.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Üks pealkiri|$1 pealkirja}} eemaldati:",
        "watchlistedit-too-many": "Pealkirju on siin kuvamiseks liiga palju.",
-       "watchlisttools-clear": "Tühjenda jälgimisloend",
-       "watchlisttools-view": "Näita vastavaid muudatusi",
-       "watchlisttools-edit": "Vaata ja redigeeri jälgimisloendit",
-       "watchlisttools-raw": "Muuda lähteteksti",
+       "watchlisttools-clear": "tühjenda jälgimisloend",
+       "watchlisttools-view": "näita vastavaid muudatusi",
+       "watchlisttools-edit": "vaata ja redigeeri jälgimisloendit",
+       "watchlisttools-raw": "redigeeri jälgimisloendi toorandmeid",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])",
        "duplicate-defaultsort": "'''Hoiatus:''' Järjestamisvõti \"$2\" tühistab eespool oleva järjestamisvõtme \"$1\".",
        "duplicate-displaytitle": "<strong>Hoiatus:</strong> Kuvatava pealkirjaga \"$2\" kirjutatakse üle varasem kuvatav pealkiri \"$1\".",
        "feedback-useragent": "Kasutajaagent:",
        "searchsuggest-search": "Otsi {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisalduv...",
-       "api-error-badaccess-groups": "Sul pole selles vikis üleslaadimisõigust.",
        "api-error-badtoken": "Sisemine tõrge: Sobimatu nimi.",
-       "api-error-copyuploaddisabled": "URLi kaudu üleslaadimine on selles serveris keelatud.",
-       "api-error-duplicate": "Siin on {{PLURAL:$1|teine samasisuline fail|mõned teised samasisulised failid}} juba olemas.",
-       "api-error-duplicate-archive": "Siin {{PLURAL:$1|on teine samasisuline fail|olid mõned teised samasisulised failid}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.",
-       "api-error-empty-file": "Üleslaaditav fail on tühi.",
        "api-error-emptypage": "Uute tühjade lehekülgede loomine pole lubatud.",
-       "api-error-fetchfileerror": "Sisemine tõrge: Midagi läks faili kättesaamisel valesti.",
-       "api-error-fileexists-forbidden": "Fail nimega \"$1\" on juba olemas ja seda ei saa üle kirjutada.",
-       "api-error-fileexists-shared-forbidden": "Fail nimega \"$1\" on jagatud failivaramus juba olemas ja seda ei saa üle kirjutada.",
-       "api-error-file-too-large": "Üleslaaditav fail on liiga suur.",
-       "api-error-filename-tooshort": "Failinimi on liiga lühike.",
-       "api-error-filetype-banned": "Antud failitüüp on keelatud.",
-       "api-error-filetype-banned-type": "$1 pole lubatud {{PLURAL:$4|failitüüp|failitüübid}}.  Lubatud {{PLURAL:$3|failitüüp|failitüübid}} on  $2.",
-       "api-error-filetype-missing": "Failinime tagant puudub laiend.",
-       "api-error-hookaborted": "Tarkvaralisa katkestas muudatuse tegemise.",
-       "api-error-http": "Sisetõrge: Serveriga pole võimalik ühendust luua.",
-       "api-error-illegal-filename": "Failinimi pole lubatud.",
-       "api-error-internal-error": "Sisetõrge: Sinu faili vikisse üleslaadimise juures läks midagi valesti.",
-       "api-error-invalid-file-key": "Sisetõrge: Faili ei leitud ajutisest mälust.",
-       "api-error-missingparam": "Sisetõrge: Päringust puudub mõni parameeter.",
-       "api-error-missingresult": "Sisetõrge: Ei õnnestu kindlaks teha, kas kopeerimine õnnestus.",
-       "api-error-mustbeloggedin": "Failide üleslaadimiseks pead sisse logima.",
-       "api-error-mustbeposted": "Sisetõrge: Päring tuleb sooritada, kasutades HTTP POST-meetodit.",
-       "api-error-noimageinfo": "Üleslaadimine õnnestus, aga server ei andnud faili kohta mingit teavet.",
-       "api-error-nomodule": "Sisetõrge: Üleslaadimismoodul on määramata.",
-       "api-error-ok-but-empty": "Sisetõrge: Server ei vasta.",
-       "api-error-overwrite": "Olemasolevate failide ülekirjutamine pole lubatud.",
-       "api-error-stashfailed": "Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.",
        "api-error-publishfailed": "Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.",
-       "api-error-stasherror": "Selle faili hoidlasse üleslaadimisel ilmnes tõrge.",
-       "api-error-stashedfilenotfound": "Algses hoidlas talletatud faili ei leitud, kui seda sealt üles püüti laadida.",
-       "api-error-stashpathinvalid": "Failitee, kus algse hoidla fail pidanuks leiduma, oli vigane.",
-       "api-error-stashfilestorage": "Faili algsesse hoidlasse talletamisel esines tõrge.",
-       "api-error-stashzerolength": "Server ei saanud faili algses hoidlas talletada, sest fail on tühi.",
-       "api-error-stashnotloggedin": "Pead olema sisse logitud, et salvestada faile üleslaadimise algsesse hoidlasse.",
-       "api-error-stashwrongowner": "Fail, mille juurde algses hoidlas üritasid pääseda, ei kuulu sulle.",
-       "api-error-stashnosuchfilekey": "Failivõtit, mille juurde algses hoidlas üritasid pääseda, pole olemas.",
-       "api-error-timeout": "Server ei vastanud oodatud aja sees.",
-       "api-error-unclassified": "Ilmnes teadmata tõrge.",
-       "api-error-unknown-code": "Teadmata tõrge: \"$1\"",
-       "api-error-unknown-error": "Sisetõrge: Sellal kui sinu faili üritati üles laadida, läks midagi valesti.",
+       "api-error-stashfailed": "Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.",
        "api-error-unknown-warning": "Teadmata hoiatus: $1",
        "api-error-unknownerror": "Tundmatu tõrge: \"$1\".",
-       "api-error-uploaddisabled": "Üleslaadimine on selles vikis keelatud.",
-       "api-error-verification-error": "See fail võib olla rikutud või vale laiendiga.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekundit}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minutit}}",
        "duration-hours": "$1 {{PLURAL:$1|tund|tundi}}",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
+       "mw-widgets-categoryselector-add-category-placeholder": "Lisa kategooria...",
        "sessionprovider-generic": "klassi $1 seansse",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "küpsisepõhiseid seansse",
        "randomrootpage": "Juhuslik juurlehekülg",
        "log-action-filter-block-reblock": "Blokeeringu muutmine",
        "log-action-filter-block-unblock": "Blokeeringu tühistamine",
        "log-action-filter-contentmodel-change": "Sisumudeli muudatus",
-       "log-action-filter-contentmodel-new": "Ebastandardse sisumudeliga lehekülje loomine",
+       "log-action-filter-contentmodel-new": "Vaikeväärtusest erineva sisumudeliga lehekülje loomine",
        "log-action-filter-delete-delete": "Lehekülje kustutamine",
        "log-action-filter-delete-delete_redir": "Ümbersuunamise ülekirjutamine",
        "log-action-filter-delete-restore": "Lehekülje taastamine",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
        "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 süntaksit <br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>"
 }
index 5c5d846..aba144a 100644 (file)
@@ -47,7 +47,7 @@
        "tog-watchdeletion": "Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchuploads": "Gehitu igotzen ditudan fitxategiak nire jarraipen zerrendara",
        "tog-watchrollback": "Nire jarraipen zerrendan rollbacka egin dudan orrialdeak erakutsi",
-       "tog-minordefault": "Lehenetsi bezala aldaketa txiki bezala markatu guztiak",
+       "tog-minordefault": "Aukera lehenetsitzat, markatu aldaketa guztiak txikitzat",
        "tog-previewontop": "Aurrebista aldaketa koadroaren aurretik erakutsi",
        "tog-previewonfirst": "Lehen aldaketan aurrebista erakutsi",
        "tog-enotifwatchlistpages": "Bidal iezadazue e-posta bat, jarraitzen ari naizen orrialde edo fitxategi bat aldatzen denean",
        "subcategories": "Azpikategoriak",
        "category-media-header": "Media \"$1\" kategorian",
        "category-empty": "''Kategoria honek ez dauka artikulurik uneotan.''",
-       "hidden-categories": "{{PLURAL:$1|Izkutuko kategoria|Izkutuko kategoriak}}",
+       "hidden-categories": "{{PLURAL:$1|Ezkutuko kategoria|Ezkutuko kategoriak}}",
        "hidden-category-category": "Kategoria ezkutuak",
        "category-subcat-count": "{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}",
        "category-subcat-count-limited": "Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.",
        "searcharticle": "Joan",
        "history": "Orriaren historia",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "permalink": "Lotura finkoa",
        "views": "Ikustaldiak",
        "toolbox": "Tresnak",
        "tool-link-userrights": "Erabiltzaile {{GENDER:$1|taldea}} aldatu",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Erabiltzailearen}} taldeak  ikusi",
        "tool-link-emailuser": "{{GENDER:$1|Erabiltzale}} honi e-posta bidali",
        "userpage": "Lankide orrialdea ikusi",
        "projectpage": "Proiektuaren orrialdea ikusi",
        "virus-scanfailed": "eskaneatze txarra ($1 kodea)",
        "virus-unknownscanner": "antibirus ezezaguna:",
        "logouttext": "'''Saioa itxi egin duzu.'''\n\nJakin ezazu hainbat orrialdetan ager daitekela oraindik saioa ez duzula itxi, zure nabigatzailearen katxea garbitzen ez duzun arte.",
+       "cannotlogoutnow-title": "Ezin da saioa itxi orain",
+       "cannotlogoutnow-text": "Saioa ezin da itxi $1 erabiltzean.",
        "welcomeuser": "Ongi etorri, $1!",
        "welcomecreation-msg": "Zure kontua sortua izan da.\nEz ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.",
        "yourname": "Erabiltzaile izena",
        "createacct-yourpasswordagain-ph": "Sartu pasahitza berriro ere",
        "userlogin-remembermypassword": "Manten nazazu barruan",
        "userlogin-signwithsecure": "Erabili konexio ziurra",
+       "cannotlogin-title": "Ezin da saioa hasi",
+       "cannotlogin-text": "Saioa hastea ez da posible izan.",
+       "cannotloginnow-title": "Ezin da saioa hasi orain",
+       "cannotloginnow-text": "Saioa ezin da hasi $1 erabiltzean.",
+       "cannotcreateaccount-title": "Kontuak ezin dira sortu",
        "yourdomainname": "Zure domeinua",
        "password-change-forbidden": "Ezin duzu pasahitzarik aldatu wiki honetan.",
        "externaldberror": "Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.",
-       "login": "Saioa hasi",
-       "nav-login-createaccount": "Saioa hasi / kontua sortu",
+       "login": "Hasi saioa",
+       "login-security": "Zure nortasuna egiaztatu",
+       "nav-login-createaccount": "Hasi saioa / sortu kontua",
        "userlogin": "Saioa hasi / kontua sortu",
        "userloginnocreate": "Hasi saioa",
        "logout": "Saioa itxi",
        "nologinlink": "Kontua sortu",
        "createaccount": "Kontua sortu",
        "gotaccount": "Baduzu erabiltzaile kontua? '''$1'''.",
-       "gotaccountlink": "Saioa hasi",
+       "gotaccountlink": "Hasi saioa",
        "userlogin-resetlink": "Saioa hasteko datuak ahaztu dituzu?",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
        "userlogin-helplink2": "Saioa hasteko laguntza",
        "saveprefs": "Gorde",
        "restoreprefs": "Konfigurazio lehenetsi guztiak berrezarri (sekzio guztietan)",
        "prefs-editing": "Aldatzen",
-       "rows": "Lerroak:",
-       "columns": "Zutabeak:",
        "searchresultshead": "Bilaketa",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> formaturako atalasea ($1):",
        "stub-threshold-sample-link": "adibidea",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "prefs-tabs-navigation-hint": "Gomendioa: Fitxen zerrendan nabigatzeko ezker eta eskuin geziak erabil ditzakezu.",
        "userrights": "Erabiltzaile baimenen kudeaketa",
-       "userrights-lookup-user": "Erabiltzaile taldeak kudeatu",
+       "userrights-lookup-user": "Erabiltzailea aukeratu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
-       "editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
-       "editinguser": "'''[[User:$1|$1]]''' $2 lankidearen erabiltzaile-eskubideak aldatzen",
+       "editusergroup": "Erabiltzaile taldeak kargatu",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|lankidearen}} erabiltzaile-eskubideak aldatzen",
        "userrights-editusergroup": "Erabiltzaile taldeak editatu",
        "saveusergroups": "Erabiltzaile {{GENDER:$1|taldeak}} gorde",
        "userrights-groupsmember": "Ondorengo talde honetako kide da:",
        "action-upload_by_url": "URL helbide batetik fitxategi hau igo",
        "action-writeapi": "idazteko APIa erabili",
        "action-delete": "orrialde hau ezabatu",
-       "action-deleterevision": "berrikuspen hau ezabatu",
-       "action-deletedhistory": "ikusi orri honen historia ezabatua",
+       "action-deleterevision": "berrikuspenak ezabatu",
+       "action-deletedhistory": "ikusi orri baten historia ezabatua",
        "action-browsearchive": "ezabatutako orrialdeak bilatu",
-       "action-undelete": "ezabatutako orrialde hau bergaitu",
-       "action-suppressrevision": "izkutuko berrikuspen hau berrikusi eta gaitu",
+       "action-undelete": "Orrialdeak birgaitu",
+       "action-suppressrevision": "Ezkutuko berrikuspenak berrikusi eta birgaitu",
        "action-suppressionlog": "log pribatu hau ikusi",
        "action-block": "lankide honi aldaketak egitea ekidin",
        "action-protect": "orrialde honetako babes mailak aldatu",
        "enotif_body_intro_deleted": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|ezabatu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3.",
        "enotif_body_intro_created": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|sortu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
        "enotif_body_intro_moved": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|mugitu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
-       "enotif_body_intro_restored": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|berrezarri}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
+       "enotif_body_intro_restored": "{{SITENAME}} guneko «$1» orria {{GENDER:$2|lehengoratu}} du $2 administratzaileak $PAGEEDITDATE datan. Oraingo bertsioa ikusteko, zoaz helbide honetara: $3.",
        "enotif_body_intro_changed": "{{SITENAME}}(e)ko $1 orrialdea {{GENDER:$2|aldatu}} du $2 erabiltzaileak $PAGEEDITDATE datan, ikus $3 oraingo bertsiorako.",
        "enotif_lastvisited": "Ikus «$1» zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.",
        "enotif_lastdiff": "Jo $1(e)ra aldaketa hau ikusteko.",
        "sp-contributions-newbies-title": "Lankideen ekarpenak lankide berrietn",
        "sp-contributions-blocklog": "Blokeaketa erregistroa",
        "sp-contributions-suppresslog": "{{GENDER:$1|(r)en}} lankide-ekarpen ezabatuak",
-       "sp-contributions-deleted": "lankide-ekarpen ezabatuak",
+       "sp-contributions-deleted": "{{GENDER:$1|lankide}}-ekarpen ezabatuak",
        "sp-contributions-uploads": "igoerak",
        "sp-contributions-logs": "erregistroak",
        "sp-contributions-talk": "eztabaida",
        "previousdiff": "← Aldaketa zaharragoa",
        "nextdiff": "Aldaketa berriagoa →",
        "mediawarning": "'''Oharra''': Fitxategi honek kode mingarria izan lezake.\nZure sisteman exekutatzea arriskutsua izan liteke.",
-       "imagemaxsize": "Irudiaren tamainaren muga:<br />''(fitxategi deskribapen-orrietarako)''",
+       "imagemaxsize": "Irudiaren tamainaren muga:<br />''(fitxategia deskribatzen duten orrietarako)''",
        "thumbsize": "Irudi txikiaren tamaina:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|orri|orri}}",
        "file-info": "fitxategiaren tamaina: $1, MIME mota: $2",
        "specialpages-note": "* Orri berezi arruntak.\n* <strong class=\"mw-specialpagerestricted\">Mugatutako orri bereziak.</strong>",
        "specialpages-group-maintenance": "Mantentze-oharrak",
        "specialpages-group-other": "Beste orri berezi batzuk",
-       "specialpages-group-login": "Saioa hasi / kontua sortu",
+       "specialpages-group-login": "Hasi saioa / sortu kontua",
        "specialpages-group-changes": "Aldaketa berriak eta erregistroak",
        "specialpages-group-media": "Artxiboen orriak",
        "specialpages-group-users": "Erabiltzaileak eta eskumenak",
        "htmlform-user-not-exists": "<strong>$1</strong> ez da existitzen.",
        "htmlform-user-not-valid": "<strong>$1</strong> erabiltzaile izena ezin da erabili.",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
-       "logentry-delete-restore": "$1(e)k $3 orrialdea {{GENDER:$2|berrezarri}} du",
+       "logentry-delete-restore": "$1 administratzaileak «$3» orria {{GENDER:$2|lehengoratu}} du",
        "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{{{GENDER:$2|}}|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
        "logentry-delete-revision": "$1 erabiltzaileak {{PLURAL:$5|berrikuste baten|$5 berrikusteren}} ikusgaitasuna aldatu du «$3» orrian: $4",
        "logentry-suppress-delete": "$1 erabiltzaileak $3 orrialdea {{GENDER:$2|ezabatu}} du",
        "feedback-thanks-title": "Eskerrik asko!",
        "searchsuggest-search": "{{SITENAME}} wikian bilatu",
        "searchsuggest-containing": "edukian...",
-       "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
-       "api-error-empty-file": "Bidali duzun fitxategia hutsik dago.",
        "api-error-emptypage": "Berria sortzerako garaian orrialde hutsak ezin dira erabili.",
-       "api-error-fetchfileerror": "Barne akatsa: zerbait gaizki joan da fitxategia eskuratzerakoan.",
-       "api-error-file-too-large": "Bidali duzun fitxategia handiegia zen.",
-       "api-error-filename-tooshort": "Fitxategiaren izena laburregia da.",
-       "api-error-filetype-banned": "Mota horretako fitxategiak debekatuta daude.",
-       "api-error-filetype-missing": "Fitxategiak ez zuen luzapenik.",
-       "api-error-http": "Barne-errorea: Ezin da zerbitzariarekin konektatu.",
-       "api-error-illegal-filename": "Fitxategiaren izena ez da onartzen.",
-       "api-error-internal-error": "Barne-errorea: Zerbaitek huts egin du zuk wikira igotakoa prozesatzean.",
-       "api-error-invalid-file-key": "Barne-errorea: Ez da fitxategia aurkitu aldi baterako biltegian.",
-       "api-error-missingparam": "Barne-errorea: Parametroak falta dira eskaeran.",
-       "api-error-missingresult": "Barne-errorea: Ezin da zehaztu kopia ondo burutu den ala ez.",
-       "api-error-mustbeloggedin": "Fitxategiak igotzeko izena emanda eduki behar duzu.",
-       "api-error-mustbeposted": "Barne arazoa: HTTP POST beharrezkoa da.",
-       "api-error-noimageinfo": "Igoera ondo egin da, baina zerbitzariak ez digu informaziorik eman zerbitzariaren inguruan.",
-       "api-error-nomodule": "Barne arazoa: igoera modulurik ez dago.",
-       "api-error-ok-but-empty": "Barne arazoa: zerbitzariaren erantzunik ez.",
-       "api-error-overwrite": "Existitzen den fitxategi bat gain-idaztea ez da posible.",
-       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-publishfailed": "Barne-errorea: Zerbitzariak ezin izan du aldi baterako fitxategia gorde.",
-       "api-error-timeout": "Zerbitzariak ez du erantzun espero zitekeen denboran.",
-       "api-error-unclassified": "Ezezaguna den errorea gertatu da.",
-       "api-error-unknown-code": "Akats ezezaguna: \"$1\".",
-       "api-error-unknown-error": "Barne arazoa: fitxategia igotzen saiatzerakoan zerbait gaizki egon da.",
+       "api-error-stashfailed": "Barne arazoa: Zerbitzariak ezin izan du behin-behineko fitxategia gorde",
        "api-error-unknown-warning": "Ohartarazpen ezezaguna: \"$1\".",
        "api-error-unknownerror": "Akats ezezaguna: \"$1\".",
-       "api-error-uploaddisabled": "Wiki honetan ezin dira igoerak egin.",
-       "api-error-verification-error": "Fitxategia ustela izan daiteke, edo fitxategi luzapen ez egokia du.",
        "duration-seconds": "{{PLURAL:$1|Segundu $1|$1 segundu}}",
        "duration-minutes": "{{PLURAL:$1|Minutu $1|$1 minutu}}",
        "duration-hours": "{{PLURAL:$1|Ordu $1|$1 ordu}}",
index 486fc28..1953747 100644 (file)
        "moredotdotdot": "Mas...",
        "morenotlisted": "Esta lista nu está completa",
        "mypage": "Páhina",
-       "mytalk": "La mi caraba",
+       "mytalk": "Caraba",
        "anontalk": "La mi caraba",
        "navigation": "Güiquipeandu",
        "and": "&#32;i",
        "virus-scanfailed": "marru al escrucal virus (cóigu $1)",
        "virus-unknownscanner": "Antivirus andarriu:",
        "logouttext": "'''Cuenta afechá corretamenti.'''<br />\nPueis acontinal gastandu {{SITENAME}} de holma anónima, u <span class='plainlinks'>[$1 entral ena tu cuenta]</span> con el mesmu ussuáriu, u con otru.\nDati cuenta que hata que nu esborris el caché del tu escrucaol pué paecel que la tu cuenta acontina abierta n'angunas páginas.",
-       "yourname": "Nombri d'usuáriu:",
+       "yourname": "Nombri dusuáriu:",
        "yourpassword": "Consínia:",
        "yourpasswordagain": "Escrebi e nuevu la consínia:",
        "yourdomainname": "El tu domiñu:",
        "usercssyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu CSS enantis d´emburacal.",
        "userjsyoucanpreview": "'''Consehu:''' Gasta el botón 'Previsoreal' pa prebal el tu nuevu JS enantis d´emburacal.",
        "usercsspreview": "'''Alcuerdati que solu estás previsoreandu el tu CSS d'usuáriu.'''\n'''Entovia nu está emburacau!'''",
-       "userjspreview": "'''Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d´usuáriu, entovia nu está emburacau!'''",
+       "userjspreview": "<strong>Recuerda que solu estás prebandu/previsoreandu el tu JavaScript d’usuáriu.\nEntovia nu está emburacau!</strong>",
        "userinvalidcssjstitle": "'''Avisu:''' Nu desisti el skin \"$1\". Alcuerdati que las páhinas presonalizás .css i .js tienin el su entítulu en menúsculas, p.s. {{ns:user}}:Foo/vector.css en lugal de {{ns:user}}:Foo/Vector.css.",
        "updated": "(Atualizau)",
        "note": "'''Nota:'''",
        "template-protected": "(protehiu)",
        "template-semiprotected": "(abati-protehiu)",
        "hiddencategories": "Esta páhina preteneci a {{PLURAL:$1|1 categoria açonchá|$1 categorias açonchás}}:",
-       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius d´eición i empuntu. -->",
+       "edittools": "<!-- Esti testu apaicirá embahu los hormulárius deición i empuntu. -->",
        "nocreatetext": "Nu se premiti crial páhinas nuevas a usuárius anónimus.\nPueis gorvel i eital anguna páhina ya desistenti, u [[Special:UserLogin|rustrilti]].",
        "nocreate-loggedin": "Nu tiés premissu pa crial nuevas páginas.",
        "permissionserrors": "Marrus colos premisus",
        "edit-conflict": "Marru d'eición.",
        "edit-no-change": "La eición nu á siu emburacá, ebiu a que nu s'á hechu dengún chambu nel testu.",
        "edit-already-exists": "Marru al crial la nueva página.\nYa dessisti.",
-       "undo-success": "Se puei eshazel la eición. Enantis d´eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d´esta horma, eshazel la eición.",
+       "undo-success": "Se puei eshazel la eición. Enantis d’eshazel la eición, compreba la siguienti comparáncia pa verifical que realmenti es lo que quieis hazel, i altonci, emburaqui los chambus pa, d’esta horma, eshazel la eición.",
        "undo-failure": "Nu es posibri eshazel la eición ebiu a que otru usuáriu á realizau una eición entelmeya.",
        "undo-norev": "La eición nu pué sel eshecha ebiu a que nu dessisti, u hue esborrá",
        "undo-summary": "Eshazel revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]])",
        "cantcreateaccount-text": "La criación de cuentas pol parti e la IP ('''$1''') á siu pará pol el usuáriu [[User:$3|$3]].\n\nLa razón dá pol $3 es ''$2''",
        "viewpagelogs": "Vel los rustrihus d’esta páhina",
-       "nohistory": "Nu ai dengún estorial d´eicionis pa esta páhina.",
+       "nohistory": "Nu ai dengún estorial deicionis pa esta páhina.",
        "currentrev": "Revisión atual",
        "currentrev-asof": "Úrtima revisión: $1",
        "revisionasof": "Revisión de $1",
        "history-feed-item-nocomment": "$1 en $2",
        "history-feed-empty": "Esa páhina nu desisti.\nEs posibri qu’aiga siu esborrá e la güiqui, u que s’aiga chambau el su nombri.\nPreba [[Special:Search|landeandu]] entri las nuevas páhinas de la güiqui.",
        "rev-deleted-comment": "(comentáriu esborrau)",
-       "rev-deleted-user": "(nombri d´usuáriu esborrau)",
+       "rev-deleted-user": "(nombri dusuáriu esborrau)",
        "rev-deleted-event": "(entrá esborrá)",
        "rev-deleted-text-permission": "La revisión desta página á siu '''esborrá'''.\nEs possibri que aiga detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "rev-deleted-text-view": "Esta revisión de la páhina á siu '''esborrá'''.\nCumu alministraol pueis echali una guipaina;\npuei bel detallis nel [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rustriju d'esborrau].",
        "search-external": "Landeu estelnu",
        "searchdisabled": "Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.",
        "preferences": "Preferéncias",
-       "mypreferences": "Las mis preferéncias",
+       "mypreferences": "Preferéncias",
        "prefs-edits": "Númiru d'eicionis:",
        "prefs-skin": "Aparéncia",
        "skin-preview": "Previsoreal",
        "prefs-resetpass": "Escambial consínia",
        "saveprefs": "Emburacal",
        "prefs-editing": "Eitandu",
-       "rows": "Filas:",
-       "columns": "Colunas:",
        "searchresultshead": "Landeal",
        "stub-threshold": "Arrayu superiol pa consieral cumu <a href=\"#\" class=\"stub\">atihu a prencipiu</a> (bytes):",
        "recentchangesdays": "Númeru e dias a muestral en \"úrtimus chambus\":",
        "prefs-custom-css": "CSS pressonalizau",
        "prefs-custom-js": "JS pressonalizau",
        "youremail": "Email:",
-       "username": "{{GENDER:$1|Nombri d'usuáriu|Nombri d'usuária}}:",
+       "username": "{{GENDER:$1|Nombri d’usuáriu|Nombri d’usuária}}:",
        "prefs-memberingroups": "Miembru de {{PLURAL:$1|grupu|groupus}}:",
        "yourrealname": "Nombri verdaeru:",
        "yourlanguage": "Palra:",
        "prefs-help-email-required": "Es mestel la direción email.",
        "userrights": "Alministral premisus d'usuárius",
        "userrights-lookup-user": "Alministral grupus d'usuárius",
-       "userrights-user-editname": "Escrebi un nombri d´usuáriu:",
+       "userrights-user-editname": "Escrebi un nombri dusuáriu:",
        "editusergroup": "Eital grupus d'usuárius",
        "editinguser": "Chambandu los derechus del usuáriu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Eital grupus d'usuárius",
        "userrights-reason": "Razón:",
        "userrights-no-interwiki": "Nu tienis premisu pa eital los derechus los usuárius en otras güiquis.",
        "userrights-nodatabase": "La basi e datus $1 nu desisti, u nu es local.",
-       "userrights-nologin": "Ebis [[Special:UserLogin|rustrilti]] con una cuenta d'alministraol pa puel asinal derechus a los usuárius.",
-       "userrights-notallowed": "Nu tienis los permisus nesezárius p'asinal derechus a los usuárius.",
        "userrights-changeable-col": "Grupus que pueis chambal",
        "userrights-unchangeable-col": "Grupus que nu pueis chambal",
        "group": "Grupu:",
        "uploadnologin": "Nu estás rustriu",
        "uploadnologintext": "Ebis estal [[Special:UserLogin|rustriu]]\npa empuntal archivus.",
        "upload_directory_read_only": "Nu puei escrebilsi nel diretoriu d'empuntu ($1) el sirviol.",
-       "uploaderror": "Marru d´empuntu",
+       "uploaderror": "Marru dempuntu",
        "uploadtext": "Gasta el hormuláriu d'embahu pa empuntal archivus, pa vel u landeal imahin ya empuntás vaiti pala [[Special:FileList|lista d'archivus empuntaus]]. Tantu los archivus empuntaus cumu los esborraus se rustrin nel [[Special:Log/upload|rustrihu d'empuntu]].\n\nP'añiil la imahin nuna páhina, gasta el atihu el hormuláriu\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' u\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' p'atihal diretamenti al archivu.",
        "upload-permitted": "Crasis d'archivus premitias: $1.",
        "upload-preferred": "Crasis d'archivus preferias: $1.",
        "filesource": "Coigu huenti:",
        "ignorewarning": "Inoral el avisihu i emburacal el achivu",
        "ignorewarnings": "Inoral tolos avisihus",
-       "minlength1": "Los nombris d´archivus ebin tenel al menus una letra.",
+       "minlength1": "Los nombris darchivus ebin tenel al menus una letra.",
        "illegalfilename": "El nombri \"$1\" tiini carateris que nu están premitius enus entítulus de páhinas. Pol favol, ponli otru nombri al archivu i preba a empuntalu e nuevu.",
-       "badfilename": "S´á chambau el nombri el archivu a \"$1\".",
+       "badfilename": "S’á chambau el nombri el archivu a «$1».",
        "filetype-badmime": "Nu está premitiu empuntal los archivus MIME type \"$1\".",
        "filetype-unwanted-type": "'''\".$1\"''' es una crassi d'archivu nu deseá. {{PLURAL:$3|La crassi d'archivu preferia es|Las crassis d'archivus preferias son}} $2.",
        "filetype-banned-type": "'''\".$1\"''' nu es una crassi d'archivu premitia.\n{{PLURAL:$3|La crassi d'archivu premitia es|Las crassis d'archivus premitias son}} $2.",
        "fileexists-forbidden": "Ya dessisti un archivu con esti nombri, i nu es possibri sobriescribilu.\nSi entovia quieris empuntal el archivu, pol favol, güervi atrás i empuntalu con otru nombri. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ya dessisti un archivu con esti nombri nel repossitóriu d'archivus compartius;\nSi acontinas queriendu empuntal el archivu, vai alatrás i escambia el nombri el archivu.\n [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Esti archivu es un dupricau {{PLURAL:$1|el siguienti archivu|los siguientis archivus}}:",
-       "uploadwarning": "Avisu d´empuntu",
+       "uploadwarning": "Avisu dempuntu",
        "savefile": "Emburacal archivu",
        "uploaddisabled": "Empuntus desativaus",
        "uploaddisabledtext": "El empuntu d'archivus está desativau.",
        "listfiles-summary": "Esta páhina especial muestra tolos archivus empuntaus.\nPol defetu los úrtimus archivus empuntaus se muestran ena parti arta la lista.\nPursa nel entítulu la coluna pa chambal el ordin.",
        "listfiles_search_for": "Landeal pol nombri la imahin:",
        "imgfile": "archivu",
-       "listfiles": "Lista d´archivus",
+       "listfiles": "Lista darchivus",
        "listfiles_date": "Fecha",
        "listfiles_name": "Nombri",
        "listfiles_user": "Usuáriu",
        "nolinkstoimage": "Nu ai denguna páhina qu’atihi a esti archivu.",
        "morelinkstoimage": "Guipal [[Special:WhatLinksHere/$1|mas atijus]] a esti archivu.",
        "sharedupload": "Esti archivu procei de $1 i puei gastalsi dendi otrus proyeutus.",
-       "uploadnewversion-linktext": "Empuntal una nueva velsión d´esti archivu",
+       "uploadnewversion-linktext": "Empuntal una nueva velsión desti archivu",
        "shared-repo-from": "dendi $1",
        "shared-repo": "un repossitóriu compartiu",
        "filerevert": "Revertil $1",
        "filedelete-intro-old": "Estás esborrandu la velsón de '''[[Media:$1|$1]]''' del [$4 $3 a las $2].",
        "filedelete-comment": "Razón:",
        "filedelete-submit": "Esborral",
-       "filedelete-success": "S´á esborrau '''$1'''.",
+       "filedelete-success": "S’á esborrau <strong>$1</strong>.",
        "filedelete-success-old": "Á siu esborrá la velsión de '''[[Media:$1|$1]]''' del $2 a las $3.</span>",
        "filedelete-nofile": "'''$1''' nu dessisti.",
        "filedelete-nofile-old": "Nu desisti una velsión archivá e '''$1''' con esas caraterísticas.",
        "statistics": "Estaísticas",
        "statistics-header-pages": "Estaísticas de la página",
        "statistics-header-edits": "Estaísticas d'eición",
-       "statistics-header-users": "Estaísticas d´usuáriu",
+       "statistics-header-users": "Estaísticas dusuáriu",
        "statistics-pages": "Páginas",
        "statistics-pages-desc": "Tolas páginas nel wiki, encruyendu carabas, redirecionis...",
        "statistics-files": "Archivus empuntaus",
        "listusers": "Lista d´usuárius",
        "usercreated": "Criá el $1 a las $2",
        "newpages": "Nuevas páhinas",
-       "newpages-username": "Nombri d´usuáriu:",
+       "newpages-username": "Nombri dusuáriu:",
        "ancientpages": "Páhinas mas antiguas",
        "move": "Movel",
        "movethispage": "Movel esta páhina",
        "linksearch-ok": "Landeal",
        "listusersfrom": "Muestral usuárius qu'esmiencin pol:",
        "listusers-submit": "Muestral",
-       "listusers-noresult": "Nu s´alcuentró dengún usuáriu.",
+       "listusers-noresult": "Nu salcuentró dengún usuáriu.",
        "listgrouprights": "Derechus del grupu d'usuárius",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Derechus",
        "emailsent": "E-mail enviau",
        "emailsenttext": "Se á enviau el tu mensahi pol e-mail.",
        "watchlist": "La mi lista e seguimientu",
-       "mywatchlist": "La mi lista e seguimientu",
+       "mywatchlist": "Lista e seguimientu",
        "nowatchlist": "La tu lista e seguimientu está vacia.",
        "watchlistanontext": "Pa vel u eital las entrás ena tu lista e seguimientu es mestel $1.",
        "watchnologin": "Nu estás rustriu",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
        "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
-       "deletionlog": "rustrihu d´esborrau",
+       "deletionlog": "rustrihu desborrau",
        "reverted": "Revertiu a la úrtima revisión",
        "deletecomment": "Razón:",
        "deleteotherreason": "Otras razonis:",
        "rollback": "Revertil eicionis",
        "rollbacklink": "revertil",
        "rollbackfailed": "Marru revirtiendu",
-       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol d´esta páhina.",
+       "cantrollback": "Nu se puei eshazel la eición; el úrtimu colabutaol es el únicu autol desta páhina.",
        "alreadyrolled": "Nu es posibri revertil la úrtima eición de [[:$1]], hecha pol [[User:$2|$2]] ([[User talk:$2|Caraba]]); alguien ya á eitau u revertiu la páhina.\n\nLa úrtima eición á siu hecha pol [[User:$3|$3]] ([[User talk:$3|Caraba]]).",
        "editcomment": "La síntesis la eición hue: <em>$1</em>.",
        "revertpage": "Án siu revertias las eicionis de [[Special:Contributions/$2|$2]] ([[User talk:$2|Caraba]]); chambau a la úrtima velsión de [[User:$1|$1]]",
        "undeletedfiles": "{{PLURAL:$1|1 archivu|$1 archivus}} restauraus",
        "cannotundelete": "Marru arrecuperandu; es posibri qu´alguien ya aiga arrecuperau la páhina.",
        "undeletedpage": "'''S'á restaurau $1'''\n\nConsurta el [[Special:Log/delete|rustrihu d'esborrau]] pa visoreal los úrtimus esborraus i arrecuperacionis.",
-       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu d´esborrau]] pa vel las úrtimas páhinas esborrás.",
+       "undelete-header": "Vaiti pal [[Special:Log/delete|rustrihu desborrau]] pa vel las úrtimas páhinas esborrás.",
        "undelete-search-box": "Landeal páhinas esborrás",
        "undelete-search-prefix": "Muestral páhinas qu´esmiencin pol:",
        "undelete-search-submit": "Landeal",
        "blanknamespace": "(Prencipal)",
        "contributions": "Endirguis {{GENDER:$1|el usuáriu|la usuária}}",
        "contributions-title": "Contribucionis del usuáriu a $1",
-       "mycontris": "Los mis endirguis",
+       "mycontris": "Endirguis",
        "contribsub2": "Pa $1 ($2)",
        "nocontribs": "Nu s'alcuentrun chambus con esus criterius.",
        "uctop": "(úrtimu chambu)",
        "sp-contributions-logs": "rustrijus",
        "sp-contributions-talk": "Caraba",
        "sp-contributions-search": "Landeal pol endirguis",
-       "sp-contributions-username": "IP u nombri d´usuáriu:",
+       "sp-contributions-username": "IP u nombri dusuáriu:",
        "sp-contributions-submit": "Landeal",
        "whatlinkshere": "Lo que atija aquina",
        "whatlinkshere-title": "Páhinas que atihan a $1",
        "blockip": "Atarugal usuáriu",
        "blockip-legend": "Atarugal usuáriu",
        "blockiptext": "Gasta el hormuláriu d'embahu p'atarugal el acesu duna IP u dun usuáriu.\nEstu solu ebi hazelsi pa evital el vandalismu, i dalcuerdu cola [[{{MediaWiki:Policy-url}}|póliça]].\nEscrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan siu vandalizás pol esti usuáriu).",
-       "ipaddressorusername": "IP u nombri d´usuáriu:",
+       "ipaddressorusername": "IP u nombri dusuáriu:",
        "ipbexpiry": "Acabiha:",
        "ipbreason": "Razón:",
-       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d´otras páhinas...\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d´usuárius enacetabris",
+       "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d’otras páhinas\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d’usuárius enacetabris",
        "ipbcreateaccount": "Atarugal el criaeru e cuentas",
        "ipbemailban": "Atarugal al usuáriu envial emails",
        "ipbenableautoblock": "Atarugal autumáticamenti la direción IP gastá pol esti usuáriu, i cualisquiel IP posteriol endi la cual trati d'eital",
        "blockipsuccesstext": "La direción IP [[Special:Contributions/$1|$1]] á siu atarugá.\n<br />Consurta la [[Special:BlockList|lista d'IP atarugás]] pa visoreal los tarugus.",
        "ipb-edit-dropdown": "Eital las razonis el tarugu",
        "ipb-unblock-addr": "Desatarugal $1",
-       "ipb-unblock": "Desatarugal un nombri d´usuáriu u direción IP",
+       "ipb-unblock": "Desatarugal un nombri dusuáriu u direción IP",
        "ipb-blocklist": "Vel tarugus desistentis",
        "ipb-blocklist-contribs": "Contribucionis de $1",
        "unblockip": "Desatarugal usuáriu",
        "unblockiptext": "Gasta el hormulariu d'embahu pa restablecel el acesu d'escritura a una direción IP u a un nombri d'usuáriu previamenti atarugau.",
        "ipusubmit": "Esborral esti tarugu",
        "unblocked": "El usuáriu [[User:$1|$1]] á siu desatarugau",
-       "unblocked-id": "S´á esborrau el tarugu $1",
+       "unblocked-id": "Sá esborrau el tarugu $1",
        "ipblocklist": "Lista de IP i nombris d'usuárius atarugaus",
        "ipblocklist-legend": "Landeal a un usuáriu atarugau",
        "ipblocklist-submit": "Landeal",
        "createaccountblock": "criaeru e páhinas atarugau",
        "emailblock": "email atarugau",
        "ipblocklist-empty": "La lista e tarugus está vacia.",
-       "ipblocklist-no-results": "Esta direción IP/nombri d´usuáriu nu está atarugau.",
+       "ipblocklist-no-results": "Esta direción IP/nombri dusuáriu nu está atarugau.",
        "blocklink": "atarugal",
        "unblocklink": "desatarugal",
        "change-blocklink": "chambal tarugu",
        "locknoconfirm": "Nu as confirmau lo que te petaria hazel.",
        "lockdbsuccesssub": "Tarugu la basi e datus ativu",
        "unlockdbsuccesssub": "Esborrau el tarugu la basi e datus",
-       "lockdbsuccesstext": "La basi e datus á siu atarugá.\n<br />Alcuerdati d´[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
+       "lockdbsuccesstext": "La basi e datus á siu atarugá.<br />\nAlcuerdati d’[[Special:UnlockDB|esborral el tarugu]] cuandu aigas acabihau.",
        "unlockdbsuccesstext": "S'á desatarugau la basi e datus.",
        "lockfilenotwritable": "El tarugu la basi e datus nu se puei sobriescribil. P'atarugual u desatarugal la basi e datus, esta ebi puel sel escrita pol sirviol web.",
        "databasenotlocked": "La basi e datus nu está atarugá.",
        "importnopages": "Nu ai páhinas pa emporteal.",
        "importfailed": "Marru al emporteal: $1",
        "importcantopen": "Nu se puei abril el archivu emporteau",
-       "importbadinterwiki": "Marru nel atihu d´EntelGüiqui",
+       "importbadinterwiki": "Marru nel atihu dEntelGüiqui",
        "importsuccess": "Archivu emporteau!",
        "importnofile": "Dengún archivu emporteau hue empuntau.",
        "import-parse-failure": "Marru nel análisis d'emporteación XML",
        "tooltip-pt-login": "Te recomendamus que te rustris, inque nu es mestel.",
        "tooltip-pt-logout": "Salil",
        "tooltip-ca-talk": "Caraba al tentu el artículu",
-       "tooltip-ca-edit": "Pueis eital esta página.\nPol favol, gasta el botón \"previsoreal\" enantis d'emburacal.",
+       "tooltip-ca-edit": "Eital esta páhina",
        "tooltip-ca-addsection": "Prencipial una nueva seción",
        "tooltip-ca-viewsource": "Esta páhina está protehia (nu pueis hazel chambus).",
        "tooltip-ca-history": "Velsionis anterioris d'esta página.",
        "file-nohires": "Nu disponibri a mayol resolución.",
        "svg-long-desc": "archivu SVG, $1 × $2 pixelis, grandol: $3",
        "show-big-image": "Resolución máisima",
-       "newimages": "Correol d´archivus nuevus",
+       "newimages": "Correol darchivus nuevus",
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
        "table_pager_last": "Úrtima páhina",
        "table_pager_limit": "Muestral $1 artículus pol páhina",
        "table_pager_limit_submit": "Dil",
-       "table_pager_empty": "Nu s´alcuentrun resurtaus",
+       "table_pager_empty": "Nu salcuentrun resurtaus",
        "autosumm-blank": "Esborrau el continiu la página",
        "autosumm-replace": "Páhina escambiá pol '$1'",
        "autoredircomment": "Rederihiendu a [[$1]]",
        "watchlistedit-raw-explain": "Se muestran embahu los entítulus de la tu lista e seguimientu, que puein sel eitaus\n\tañiendulus i esborrándulus de la lista; un entítulu pol línia. Cuandu acabihis, pursa sobri \"Atualizal lista e seguimientu\".\n\tTamién pueis [[Special:EditWatchlist|gastal el eitol estándal]].",
        "watchlistedit-raw-titles": "Entítulus:",
        "watchlistedit-raw-submit": "Atualizal la lista e seguimientu",
-       "watchlistedit-raw-done": "La tu lista e seguimientu s´acabiha d´atualizal!",
+       "watchlistedit-raw-done": "La tu lista e seguimientu s’acabiha d’atualizal.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 entítulu hue añiiu|$1 entítulus huerun añiius}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 entítulu hue esborrau|$1 entítulus huerun esborraus}}:",
        "watchlisttools-view": "Vel chambus emportantis",
index 4a6080b..c4f30c9 100644 (file)
        "nstab-special": "صفحهٔ ویژه",
        "nstab-project": "صفحهٔ پروژه",
        "nstab-image": "پرونده",
-       "nstab-mediawiki": "پیام",
+       "nstab-mediawiki": "Ù¾Û\8cغاÙ\85",
        "nstab-template": "الگو",
        "nstab-help": "صفحهٔ راهنما",
        "nstab-category": "رده",
        "saveprefs": "ذخیره",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-editing": "ویرایش",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "جستجو",
        "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
        "stub-threshold-sample-link": "نمونه",
        "restriction-level-all": "هر سطحی",
        "undelete": "احیای صفحهٔ حذف‌شده",
        "undeletepage": "نمایش و احیای صفحه‌های حذف‌شده",
-       "undeletepagetitle": "'''آن چه در ادامه می‌آید شامل نسخه‌های حذف شدهٔ [[:$1|$1]] است'''.",
+       "undeletepagetitle": "<strong>آنچه در ادامه می‌آید شامل نسخه‌های حذف شدهٔ [[:$1|$1]] است</strong>.",
        "viewdeletedpage": "نمایش صفحه‌های حذف‌شده",
        "undeletepagetext": "{{PLURAL:$1|صفحهٔ زیر حدف شده|صفحه‌های زیر حذف شده‌اند}} ولی هنوز در بایگانی {{PLURAL:$1|هست|هستند}} و {{PLURAL:$1|می‌تواند احیا شود|می‌توانند احیا شوند}}.\nاین بایگانی ممکن است هر چند وقت تمیز شود.",
        "undelete-fieldset-title": "احیای نسخه‌ها",
        "tags-edit": "ویرایش",
        "tags-delete": "حذف",
        "tags-activate": "فعال‌سازی",
-       "tags-deactivate": "غیرفعال کردن/إکار کةتن",
+       "tags-deactivate": "غیرفعال کردن",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییر}}",
        "tags-manage-no-permission": "شما اجازه مدیریت تغییر تگ‌ها را ندارید.",
        "tags-manage-blocked": "امکان تغییر برچسب‌ها را در زمان بسته‌بودن {{GENDER:$1|ندارید}}",
        "revdelete-restricted": "مدیران را محدود کرد",
        "revdelete-unrestricted": "محدودیت مدیران را لغو کرد",
        "logentry-block-block": "$1 {{GENDER:$4|$3}} را تا $5 {{GENDER:$2|بست}} $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|بازکرد}} {{GENDER:$4|$3}}",
+       "logentry-block-unblock": "$1 {{GENDER:$4|$3}} را {{GENDER:$2|بازکرد}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به پایان قطع دسترسی $5 $6 تغییر داد.",
        "logentry-suppress-block": "$1 {{GENDER:$2|بسته شد}} {{GENDER:$4|$3}} با پایان قطع دسترسی در زمان $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن برای  {{GENDER:$4|$3}} به پایان قطع دسترسی  $5 $6 تغییر یافت",
        "feedback-useragent": "رابط کاربر:",
        "searchsuggest-search": "جستجو در {{SITENAME}}",
        "searchsuggest-containing": "صفحه‌های دربردارنده...",
-       "api-error-autoblocked": "نشانی آی‌پی شما به صورت خودکار بسته شده‌است، چون توسط یک کاربر بسته‌شده استفاده می‌شد.",
-       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
-       "api-error-blocked": "شما از ویرایش بسته شده‌اید.",
-       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
-       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
-       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
-       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
-       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
-       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
-       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
-       "api-error-filetype-missing": "پرونده فرمت ندارد.",
-       "api-error-hookaborted": "اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.",
-       "api-error-http": "خطای داخلی: قادر به اتصال به سرور نیست.",
-       "api-error-illegal-filename": "نام پرونده مجاز نیست.",
-       "api-error-internal-error": "خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رفت.",
-       "api-error-invalid-file-key": "خطای داخلی: پرونده در حافظهٔ موقت موجود نیست.",
-       "api-error-missingparam": "خطای داخلی: پارامترهای ناموجود در درخواست.",
-       "api-error-missingresult": "خطای داخلی: نمی‌توان فهمید کپی‌برداری موفق بوده‌است یا نه.",
-       "api-error-mustbeloggedin": "برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.",
-       "api-error-mustbeposted": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
-       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
-       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
-       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
-       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
-       "api-error-ratelimited": "شما سعی داريد، در بازه زمانی کوتاهی، بيشتر از تعدادی که اين ويکی اجازه داده‌است پرونده بارگذاری کنيد.\nلطفاً چند دقيقه بعد مجدداً تلاش نماييد.",
-       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
-       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
-       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
-       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
-       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
-       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
-       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
-       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
-       "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
-       "api-error-unclassified": "یک خطای ناشناخته رخ داد.",
-       "api-error-unknown-code": "خطای ناشناخته: \" $1 \"",
-       "api-error-unknown-error": "خطای داخلی: در زمانی که شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رفت.",
+       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-unknown-warning": "اخطار ناشناخته: $1",
        "api-error-unknownerror": "خطای ناشناخته: «$1».",
-       "api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
-       "api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
-       "api-error-was-deleted": "پرونده‌ای با همين نام قبلاً بارگذاری و متعاقباً حذف شده است.",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 ساعت",
        "log-action-filter-block-block": "بستن",
        "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
-       "log-action-filter-contentmodel-change": "تغÛ\8cÛ\8cر Ù\86Ù\88ع محتوا",
+       "log-action-filter-contentmodel-change": "تغÛ\8cÛ\8cر Ù\85دÙ\84 محتوا",
        "log-action-filter-contentmodel-new": "ایجاد صفحه با contentmodel غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-delete_redir": "رونویسی تغییرمسیر",
index 1a5a9a9..730bcc3 100644 (file)
        "searcharticle": "Siirry",
        "history": "Sivun historia",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "päivitetty viimeisimmän käyntisi jälkeen",
        "printableversion": "Tulostettava versio",
        "permalink": "Ikilinkki",
        "saveprefs": "Tallenna asetukset",
        "restoreprefs": "Palauta kaikki oletusasetuksiin (kaikissa osioissa)",
        "prefs-editing": "Muokkaus",
-       "rows": "Rivejä",
-       "columns": "Sarakkeita",
        "searchresultshead": "Haku",
        "stub-threshold": "Tynkälinkkien muotoilun kynnysarvo ($1):",
        "stub-threshold-sample-link": "näyte",
        "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\n[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].",
        "savedprefs": "Asetuksesi on tallennettu.",
-       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttöoikeudet on tallennettu.",
+       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttäjäryhmät on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "localtime": "Paikallinen aika",
        "timezoneuseserverdefault": "Käytä oletusta ($1)",
        "userrights-user-editname": "Käyttäjätunnus:",
        "editusergroup": "Lataa käyttäjäryhmät",
        "editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
+       "viewinguserrights": "Näytetään {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 käyttäjäryhmät",
        "userrights-editusergroup": "Muuta käyttäjän ryhmiä",
+       "userrights-viewusergroup": "Näytä käyttäjäryhmät",
        "saveusergroups": "Tallenna {{GENDER:$1|käyttäjän}} ryhmät",
        "userrights-groupsmember": "Jäsenenä ryhmissä:",
        "userrights-groupsmember-auto": "Automaattisesti jäsenenä ryhmissä:",
        "action-upload_by_url": "tallentaa tätä tiedostoa URL-osoitteesta",
        "action-writeapi": "käyttää kirjoitus-APIa",
        "action-delete": "poistaa tätä sivua",
-       "action-deleterevision": "poistaa tätä versiota",
-       "action-deletedhistory": "tarkastella tämän sivun poistettua historiaa",
+       "action-deleterevision": "poistaa versioita",
+       "action-deletelogentry": "poistaa lokimerkintöjä",
+       "action-deletedhistory": "tarkastella sivun poistettua historiaa",
+       "action-deletedtext": "tarkastella poistetun version tekstiä",
        "action-browsearchive": "etsiä poistettuja sivuja",
-       "action-undelete": "palauttaa tätä poistettua sivua",
-       "action-suppressrevision": "tarkastella ja palauttaa tätä piilotettua versiota",
+       "action-undelete": "palauttaa poistettuja sivuja",
+       "action-suppressrevision": "tarkastella ja palauttaa piilotettuja versioita",
        "action-suppressionlog": "tarkastella tätä yksityislokia",
        "action-block": "estää tätä käyttäjää muokkaamasta",
        "action-protect": "muuttaa tämän sivun suojaustasoa",
        "action-userrights-interwiki": "muokata muiden wikien käyttäjien käyttöoikeuksia",
        "action-siteadmin": "lukita tai avata tietokantaa",
        "action-sendemail": "lähettää sähköpostia",
+       "action-editmyoptions": "muokata omia asetuksiasi",
        "action-editmywatchlist": "muokata omaa tarkkailulistaasi",
        "action-viewmywatchlist": "tarkastella tarkkailulistaasi",
        "action-viewmyprivateinfo": "katsoa omia yksityisiä tietojasi",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Näytä",
+       "rcfilters-activefilters": "Aktiiviset suodattimet",
+       "rcfilters-invalid-filter": "Suodatin on epäkelpo",
+       "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
-       "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
+       "rclistfrom": "Näytä uudet muutokset $3 kello $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhideminor-show": "Näytä",
        "rcshowhideminor-hide": "Piilota",
        "activeusers-count": "$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana",
        "activeusers-from": "Näytä käyttäjät alkaen kohdasta:",
        "activeusers-groups": "Näytä käyttäjät, jotka kuuluvat ryhmiin:",
+       "activeusers-excludegroups": "Älä näytä käyttäjiä, jotka kuuluvat seuraaviin ryhmiin:",
        "activeusers-noresult": "Käyttäjiä ei löytynyt.",
        "activeusers-submit": "Hae aktiiviset käyttäjät",
        "listgrouprights": "Käyttäjäryhmien oikeudet",
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
+       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}. Sähköpostisi lähetetään suoraan {{GENDER:$1|alkuperäiselle lähettäjälle}}, paljastaen {{GENDER:$2|sinun}} sähköpostiosoitteesi {{GENDER:$1|hänelle}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
        "addwatch": "Lisää tarkkailulistalle",
        "addedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
        "addedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
-       "addedwatchtext-short": "Sivu ”$1” on lisätty tarkkailulistallesi.",
+       "addedwatchtext-short": "Sivu \"$1\" on lisätty tarkkailulistallesi.",
        "removewatch": "Poista tarkkailulistalta",
        "removedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "removedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "undeletehistorynoadmin": "Tämä sivu on poistettu. \nSyy sivun poistamiseen näkyy alla olevassa yhteenvedossa, jossa on myös tiedot, ketkä olivat muokanneet tätä sivua ennen poistamista. \nNäiden poistettujen versioiden varsinainen tekstisisältö on vain ylläpitäjien luettavissa.",
        "undelete-revision": "Poistettu versio sivusta $1 (aikaleima $4 kello $5). Version tekijä: $3.",
        "undeleterevision-missing": "Virheellinen tai puuttuva versio. \nSinulla on kenties käytössä väärä linkki, tai sitten versio on saatettu palauttaa takaisin tai poistaa arkistosta.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Yhtä versiota|$1 versiota}} ei voitu palauttaa, koska {{PLURAL:$1|sen|niiden}} <code>rev_id</code> oli jo käytössä.",
        "undelete-nodiff": "Aikaisempaa versiota ei löytynyt.",
        "undeletebtn": "Palauta",
        "undeletelink": "näytä tai palauta",
        "pageinfo-length": "Sivun pituus (tavuina)",
        "pageinfo-article-id": "Sivun tunnistenumero",
        "pageinfo-language": "Sivun sisällön kieli",
+       "pageinfo-language-change": "vaihda",
        "pageinfo-content-model": "Sivun sisältömalli",
        "pageinfo-content-model-change": "muuta",
        "pageinfo-robot-policy": "Hakukonemerkinnät",
        "tags-deactivate": "ota pois käytöstä",
        "tags-hitcount": "$1 {{PLURAL:$1|muutos|muutosta}}",
        "tags-manage-no-permission": "Sinulla ei ole oikeutta käsitellä merkkauksia.",
-       "tags-manage-blocked": "Et voi hallita muokkausmerkkauksia kun olet estettynä.",
+       "tags-manage-blocked": "Et voi hallita muokkausmerkkauksia, kun {{GENDER:$1|olet}} estettynä.",
        "tags-create-heading": "Luo uusi merkkaus",
        "tags-create-explanation": "Oletuksena on, että uutena luodut merkkaukset tulevat käyttäjien ja bottien käyttöön.",
        "tags-create-tag-name": "Merkkauksen nimi:",
        "tags-deactivate-not-allowed": "Ei ole mahdollista poistaa käytöstä merkkausta \"$1\".",
        "tags-deactivate-submit": "Poista käytöstä",
        "tags-apply-no-permission": "Sinulla ei ole oikeutta käyttää merkkauksia muutostesi yhteydessä.",
-       "tags-apply-blocked": "Et voi asettaa merkkauksia muutostesi yhteyteen kun olet estettynä.",
+       "tags-apply-blocked": "Et voi asettaa merkkauksia muutostesi yhteyteen, kun {{GENDER:$1|olet}} estettynä.",
        "tags-apply-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
        "tags-apply-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
        "tags-update-no-permission": "Sinulla ei ole oikeutta lisätä tai poistaa merkkauksia yksittäisissä sivuversioissa tai lokimerkinnöissä.",
-       "tags-update-blocked": "Et voi lisätä tai poistaa merkkauksia kun olet estettynä.",
+       "tags-update-blocked": "Et voi lisätä tai poistaa merkkauksia, kun {{GENDER:$1|olet}} estettynä.",
        "tags-update-add-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
        "tags-update-add-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
        "tags-update-remove-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua poistaa.",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Hae {{GRAMMAR:elative|{{SITENAME}}}}",
        "searchsuggest-containing": "sisältää...",
-       "api-error-autoblocked": "Sinun IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt estetty käyttäjätunnus.",
-       "api-error-badaccess-groups": "Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.",
        "api-error-badtoken": "Sisäinen virhe: virheellinen tarkistussumma.",
-       "api-error-blocked": "Sinut on estetty muokkaamasta.",
-       "api-error-copyuploaddisabled": "Tallentaminen URL-osoitteesta ei ole käytössä.",
-       "api-error-duplicate": "Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|yksi kappale|useampia kappaleita}}.",
-       "api-error-duplicate-archive": "Sivustolla oli aiemmin {{PLURAL:$1|toinen samansisältöinen tiedosto|toisia samansisältöisiä tiedostoja}}, mutta {{PLURAL:$1|se|ne}} poistettiin.",
-       "api-error-empty-file": "Määrittämäsi tiedosto on tyhjä.",
        "api-error-emptypage": "Ei ole sallittua luoda uutta, tyhjää sivua.",
-       "api-error-fetchfileerror": "Sisäinen virhe: Jotakin meni pieleen kun tiedostoa haettiin.",
-       "api-error-fileexists-forbidden": "Tiedosto nimellä \"$1\" on jo olemassa eikä sitä voi korvata.",
-       "api-error-fileexists-shared-forbidden": "Tiedosto nimeltä \"$1\" on jo olemassa yhteisessä tietovarastossa eikä sitä voi korvata.",
-       "api-error-file-too-large": "Määrittämäsi tiedosto on liian iso.",
-       "api-error-filename-tooshort": "Tiedoston nimi on liian lyhyt.",
-       "api-error-filetype-banned": "Tämän tyyppisten tiedostojen tallentaminen on kielletty.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ei ole sallittu tiedostomuoto|eivät ole sallittuja tiedostomuotoja}}. {{PLURAL:$3|Sallittu tiedostomuoto on|Sallittuja tiedostomuotoja ovat}} $2.",
-       "api-error-filetype-missing": "Tiedostolta puuttuu tiedostopääte.",
-       "api-error-hookaborted": "Laajennuskoodi esti yrittämäsi muutoksen.",
-       "api-error-http": "Sisäinen virhe: palvelimeen ei saatu yhteyttä.",
-       "api-error-illegal-filename": "Tiedoston nimi ei kelpaa.",
-       "api-error-internal-error": "Sisäinen virhe: jotain meni vikaan tallennuksesi käsittelyssä.",
-       "api-error-invalid-file-key": "Sisäinen virhe: tiedostoa ei löytynyt välikaisvarastosta.",
-       "api-error-missingparam": "Sisäinen virhe: pyynnöstä puutuu parametreja.",
-       "api-error-missingresult": "Sisäinen virhe: ei voitu varmistaa, että tallennus onnistui.",
-       "api-error-mustbeloggedin": "Sinun pitää olla kirjautunut sisään, jotta voisit tallentaa tiedostoja.",
-       "api-error-mustbeposted": "Sisäinen virhe: HTTP POST-pyyntö edellytetty.",
-       "api-error-noimageinfo": "Tallennus onnistui, mutta palvelin ei antanut meille tietoja tiedostosta.",
-       "api-error-nomodule": "Sisäinen virhe: tallennusmoduulia ei ole asetettu.",
-       "api-error-ok-but-empty": "Sisäinen virhe: palvelimelta ei saatu vastausta.",
-       "api-error-overwrite": "Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.",
-       "api-error-ratelimited": "Yrität tallentaa lyhyessä ajassa enemmän tiedostoja kuin tämä wiki sallii.\nYritä uudelleen muutaman minuutin kuluttua.",
-       "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
-       "api-error-stasherror": "Tiedostoa ladattaessa tapahtui virhe.",
-       "api-error-stashedfilenotfound": "Tallennettavaa tiedostoa ei löytynyt säilöstä.",
-       "api-error-stashpathinvalid": "Hakupolku, jossa säilötyn tiedoston olisi pitänyt olla, oli virheellinen.",
-       "api-error-stashfilestorage": "Tiedoston tallentaminen säilöön epäonnistui.",
-       "api-error-stashzerolength": "Palvelin ei voinut säilöä tiedostoa, koska sen pituus oli nolla.",
-       "api-error-stashnotloggedin": "Sinun täytyy kirjautua sisään, jotta voit tallentaa tiedostoja lataussäilöön.",
-       "api-error-stashwrongowner": "Tiedosto, jota yritit käyttää säilössä, ei ole sinun omasi.",
-       "api-error-stashnosuchfilekey": "Tiedoston avainta, jota yritit käyttää säilössä, ei ole olemassa.",
-       "api-error-timeout": "Palvelin ei vastannut odotetun ajan kuluessa.",
-       "api-error-unclassified": "Tapahtui tuntematon virhe.",
-       "api-error-unknown-code": "Tuntematon virhe: $1.",
-       "api-error-unknown-error": "Sisäinen virhe: Jotain meni vikaan kun tiedostoasi yritettiin tallentaa.",
+       "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
        "api-error-unknown-warning": "Tuntematon varoitus: $1.",
        "api-error-unknownerror": "Tuntematon virhe: $1.",
-       "api-error-uploaddisabled": "Tiedostojen tallentaminen ei ole käytössä.",
-       "api-error-verification-error": "Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.",
-       "api-error-was-deleted": "Tämänniminen tiedosto on aikaisemmin tallennettu ja sittemmin poistettu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunti|sekuntia}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuutti|minuuttia}}",
        "duration-hours": "$1 {{PLURAL:$1|tunti|tuntia}}",
        "pagelang-language": "Kieli",
        "pagelang-use-default": "Käytä oletuskieltä",
        "pagelang-select-lang": "Valitse kieli",
+       "pagelang-reason": "Syy",
        "pagelang-submit": "Lähetä",
        "right-pagelang": "Vaihtaa sivun kieli",
        "action-pagelang": "muuttaa sivun kieliasetuksia",
        "mw-widgets-dateinput-no-date": "Ei ole valittu mitään päivää",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
+       "mw-widgets-mediasearch-input-placeholder": "Etsi mediaa",
+       "mw-widgets-mediasearch-noresults": "Tuloksia ei löytynyt.",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
        "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lisää luokka...",
        "log-action-filter-contentmodel-change": "Sisältömallin muuttaminen",
        "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava Sisältömalli",
        "log-action-filter-delete-delete": "Sivun poistaminen",
+       "log-action-filter-delete-delete_redir": "Ohjauksen päällekirjoitus",
        "log-action-filter-delete-restore": "Sivun palauttaminen",
        "log-action-filter-delete-event": "Lokimerkinnän poistaminen",
        "log-action-filter-delete-revision": "Version piilottaminen",
        "unlinkaccounts": "Poista tunnusten linkityksiä",
        "unlinkaccounts-success": "Tunnuksen linkitys poistettiin.",
        "authenticationdatachange-ignored": "Varmennustietojen muutosta ei käsitelty. Ehkä palveluntarjoajaa ei määritelty?",
+       "userjsispublic": "Huomio: JavaScript-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
+       "usercssispublic": "Huomio: CSS-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
-       "restrictionsfield-label": "Sallitut IP-alueet:"
+       "restrictionsfield-label": "Sallitut IP-alueet:",
+       "revid": "versio $1",
+       "pageid": "sivun tunnistenumero $1"
 }
index 19113d8..eaef8b2 100644 (file)
@@ -12,7 +12,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Irus"
+                       "Irus",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
        "passwordreset-emaildisabled": "Teldupost funksjónir eru óvirknar á hesi wiki.",
        "passwordreset-username": "Brúkaranavn:",
        "passwordreset-domain": "Umdømi (domain):",
-       "passwordreset-capture": "Sí tann endaliga t-postin?",
-       "passwordreset-capture-help": "Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.",
        "passwordreset-email": "T-post adressur:",
        "passwordreset-emailtitle": "konto upplýsingar á {{SITENAME}}",
        "passwordreset-emailtext-ip": "Onkur (óiva tú, frá IP adressu $1) hevur biðið um nullstillan av tínum loyniorði til {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}\nsettar í samband við hesa t-post adressu:\n\n$2\n\n{{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.\nTú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.",
        "userinvalidcssjstitle": "'''Ávaring:''' Tað er onki skinn \"$1\".\nTilevnaðar .css og .js síður brúka heiti sum byrja við lítlum bókstavi, t.d.  {{ns:user}}:Foo/vector.css í mun til {{ns:user}}:Foo/Vector.css.",
        "updated": "(Dagført)",
        "note": "'''Viðmerking:'''",
-       "previewnote": "'''Minst til at hetta bara er ein forskoðan.'''\nTínar broytingar eru ikki goymdar enn!",
+       "previewnote": "<strong>Minst til at hetta bara er ein forskoðan.</strong>\nTínar broytingar eru ikki goymdar enn!",
        "continue-editing": "Far til økið har ið tú kanst gera rættingar",
        "previewconflict": "Henda forskoðanin vísir tekstin í erva soleiðis sum hann sær út, um tú velur at goyma.",
        "session_fail_preview": "'''Orsakað! Vit kundu ikki fullføra tínar broytingar, tí tínar sessións dáta eru horvin.'''\nVinarliga royn aftur.\nUm tað enn ikki virkar, royn so [[Special:UserLogout|rita út]] og rita so inn aftur.",
        "userrights-reason": "Orsøk:",
        "userrights-no-interwiki": "Tú hevur ikki loyvi til at rætta brúkara rættindi á øðrum wikium.",
        "userrights-nodatabase": "Dátugrunnurin $1 er ikki til ella er hann ikki lokalur.",
-       "userrights-nologin": "Tú mást [[Special:UserLogin|rita inn]] sum administrator fyri at kunna áseta brúkararættindi.",
-       "userrights-notallowed": "Tú hevur ikki loyvi til at geva ella taka burtur brúkara rættindi.",
        "userrights-changeable-col": "Bólkar sum tú kanst broyta",
        "userrights-unchangeable-col": "Bólkar, ið tú ikki kanst broyta",
        "userrights-conflict": "Ósamsvar viðvíkjandi broytingum í brúkararættindum! Vinarliga endurskoða og vátta tínar broytingar.",
-       "userrights-removed-self": "Tað eydnaðist tær at taka burtur tíni egnu rættindi. Tí kanst tú ikki longur fáa atgongd til hesa síðuna.",
        "group": "Bólkur:",
        "group-user": "Brúkarar",
        "group-autoconfirmed": "Sjálvvirkandi váttaðir brúkarar",
        "right-siteadmin": "Stong og læs upp dátugrunnin",
        "right-override-export-depth": "Útflyt síður, eisini slóðaðar síður upp til eina dýpd á 5",
        "right-sendemail": "Send t-post til aðrir brúkarar",
-       "right-passwordreset": "Sí teldupostar til nullstilling av loyniorði",
        "newuserlogpage": "Brúkara logg",
        "newuserlogpagetext": "Hetta er ein listi yvir seinast stovnaðu brúkarar.",
        "rightslog": "Rættindaloggur",
index 88b44f2..df0c8a7 100644 (file)
                        "Lucas",
                        "Mabroukb",
                        "Pymouss",
-                       "Derugon"
+                       "Derugon",
+                       "Benoit Rochon",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "searcharticle": "Lire",
        "history": "Historique de la page",
        "history_short": "Historique",
+       "history_small": "historique",
        "updatedmarker": "modifié depuis ma dernière visite",
        "printableversion": "Version imprimable",
        "permalink": "Adresse permanente",
        "sort-descending": "Tri décroissant",
        "sort-ascending": "Tri croissant",
        "nstab-main": "Page",
-       "nstab-user": "Page utilisateur",
+       "nstab-user": "Page {{GENDER:{{ROOTPAGENAME}}|utilisateur|utilisatrice}}",
        "nstab-media": "Média",
        "nstab-special": "Page spéciale",
        "nstab-project": "À propos",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
-       "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
+       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n:<em>$2:</em>\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité n’a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
+       "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués par MediaWiki.\nLa raison donnée est la suivante:\n\n:<em>$2</em>\n\n* Le début du blocage: $8\n* Expiration d'un délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est de $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous faites.",
        "blockednoreason": "aucune raison donnée",
        "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "search-relatedarticle": "Reliés",
        "searchrelated": "reliés",
        "searchall": "tout",
-       "showingresults": "Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.",
+       "showingresults": "Affichage de <strong>$1</strong> résultat{{PLURAL:$1||s}} à partir du n°<strong>$2</strong>.",
        "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Résultat <strong>$1</strong> parmi <strong>$3</strong>|Résultats <strong>$1 à $2</strong> parmi <strong>$3</strong>}}",
        "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.",
        "saveprefs": "Enregistrer les préférences",
        "restoreprefs": "Restaurer tous les paramètres par défaut (dans toutes les sections)",
        "prefs-editing": "Modification",
-       "rows": "Rangées :",
-       "columns": "Colonnes :",
        "searchresultshead": "Filtrer avec cette valeur",
        "stub-threshold": "Seuil pour le formatage des liens d’ébauche ($1) :",
        "stub-threshold-sample-link": "exemple",
        "userrights-user-editname": "Entrez un nom d'utilisateur :",
        "editusergroup": "Charger des groupes d’utilisateurs",
        "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Affichage des droits utilisateur de {{GENDER:$1|l’utilisateur|l’utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
+       "userrights-viewusergroup": "Afficher les groupes d'utilisateurs",
        "saveusergroups": "Enregistrer les groupes de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicite de :",
        "action-upload_by_url": "importer ce fichier à partir d'une adresse URL",
        "action-writeapi": "utiliser l‘API d'écriture",
        "action-delete": "supprimer cette page",
-       "action-deleterevision": "supprimer cette version",
-       "action-deletedhistory": "voir l’historique supprimé de cette page",
+       "action-deleterevision": "supprimer les révisions",
+       "action-deletelogentry": "supprimer les entrées de la trace",
+       "action-deletedhistory": "voir l’historique supprimé d’une page",
+       "action-deletedtext": "Afficher le texte de la révision supprimée",
        "action-browsearchive": "rechercher des pages supprimées",
-       "action-undelete": "restaurer cette page",
-       "action-suppressrevision": "visionner et rétablir cette version supprimée",
+       "action-undelete": "restaurer des pages",
+       "action-suppressrevision": "visionner et rétablir des révisions supprimées",
        "action-suppressionlog": "voir ce journal privé",
        "action-block": "bloquer en écriture cet utilisateur",
        "action-protect": "modifier les niveaux de protection pour cette page",
        "action-userrights-interwiki": "modifier les droits des utilisateurs sur d'autres wikis",
        "action-siteadmin": "verrouiller ou déverrouiller la base de données",
        "action-sendemail": "envoyer des courriels",
+       "action-editmyoptions": "modifier vos préférences",
        "action-editmywatchlist": "modifier votre liste de suivi",
        "action-viewmywatchlist": "afficher votre liste de suivi",
        "action-viewmyprivateinfo": "voir vos informations personnelles",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Lister",
+       "rcfilters-activefilters": "Filtres actifs",
+       "rcfilters-restore-default-filters": "Rétablir les filtres par défaut",
+       "rcfilters-clear-all-filters": "Effacer tous les filtres",
+       "rcfilters-search-placeholder": "Modifications récentes de filtres (naviguer ou commencer à saisir)",
+       "rcfilters-invalid-filter": "Filtre non valide",
+       "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
+       "rcfilters-filter-registered-label": "Enregistré",
+       "rcfilters-filter-registered-description": "Éditeurs connectés.",
+       "rcfilters-filter-unregistered-label": "Désinscrit",
+       "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
+       "rcfilters-filtergroup-authorship": "Modifier la paternité",
+       "rcfilters-filter-editsbyself-label": "Vos propres modifications",
+       "rcfilters-filter-editsbyself-description": "Vos modifications.",
+       "rcfilters-filter-editsbyother-label": "Modifications par d’autres.",
+       "rcfilters-filter-editsbyother-description": "Modifications créées par d’autres utilisateurs (pas vous).",
+       "rcfilters-filtergroup-userExpLevel": "Niveau d’expérience (uniquement pour les utilisateurs enregistrés)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nouveaux arrivants",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
+       "rcfilters-filter-userExpLevel-learner-label": "Apprentis",
+       "rcfilters-filter-userExpLevel-learner-description": "Davantage de jours d’activité et de modifications que les « Nouveaux arrivants » mais moins que les « Utilisateurs expérimentés ».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilisateurs expérimentés",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 jours d’activité et 500 modifications",
+       "rcfilters-filtergroup-automated": "Contributions automatisées",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modifications faites par des outils automatisés.",
+       "rcfilters-filter-humans-label": "Humain (non robot)",
+       "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
+       "rcfilters-filtergroup-significance": "Signification",
+       "rcfilters-filter-minor-label": "Modifications mineures",
+       "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
+       "rcfilters-filter-major-label": "Modifications non mineures",
+       "rcfilters-filter-major-description": "Modifications non marquées comme mineures.",
+       "rcfilters-filtergroup-changetype": "Type de modification",
+       "rcfilters-filter-pageedits-label": "Modifications de page",
+       "rcfilters-filter-pageedits-description": "Modifications du contenu du wiki, des discussions, des descriptions des catégories…",
+       "rcfilters-filter-newpages-label": "Créations de page",
+       "rcfilters-filter-newpages-description": "Modifications créant de nouvelles pages.",
+       "rcfilters-filter-categorization-label": "Modifications de catégorie",
+       "rcfilters-filter-categorization-description": "Enregistrements de pages ajoutées ou supprimées des catégories.",
+       "rcfilters-filter-logactions-label": "Actions tracées",
+       "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléchargements…",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "upload_directory_read_only": "Le serveur web n’a pas accès en écriture au répertoire d’import de fichier ($1).",
        "uploaderror": "Erreur lors de l’import",
        "upload-recreate-warning": "<strong>Attention : Un fichier portant ce nom a été supprimé ou déplacé.</strong>\n\nLe journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
-       "uploadtext": "Utilisez ce formulaire pour importer des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L’import est aussi enregistré dans le [[Special:Log/upload|journal d’import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien de la forme :\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l’afficher.",
+       "uploadtext": "Utilisez ce formulaire pour téléverser des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des fichiers téléversés]]. Les envois multiples sont également tracés dans le [[Special:Log/upload|journal des téléversements]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien ayant l'un des formats suivants :\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code></strong>, pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code></strong> pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code></strong> pour relier directement le fichier sans l’afficher.",
        "upload-permitted": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|autorisé|autorisés}} : $1.",
        "upload-preferred": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|préféré|préférés}} : $1.",
        "upload-prohibited": "‎{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|interdit|interdits}} : $1.",
        "uploaded-setting-event-handler-svg": "Positionner les attributs du gestionnaire d’événements n'est pas possbile, <code>&lt;$1 $2=\"$3\"&gt;</code> trouvé dans le fichier SVG téléchargé.",
        "uploaded-setting-href-svg": "L’utilisation de la balise « set » pour ajouter un attribut « href » à l’élément parent est interdite.",
        "uploaded-wrong-setting-svg": "L’utilisation de la balise « set » pour ajouter une cible distante/données/script à un attribut quelconque est interdite. <code>&lt;set to=\"$1\"&gt;</code> a été trouvé dans le fichier SVG téléchargé.",
-       "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont interdits. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléchargé.",
+       "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont bloqués. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléchargé.",
        "uploaded-remote-url-svg": "Les SVG qui positionnent un attribut de style avec une URL distante sont bloqués. <code>$1=\"$2\"</code> trouvé dans le fichier SVG téléchargé.",
        "uploaded-image-filter-svg": "Filtre d’image avec URL trouvé : <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléchargé.",
        "uploadscriptednamespace": "Ce fichier SVG contient un espace de noms '$1' non autorisé.",
        "uncategorizedcategories": "Catégories sans catégories",
        "uncategorizedimages": "Fichiers sans catégorie",
        "uncategorizedtemplates": "Modèles sans catégorie",
+       "uncategorized-categories-exceptionlist": "# Contient une liste de catégories, qui ne devraient pas être mentionnées sur Spécial:UncategorizedCategories. Une par ligne, en commençant par \"*\". Les lignes qui commencent avec un autre caractère (y compris les espaces) sont ignorées. Utilisez \"#\" pour les commentaires.",
        "unusedcategories": "Catégories inutilisées",
        "unusedimages": "Fichiers orphelins",
        "wantedcategories": "Catégories les plus demandées",
        "wantedpages": "Pages les plus demandées",
-       "wantedpages-summary": "Liste des pages inexistantes ayant le plus de lien vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}|la liste des redirections cassées]].",
+       "wantedpages-summary": "Liste des pages inexistantes ayant le plus de liens vers elles, en excluant les pages n’ayant que des redirections pointant vers elles. Pour avoir une liste des pages inexistantes qui ont des redirections pointant vers elles, voyez [[{{#special:BrokenRedirects}}|la liste des redirections cassées]].",
        "wantedpages-badtitle": "Titre invalide dans les résultats : $1",
        "wantedfiles": "Fichiers les plus demandés",
        "wantedfiletext-cat": "Les fichiers suivants sont utilisés, mais n'existent pas localement. Les fichiers qui se trouvent sur un dépôt externe peuvent être listés ici, bien qu'ils soient, de fait, déjà disponibles. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
        "linksearch-error": "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
        "listusersfrom": "Afficher les utilisateurs à partir de :",
        "listusers-submit": "Lister",
-       "listusers-noresult": "Aucun utilisateur trouvé. Vérifiez aussi les variantes de casse.",
+       "listusers-noresult": "Aucun utilisateur trouvé.",
        "listusers-blocked": "(bloqué{{GENDER:$1||e}})",
        "activeusers": "Liste des utilisateurs actifs",
        "activeusers-intro": "Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.",
        "deletereason-dropdown": "* Motifs de suppression les plus courants\n** Pourriel\n** Vandalisme\n** Violation des droits d’auteur\n** Demande de l’auteur\n** Redirection cassée",
        "delete-edit-reasonlist": "Modifier les motifs de suppression de page",
        "delete-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.",
-       "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuiller ne procéder qu'avec prudence.",
+       "delete-warning-toobig": "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.\nLa supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;\nveuillez procéder avec prudence.",
        "deleteprotected": "Vous ne pouvez pas supprimer cette page car elle a été protégée.",
        "deleting-backlinks-warning": "<strong>Attention :</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’autres pages]] ont un lien vers ou incorporent la page que vous allez supprimer.",
        "rollback": "Révoquer les modifications",
        "changecontentmodel-emptymodels-title": "Aucun modèle de contenu disponible",
        "changecontentmodel-emptymodels-text": "Le contenu sur [[:$1]] ne peut être converti en aucun type.",
        "log-name-contentmodel": "Journal de modification de modèle de contenu",
-       "log-description-contentmodel": "Événements relatifs aux modèles de contenu d’une page",
+       "log-description-contentmodel": "Cette page montre des modifications dans le modèle de contenu des pages, ainsi que les pages créées avec un modèle de contenu différent du contenu par défaut.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|a créé}} la page $3 en utilisant un modèle de contenu « $5 » autre que celui par défaut",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|a modifié}} le modèle de contenu de la page $3 de « $4 » en « $5 »",
        "logentry-contentmodel-change-revertlink": "rétablir",
        "tooltip-invert": "Cochez cette case pour cacher les modifications des pages dans l'espace de noms sélectionné (et l'espace de noms associé si coché)",
        "tooltip-whatlinkshere-invert": "Cochez cette case pour cacher les liens des pages dans l'espace de nom sélectionné.",
        "namespace_association": "Espace de noms associé",
-       "tooltip-namespace_association": "Cochez cette case pour inclure également l'espace de noms de discussion associé à l'espace de noms sélectionné",
+       "tooltip-namespace_association": "Cochez cette case pour inclure également l'espace de noms de discussion ou du sujet, associé à l'espace de noms sélectionné",
        "blanknamespace": "(Principal)",
        "contributions": "Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "contributions-title": "Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1",
        "ipb-confirm": "Confirmer le blocage",
        "badipaddress": "Adresse IP incorrecte",
        "blockipsuccesssub": "Blocage réussi",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour voir les utilisateurs bloqués.",
        "ipb-blockingself": "Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e}} de vouloir faire cela ?",
        "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprimera le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr{{GENDER:||e}} de vouloir le faire ?",
        "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e}} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
        "proxyblockreason": "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.\nVeuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
        "sorbsreason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.",
        "sorbs_create_account_reason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.\nVous ne pouvez pas créer un compte.",
+       "softblockrangesreason": "Les contributions anonymes ne sont pas autorisées à partir de votre adresse IP ($1). Veuillez vous connecter.",
        "xffblockreason": "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
        "cant-see-hidden-user": "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. \nN’ayant pas le droit de masquer des utilisateurs, vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
        "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e}}.",
        "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.",
+       "namespace-nosubpages": "L’espace de noms « $1 » n’autorise pas les sous-pages.",
        "newtitle": "Nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "exporttext": "Vous pouvez exporter en XML le texte et l’historique d’une page ou d’un ensemble de pages.\nLe résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page d’importation]].\n\nPour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d’un titre par ligne. Sélectionnez si vous désirez la version actuelle avec toutes les anciennes versions, avec les lignes de l’historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.\n\nDans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Exporter toutes les pages",
        "exportcuronly": "Exporter uniquement la version courante, sans l’historique complet",
-       "exportnohistory": "----\n'''Note :''' l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
+       "exportnohistory": "----\n<strong>Note :</strong> l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
        "exportlistauthors": "Inclure une liste complète des contributeurs pour chaque page",
        "export-submit": "Exporter",
        "export-addcattext": "Ajouter les pages de la catégorie :",
        "javascripttest": "Test de JavaScript",
        "javascripttest-pagetext-unknownaction": "Action « $1 » inconnue.",
        "javascripttest-qunit-intro": "Voir [$1 la documentation de test] sur mediawiki.org.",
-       "tooltip-pt-userpage": "{{GENDER:|Votre}} page utilisateur",
+       "tooltip-pt-userpage": "Votre page {{GENDER:|utilisateur|utilisatrice}}",
        "tooltip-pt-anonuserpage": "La page utilisateur avec l'adresse IP de laquelle vous contribuez",
        "tooltip-pt-mytalk": "{{GENDER:|Votre}} page de discussion",
        "tooltip-pt-anontalk": "La page de discussion pour les contributions depuis cette adresse IP",
        "pageinfo-length": "Taille de la page (en octets)",
        "pageinfo-article-id": "Numéro de la page",
        "pageinfo-language": "Langue du contenu de la page",
+       "pageinfo-language-change": "modifier",
        "pageinfo-content-model": "Modèle de contenu de la page",
        "pageinfo-content-model-change": "modifier",
        "pageinfo-robot-policy": "Indexation par robots",
        "feedback-useragent": "Agent utilisateur :",
        "searchsuggest-search": "Rechercher sur {{SITENAME}}",
        "searchsuggest-containing": "contenant...",
-       "api-error-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
-       "api-error-badaccess-groups": "Vous n'êtes pas autorisé à téléverser des fichiers sur ce wiki.",
        "api-error-badtoken": "Erreur interne : mauvais « jeton ».",
-       "api-error-blocked": "Vous avez été bloqué en édition.",
-       "api-error-copyuploaddisabled": "Les versements via URL sont désactivés sur ce serveur.",
-       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu.",
-       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|un autre fichier présent|d'autres fichiers présents}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.",
-       "api-error-empty-file": "Le fichier que vous avez soumis était vide.",
        "api-error-emptypage": "Création de pages vide n'est pas autorisée.",
-       "api-error-fetchfileerror": "Erreur interne : Quelque chose s'est mal passé lors de la récupération du fichier.",
-       "api-error-fileexists-forbidden": "Un fichier nommé \"$1\" existe déjà, et ne peut pas être écrasé.",
-       "api-error-fileexists-shared-forbidden": "Un fichier nommé \"$1\" existe déjà dans le répertoire des fichiers partagés, et ne peut pas être écrasé.",
-       "api-error-file-too-large": "Le fichier que vous avez soumis était trop grand.",
-       "api-error-filename-tooshort": "Le nom du fichier est trop court.",
-       "api-error-filetype-banned": "Ce type de fichier est interdit.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. {{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.",
-       "api-error-filetype-missing": "L'extension du fichier est manquante.",
-       "api-error-hookaborted": "La modification que vous avez essayé de faire a été annulée par une extension.",
-       "api-error-http": "Erreur interne : ne peut se connecter au serveur.",
-       "api-error-illegal-filename": "Le nom du fichier n'est pas autorisé.",
-       "api-error-internal-error": "Erreur interne : quelque chose s'est mal passé lors du traitement de votre import sur le wiki.",
-       "api-error-invalid-file-key": "Erreur interne : fichier non trouvé dans l'espace de stockage temporaire.",
-       "api-error-missingparam": "Erreur interne : Il manque des paramètres dans la requête.",
-       "api-error-missingresult": "Erreur interne : Nous n'avons pas pu déterminer si la copie avait réussi.",
-       "api-error-mustbeloggedin": "Vous devez être connecté pour télécharger des fichiers.",
-       "api-error-mustbeposted": "Erreur interne : cette requête nécessite la méthode HTTP POST.",
-       "api-error-noimageinfo": "Le téléversement a réussi, mais le serveur n'a pas donné d'informations sur le fichier.",
-       "api-error-nomodule": "Erreur interne : aucun module de versement défini.",
-       "api-error-ok-but-empty": "Erreur interne : Le serveur n'a pas répondu.",
-       "api-error-overwrite": "Écraser un fichier existant n'est pas autorisé.",
-       "api-error-ratelimited": "Vous essayez de téléverser plus de fichiers dans un court espace de temps que ce que ce wiki peut accepter.\nVeuillez réessayer dans quelques minutes.",
-       "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
        "api-error-publishfailed": "Erreur interne : Le serveur n'a pas pu publier le fichier temporaire.",
-       "api-error-stasherror": "Une erreur s'est produite lors du téléchargement du fichier pour le dissimuler.",
-       "api-error-stashedfilenotfound": "Le fichier caché n’a pas été trouvé lors de la tentative pour le télécharger depuis sa cachette.",
-       "api-error-stashpathinvalid": "Le chemin où aurait dû se trouver le fichier caché n’est pas valide.",
-       "api-error-stashfilestorage": "Une erreur s’est produite en stockant le fichier dans la cachette.",
-       "api-error-stashzerolength": "Le serveur n’a pas pu cacher le fichier, car il a une taille de zéro.",
-       "api-error-stashnotloggedin": "Vous devez être connecté pour enregistrer des fichiers dans la cachette de téléchargement.",
-       "api-error-stashwrongowner": "Le fichier auquel vous essayez d’accéder dans la cachette ne vous appartient pas.",
-       "api-error-stashnosuchfilekey": "La clé du fichier auquel vous essayez d’accéder dans la cachette n’existe pas.",
-       "api-error-timeout": "Le serveur n'a pas répondu dans le délai imparti.",
-       "api-error-unclassified": "Une erreur inconnue s'est produite",
-       "api-error-unknown-code": "Erreur inconnue : « $1 »",
-       "api-error-unknown-error": "Erreur interne : quelque chose s'est mal passé lors du téléversement de votre fichier.",
-       "api-error-unknown-warning": "Avertissement inconnu : « $1 ».",
+       "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
+       "api-error-unknown-warning": "Avertissement inconnu : « $1 ».",
        "api-error-unknownerror": "Erreur inconnue : « $1 ».",
-       "api-error-uploaddisabled": "Le téléversement est désactivé sur ce wiki.",
-       "api-error-verification-error": "Ce fichier est peut-être corrompu, ou son extension est incorrecte.",
-       "api-error-was-deleted": "Un fichier portant ce nom a déjà été importé puis supprimé.",
        "duration-seconds": "$1 seconde{{PLURAL:$1||s}}",
        "duration-minutes": "$1 minute{{PLURAL:$1||s}}",
        "duration-hours": "$1 heure{{PLURAL:$1||s}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|octet|octets}}",
        "limitreport-templateargumentsize": "Taille de l’argument du modèle",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|octet|octets}}",
-       "limitreport-expansiondepth": "Plus grande profondeur d’expansion",
+       "limitreport-expansiondepth": "Profondeur d’expansion maximale",
        "limitreport-expensivefunctioncount": "Nombre de fonctions d’analyse coûteuses",
        "expandtemplates": "Expansion des modèles",
        "expand_templates_intro": "Cette page spéciale accepte un texte wiki source et permet de réaliser récursivement l’expansion de tous les modèles qu’il contient.\nElle réalise aussi l’expansion des fonctions supportées d'analyse telles que\n<code><nowiki>{{</nowiki>#language:...}}</code> et des variables telles que\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEn fait, elle réalise l'expansion de pratiquement tout ce qui est encadré par des doubles accolades.",
        "expand_templates_generate_rawhtml": "Afficher le HTML brut",
        "expand_templates_preview": "Aperçu du rendu",
        "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a l’HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et de vous reconnecter, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
-       "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
+       "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a activé le HTML brut et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
        "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
        "pagelanguage": "Modifier la langue de la page",
        "pagelang-name": "Page",
        "pagelang-language": "Langue",
        "pagelang-use-default": "Utiliser la langue par défaut",
        "pagelang-select-lang": "Sélectionner la langue",
+       "pagelang-reason": "Motif",
        "pagelang-submit": "Envoyer",
+       "pagelang-nonexistent-page": "La page $1 n’existe pas.",
+       "pagelang-unchanged-language": "La page $1 est déjà positionnée sur la langue $2.",
+       "pagelang-unchanged-language-default": "La page $1 est déjà positionnée dans la langue par défaut du contenu du wiki.",
+       "pagelang-db-failed": "La base de données n’a pas réussi à modifier la langue de la page.",
        "right-pagelang": "Changer la langue de la page",
        "action-pagelang": "changer la langue de la page",
        "log-name-pagelang": "Tracer les changements de langue",
        "sessionprovider-nocookies": "Il est possible que les témoins (''cookies'') soient désactivés. Assurez-vous que vous avez activé les témoins et recommencez.",
        "randomrootpage": "Page racine aléatoire",
        "log-action-filter-block": "Type de blocage :",
-       "log-action-filter-contentmodel": "Type de modification de modèle de contenu :",
+       "log-action-filter-contentmodel": "Type de modification du modèle de contenu :",
        "log-action-filter-delete": "Type de suppression :",
        "log-action-filter-import": "Type d’import :",
        "log-action-filter-managetags": "Type d’action de gestion des étiquettes :",
        "log-action-filter-block-reblock": "Modification de blocage",
        "log-action-filter-block-unblock": "Débloquer",
        "log-action-filter-contentmodel-change": "Changement de modèle de contenu",
-       "log-action-filter-contentmodel-new": "Création de page avec un modèle de contenu non-standard",
+       "log-action-filter-contentmodel-new": "Création de page avec un modèle de contenu différent du contenu par défaut",
        "log-action-filter-delete-delete": "Suppression de pages",
-       "log-action-filter-delete-delete_redir": "Rediriger l'écrasement",
+       "log-action-filter-delete-delete_redir": "Rediriger la réécriture",
        "log-action-filter-delete-restore": "Restauration de page",
        "log-action-filter-delete-event": "Suppression du journal",
        "log-action-filter-delete-revision": "Suppression de révison",
        "usercssispublic": "Veuillez noter: les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
        "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 <br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "version $1",
+       "pageid": "ID de page $1"
 }
index a9446ce..063cdae 100644 (file)
        "passwordreset-emaildisabled": "E-mail as üüb detheer Wiki ufknipset wurden.",
        "passwordreset-username": "Brükernööm:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Wel dü det e-mail nooracht uunluke?",
-       "passwordreset-capture-help": "Wan dü detheer kasche uunkrüsagst, woort det e-mail nooracht mä det nei paaswurd uunwiset an tu di brüker schüürd.",
        "passwordreset-email": "E-mail adres:",
        "passwordreset-emailtitle": "Brükerkonto aw {{SITENAME}}",
        "passwordreset-emailtext-ip": "Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. \nDü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää an dü din ual paaswurd käänst, do säärst dü niks widjer onernem. Melde di ianfach widjerhen mä din ual paaswurd uun.",
        "newarticle": "(Nei)",
        "newarticletext": "Dü beest en ferwisang tu en sidj fulagt, diar't noch ei jaft.\nAm det sidj iinturachten, skriiw dan tekst uun det fial för't bewerkin iin.\nÜüb det [$1 halepsidj] fanjst dü halep.\nWan dü ütj fersen heer beest, trak ianfach üüb di <strong>turag</strong>-knoop faan dan browser.",
        "anontalkpagetext": "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special:CreateAccount|brükerkonto iinrachst]] of di [[Special:UserLogin|uunmeldest]], komt sowat ei weder föör.",
-       "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} bewerke]</span>.",
+       "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} maage]</span>.",
        "noarticletext-nopermission": "Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.\nDü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|schük]] of a <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>",
        "missing-revision": "Det werjuun #$1 faan det sidj \"{{FULLPAGENAME}}\" jaft at ei.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "userpage-userdoesnotexist": "Det brükerkonto ''$1'' as ei diar.\nWel dü detdiar sidj würelk maage/bewerke?",
        "userrights-reason": "Grünj:",
        "userrights-no-interwiki": "Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.",
        "userrights-nodatabase": "Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.",
-       "userrights-nologin": "Dü mutst di mä en administraator-brükerkonto [[Special:UserLogin|uunmelde]], wan dü brükerrochten feranre wel.",
-       "userrights-notallowed": "Dü heest ei det rocht, am brükerrochten tu feranrin.",
        "userrights-changeable-col": "Lasmootskapen, diar dü feranre könst",
        "userrights-unchangeable-col": "Lasmootskapen, diar dü ei feranre könst",
        "userrights-conflict": "Konflikt bi't feranrin faan brükerrochten! Du din feranrangen noch ans iin.",
-       "userrights-removed-self": "Dü heest din aanj brükerrochtem stregen. Dü könst nü ei muar üüb det sidj tugrip.",
        "group": "Skööl:",
        "group-user": "Brükern",
        "group-autoconfirmed": "Registriaret brükern",
        "right-siteadmin": "Dootenbeenk spere an eebenmaage",
        "right-override-export-depth": "Sidjen an onersidjen bit tu en jipde faan 5 eksportiare",
        "right-sendemail": "E-mails tu ööder brükern schüür",
-       "right-passwordreset": "Paaswurd faan en brüker turagsaat an det e-mail diartu uunluke",
        "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
        "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
        "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "javascripttest": "JavaScript-test",
        "javascripttest-pagetext-unknownaction": "Ünbekäänd aktjuun „$1“.",
        "javascripttest-qunit-intro": "Luke efter bi [$1 test dokumentatjuun] üüb mediawiki.org",
-       "tooltip-pt-userpage": "Din brükersidj",
+       "tooltip-pt-userpage": "{{GENDER:|Din}} brükersidj",
        "tooltip-pt-anonuserpage": "Brükersidj faan det IP-adres, faan huar ütj dü werkest",
-       "tooltip-pt-mytalk": "Din diskuschuunssidj",
+       "tooltip-pt-mytalk": "{{GENDER:|Din}} diskuschuunsidj",
        "tooltip-pt-anontalk": "Diskuschuun auer feranrangen faan detdiar IP-adres",
-       "tooltip-pt-preferences": "Min iinstelangen",
+       "tooltip-pt-preferences": "{{GENDER:|Din}} iinstelangen",
        "tooltip-pt-watchlist": "Sidjen, diar dü uun't uug behual wel",
-       "tooltip-pt-mycontris": "List mä aanj bidracher",
+       "tooltip-pt-mycontris": "List mä {{GENDER:|aanj}} bidracher",
        "tooltip-pt-login": "Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.",
        "tooltip-pt-logout": "Ufmelde",
        "tooltip-pt-createaccount": "Wees so gud an racht en brükerkonto iin an melde di uun. Dü säärst det oober ei.",
        "tooltip-t-recentchangeslinked": "Leetst feranrangen faan sidjen, huar faan heer üüb ferwiset woort",
        "tooltip-feed-rss": "RSS-feed för detdiar sidj",
        "tooltip-feed-atom": "Atom-feed för detdiar sidj",
-       "tooltip-t-contributions": "List mä bidracher faan didiar brüker uunluke",
+       "tooltip-t-contributions": "List mä bidracher faan {{GENDER:$1|didiar brüker|detdiar brüker}} uunluke",
        "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
        "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "feedback-thanks": "Föl soonk. Dan komentaar as üüb det sidj „[$2 $1]“ skrewen wurden.",
        "feedback-thanks-title": "Föl soonk!",
        "feedback-useragent": "Brüker-agent:",
-       "searchsuggest-search": "Schük",
+       "searchsuggest-search": "Schük uun {{SITENAME}}",
        "searchsuggest-containing": "diar banen as ...",
        "api-error-badaccess-groups": "Dü mutst nian datein tu detdiar Wiki huuchschüür.",
        "api-error-badtoken": "Intern feeler: Token as ferkiard.",
index 93fb479..65859a8 100644 (file)
        "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
        "passwordreset-username": "Ainm-cleachdaiche:",
        "passwordreset-domain": "Àrainn-lìn:",
-       "passwordreset-capture": "A bheil thu airson coimhead air a' phost-d?",
-       "passwordreset-capture-help": "Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.",
        "passwordreset-email": "Seòladh puist-d:",
        "passwordreset-emailtitle": "Dàta a' chunntais air {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut logadh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "saveprefs": "Sàbhail",
        "restoreprefs": "Aisig na roghainnean bunaiteach uile (anns gach earrann)",
        "prefs-editing": "Deasachadh",
-       "rows": "Sreathan",
-       "columns": "Colbhan",
        "searchresultshead": "Lorg",
        "stub-threshold": "An stairsneach airson fòrmatadh cheanglaichean nam bun ($1):",
        "stub-threshold-disabled": "À comas",
        "userrights-reason": "Adhbhar:",
        "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
        "userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
-       "userrights-nologin": "Feumaidh tu [[Special:UserLogin|logadh a-steach]] le cunntas rianaire ach an toir thu ceadan nam ball seachad.",
-       "userrights-notallowed": "Chan eil cead agad gus ceadan nam ball a chur ris no a thoirt air falbh.",
        "userrights-changeable-col": "Buidhnean as urrainn dhut atharrachadh",
        "userrights-unchangeable-col": "Buidhnean nach urrainn dhut atharrachadh",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Tha còmhstri le atharraichean air ceadan nam ball! Thoir sùil air a-rithist 's dearbhaich na h-atharraichean agad.",
-       "userrights-removed-self": "Tha thu air na ceadan agad fhèin a thoirt air falbh. Mar sin, chan eil cead agad tuilleadh gus an duilleag seo inntrigeadh.",
        "group": "Buidheann:",
        "group-user": "Cleachdaichean",
        "group-autoconfirmed": "Cleachdaichean fèin-dearbhte",
        "right-siteadmin": "Cead gus an stòr-dàta a glasadh 's a' ghlas a thoirt fo bharr",
        "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
        "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
-       "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
        "right-managechangetags": "Cruthaich is gnìomhaich no neo-ghnìomhaich [[Special:Tags|tagaichean]]",
        "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
        "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "feedback-subject": "Cuspair:",
        "feedback-submit": "Cuir a-null",
        "feedback-thanks": "Mòran taing! Chaidh do bheachd a phostadh air an duilleag \"[$2 $1]\".",
+       "feedback-thanks-title": "Ceud taing!",
        "searchsuggest-search": "Lorg",
        "searchsuggest-containing": "anns a bheil...",
-       "api-error-badaccess-groups": "Chan eil cead agad gus faidhlichean a luchdadh suas dhan uicidh seo.",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
-       "api-error-copyuploaddisabled": "Tha luchdadh suas le URL à comas air an fhrithealaiche seo.",
-       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
-       "api-error-duplicate-archive": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
-       "api-error-empty-file": "Tha am faidhle a chuir thu a-null falamh.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
-       "api-error-fetchfileerror": "Mearachd taobh a-staigh: Chaidh rudeigin cearr le faighinn an fhaidhle.",
-       "api-error-fileexists-forbidden": "Tha faidhle air a bheil \"$1\" ann mar-thà 's cha ghabh sgrìobhadh thairis air.",
-       "api-error-fileexists-shared-forbidden": "Tha faidhle air a bheil \"$1\" san ionad-tasgaich cho-roinnte mar-thà 's cha ghabh sgrìobhadh thairis air.",
-       "api-error-file-too-large": "Tha am faidhle a chuir thu a-null ro mhòr.",
-       "api-error-filename-tooshort": "Tha ainm an fhaidhle ro ghoirid.",
-       "api-error-filetype-banned": "Tha an seòrsa faidhle seo toirmisgte.",
-       "api-error-filetype-banned-type": "Chan eil $1 {{PLURAL:$4|'na seòrsa faidhle|'nan seòrsaichean faidhle}} ceadaichte. Is $2 {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} ceadaichte.",
-       "api-error-filetype-missing": "Tha leudachan a dhìth air an fhaidhle.",
-       "api-error-hookaborted": "Chaidh sgur dhen atharrachadh a dh'fheuch thu ri dèanamh le leudachan.",
-       "api-error-http": "Mearachd taobh a-staigh: Cha b' urrainn dhuinn ceangal ris an fhrithealaiche.",
-       "api-error-illegal-filename": "Chan eil ainm an fhaidhle ceadaichte.",
-       "api-error-internal-error": "Mearachd tabh a-staigh: chaidh rudeigin cearr rè an luchdaidh suas agad dhan uicidh.",
-       "api-error-invalid-file-key": "Mearachd taobh a-staigh: Cha deach am faidhle a lorg san stòras shealach.",
-       "api-error-missingparam": "Mearachd taobh a-staigh: Tha paramadair a dhìth air an iarrtas.",
-       "api-error-missingresult": "Mearachd taobh a-staigh: Cha d' fhuair sinn a-mach co-dhiù an do shoirbhich leis an lethbhreac gus nach do shoirbhich.",
-       "api-error-mustbeloggedin": "Feumaidh tu logadh a-steach mus luchdaich thu suas faidhle.",
-       "api-error-mustbeposted": "Mearachd taobh a-staigh: Tha an t-iarrtas ag iarraidh HTTP POST.",
-       "api-error-noimageinfo": "Shoirbhich leis an luchdadh suas, ach cha dug am frithealaiche fiosrachadh sam bith dhuinn mun fhaidhle.",
-       "api-error-nomodule": "Mearachd taobh a-staigh: cha deach mòideal luchdaidh suas a shuidheachadh.",
-       "api-error-ok-but-empty": "Mearachd taobh a-staigh: Cha d' fhuair sinn freagairt on fhrithealaiche.",
-       "api-error-overwrite": "Chan fhaodar sgrìobhadh thairis air faidhle a tha ann mar-thà.",
-       "api-error-stashfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach a stòradh.",
        "api-error-publishfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach fhoillseachadh.",
-       "api-error-stasherror": "Thachair mearachd le luchdadh suas an fhaidhle dhan tasgadan.",
-       "api-error-timeout": "Cha d' fhuair sinn freagairt on fhrithealaiche ri àm.",
-       "api-error-unclassified": "Thachair mearachd neo-aithnichte.",
-       "api-error-unknown-code": "Mearachd neo-aithnichte: \"$1\".",
-       "api-error-unknown-error": "Mearachd tabh a-staigh: Chaidh rudeigin cearr rè luchdadh suas an fhaidhle agad.",
+       "api-error-stashfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach a stòradh.",
        "api-error-unknown-warning": "Rabhadh neo-aithnichte: \"$1\".",
        "api-error-unknownerror": "Mearachd neo-aithnichte: \"$1\".",
-       "api-error-uploaddisabled": "Tha luchdadh suas à comas air an uicidh seo.",
-       "api-error-verification-error": "Dh'fhaoidte gu bheil am faidhle seo coirbte no gu bheil an leudachan cearr air.",
        "duration-seconds": "$1 {{PLURAL:$1|diog|dhiog|diogan|diog}}",
        "duration-minutes": "$1 {{PLURAL:$1|mhionaid|mhionaid|mionaidean|mionaid}}",
        "duration-hours": "$1 {{PLURAL:$1|uair|uair|uairean|uair}}",
index d9e4f6b..17ecd13 100644 (file)
        "searcharticle": "Artigo",
        "history": "Historial da páxina",
        "history_short": "Historial",
+       "history_small": "historial",
        "updatedmarker": "actualizado desde a miña última visita",
        "printableversion": "Versión para imprimir",
        "permalink": "Ligazón permanente",
        "blockedtitle": "O usuario está bloqueado",
        "blockedtext": "<strong>Bloqueouse o seu nome de usuario ou enderezo IP.</strong>\n\n$1 estableceu o bloqueo.\nO motivo que achegou foi <em>$2</em>.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o identificador do bloqueo é #$5.\nPor favor, inclúa todos estes datos nas consultas que faga.",
        "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:''$2''\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
+       "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "confirmedittext": "Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].",
        "revertmerge": "Desfacer a fusión",
        "mergelogpagetext": "A continuación hai unha lista coas fusións máis recentes do historial dunha páxina co doutra.",
        "history-title": "Historial de revisións de \"$1\"",
-       "difference-title": "Diferenzas entre revisións de \"$1\"",
+       "difference-title": "Diferenzas entre revisións de «$1»",
        "difference-title-multipage": "Diferenzas entre as páxinas \"$1\" e \"$2\"",
        "difference-multipage": "(Diferenzas entre páxinas)",
        "lineno": "Liña $1:",
        "saveprefs": "Gardar",
        "restoreprefs": "Restaurar todas as preferencias por defecto (en todas as seccións)",
        "prefs-editing": "Edición",
-       "rows": "Filas:",
-       "columns": "Columnas:",
        "searchresultshead": "Procurar",
        "stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara a bosquexos ($1):",
        "stub-threshold-sample-link": "exemplo",
        "userrights-user-editname": "Escriba un nome de usuario:",
        "editusergroup": "Cargar os grupos de usuario",
        "editinguser": "Mudando os dereitos {{GENDER:$1|do usuario|da usuaria}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Consultando os dereitos {{GENDER:$1|de usuario|de usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar os grupos do usuario",
+       "userrights-viewusergroup": "Consultar os grupos do usuario",
        "saveusergroups": "Gardar os grupos {{GENDER:$1|do usuario|da usuaria}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "action-upload_by_url": "cargar este ficheiro desde un enderezo URL",
        "action-writeapi": "usar a escritura API",
        "action-delete": "borrar esta páxina",
-       "action-deleterevision": "borrar esta revisión",
-       "action-deletedhistory": "ver o historial borrado desta páxina",
+       "action-deleterevision": "borrar revisións",
+       "action-deletelogentry": "borrar entradas do rexistro",
+       "action-deletedhistory": "ver o historial borrado dunha páxina",
+       "action-deletedtext": "ver o texto dunha revisión borrada",
        "action-browsearchive": "procurar páxinas borradas",
-       "action-undelete": "restaurar esta páxina",
-       "action-suppressrevision": "revisar e restaurar esta revisión agochada",
+       "action-undelete": "restaurar páxinas",
+       "action-suppressrevision": "revisar e restaurar revisións agochadas",
        "action-suppressionlog": "ver este rexistro privado",
        "action-block": "bloquear o usuario fronte á edición",
        "action-protect": "cambiar o nivel de protección desta páxina",
        "action-userrights-interwiki": "editar os permisos de usuario dos usuarios doutros wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de datos",
        "action-sendemail": "enviar correos electrónicos",
+       "action-editmyoptions": "Editar as súas preferencias",
        "action-editmywatchlist": "editar a súa lista de vixilancia",
        "action-viewmywatchlist": "ver a súa lista de vixilancia",
        "action-viewmyprivateinfo": "ver a súa información privada",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-search-placeholder": "Filtrar os cambios recentes (ollar ou comezar a escribir)",
+       "rcfilters-invalid-filter": "Filtro no válido",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Non se atoparon filtros",
+       "rcfilters-filter-registered-label": "Rexistrado",
+       "rcfilters-filter-unregistered-label": "Non rexistrado",
+       "rcfilters-filtergroup-authorship": "Editar autoría",
+       "rcfilters-filter-editsbyself-label": "As súas propias edicións",
+       "rcfilters-filter-editsbyself-description": "Edicións súas.",
+       "rcfilters-filter-editsbyother-label": "Edicións doutros.",
+       "rcfilters-filter-editsbyother-description": "Edicións creadas por outros usuarios.",
+       "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia de usuario",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Chegados recentemente",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Editores moi novosː menos de 10 edicións e 4 días de actividade.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
+       "rcfilters-filter-userExpLevel-learner-description": "Máis días de actividade e edicións que 'novatos' pero menos que 'usuarios experimentados'.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuarios experimentados",
+       "rcfilters-filter-userExpLevel-experienced-description": "Máis de 30 días de actividade e 500 edicións.",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-humans-label": "Humano (non bot)",
+       "rcfilters-filter-minor-label": "Edicións menores",
+       "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
+       "rcfilters-filtergroup-changetype": "Tipo de cambio",
        "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] eliminada da categoría [[Special:WhatLinksHere/$1||esta páxina está incluída noutras páxinas]]",
        "autochange-username": "Cambio automático de MediaWiki",
        "upload": "Subir un ficheiro",
-       "uploadbtn": "Subir o ficheiro",
+       "uploadbtn": "Subir un ficheiro",
        "reuploaddesc": "Cancelar a subida e volver ao formulario de subidas",
        "upload-tryagain": "Enviar a descrición do ficheiro modificada",
        "uploadnologin": "Non accedeu ao sistema",
        "uncategorizedcategories": "Categorías sen categorías",
        "uncategorizedimages": "Ficheiros sen categorías",
        "uncategorizedtemplates": "Modelos sen categorías",
+       "uncategorized-categories-exceptionlist": "# Contén unha lista de categorías que non van aparecer en Especial:UncategorizedCategories. Unha por liña, comezando con \"*\". As liñas que comecen con outro carácter (incluíndo espazos en branco) ignóranse. Use \"#\" para  engadir comentarios.",
        "unusedcategories": "Categorías sen uso",
        "unusedimages": "Imaxes sen uso",
        "wantedcategories": "Categorías requiridas",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "$1 {{GENDER:$1|enviou}} este correo electrónico a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" de {{SITENAME}}.",
+       "emailuserfooter": "$1 {{GENDER:$1|enviou}} este correo electrónico a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" de {{SITENAME}}. {{GENDER:$2|A súa}} dirección de correo electrónico será enviada directamente {{GENDER:$1|ó|á}} remitente orixinal, {{GENDER:$1|revelándolle}} a {{GENDER:$2|súa}} dirección de correo.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "wlshowhideanons": "usuarios anónimos",
        "wlshowhidepatr": "edicións vixiadas",
        "wlshowhidemine": "as miñas edicións",
-       "wlshowhidecategorization": "categorización da páxina",
+       "wlshowhidecategorization": "categorización de páxinas",
        "watchlist-options": "Opcións de vixilancia",
        "watching": "Vixiando...",
        "unwatching": "Deixando de vixiar...",
        "proxyblockreason": "O seu enderezo IP foi bloqueado porque é un proxy aberto.\nPor favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.",
        "sorbsreason": "O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.\nPolo tanto, non pode crear unha conta",
+       "softblockrangesreason": "As contribucións anónimas non están permitidas dende o seu enderezo IP ($1). Por favor, inicie sesión.",
        "xffblockreason": "Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1",
        "cant-see-hidden-user": "O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.",
        "ipbblocked": "Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado",
        "cant-move-to-user-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de usuario (agás a unha subpáxina).",
        "cant-move-category-page": "Non ten os permisos necesarios para mover páxinas de categoría.",
        "cant-move-to-category-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de categoría.",
+       "cant-move-subpages": "Non ten os permisos necesarios para mover subpáxinas.",
+       "namespace-nosubpages": "O espazo de nomes \"$1\" non deixa subpáxinas.",
        "newtitle": "Novo título:",
        "move-watch": "Vixiar esta páxina",
        "movepagebtn": "Mover a páxina",
        "pageinfo-length": "Lonxitude da páxina (en bytes)",
        "pageinfo-article-id": "ID da páxina",
        "pageinfo-language": "Lingua do contido da páxina",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modelo do contido da páxina",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indexación por robots",
        "feedback-useragent": "Axente de usuario:",
        "searchsuggest-search": "Procurar en {{SITENAME}}",
        "searchsuggest-containing": "que conteña...",
-       "api-error-autoblocked": "A súa dirección IP foi bloqueada automaticamente porque foi usada por un usuario bloqueado.",
-       "api-error-badaccess-groups": "Non ten os permisos necesarios para cargar ficheiros neste wiki.",
        "api-error-badtoken": "Erro interno: Pase incorrecto.",
-       "api-error-blocked": "Foi bloqueado fronte á edición.",
-       "api-error-copyuploaddisabled": "As cargas mediante URL están desactivadas neste servidor.",
-       "api-error-duplicate": "Xa hai {{PLURAL:$1|outro ficheiro| outros ficheiros}} no wiki co mesmo contido.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|outro ficheiro|outros ficheiros}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.",
-       "api-error-empty-file": "O ficheiro que enviou estaba baleiro.",
        "api-error-emptypage": "Non está permitida a creación de páxinas novas que estean baleiras.",
-       "api-error-fetchfileerror": "Erro interno: Houbo un problema ao buscar o ficheiro.",
-       "api-error-fileexists-forbidden": "Xa existe un ficheiro co nome \"$1\". Non se pode sobrescribir.",
-       "api-error-fileexists-shared-forbidden": "Xa existe un ficheiro co nome \"$1\" no repositorio de ficheiros compartidos. Non se pode sobrescribir.",
-       "api-error-file-too-large": "O ficheiro que enviou era grande de máis.",
-       "api-error-filename-tooshort": "O nome do ficheiro é curto de máis.",
-       "api-error-filetype-banned": "Este tipo de ficheiro está prohibido.",
-       "api-error-filetype-banned-type": "$1 non {{PLURAL:$4|é un tipo de ficheiro permitido|son tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos son}} $2.",
-       "api-error-filetype-missing": "Fáltalle a extensión ao ficheiro.",
-       "api-error-hookaborted": "O asociador da extensión cancelou a modificación que intentou realizar.",
-       "api-error-http": "Erro interno: Non se puido conectar co servidor.",
-       "api-error-illegal-filename": "O nome do ficheiro non está permitido.",
-       "api-error-internal-error": "Erro interno: Houbo un problema ao procesar a súa carga no wiki.",
-       "api-error-invalid-file-key": "Erro interno: Non se atopou o ficheiro no depósito temporal.",
-       "api-error-missingparam": "Erro interno: Faltan parámetros na solicitude.",
-       "api-error-missingresult": "Erro interno: Non se puido determinar se a copia saíu ben.",
-       "api-error-mustbeloggedin": "Debe acceder ao sistema para cargar ficheiros.",
-       "api-error-mustbeposted": "Erro interno: A solicitude necesita HTTP POST.",
-       "api-error-noimageinfo": "A carga realizouse correctamente, pero o servidor non deu ningunha información sobre o ficheiro.",
-       "api-error-nomodule": "Erro interno: Non hai ningún módulo de cargas.",
-       "api-error-ok-but-empty": "Erro interno: Non hai resposta do servidor.",
-       "api-error-overwrite": "Non está permitido sobrescribir un ficheiro existente.",
-       "api-error-ratelimited": "Está intentando subir máis ficheiros nun pequeno espazo de tempo do que permite este wiki.\nPor favor, inténteo de novo nuns minutos.",
-       "api-error-stashfailed": "Erro interno: O servidor non puido almacenar o ficheiro temporal.",
        "api-error-publishfailed": "Erro interno: O servidor non puido publicar o ficheiro temporal.",
-       "api-error-stasherror": "Houbo un erro ao subir o ficheiro ao depósito.",
-       "api-error-stashedfilenotfound": "O ficheiro apartado non se atopou ao intentar envialo.",
-       "api-error-stashpathinvalid": "A ruta na que se apartara o ficheiro non era correcta.",
-       "api-error-stashfilestorage": "Produciuse un erro ao apartar o ficheiro.",
-       "api-error-stashzerolength": "O servidor non puido apartar o ficheiro porque o ficheiro está baleiro.",
-       "api-error-stashnotloggedin": "Debe identificarse para gardar ficheiros no apartado de envío.",
-       "api-error-stashwrongowner": "O ficheiro apartado ao que intentaba acceder non lle pertence a vostede.",
-       "api-error-stashnosuchfilekey": "A clave de ficheiro apartado á que intentaba acceder non existe.",
-       "api-error-timeout": "O servidor non respondeu no tempo esperado.",
-       "api-error-unclassified": "Houbo un erro descoñecido.",
-       "api-error-unknown-code": "Erro descoñecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: Houbo un problema ao intentar cargar o ficheiro.",
-       "api-error-unknown-warning": "Advertencia descoñecida: $1",
+       "api-error-stashfailed": "Erro interno: O servidor non puido almacenar o ficheiro temporal.",
+       "api-error-unknown-warning": "Advertencia descoñecida: \"$1\".",
        "api-error-unknownerror": "Erro descoñecido: \"$1\".",
-       "api-error-uploaddisabled": "As cargas están desactivadas neste wiki.",
-       "api-error-verification-error": "Este ficheiro podería estar corrupto ou ter unha extensión incorrecta.",
-       "api-error-was-deleted": "Un ficheiro con este mesmo nome xa foi cargado con anterioridade e posteriormente eliminado.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Utilizar a lingua por defecto",
        "pagelang-select-lang": "Seleccionar a lingua",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "A páxina $1 non existe.",
+       "pagelang-unchanged-language": "A páxina $1 xa foi definida coa lingua $2.",
+       "pagelang-db-failed": "A base de datos fallou ó tentar mudar a lingua da páxina.",
        "right-pagelang": "Cambiar a lingua da páxina",
        "action-pagelang": "cambiar a lingua da páxina",
        "log-name-pagelang": "Rexistro de cambios de linguas",
        "log-action-filter-block-reblock": "Modificación de bloqueo",
        "log-action-filter-block-unblock": "Desbloquear",
        "log-action-filter-contentmodel-change": "Cambio de modelo de contido",
-       "log-action-filter-contentmodel-new": "Creación de páxins cun modelo de contido non estándar",
+       "log-action-filter-contentmodel-new": "Creación de páxina cun modelo de contido diferente do contido por defecto",
        "log-action-filter-delete-delete": "Borrado de páxinas",
        "log-action-filter-delete-delete_redir": "Sobreescritura de redirección",
        "log-action-filter-delete-restore": "Restauración de páxinas",
        "usercssispublic": "Lembre: As subpáxinas CSS non deberían conter datos confidenciais porque outros usuarios poden velos.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "revisión $1",
+       "pageid": "identificador de páxina $1"
 }
index 4e4e804..46af76a 100644 (file)
@@ -82,6 +82,7 @@
        "dec": "دسامبر",
        "pagecategories": "{{PLURAL:$1|جرگه|جرگهٰ‌ن}}",
        "category_header": "\"$1\" جرگه مئنˇ ولگؤن",
+       "subcategories": "جيررچؤن",
        "category-media-header": "\"$1\" جرگه مئنˇ رسانهٰ‌ن",
        "hidden-categories": "{{PLURAL:$1|جخۊته جرگه|جخۊته جرگهٰ‌ن}}",
        "category-subcat-count": "{{PLURAL:$2|اي جرگه ميئن خالي اي جيرجرگه دره.|{{PLURAL:$1|اي جيرجرگه|اي $1 جيرجرگه}} اي جرگه ميئن {{PLURAL:$1|دره|درن}}؛ اي جرگه سرجمع $2ته جيرجرگه دأنه.}}",
@@ -89,6 +90,7 @@
        "category-article-count-limited": "جيرˇ{{PLURAL:$1|ولگ|$1 ولگ}} هي جرگه مئن دره.",
        "category-file-count": "{{PLURAL:$2|اي جرگه مئن خالي اي فاىل دره.|{{PLURAL:$1|اي فاىل|اي $1ته فاىل}} اي جرگه مئن {{PLURAL:$1|دره|درن}}؛ اي جرگه مئن در کؤل $2ته فاىل دره.}}",
        "listingcontinuesabbrev": "(ايدامه)",
+       "newwindow": "(تازه پنجره ميئن بازأبۊنه)",
        "cancel": "لغو",
        "moredotdotdot": "ویشتر...",
        "mypage": "ولگ",
        "printableversion": "وؤته چاپ گۊدن",
        "permalink": "داىمي خال",
        "view": "دئن",
+       "view-foreign": "دئن $1ˇ ميئن",
        "edit": "دچينواچين",
        "editthispage": "اي ولگه دچينواچين بکۊن",
        "create-this-page": "اي ولگه چاکۊن",
        "categorypage": "جرگه ولگه دئن",
        "otherlanguages": "باخي زوانؤنˇ جي",
        "redirectedfrom": "(مسير عوضاؤدن $1 أجي)",
+       "lastmodifiedat": "اي ولگ آخري گرش $1ˇ ميئن ساعت $2 دچينواچين بۊبؤ.",
        "protectedpage": "بپأسه ولگ",
        "jumpto": "بوؤز:",
        "jumptonavigation": "گردسن",
        "jumptosearch": "وامج",
        "view-pool-error": "سرورؤنˇ سر پۊر بار هننأ. پۊر پۊرˇ کارگيرؤن حقسأى کأدرن که اي ولگه فأندرن. \nلؤطف بۊکۊنين ىيسکالى صبر بدأرين.\n\n$1",
-       "aboutsite": "راجه به {{SITENAME}}",
+       "aboutsite": "راجع به {{SITENAME}}",
        "aboutpage": "Project:راجه به",
        "copyrightpage": "{{ns:project}}:چاکۊدنحق",
        "currentevents": "هسأىي تفاقؤن",
        "resetpass-submit-cancel": "لغو",
        "passwordreset": "هندئه رمز چاگۊدن",
        "passwordreset-username": "کارگيري نؤم:",
-       "passwordreset-capture-help": "أگه اي گۊزينه' تيک بزنين، ايمىل (که اينˇ مئن مؤوقتي رمز دره) شيمئبه نۊشؤن بدأ بنه ؤ کارگيرئبه ني اۊسئه بنه.",
        "passwordreset-emailelement": "کارگيري نؤم: \n$1\n\nمؤوقتي رمز: \n$2",
        "bold_sample": "پۊررنگˇ وؤت",
        "bold_tip": "پۊررنگˇ وؤت",
        "extlink_sample": "http://www.example.com خالˇ تيتر",
        "extlink_tip": "بيريني خال (http://‎ پيشونده ىادانکۊنين)",
        "headline_sample": "تيترˇ وؤت",
+       "headline_tip": "سطحˇ ۲ˇ تيتر",
+       "nowiki_sample": "قالب-بندي نۊبؤ وؤت ائره واردأبي",
        "image_tip": "وؤتˇ مئنˇ تصوير",
        "media_tip": "فاىلˇ خال",
+       "sig_tip": "شيمي ايمضا ؤ زمتˇ برچسب",
        "hr_tip": "اؤفؤقي خط (اۊن أجي کم کارأگيرين)",
        "summary": "فيچالسه:",
        "minoredit": "اي نيميزگره دچينواچينه",
        "editingsection": "دچيواچينˇ مئن $1 (وابين)",
        "templatesused": "اي ولگˇ مينˇ {{PLURAL:$1|قالب|قالبؤن}}",
        "template-protected": "(بپأسه)",
+       "template-semiprotected": "(نيمه بپأسه)",
        "hiddencategories": "اي ولگ {{PLURAL:$1|ىکته جخۊته جرگه|$1 جخۊته جرگه}} مئن دره:",
        "currentrev-asof": "هسأىي نۊسخه تا $1",
        "revisionasof": "نۊسخه $1",
        "prevn": "داميشکˇ {{PLURAL:$1|$1}}",
        "nextn": "بعدي {{PLURAL:$1|$1}}",
        "shown-title": "$1هر ىکته ولگˇ مئن {{PLURAL:$1|نتيجه'|نتيجه'ن}} نۊشؤن بدي.",
+       "viewprevnext": "نۊشؤن دأن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "دله ولگؤن",
        "searchprofile-images": "چنرسانه",
        "searchprofile-everything": "همه چي",
        "searchprofile-everything-tooltip": "تمؤمˇ دله' وامتن (حتی گبˇ ولگؤنه)",
        "searchprofile-advanced-tooltip": "دؤجئه نؤمفضا'نˇ مئن وامتن",
        "search-result-size": "$1 ({{PLURAL:$2|ىک کلمه|$2 کلمه'ن}})",
+       "search-redirect": "(مسير عوضاؤدن $1ˇ جي)",
+       "search-section": "($1ˇ وابين)",
        "search-category": "($1 جرگه)",
        "search-suggest": "شيمي منظۊر بۊ: $1",
        "searchall": "همه",
+       "search-nonefound": "نتيجه-اي ياته نۊبؤ.",
        "mypreferences": "ترجيحات",
        "skin-preview": "پيشادئن",
        "prefs-user-pages": "کارگيري ولگؤن",
        "enhancedrc-history": "تاريخ",
        "recentchanges": "آخري تغىيرؤن",
        "recentchanges-legend": "آخري تغىيرؤنˇ تنظيمات",
+       "recentchanges-summary": "ويکي آخري تغييرؤنه اي ولگˇ ميئن پى بگيرين.",
        "recentchanges-label-newpage": "اي دچينواچين ىکته تازه ولگ چاگۊده",
        "recentchanges-label-minor": "اي نيميزگره دچينواچينه",
        "recentchanges-label-bot": "اي دچينواچينه ىکته رۊبات بؤده",
+       "recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
+       "recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
+       "recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+       "rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
+       "rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
        "rcshowhideminor-show": "نۊشؤن دأن",
        "rcshowhideminor-hide": "دۊخۊسان",
        "rcshowhidebots": "$1 رۊباتؤن",
        "newpageletter": "نؤ",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کارگير}} پىگير]",
-       "rc-change-size-new": "$1 {{PLURAL:$1|باÙ\89ت}} ØªØºÙ\89يرˇ پسي",
+       "rc-change-size-new": "$1 {{PLURAL:$1|باÙ\89ت}} ØªØºÙ\8aيرˇ پسي",
        "recentchangeslinked": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-toolbox": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-summary": "اي جير، ىکته ليسته تينين بىنين آخري تغييرؤن أجي اۊ ولگؤنˇ مئن کي اي ولگˇ جي خال ببؤن (ىا جرگهٔ مؤردˇ نظرˇ جي). اۊ ولگؤني که [[Special:Watchlist|شيمئه پىگيري ليست]]۱ميئن دبۊن پۊررنگ نۊشؤن بدأبۊنن.",
        "namespace_association": "مؤرتبطˇ نؤمفضا",
        "tooltip-namespace_association": "ائره' تيک بزنين تا گبˇ نؤمفضا ىا مؤرتبط مؤضۊع ىا دؤجين بۊبؤ نؤمفضا ني شامل بۊبۊن.",
        "blanknamespace": "گت",
+       "contributions": "{{GENDER:$1|کارگير}}ˇ مۊشارکتؤن",
        "month": "اي ماه مئن (ؤ دأميشک):",
        "year": "اي سالˇ مئن (ؤ دأميشک):",
        "sp-contributions-talk": "گب",
        "blocklist-by": "دبۊدگر کيا",
        "blocklist-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
        "blocklink": "دبۊستن",
-       "contribslink": "Ù\89اوري‌ئن",
+       "contribslink": "Ù\8aاوري‌ئن",
        "block-log-flags-nousertalk": "مننه خۊ گبˇ ولگه دچينواچين بکۊنه",
        "block-log-flags-hiddenname": "دۊخۊسانئه کارگيري نؤم",
        "movecategorypage-warning": "<strong>اخظار:</strong> شمه جرگه ولگه جابجا کأدرين. شيمه حواس بمؤنه کي فقط ولگ جابجا بنه ؤ ولگؤن قديمي جرگه مئن مؤنن ؤ تازه جرگه مئن <em>نشنن</em>.",
        "tooltip-pt-login": "بئتره ديرين بشين؛ بسچی گه ايجباری نیه.",
        "tooltip-pt-logout": "بيرين شؤن",
        "tooltip-pt-createaccount": "بئتره کارگیري حساب چاکۊنين ؤ ديرين بشين؛ بسچي که حساب چاؤدن ايجباری نیه.",
-       "tooltip-ca-talk": "گب راجه به ولگˇ مؤحتوا",
+       "tooltip-ca-talk": "گب راجع به ولگˇ مؤحتوا",
        "tooltip-ca-edit": "اي ولگه دچينواچين بۊکۊنين",
        "tooltip-ca-addsection": "ىکته تازه وابين چاکۊن",
+       "tooltip-ca-viewsource": "اي ولگ بپاسأکه.\nتؤنين اينˇ سربسه بينين",
        "tooltip-ca-history": "اي ولگˇ قديمي نۊسخه'ن",
        "tooltip-ca-protect": "أ ولگه بپا",
        "tooltip-ca-move": "اي ولگه جابجا گۊدن",
        "tooltip-n-randompage": "ىکته کترئي ولگه أردن",
        "tooltip-n-help": "فأمسن ؤ آؤجا هأىتنˇ جيگه",
        "tooltip-t-whatlinkshere": "ىکته ليست همته ولگؤنˇ جي کي ائره خال ببؤن",
+       "tooltip-t-recentchangeslinked": "ولگؤنˇ آخري تغييرؤني گه اي ولگ اۊشؤنˇ أمرأ خال دأنه.",
        "tooltip-feed-atom": "أتۊمˇ خبرنامه اي ولگˇ شي",
+       "tooltip-t-contributions": "{{GENDER:$1|اي کارگير}}ˇ مۊشارکتؤنˇ ليست",
        "tooltip-t-upload": "فاىلؤنه جؤراکشئن",
        "tooltip-t-specialpages": "ىکته ليست، همه ته خاصˇ ولگؤن جي",
        "tooltip-t-print": "اي ولگˇ چاپي وؤت",
+       "tooltip-t-permalink": "پايدارˇ خال اي ولگˇ نۊسخهٰ جي",
        "tooltip-ca-nstab-main": "مۊحتوياتˇ ولگه دئن",
        "tooltip-ca-nstab-user": "کارگيرˇ ولگه دئن",
        "tooltip-ca-nstab-special": "اي ىکته خاصˇ ولگه ؤ نشأنه دچينواچين گۊدن.",
        "tooltip-ca-nstab-category": "جرگه ولگه دئن",
        "tooltip-save": "شيمه تغىيرؤنه ذخيره بکۊنين",
        "tooltip-preview": "شيمئه تغىيرؤنˇ پيشادئن. هلئه ثبت نۊده، اي کيليده کاراگيرين.",
+       "tooltip-diff": "تغييرؤني گه شۊمۊ وؤتˇ ميئن بدأينˇ نۊشؤن دأن",
        "tooltip-rollback": "\"پساوگردان\" اي ولگˇ آخري دچينواچينگرˇ دچينواچينؤنه ىکته تنگۊلى أجي خؤنثا کؤنه.",
+       "tooltip-summary": "فيچالسه وارد بکۊنين",
        "pageinfo-header-restrictions": "ولگه پأسن",
        "pageinfo-hidden-categories": "جخۊته {{PLURAL:$1| جرگه|جرگه}} ( $1 )",
        "pageinfo-toolboxlink": "ولگˇ اطلاعات",
        "pageinfo-category-info": "جرگه اطلاعات",
        "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فاىلˇ واويراز: $3، نوع MIME فاىل: $4",
        "show-big-image": "أصلˇ فاىل",
+       "show-big-image-preview": "اي پيشأدئنˇ واويراز: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پيکسل",
        "metadata": "گتˇ دىتا",
        "metadata-fields": "اي پىغؤمˇ مئنˇ نۊشؤن بدأ تاتاىي گتˇ دىتا'ن، وختي کي تاتاىي گتˇ دىتا'نˇ جدول جمأبؤبي، هندئه نۊشؤن بدأ بنه. باخيˇ مؤردؤن خالي اۊ زمت نۊشؤن بدأ بنه کي اۊ جدول وابۊبۊن.\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-orientation": "سۊ",
        "exif-model": "دۊربينˇ مؤدل",
        "exif-software": "کارىته-بۊبؤ نرمبزار",
        "exif-colorspace": "رنگي فضا",
        "specialpages-group-login": "ديرين/ثبتˇ نؤم",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تگ|تگؤن}}]]: $2)",
        "logentry-newusers-create": "کارگيري حساب $1 {{GENDER:$2|چاگۊده-بۊبؤ}}",
-       "searchsuggest-search": "وامج",
+       "searchsuggest-search": "{{SITENAME}} مئن وامج",
        "expand_templates_preview": "پيشادئن",
        "default-skin-not-found": "اؤخ! پيشفرضˇ قالبي که شيمه ويکي ئبه <code dir=\"ltr\"<$wgDefaultSkin</code> مئن تعريف ببؤ به عنوانˇ <code>$1</code>، دسفرس نيه.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند {{PLURAL:$4|پوسته|پوسته}} از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استفاده از گیت برای دریافت پوسته‌ها].\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا {{PLURAL:$5|همه|همه}} پوسته‌های نصب‌شده را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید."
 }
index 1006cc8..2f79206 100644 (file)
        "nov": "Nop",
        "dec": "Des",
        "january-date": "$1 Yanuari",
-       "february-date": "$1 Peburuari",
+       "february-date": "$1 Pebruari",
        "march-date": "$1 Maret",
        "april-date": "$1 April",
        "may-date": "$1 Mei",
-       "june-date": "$1 Yuni",
-       "july-date": "$1 Yuli",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
        "august-date": "$1 Agustus",
        "september-date": "$1 September",
        "october-date": "$1 Oktober",
        "edit-local": "Ubawa deskripsi lokal",
        "create": "Mohutu",
        "create-local": "Duhengi deskripsi lokal",
-       "editthispage": "Ubawa halaamani boti",
-       "create-this-page": "Pohutuwa halaamani boti",
+       "editthispage": "Boli'a halaman botiye",
+       "create-this-page": "Pohutuwa halamani botiye",
        "delete": "Luluta",
-       "deletethispage": "Luluta halaamani boti",
+       "deletethispage": "Luluta halaman botiye",
        "undeletethispage": "Bataliya moluluto",
        "undelete_short": "Batali moluluto {{PLURAL:$1|tuwawu uba|$1 ubawa}}",
        "viewdeleted_short": "Bilohi {{PLURAL:$1|tuwawu yiluluto uba|$1 yiluluto ubawa}}",
        "protect": "Dahawa",
-       "protect_change": "gantiyi",
+       "protect_change": "boli'a",
        "protectthispage": "Dahawa halaman boti",
        "unprotect": "dudaha ubaalo",
        "unprotectthispage": "ubawa dudaha halaman botiye",
        "talk": "Biisalawa",
        "views": "Bibilohu",
        "toolbox": "Pilaakasi",
+       "tool-link-userrights-readonly": "Bilohi lembo'a {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Lawola email ode {{GENDER:$1|user}}",
        "userpage": "Bilohi halaman pengguna",
        "projectpage": "Bilohi halaman proyek",
        "imagepage": "Bilohi halaman berkas",
        "disclaimers": "Momaahu",
        "disclaimerpage": "Project:Momaahu umum",
        "edithelp": "Wubodu momoli'o",
-       "helppage-top-gethelp": "Tuulungi",
+       "helppage-top-gethelp": "Wubodu",
        "mainpage": "Halaman Bungaliyo",
        "mainpage-description": "Halaman bungaliyo",
        "policy-url": "Project:Kebijakan",
        "toc": "Tuwango",
        "showtoc": "popobilehe",
        "hidetoc": "wanto'a",
-       "collapsible-collapse": "Lolohubu",
-       "collapsible-expand": "Duhengi",
+       "collapsible-collapse": "Wanto'a",
+       "collapsible-expand": "Bu'ade",
        "confirmable-confirm": "Delo {{GENDER:$1|yi'o}} yakini?",
        "confirmable-yes": "Jo",
        "confirmable-no": "De'e",
        "logentry-move-move": "$1 {{GENDER:$2|moheyi}} halaman $3 ode $4",
        "logentry-newusers-create": "Ta ohu'uwo akun $1 {{GENDER:$2|mohutu}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
-       "searchsuggest-search": "Lolohe"
+       "searchsuggest-search": "Lolohe {{SITENAME}}"
 }
index 4a3207f..c6f36fa 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Sälber gändereti Syte un Dateie automatisch beobachte",
        "tog-watchmoves": "Sälber verschobeni Sytene un Dateie automatisch beobachte",
        "tog-watchdeletion": "Sälber gleschti Sytene un Dateie automatisch beobachte",
+       "tog-watchuploads": "Die Dateie, wonni uffelad, automatisch uff myni Beobachtigslischt druff due",
        "tog-watchrollback": "Syte, wun i zruckgsetzt haa, automatisch beobachte",
        "tog-minordefault": "Alli dyni Änderigen als «chlyni Änderige» markiere",
        "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
@@ -63,7 +64,7 @@
        "tog-ccmeonemails": "Schick mr Kopie vo de E-Mails, won i andere schick.",
        "tog-diffonly": "Numme Versionsunterschiid aazeige, ohni d Syte",
        "tog-showhiddencats": "Zeig di versteckte Kategorie",
-       "tog-norollbackdiff": "Unterschid noch em Zrucksetze unterdrucke",
+       "tog-norollbackdiff": "Unterschid noch em Zrucksetze nit aazeige",
        "tog-useeditwarning": "Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin",
        "tog-prefershttps": "Wänn aagmäldet, alliwyl e sicheri Verbindig bruuche",
        "underline-always": "immer",
        "october-date": "$1. Oktober",
        "november-date": "$1. Novämber",
        "december-date": "$1. Dezämber",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorie}}",
        "category_header": "Artikel in de Kategori \"$1\"",
        "subcategories": "Unterkategorie",
        "newwindow": "(imene nöie Fänschter)",
        "cancel": "Abbräche",
        "moredotdotdot": "Meh …",
-       "morenotlisted": "Die Lischt isch nit vollständig.",
+       "morenotlisted": "Die Lischt isch vilycht nit vollständig.",
        "mypage": "Syte",
        "mytalk": "Diskussionsyte",
        "anontalk": "Diskussionssyste vo sellere IP",
        "talk": "Diskussion",
        "views": "Wievylmol agluegt",
        "toolbox": "Wärchzyyg",
+       "tool-link-userrights": "{{GENDER:$1|Benutzergruppe}} ändere",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppe}} aaluege",
+       "tool-link-emailuser": "E-Mail an {{GENDER:$1|dää Benutzer|die Benutzeri}} schicke",
        "userpage": "Benutzersyte",
        "projectpage": "Projektsyte azeige",
        "imagepage": "Dateisyte",
        "virus-scanfailed": "Scan het nid funktioniert (code $1)",
        "virus-unknownscanner": "Virescanner, wu nid bekannt isch:",
        "logouttext": "'''Du bisch jetz abgmäldet.'''\n\nObacht: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmäldet wärsch, bis Du dr Zwischespycher vu Dyym Browser glescht hesch.",
+       "cannotlogoutnow-title": "Abmälde goot grad nit",
+       "cannotlogoutnow-text": "Abmälde goot nit, derwyylscht du $1 bruuchsch",
        "welcomeuser": "Willchuu, $1!",
        "welcomecreation-msg": "Dyy Benutzerkonto isch aagleit wore.\nVergiss nit, Dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] z ändere.",
        "yourname": "Dyy Benutzername",
        "createacct-yourpasswordagain-ph": "Gib s Passwort nomol yy",
        "userlogin-remembermypassword": "Aagmäldet blyybe",
        "userlogin-signwithsecure": "Sicheri Verbindig bruuche",
+       "cannotlogin-title": "Aamälde goot nit",
+       "cannotlogin-text": "Aamälde goot nit",
+       "cannotloginnow-title": "Aamälde goot grad nit",
+       "cannotloginnow-text": "Aamälde goot nit, derwyylscht du $1 bruuchsch",
+       "cannotcreateaccount-title": "Benutzerkonto cha nid aagleit wäre.",
        "yourdomainname": "Dyyni Domäne",
        "password-change-forbidden": "Du chasch uf däm Wiki kei Passwerter ändere.",
        "externaldberror": "Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.",
        "login": "Aamälde",
+       "login-security": "Due dyni Identität verifiziere",
        "nav-login-createaccount": "Aamälde / Konto aalege",
        "userlogin": "Aamälde/Konto aalege",
        "userloginnocreate": "Aamälde",
        "resetpass_submit": "Passwort ibermittle un aamälde",
        "changepassword-success": "Dyy Passwort isch erfolgryych gänderet wore.",
        "changepassword-throttled": "Du hesch z vilmol versuecht Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
+       "botpasswords-label-appid": "Name vum Bot:",
+       "botpasswords-label-create": "Aalege",
+       "botpasswords-label-update": "Aktualisiere",
+       "botpasswords-label-cancel": "Abbräche",
+       "botpasswords-label-delete": "Lösche",
+       "botpasswords-label-resetpassword": "Passwort zruggsetze",
        "resetpass_forbidden": "S Passwort cha nid gänderet wäre.",
        "resetpass-no-info": "Du muesch Di aamälde zum uf die Syte diräkt zuegryfe z chenne.",
        "resetpass-submit-loggedin": "Passwort ändere",
        "passwordreset-emaildisabled": "D E-Mail-Funktione sin uf däm Wiki deaktiviert wore.",
        "passwordreset-username": "Benutzername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail aaluege?",
-       "passwordreset-capture-help": "Wänn du des Chäschtli aachrüüzesch, no wird die E-Mail (mit em temporäre Passwort) dir aazeigt, un au em Benutzer zuegschiggt.",
        "passwordreset-email": "E-Mail-Adräss:",
        "passwordreset-emailtitle": "Benutzerkontoinformationen uf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "searchprofile-advanced-tooltip": "Suech in wytere Namensryym",
        "search-result-size": "$1 ({{PLURAL:$2|1 Wort|$2 Werter}})",
        "search-result-category-size": "{{PLURAL:$1|1 Kategorii|$1 Kategorie}} ({{PLURAL:$2|1 Unterkategorii|$2 Unterkategorie}}, {{PLURAL:$3|1 Datei|$3 Dateie}})",
-       "search-redirect": "(Wyterleitig $1)",
+       "search-redirect": "(Wyterleitig vo $1)",
        "search-section": "(Abschnitt $1)",
        "search-category": "(Kategorie $1)",
        "search-file-match": "(Resultat us em Inhalt vo Dateie)",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hesch nit d Berächtigung, Benutzerrächt in andere Wiki z ändere.",
        "userrights-nodatabase": "D Datebank $1 git s nit oder si isch nit lokal.",
-       "userrights-nologin": "Du muesch Di mit eme Ammanne-Benutzerkonto [[Special:UserLogin|aamälde]], zum Benutzerrächt z ändere.",
-       "userrights-notallowed": "Du hesch nit d Berächtigung zum Benutzerrächt vergee oder ewägnee.",
        "userrights-changeable-col": "Gruppezuegherigkeit, wu Du chasch ändere",
        "userrights-unchangeable-col": "Gruppezuegherigkeit, wu Du nit chasch ändere",
        "userrights-conflict": "Di veränderete Rächt göh nid uuf! Bitte lueg d Änderige düren u tue se nomal spychere.",
-       "userrights-removed-self": "Du hesch dir di eigete Rächt erfolgrych furtgnoh. Drum hesch kei Zuegriff meh uf die Syte.",
        "group": "Grupp:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Bstetigti Benutzer",
        "right-siteadmin": "Datebank sperre un entsperre",
        "right-override-export-depth": "Exportier Syte mitsamt dr vergleichte Syte bis zuen ere Tiefi vu 5",
        "right-sendemail": "E-Mail an anderi Benutzer schicke",
-       "right-passwordreset": "Passwort vun eme Benutzer zruggsetze",
        "right-managechangetags": "[[Special:Tags|Markierigen]] ir Datebank schaffen oder lösche",
        "right-applychangetags": "Zäme mit den eigeten Änderige [[Special:Tags|Markierigen]] abringe",
        "right-changetags": "Beliebigi [[Special:Tags|Markierige]] by einzelne Versionen oder Logbuechyträg derzuetue oder lösche",
        "feedback-thanks": "Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.",
        "feedback-thanks-title": "Merci!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Suechi",
+       "searchsuggest-search": "{{SITENAME}} dursueche",
        "searchsuggest-containing": "din het s …",
        "api-error-badaccess-groups": "Du derfsch keini Dateie in des Wiki uffelade.",
        "api-error-badtoken": "Intärne Fähler: Dr Token isch fählerhaft.",
index 458d0e5..30e2574 100644 (file)
@@ -29,7 +29,8 @@
                        "Nisargjhaveri",
                        "Matma Rex",
                        "Bhatakati aatma",
-                       "YmKavishwar"
+                       "YmKavishwar",
+                       "Kevin Kovadia"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "passwordreset-emaildisabled": "આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.",
        "passwordreset-username": "સભ્ય નામ:",
        "passwordreset-domain": "ડોમેઈન:",
-       "passwordreset-capture": "પરિણામી ઈમેલ જોવો છે?",
-       "passwordreset-capture-help": "જો તમે આ ઓપ્શન સિલેક્ટ કરશો, તો તમને અને યુઝર ને ઈ મેલ (કામચલાઉ પાસવર્ડ સાથે) દેખાડવામાં આવશે.",
        "passwordreset-email": "ઇમેલ સરનામું:",
        "passwordreset-emailtitle": "{{SITENAME}} પર ખાતાની માહિતી",
        "passwordreset-emailtext-ip": "કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}}  ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.\n.\n.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસો}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.",
        "userrights-reason": "કારણ:",
        "userrights-no-interwiki": "અન્ય વિકિ પર અન્ય સભ્યો ના અધિકારો માં પરિવર્તન કરવાની તમને પરવાનગી નથી",
        "userrights-nodatabase": "માહિતીસંચ $1 અસ્તિત્વમાં નથી કે તે સ્થાનીય નથી.",
-       "userrights-nologin": "સભ્યના અધિકારો આપવા તમે પ્રબંધક તરીકે પ્રવેશ  [[Special:UserLogin|log in]] કરેલ હોવો જરૂરી છે.",
-       "userrights-notallowed": "તમને વપરાશકર્તા અધિકારો ઉમેરવા કે દૂર કરવાની પરવાનગી નથી.",
        "userrights-changeable-col": "તમે બદલી શકો તેવા જૂથ",
        "userrights-unchangeable-col": "તમે બદલી ન શકો તેવા જૂથ",
        "group": "સમુહ",
        "right-siteadmin": "માહિતી સંચયને ઉઘાડો અને વાસો.",
        "right-override-export-depth": "૫ સ્તર સુધી જોડાયેલ પાના સહીત પાના નિકાસ કરો",
        "right-sendemail": " અન્ય સભ્યોને ઈ-મેલ મોકલો",
-       "right-passwordreset": "પાસવર્ડ રીસેટ ઇ-મેઇલ્સ જુઓ",
        "newuserlogpage": "નવા બનેલા સભ્યોનો લૉગ",
        "newuserlogpagetext": "આ સભ્યોની રચનાનો લોગ છે.",
        "rightslog": "સભ્ય હક્ક માહિતિ પત્રક",
        "action-upload_by_url": "URL પરથી આ ફાઇલ ચઢાવો",
        "action-writeapi": "લેખન API વાપરો",
        "action-delete": "આ પાનું હટાવો",
-       "action-deleterevision": "આ પુનરાવર્તનારદ્દ કરો",
-       "action-deletedhistory": "àª\86 àªªàª¾àª¨àª¾àª¨àª¾ àª°àª¦à«\8dદà«\80àª\95રણનà«\8b àª\87તિહાસ બતાવો",
+       "action-deleterevision": "આ પુનરાવર્તન ને કાઢી નાખો",
+       "action-deletedhistory": "àª\86 àªªàª¾àª¨àª¾àª¨àª¾ àª°àª¦à«\8dદà«\80àª\95રણનà«\80 àªªà«\82રà«\8dવ-વિàª\97ત બતાવો",
        "action-browsearchive": "હટાવેલા પાનાં શોધો",
-       "action-undelete": "àª\86 àªªàª¾àª¨à«\81àª\82 àª«àª°à«\80 àªªà«\81નરà«\8dàª\9cà«\80વà«\80ત àª\95રà«\8b",
-       "action-suppressrevision": "સમà«\80àª\95à«\8dષા àª\95રà«\80 àª\86 àª\97à«\81પà«\8dત àªªà«\81નરાવરà«\8dતન પુન:સ્થાપિત કરો",
+       "action-undelete": "ડિલà«\80àª\9f àª¥àª¯àª¾ àªµàª\97રના àªªàª¾àª¨àª¾àª\82àª\93",
+       "action-suppressrevision": "સમà«\80àª\95à«\8dષા àª\95રà«\8b àª\85નà«\87 àª\97à«\81પà«\8dત àªªà«\81નરાવરà«\8dતનà«\8b àª¨à«\87 પુન:સ્થાપિત કરો",
        "action-suppressionlog": "આ અંગત યાદી જુઓ",
        "action-block": "આ સભ્ય દ્વારા થનાર ફેરફાર પ્રતિબંધીત કરો",
        "action-protect": "આ પાનાંનું પ્રતિબંધ સ્તર બદલો",
index 6372222..b471859 100644 (file)
        "searcharticle": "לדף",
        "history": "היסטוריית הגרסאות של הדף",
        "history_short": "היסטוריה",
+       "history_small": "היסטוריה",
        "updatedmarker": "עודכן מאז ביקורך האחרון",
        "printableversion": "גרסה להדפסה",
        "permalink": "קישור קבוע",
        "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "blockedtitle": "המשתמש חסום",
-       "blockedtext": "'''שם המשתמש או כתובת ה־IP שלכם נחסמו.'''\n\nהחסימה בוצעה על ידי $1. הסיבה שניתנה לכך היא '''$2'''.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון על החסימה.\nאינכם יכולים להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינתם כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
-       "autoblockedtext": "כתובת ה־IP שלכם נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nבאפשרותכם להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\", אלא אם לא ציינתם כתובת דוא\"ל תקינה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\n\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
+       "blockedtext": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו.</strong>\n\nהחסימה בוצעה על ידי $1.\nהסיבה שניתנה לכך היא <em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\nאין באפשרותך להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "autoblockedtext": "כתובת ה־IP שלך נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nאין באפשרותך להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\n\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "systemblockedtext": "שם המשתמש או כתובת ה־IP שלך נחסמו באופן אוטומטי על־ידי תוכנת מדיה־ויקי.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "blockednoreason": "לא ניתנה סיבה",
        "whitelistedittext": "נדרשת $1 כדי לערוך דפים.",
        "confirmedittext": "עליכם לאמת את כתובת הדוא\"ל שלכם לפני שתוכלו לערוך דפים. אנא הגדירו ואמתו את כתובת הדוא\"ל שלכם באמצעות [[Special:Preferences|העדפות המשתמש]] שלכם.",
        "saveprefs": "שמירה",
        "restoreprefs": "שחזור הגדרות ברירת המחדל (בכל הלשוניות)",
        "prefs-editing": "עריכה",
-       "rows": "שורות:",
-       "columns": "עמודות:",
        "searchresultshead": "חיפוש",
        "stub-threshold": "סף לעיצוב קישורים כקצרמרים ($1):",
        "stub-threshold-sample-link": "דוגמה",
        "userrights-user-editname": "שם משתמש:",
        "editusergroup": "טעינת קבוצות המשתמש",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "צפייה בהרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "עריכת קבוצות משתמש",
+       "userrights-viewusergroup": "צפייה בקבוצות משתמש",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "userrights-groupsmember": "{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "action-upload_by_url": "להעלות קובץ זה מכתובת URL",
        "action-writeapi": "להשתמש ב־API לשינוי דפים",
        "action-delete": "למחוק דף זה",
-       "action-deleterevision": "למחוק גרסה זו",
-       "action-deletedhistory": "לצפות בהיסטוריה המחוקה של דפים",
+       "action-deleterevision": "למחוק גרסאות",
+       "action-deletelogentry": "למחוק פריטי יומן",
+       "action-deletedhistory": "לצפות בהיסטוריה מחוקה של דף",
+       "action-deletedtext": "לצפות בטקסט של גרסה מחוקה",
        "action-browsearchive": "לחפש דפים מחוקים",
-       "action-undelete": "×\9cש×\97×\96ר ×\93×£ ×\96×\94",
-       "action-suppressrevision": "×\9c×\91×\93×\95ק ×\95×\9cש×\97×\96ר ×\92רס×\94 ×\9e×\95סתרת ×\96×\95",
+       "action-undelete": "×\9cש×\97×\96ר ×\93פ×\99×\9d",
+       "action-suppressrevision": "×\9cסק×\95ר ×\95×\9cש×\97×\96ר ×\92רס×\90×\95ת ×\9e×\95סתר×\95ת",
        "action-suppressionlog": "לצפות ביומן הפרטי הזה",
        "action-block": "לחסום משתמשים מעריכה",
        "action-protect": "לשנות את רמת ההגנה של דף זה",
        "action-userrights-interwiki": "לשנות הרשאות של משתמשים באתרי ויקי אחרים",
        "action-siteadmin": "לנעול או לבטל את הנעילה של בסיס הנתונים",
        "action-sendemail": "לשלוח דואר אלקטרוני למשתמשים",
+       "action-editmyoptions": "לערוך את ההעדפות {{GENDER:|שלך|שלך|שלכם}}",
        "action-editmywatchlist": "לערוך את רשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
        "action-viewmywatchlist": "לצפות ברשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
        "action-viewmyprivateinfo": "לצפות במידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ({{GENDER:|ראה|ראי|ראו}} גם את [[Special:NewPages|רשימת הדפים החדשים]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "הצגה",
+       "rcfilters-activefilters": "מסננים פעילים",
+       "rcfilters-search-placeholder": "סינון שינויים אחרונים (עיינו או התחילו להקליד)",
+       "rcfilters-invalid-filter": "מסנן בלתי־תקין",
+       "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
+       "rcfilters-filtergroup-registration": "רישום העורכים",
+       "rcfilters-filter-registered-label": "רשומים",
+       "rcfilters-filter-registered-description": "עורכים שנכנסו לחשבון.",
+       "rcfilters-filter-unregistered-label": "לא רשומים",
+       "rcfilters-filter-unregistered-description": "עורכים שלא נכנסו לחשבון.",
+       "rcfilters-filtergroup-authorship": "מבצעי העריכה",
+       "rcfilters-filter-editsbyself-label": "עריכות שלך",
+       "rcfilters-filter-editsbyself-description": "עריכות שביצעת בעצמך.",
+       "rcfilters-filter-editsbyother-label": "עריכות של אחרים",
+       "rcfilters-filter-editsbyother-description": "עריכות שבוצעו על־ידי משתמשים אחרים (מלבדך).",
+       "rcfilters-filtergroup-userExpLevel": "הניסיון והוותק (למשתמשים רשומים בלבד)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "חדשים",
+       "rcfilters-filter-userExpLevel-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.",
+       "rcfilters-filter-userExpLevel-learner-label": "לומדים",
+       "rcfilters-filter-userExpLevel-learner-description": "יותר ימי פעילות ועריכות מ\"חדשים\", אבל פחות מ\"משתמשים מנוסים\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "משתמשים מנוסים",
+       "rcfilters-filter-userExpLevel-experienced-description": "יותר מ־30 ימים של פעילות ו־500 עריכות.",
+       "rcfilters-filtergroup-automated": "תרומות אוטומטיות",
+       "rcfilters-filter-bots-label": "בוטים",
+       "rcfilters-filter-bots-description": "עריכות שבוצעו על־ידי כלים אוטומטיים.",
+       "rcfilters-filter-humans-label": "בני אדם (לא בוטים)",
+       "rcfilters-filter-humans-description": "עריכות שבוצעו על־ידי עורכים אנושיים.",
+       "rcfilters-filtergroup-significance": "חשיבות",
+       "rcfilters-filter-minor-label": "עריכות משניות",
+       "rcfilters-filter-minor-description": "עריכות שהוגדרו על־ידי העורכים כמשניות.",
+       "rcfilters-filter-major-label": "עריכות שאינן משניות",
+       "rcfilters-filter-major-description": "עריכות שלא הוגדרו כמשניות.",
+       "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-categorization-description": "רישומים על דפים שנוספו לקטגוריות או הוסרו מהן.",
+       "rcfilters-filter-logactions-label": "פעולות יומן",
+       "rcfilters-filter-logactions-description": "פעולות מנהליות, יצירת חשבונות, מחיקת דפים, העלאות...",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 עריכות משניות",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|משתמש אחד עוקב|$1 משתמשים עוקבים}} אחרי הדף]",
        "rc_categories": "הגבלה לקטגוריות (מופרדות בתו \"|\"):",
        "rc_categories_any": "כל אחת מהנבחרות",
-       "rc-change-size-new": "{{PLURAL:$1|×\91×\99ת ×\90×\97×\93|$1 ×\91תים}} לאחר השינוי",
+       "rc-change-size-new": "{{PLURAL:$1|×\91×\99×\99×\98 ×\90×\97×\93|$1 ×\91×\99×\99×\98ים}} לאחר השינוי",
        "newsectionsummary": "/* $1 */ פסקה חדשה",
        "rc-enhanced-expand": "הצגת הפרטים",
        "rc-enhanced-hide": "הסתרת הפרטים",
        "uncategorizedcategories": "קטגוריות חסרות קטגוריה",
        "uncategorizedimages": "קבצים חסרי קטגוריה",
        "uncategorizedtemplates": "תבניות חסרות קטגוריה",
+       "uncategorized-categories-exceptionlist": " # מכיל רשימה של קטגוריות שאינן אמורות להופיע בדףSpecial:UncategorizedCategories. יש לכתוב קטגוריה אחת בכל שורה, ולהתחיל כל שורה בתו \"*\". התוכנה תתעלם משורות המתחילות בתווים אחרים (לרבות רווחים). התו \"#\" משמש להערות.",
        "unusedcategories": "קטגוריות שאינן בשימוש",
        "unusedimages": "קבצים שאינם בשימוש",
        "wantedcategories": "קטגוריות מבוקשות",
        "activeusers": "רשימת משתמשים פעילים",
        "activeusers-intro": "זוהי רשימת המשתמשים שביצעו פעולה כלשהי {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
        "activeusers-count": "{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}",
-       "activeusers-from": "×\94צ×\92ת ×\9eשת×\9eש×\99×\9d ×©×©×\9e×\9d ×\9eת×\97×\99×\9c ×\91:",
+       "activeusers-from": "×\94צ×\92ת ×\9eשת×\9eש×\99×\9d ×\94×\97×\9c ×\9e:",
        "activeusers-groups": "הצגת משתמשים השייכים לקבוצות:",
        "activeusers-excludegroups": "הסתרת משתמשים השייכים לקבוצות:",
        "activeusers-noresult": "לא נמצאו משתמשים.",
        "editcomment": "תקציר העריכה היה: <em>$1</em>.",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2",
+       "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2.",
        "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לחזור לדף הקודם, לטעון אותו מחדש ולנסות שוב.",
        "changecontentmodel-emptymodels-title": "לא קיים מודל תוכן מתאים",
        "changecontentmodel-emptymodels-text": "לא ניתן להמיר את התוכן של [[:$1]] לאף סוג.",
        "log-name-contentmodel": "יומן שינויי מודל תוכן",
-       "log-description-contentmodel": "×\90×\99ר×\95×¢×\99×\9d ×©×§×©×\95ר×\99×\9d ×\9c×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d",
+       "log-description-contentmodel": "×\91×\93×£ ×\96×\94 ×\9e×\95פ×\99×¢×\99×\9d ×©×\99× ×\95×\99×\99×\9d ×\91×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d, ×\95×\9b×\9f ×\93פ×\99×\9d ×©× ×\95צר×\95 ×¢×\9d ×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×©×\95× ×\94 ×\9e×\91ר×\99רת ×\94×\9e×\97×\93×\9c.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|יצר|יצרה}} את הדף $3 תוך שימוש במודל התוכן \"$5\" השונה ממודל ברירת המחדל",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|שינה|שינתה}} את מודל התוכן של הדף $3 מ\"$4\" ל\"$5\"",
        "logentry-contentmodel-change-revertlink": "שחזור",
        "proxyblockreason": "כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח.\nאנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.",
        "sorbsreason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.",
        "sorbs_create_account_reason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.\nאין באפשרותך ליצור חשבון.",
+       "softblockrangesreason": "תרומות אנונימיות אינן מותרות מכתובת ה־IP שלך ($1). נא להיכנס לחשבון.",
        "xffblockreason": "כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1",
        "cant-see-hidden-user": "המשתמש שאתם מנסים לחסום כבר נחסם והוסתר.\nכיוון שאין לכם הרשאה להסתרת משתמשים, אין באפשרותכם לצפות בחסימת המשתמש או לערוך אותה.",
        "ipbblocked": "אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים.",
        "cant-move-to-user-page": "אין לך הרשאה להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
        "cant-move-category-page": "אין לך הרשאה להעביר דפי קטגוריה.",
        "cant-move-to-category-page": "אין לך הרשאה להעביר דף לדף קטגוריה.",
+       "cant-move-subpages": "אין לך הרשאה להעביר דפי משנה.",
+       "namespace-nosubpages": "מרחב השם \"$1\" לא יכול להכיל דפי משנה.",
        "newtitle": "השם החדש:",
        "move-watch": "מעקב אחרי דף המקור ואחרי דף היעד",
        "movepagebtn": "העברת הדף",
        "pageinfo-length": "אורך הדף (בבייטים)",
        "pageinfo-article-id": "מזהה הדף",
        "pageinfo-language": "שפת התוכן של הדף",
+       "pageinfo-language-change": "שינוי",
        "pageinfo-content-model": "מודל התוכן של הדף",
        "pageinfo-content-model-change": "שינוי",
        "pageinfo-robot-policy": "איסוף על־ידי רובוטים של מנועי חיפוש",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
        "log-show-hide-tag": "$1 יומן תגיות",
        "confirm-markpatrolled-button": "אישור",
-       "confirm-markpatrolled-top": "×\9cס×\9e×\9f ×\90ת ×\92רס×\94 $3 ×©×\9c $2 כבדוקה?",
+       "confirm-markpatrolled-top": "×\9cס×\9e×\9f ×\90ת ×\92רס×\94 $3 ×\91×\93×£ $2 כבדוקה?",
        "deletedrevision": "מחיקת גרסה ישנה ($1)",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "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 תוך דריסת הפניה ובלי להשאיר הפניה",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|ס×\99×\9e×\9f|ס×\99×\9e× ×\94}} ×\90ת ×\94×\92רס×\94 $4 ×\91×\93×£ $3 ×\9b×\91×\93×\95ק×\94",
-       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|ס×\99×\9e×\9f|ס×\99×\9e× ×\94}} ×\90×\95×\98×\95×\9e×\98×\99ת ×\90ת ×\94×\92רס×\94 $4 ×\91×\93×£ $3 ×\9b×\91×\93×\95ק×\94",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|סימן|סימנה}} את גרסה $4 בדף $3 כבדוקה",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|סימן|סימנה}} אוטומטית את גרסה $4 בדף $3 כבדוקה",
        "logentry-newusers-newusers": "חשבון המשתמש $1 {{GENDER:$2|נוצר}}",
        "logentry-newusers-create": "חשבון המשתמש $1 {{GENDER:$2|נוצר}}",
        "logentry-newusers-create2": "חשבון המשתמש $3 נוצר על־ידי $1",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "searchsuggest-containing": "כולל...",
-       "api-error-autoblocked": "כתובת ה־IP שלך נחסמה אוטומטית, כי היא הייתה בשימוש על־ידי משתמש חסום.",
-       "api-error-badaccess-groups": "אינך מורשה להעלות קבצים לאתר הוויקי הזה.",
        "api-error-badtoken": "שגיאה פנימית: אסימון שבור.",
-       "api-error-blocked": "נחסמת מעריכה.",
-       "api-error-copyuploaddisabled": "העלאה לפי כתובת כובתה בשרת זה.",
-       "api-error-duplicate": "כבר יש באתר הזה {{PLURAL:$1|קובץ אחר|קבצים אחרים}} עם אותו תוכן.",
-       "api-error-duplicate-archive": "כבר {{PLURAL:$1|היה|היו}} באתר הזה {{PLURAL:$1|קובץ|קבצים}} עם אותו תוכן, אבל {{PLURAL:$1|הוא נמחק|הם נמחקו}}.",
-       "api-error-empty-file": "הקובץ ששלחת היה ריק.",
        "api-error-emptypage": "יצירת דפים חדשים ריקים אינה אפשרית.",
-       "api-error-fetchfileerror": "שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.",
-       "api-error-fileexists-forbidden": "קובץ בשם \"$1\" כבר קיים ואי־אפשר לדרוס אותו.",
-       "api-error-fileexists-shared-forbidden": "קובץ בשם \"$1\" כבר קיים במאגר הקבצים המשותף ואי־אפשר לדרוס אותו.",
-       "api-error-file-too-large": "הקובץ ששלחת היה גדול מדי.",
-       "api-error-filename-tooshort": "שם הקובץ קצר מדי.",
-       "api-error-filetype-banned": "סוג קובץ זה חסום.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|הוא סוג קובץ אסור להעלאה|הם סוגי קבצים אסורים להעלאה}}. {{PLURAL:$3|סוג הקובץ המותר הוא|סוגי הקבצים המותרים הם}} $2.",
-       "api-error-filetype-missing": "חסרה סיומת לשם הקובץ.",
-       "api-error-hookaborted": "השינוי שניסית לעשות נחסם על־ידי הרחבה.",
-       "api-error-http": "שגיאה פנימית: לא ניתן להתחבר לשרת.",
-       "api-error-illegal-filename": "שם הקובץ הזה אינו מורשה.",
-       "api-error-internal-error": "שגיאה פנימית: משהו השתבש בעת עיבוד ההעלאה שלך באתר הוויקי.",
-       "api-error-invalid-file-key": "שגיאה פנימית: הקובץ לא נמצא במאגר הזמני.",
-       "api-error-missingparam": "שגיאה פנימית: פרמטרים חסרים בבקשה שנשלחה.",
-       "api-error-missingresult": "שגיאה פנימית: לא ניתן לקבוע אם ההעתקה הצליחה.",
-       "api-error-mustbeloggedin": "יש להיכנס לחשבון כדי להעלות קבצים.",
-       "api-error-mustbeposted": "שגיאה פנימית: הבקשה דורשת שימוש בשיטת POST של HTTP.",
-       "api-error-noimageinfo": "ההעלאה הושלמה בהצלחה, אבל השרת לא נתן לנו שום מידע על הקובץ.",
-       "api-error-nomodule": "שגיאה פנימית: מודול ההעלאה אינו מוגדר.",
-       "api-error-ok-but-empty": "שגיאה פנימית: אין תשובה מהשרת.",
-       "api-error-overwrite": "לא מותרת החלפת קובץ קיים.",
-       "api-error-ratelimited": "ניסית להעלות בזמן קצר יותר קבצים מהכמות המירבית המותרת באתר הוויקי הזה.\nנא לנסות שוב בעוד מספר דקות.",
-       "api-error-stashfailed": "שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.",
        "api-error-publishfailed": "שגיאה פנימית: השרת נכשל בפרסום הקובץ הזמני.",
-       "api-error-stasherror": "הייתה שגיאה בהעלאת הקובץ לסליק.",
-       "api-error-stashedfilenotfound": "הקובץ המוסלק לא נמצא בעת הניסיון להעלות אותו מהסליק.",
-       "api-error-stashpathinvalid": "הנתיב שבו הקובץ שבמאגר אמור היה להימצא היה בלתי תקין.",
-       "api-error-stashfilestorage": "הייתה שגיאה בעת אחסון הקובץ בסליק.",
-       "api-error-stashzerolength": "השרת לא יכול היה לאחסן במאגר את הקובץ, כי אורכו היה אפס.",
-       "api-error-stashnotloggedin": "נדרשת כניסה לחשבון כדי לשמור קבצים בסליק ההעלאות.",
-       "api-error-stashwrongowner": "הקובץ שניסית לגשת אליו במאגר אינו שייך לך.",
-       "api-error-stashnosuchfilekey": "מפתח הקובץ שניסית לגשת אליו בסליק אינו קיים.",
-       "api-error-timeout": "השרת לא השיב בזמן המצופה.",
-       "api-error-unclassified": "אירעה שגיאה בלתי ידועה.",
-       "api-error-unknown-code": "שגיאה בלתי ידועה: \"$1\".",
-       "api-error-unknown-error": "שגיאה פנימית: משהו השתבש בעת ניסיון להעלות את הקובץ שלך.",
-       "api-error-unknown-warning": "אזהרה בלתי ידועה: \"$1\".",
+       "api-error-stashfailed": "שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.",
+       "api-error-unknown-warning": "אזהרה בלתי־ידועה: \"$1\".",
        "api-error-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
-       "api-error-uploaddisabled": "ההעלאה מבוטלת באתר הוויקי הזה.",
-       "api-error-verification-error": "קובץ זה עשוי להיות פגום או בעל סיומת שגויה.",
-       "api-error-was-deleted": "קובץ בשם הזה הועלה מוקדם יותר ונמחק לאחר מכן.",
        "duration-seconds": "{{PLURAL:$1|שנייה|$1 שניות}}",
        "duration-minutes": "{{PLURAL:$1|דקה|$1 דקות}}",
        "duration-hours": "{{PLURAL:$1|שעה|שעתיים|$1 שעות}}",
        "pagelang-language": "שפה",
        "pagelang-use-default": "להשתמש בשפה הרגילה",
        "pagelang-select-lang": "בחירת שפה",
+       "pagelang-reason": "סיבה",
        "pagelang-submit": "שליחה",
+       "pagelang-nonexistent-page": "הדף $1 אינו קיים.",
+       "pagelang-unchanged-language": "הדף $1 כבר מוגדר לשפה $2.",
+       "pagelang-unchanged-language-default": "הדף $1 כבר מוגדר לשפת התוכן ההתחלתית של אתר הוויקי.",
+       "pagelang-db-failed": "בסיס הנתונים לא הצליח לשנות את שפת הדף.",
        "right-pagelang": "שינוי שפות של דפים",
        "action-pagelang": "לשנות את שפת הדף",
        "log-name-pagelang": "יומן שינוי שפה",
        "usercssispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־CSS שלכם, ולכן אין לכלול בהם מידע סודי.",
        "restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
-       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "גרסה $1",
+       "pageid": "מזהה דף $1"
 }
index 753316c..456ba8d 100644 (file)
@@ -74,7 +74,8 @@
                        "Upendradutt93",
                        "Nemo bis",
                        "Wassan.anmol",
-                       "Ziyaurr"
+                       "Ziyaurr",
+                       "NehalDaveND"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "qbedit": "सम्पादन",
        "qbpageoptions": "यह पृष्ठ",
        "qbmyoptions": "मेरे पृष्ठ",
-       "faq": "à¤\85à¤\95à¥\8dसर पूछे जाने वाले प्रश्न",
-       "faqpage": "Project:à¤\85à¤\95à¥\8dसर पूछे जाने वाले सवाल",
+       "faq": "बहà¥\81धा पूछे जाने वाले प्रश्न",
+       "faqpage": "Project:बहà¥\81धा पूछे जाने वाले सवाल",
        "actions": "क्रियाएँ",
        "namespaces": "नामस्थान",
        "variants": "संस्करण",
        "viewsourcetext": "आप इस पृष्ठ का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "viewyourtext": "आप इस पृष्ठ में ''अपने सम्पादन'' का स्रोत देख सकते हैं और उसकी नकल उतार सकते हैं:",
        "protectedinterface": "यह पृष्ठ इस विकी के सॉफ़्टवेयर का इंटरफ़ेस पाठ देता है, और इसे गलत प्रयोग से बचाने के लिये सुरक्षित कर दिया गया है।\nसभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [https://translatewiki.net/ translatewiki.net] का प्रयोग करें।",
-       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\95 à¤\90सà¥\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤² à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82 à¤\9cà¥\8b à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95ा à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रता à¤¹à¥\88।\nà¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤²à¤¨à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\80 à¤¶à¤\95à¥\8dलà¥\8bसà¥\82रत में बदलाव आएगा।",
+       "editinginterface": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\95 à¤\90सà¥\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤² à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82 à¤\9cà¥\8b à¤¸à¥\89फ़à¥\8dà¤\9fवà¥\87यर à¤\95ा à¤\87à¤\82à¤\9fरफ़à¥\87स à¤ªà¤¾à¤  à¤ªà¥\8dरदान à¤\95रता à¤¹à¥\88।\nà¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤²à¤¨à¥\87 à¤¸à¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\8dरदरà¥\8dशित à¤\87à¤\82à¤\9fरफ़à¥\87स à¤\95à¥\80 à¤¸à¥\8dवरà¥\82प में बदलाव आएगा।",
        "translateinterface": "सभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए मीडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ translatewiki.net] का प्रयोग करें।",
        "cascadeprotected": "यह पृष्ठ सुरक्षित हैं, क्योंकि यह निम्नलिखित {{PLURAL:$1|पृष्ठ|पृष्ठों}} की सुरक्षा-सीढ़ी में समाविष्ट है:\n$2",
        "namespaceprotected": "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
        "prefs-changeemail": "ई-मेल पता परिवर्तित करें",
        "prefs-setemail": "ई-मेल पता सेट करें",
        "prefs-email": "ई-मेल वरीयताएँ",
-       "prefs-rendering": "शà¤\95à¥\8dलà¥\8bसà¥\82रत",
+       "prefs-rendering": "सà¥\8dवरà¥\82प",
        "saveprefs": "संजोएँ",
        "restoreprefs": "वापिस मूल जमावों पर आ जाएँ (सभी भागों में)",
        "prefs-editing": "संपादन",
        "editusergroup": "{{GENDER:$1|सदस्य}} समूहों का संपादन करें",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 के अधिकार बदलें\n{{GENDER:$1|सदस्य}} के सदस्य अधिकार बदले जा रहे हैं <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्य समूहों का संपादन करें",
+       "userrights-viewusergroup": "सदस्य समूह देखें",
        "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सहेजें",
        "userrights-groupsmember": "निम्न {{PLURAL:$1|समूह|समूहों}} का सदस्य:",
        "userrights-groupsmember-auto": "निम्न {{PLURAL:$1|समूह|समूहों}} का अंतर्निहित सदस्य:",
        "action-userrights-interwiki": "अन्य विकियों पर सदस्य अधिकार बदलने",
        "action-siteadmin": "डाटाबेस को ताला लगाने या खोलने",
        "action-sendemail": "ई-मेल भेजने",
+       "action-editmyoptions": "अपनी पसंद संपादित करें",
        "action-editmywatchlist": "ध्यानसूची सम्पादित करने",
        "action-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "action-viewmyprivateinfo": "अपनी व्यक्तिगत जानकारी देखने",
        "cant-move-to-user-page": "आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)",
        "cant-move-category-page": "आपको श्रेणी प्रष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "cant-move-to-category-page": "आपको किसी पृष्ठ को श्रेणी पृष्ठ पर स्थानांतरित करने की अनुमति नहीं है।",
+       "namespace-nosubpages": "\"$1\" नामस्थान उपपृष्ठ की अनुमति नहीं देता है।",
        "newtitle": "नया शीर्षक:",
        "move-watch": "ध्यान रखें",
        "movepagebtn": "नाम बदलें",
        "special-characters-title-minus": "ऋण चिह्न",
        "mw-widgets-dateinput-no-date": "कुछ चयनित नहीं",
        "mw-widgets-dateinput-placeholder-day": "DD-MM-YYYY",
+       "mw-widgets-mediasearch-noresults": "कोई परिणाम नहीं मिला",
        "mw-widgets-titleinput-description-new-page": "पृष्ठ अभी मौजूद नहीं है",
        "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित",
        "mw-widgets-categoryselector-add-category-placeholder": "श्रेणी जोड़ें...",
        "log-action-filter-newusers-create2": "पंजीकृत सदस्य द्वारा निर्मित",
        "log-action-filter-newusers-autocreate": "स्वतः निर्मित",
        "log-action-filter-newusers-byemail": "पासवर्ड ईमेल द्वारा भेजा गया के साथ निर्मित",
-       "log-action-filter-patrol-patrol": "à¤\85पनà¥\87 à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषण",
+       "log-action-filter-patrol-patrol": "सदसà¥\8dय à¤¦à¥\8dवारा à¤ªà¤°à¥\80à¤\95à¥\8dषित",
        "log-action-filter-patrol-autopatrol": "स्वतः पुनरीक्षण",
        "log-action-filter-protect-protect": "सुरक्षा",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
index f694e21..ade5f1b 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "Matma Rex",
                        "V6rg",
-                       "C.R."
+                       "C.R.",
+                       "Smcnarayan"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
@@ -34,6 +35,7 @@
        "tog-watchdefault": "Ham se badla gais panna aur file ke hamaar dhyaan suchi me jorro",
        "tog-watchmoves": "Uu panna aur file jiske naam ham badla hai ke hamaar dhyaan suchi me jorro",
        "tog-watchdeletion": "Uu panna, aur file jiske ham mitaya hai ke hamaar dhyaan suchi me jorro",
+       "tog-watchuploads": "Nawaa upload karaa gais file ke hamaar dhyaan suchi me jorro",
        "tog-watchrollback": "Uu panna ke jorro jisme ham aapan watchlist me rollback karaa hae",
        "tog-minordefault": "Mamuli badlao ke apne se nishaan lagao",
        "tog-previewontop": "Badlao waala dabba se pahile ek jhalak dekhao",
        "october-date": "October $1",
        "november-date": "November $1",
        "december-date": "December $1",
+       "period-am": "sabere",
+       "period-pm": "sanjhaa",
        "pagecategories": "{{PLURAL:$1|Vibhag|Vibhag}}",
        "category_header": "\"$1\" vibhag ke panna",
        "subcategories": "Vibhag ke bhitar vibhag",
        "tagline": "{{SITENAME}} se",
        "help": "Madat karo",
        "search": "Khojo",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Heading, jispe dhyaan nai dewaa jaai.\n# Isme badlao uu time hoi jaise panna ke heading ke index karaa jaai ki.\n# Aap null edit kar ke panna ke reindexing ke force kare saktaa hai.\n# Iske syntax aise hai:\n#   * Sab chij \"#\" character se lae ke line ke ant talak, comment hai.\n#   * Sab non-blank line is the exact title to ignore, case and everything.\nReferences\nBahaari jorr\nAur dekho\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Khojo",
        "go": "Jao",
        "searcharticle": "Jaao",
        "history": "Panna ke itihaas",
        "history_short": "Itihaas",
+       "history_small": "itihaas",
        "updatedmarker": "hamaar pahile waala visit ke baad badla gais hai",
        "printableversion": "Chhape ke khaatir",
        "permalink": "Pakka jorr",
        "talk": "Salah",
        "views": "Bichar",
        "toolbox": "Aujaar ke dabba",
+       "tool-link-userrights": "Badlo {{GENDER:$1|sadasya}} groups",
+       "tool-link-userrights-readonly": "Dekho {{GENDER:$1|sadasya}} groups",
+       "tool-link-emailuser": "Email karo ii {{GENDER:$1|sadasya}}",
        "userpage": "Sadasya ke panna dekho",
        "projectpage": "Project waala panna dekho",
        "imagepage": "File panna ke dekho",
        "protectedinterface": "Ii panna, ii wiki ke khatir, software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.\nSab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project ke kaam me laao.",
        "editinginterface": "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.\nIi panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.",
        "translateinterface": "Sab wiki me translate kare ke khatir [https://translatewiki.net/translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
-       "cascadeprotected": "Ii panna ke badlao se bachawa gais hai, kaheki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae \"cascading\" option turned on ke saathe me rakkhaa gais hai:\n$2",
+       "cascadeprotected": "Ii panna ke badlao se bachawa gais hai, kaheki iske {{PLURAL:$1|panna, jon ki}} surakchhit hae \"cascading\" option turned on ke saathe me rakkhaa gais hai:\n$2",
        "namespaceprotected": "Aap ke paas '''$1''' namespace me panna ke badle ke adhikar nai hai.",
        "customcssprotected": "Aap ke ii CSS panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.",
        "customjsprotected": "Aap ke ii JavaScript panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.",
        "virus-scanfailed": "scan fail hoe gais (code $1)",
        "virus-unknownscanner": "jaana waala antivirus nai hai:",
        "logouttext": "'''Aap abhi logged out hai.'''\n\nYaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, jab talak ki browser ke cache safaa nai hoe jaae.",
+       "cannotlogoutnow-title": "Abhi log out nai kare saktaa hai",
+       "cannotlogoutnow-text": "$1 ke kaam me laae ke time, loggong out nai hoe sake hai",
        "welcomeuser": "Swagat, $1!",
        "welcomecreation-msg": "Aap ke account banae dewa gais hai.\nAapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.",
        "yourname": "Username:",
        "createacct-yourpasswordagain-ph": "Hame lagged in rahan do",
        "userlogin-remembermypassword": "Secure connection ke kaam me lao",
        "userlogin-signwithsecure": "Secure connection ke kaam me lao",
+       "cannotlogin-title": "Log in nai kare saktaa hai",
+       "cannotlogin-text": "Logging in possible nai hai",
+       "cannotloginnow-title": "Abhi log in nai kare saktaa hai",
+       "cannotloginnow-text": "$1 ke kaam me laae ke time logging in possible nai hai.",
+       "cannotcreateaccount-title": "Account nai banae saktaa hai",
+       "cannotcreateaccount-text": "Ii wiki me direct account creation enabled nai hai.",
        "yourdomainname": "Aap ke domain:",
        "password-change-forbidden": "Aap ii wiki me password nai badle saktaa hae.",
        "externaldberror": "Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.",
        "login": "Log in karo",
+       "login-security": "Aapan account ke verify karo",
        "nav-login-createaccount": "Log in karo/ nawaa account banao",
        "userlogin": "Log in karo/ nawaa account banao",
        "userloginnocreate": "Log in karo",
        "userlogin-resetpassword-link": "Aapan password ke bhool gayaa?",
        "userlogin-helplink2": "Log in kare ke khatir madat.",
        "userlogin-loggedin": "Aap {{GENDER:$1|$1}} ke naam ke niche login bhayaa hae.\nNiche ke form ke kaam me laae ke duusra naam ke niche login ho.",
+       "userlogin-reauth": "Aap ke fir se log in kare ke parri, ii verify kare ke khaatir, ki aap {{GENDER:$1|$1}} hai.",
        "userlogin-createanother": "Duusra account banao",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (jaruri nai hae)",
        "createacct-email-ph": "Aapan mail address ke likho",
        "createacct-another-email-ph": "Email address ke likho",
        "createaccountmail": "Ek temporary password ke kaam me laao aur iske batawa gais Email pe bhej do",
+       "createaccountmail-help": "Binaa password ke jaane iske duusra jan ke khaatir account banae me use karaa jaae sake hai.",
        "createacct-realname": "Aslii naam (jaruri nai hae)",
        "createaccountreason": "Kaaran:",
        "createacct-reason": "Kaaran",
        "createacct-reason-ph": "Aap ke ii account ke banae ke kaaran",
+       "createacct-reason-help": "Ii sandes ke account creation log me dekhaawa jaae hai",
        "createacct-submit": "Aapan account banao",
        "createacct-another-submit": "Account banao",
+       "createacct-continue-submit": "Account banaate raho",
+       "createacct-another-continue-submit": "Account banaate raho",
        "createacct-benefit-heading": "Aap ke rakam log {{SITENAME}} ke banain hae.",
        "createacct-benefit-body1": "{{PLURAL:$1|badlao}}",
        "createacct-benefit-body2": "{{PLURAL:$1|panna}}",
        "nocookiesnew": "Aap ke account banae dewa gais hae lekin aap logged in nai hae.\n{{SITENAME}} me sadasya ke login khatir cookies hae.\nAap cookies ke rok diya hae.\nCookies ke enable kar ke, aapan nawaa username aur password se login karo.",
        "nocookieslogin": "{{SITENAME}} me sadasya ke login khatir cookies hae.\nAap cookies ke disabled karaa hae.\nCookies ke enable kar ke fir se kosis karo.",
        "nocookiesfornew": "Sadasya ke account ke nai banawa gais hae, kaahe ki source ke confirm nai karaa jaae sakis hae.\nCookies ke enable kar ke, ii panna ke fir se load karo aur fir se kosis karo.",
+       "createacct-loginerror": "Ii account ke banae dewa gais hai, lekin aap ke automatically login nai karaa jaae sakis hai. Meharbaani kar ke  [[Special:UserLogin|manual login]] me jaao.",
        "noname": "Aap achchha user name ke nai specify karaa hai.",
        "loginsuccesstitle": "Login safal bhais",
        "loginsuccess": "'''Aap \"$1\" ke naam pe {{SITENAME}} me logged in hai.'''",
        "eauthentsent": "Ek confirmation e-mail aap ke dewa gae e-mail address pe bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.",
        "throttled-mailpassword": "Ek password reset Email ke pahile bheja gais hae, pichhle  {{PLURAL:$1|ghanta|$1 ghanta}} me bhej me.\nAbuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|ghanta|$1 ghanta}} me bheja jaai.",
        "mailerror": "Mail bheje me galti hoe gais hai: $1",
-       "acct_creation_throttle_hit": "Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle kuch din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.\nIi kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.",
+       "acct_creation_throttle_hit": "Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle $2 din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.\nIi kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.",
        "emailauthenticated": "Aap ke e-mail address ke $2 ke roj aur $3 baje confirm karaa gais rahaa.",
        "emailnotauthenticated": "Aap ke e-mail address ke abi tak authenticate nai karaagais hai.\nIi sab feature khatir koi e-mail nai bheja jaai.",
        "noemailprefs": "Ii sab feature ke kaam kare khatir e-mail specify karo.",
        "createacct-another-realname-tip": "Aslii naam ke jaruri nai hae.\nAgar aap iske diya hae tab iske aapke kaam ke attribute kare ke khatir kaam me lawa jaai.",
        "pt-login": "Log in karo",
        "pt-login-button": "Log in karo",
+       "pt-login-continue-button": "Login karte raho",
        "pt-createaccount": "Nawaa account banao",
        "pt-userlogout": "Log out ho",
        "php-mail-error-unknown": "PHP ke mail() function me koi anjaan kharaabi hae",
        "newpassword": "Nawaa password:",
        "retypenew": "Password fir se type karo:",
        "resetpass_submit": "Password ke set kar ke login karo",
-       "changepassword-success": "Aap ke password ke safalta se badal dewa gais hai!",
+       "changepassword-success": "Aap ke password ke badal dewa gais hai!",
        "changepassword-throttled": "Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.\n$1 talak wait kar ke fir se try karo.",
+       "botpasswords": "Bot passwords",
+       "botpasswords-summary": "<em>Bot passwords</em> sadasya ke account ke access API se dewe hai, bina account ke main login credentials ke use kare. Bot password se login kare se bahut restricted rights mile hai. \n\nAgar aap ii nai janta hai ki kaahe aap ii chij kaahe kartaa hai, tab aap ke saait ii chij nai kare ke chaahi. Koi jane ke ii nai maange ke chaahi ki aap aapan bot credentials ke generate kar ke uske de.",
+       "botpasswords-disabled": "Bot passwords ke disable kar dewa gais hai.",
+       "botpasswords-no-central-id": "Bot password use kare ke khaatir, aap ke ek centralized account me logged in hoe ke chaahi.",
+       "botpasswords-existing": "Abhi ke bot passwords",
+       "botpasswords-createnew": "Nawaa bot password banao",
+       "botpasswords-editexisting": "Ek bot password ke badlo",
+       "botpasswords-label-appid": "Bot ke naam:",
+       "botpasswords-label-create": "Banao",
+       "botpasswords-label-update": "Update karo",
+       "botpasswords-label-cancel": "Cancel karo",
+       "botpasswords-label-delete": "Mitao",
+       "botpasswords-label-resetpassword": "Password ke badlo",
+       "botpasswords-label-grants": "Applicable grants:",
+       "botpasswords-help-grants": "Agar aap ke lage abhi koi rights hai, tab grants aap ke iske access de hai.\nHian pe grant ke enable kare se aap ke uu right nai mile hai jon ki aap ke waise nai milat rahaa.\nAur jaaan kari ke khatir [[Special:ListGrants|table of grants]] ke dekho.",
+       "botpasswords-label-grants-column": "Ijaajat hai",
+       "botpasswords-bad-appid": "Bot ke naam \"$1\" valid nai hai",
+       "botpasswords-insert-failed": "Bot ke naam \"$1\"nai jorre sakaa. Ka iske pahile jorraa gais rahaa?",
+       "botpasswords-update-failed": "Bot ke naam \"$1\" nai badle sakaa. Ka iske pahile mitaawa gais rahaa?",
+       "botpasswords-created-title": "Bot password ke banae dewa gais hai",
+       "botpasswords-created-body": "User \"$2\" ke khaatir, bot jiske naam \"$1\" hai, ke password ke mitaae dewa gais hai.",
+       "botpasswords-updated-title": "Bot password ke mitae dewa gais hai",
+       "botpasswords-updated-body": "User \"$2\" ke khaatir, jiske bot naam \"$1\" hai, ke password ke badal dewa gais hai.",
+       "botpasswords-deleted-title": "Bot ke password ke mitae dewa gais hai",
+       "botpasswords-deleted-body": "User \"$2\" ke khaatir, bot jiske naam \"$1\" hai, ke password ke mitaae dewa gais hai.",
+       "botpasswords-newpassword": "Log in kare ke khatir nawaa password <strong>$1</strong> <strong>$2</strong> hai. <em>Iske aage kaam me laae ke khaatir likh lo.</em> <br> (For old bots which require the login name to be the same as the eventual username, you can also use <strong>$3</strong> as username and <strong>$4</strong> as password.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider abhi available nai hai.",
+       "botpasswords-restriction-failed": "Bot password restrictions ii login ke roke hai.",
+       "botpasswords-invalid-name": "Jon username ke dewa gais hai, me bot password separator (\"$1\") nai hai.",
+       "botpasswords-not-exist": "Sadasya \"$1\" ke lage bot password \"$2\" nai hai.",
        "resetpass_forbidden": "Password nai badlaa jaae sake hai",
+       "resetpass_forbidden-reason": "Password nai badlaa jaae sake hai: $1",
        "resetpass-no-info": "Ii panna ke sidha access kare ke khatir aap ke logged in rahe ke parri.",
        "resetpass-submit-loggedin": "Password ke badlo",
        "resetpass-submit-cancel": "Nai karo",
-       "resetpass-wrong-oldpass": "Temporary nai to abhi ke password valid nai hai.\nSait aap password ke safalta se badal sia hoga nai to nawaa temporary password ke maang karaa hoga.",
+       "resetpass-wrong-oldpass": "Temporary, nai to abhi ke password, valid nai hai.\nSait aap password ke badal dia hoga, nai to, nawaa temporary password ke maang karaa hoga.",
        "resetpass-recycled": "Meharbaani kar ke aap aapan password ke badal ke duusra password banao.",
        "resetpass-temp-emailed": "Aap ke temporary code, jiske emai karaa gais rahaa, se login bhayaa hae.\nLogin khatam kare ke khatir aap ke nawaa password banae ke chaahi.",
        "resetpass-temp-password": "Kachcha password:",
        "passwordreset-emaildisabled": "Ii wiki me email ke band kar dewa gais hae.",
        "passwordreset-username": "Sadasya ke naam:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Banawa gais e-mail ke dekho",
-       "passwordreset-capture-help": "Agar aap ii box ke tick karaa, tab e-mail (aur uske saathe temporary password)  ke aap ke ii rakam se dekhawa jaai jaise ki iske sadasya ke lage bhej dewa gais hae.",
        "passwordreset-email": "E-mail ke address",
        "passwordreset-emailtitle": "{{SITENAME}} me account ke jaankari",
        "passwordreset-emailtext-ip": "Koi (hoe sake aap, IP address $1 se) {{SITENAME}} ($4) pe aap ke account ke baare me jaankari maanga hae. Niche likha gias sadasya ii e-mail se associated hae.  {{PLURAL:$3|account hae|accounts hae}}\n\n$2\n\n{{PLURAL:$3|Ii temporary password|Ii sab temporary passwords}}  {{PLURAL:$5|ek din|$5 din}} me khalaas hoi.\nAap ke chaahi ki aap login kar ke ek nawaa password banao.  Agar aur koi ii request karis hae, nai to agae aap aapan purana paasword ke yaad kar liya hae, tab ii sandes ke baare me bhuul jaao aur purana password use karte raho.",
        "passwordreset-emailelement": "Sadasya ke naam: \n$1\n\nKuchh din ke khatir password: \n$2",
        "passwordreset-emailsentemail": "Agar ii email aap ke account se associated hai tab ek password reset email ke bheja jaai.",
        "passwordreset-emailsentusername": "Agar ii email aap ke username se associated hai tab ek password reset email ke bheja jaai.",
+       "passwordreset-nocaller": "A caller must be provided",
+       "passwordreset-nosuchcaller": "Caller exist nai hoe hai: $1",
+       "passwordreset-ignored": "Password reset ke hadle nai karaa gais hai. Saait koi provider ke nai configure karaa gais hoi?",
+       "passwordreset-invalidemail": "Email address invalid hai",
+       "passwordreset-nodata": "Na username, na email address ke dewa gais rahaa",
        "changeemail": "E-mail address ke badlo, nai to, hatao",
        "changeemail-header": "Aapan email ke badle ke khatir ii form ke bharo. Agar aap koi email ke aapan account se nai associate kare mangtaa hai tab form ke submit kare ke time email address ke blank chhorr do.",
        "changeemail-no-info": "Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.",
        "minoredit": "Ii chhota badlao hai",
        "watchthis": "Ii panna pe dhyaan rakkho",
        "savearticle": "Panna ke bachao",
+       "savechanges": "Badlao ke bachao",
+       "publishpage": "Panna ke publish karo",
+       "publishchanges": "Badlao ke publish karo",
        "preview": "Jhalak dekhao",
        "showpreview": "Preview dekhao",
        "showdiff": "Badlao dekhao",
        "blockedtitle": "Sadasya ke rok dewa gais hai",
        "blockedtext": "'''Aapke user name nai to IP address ke rok dewa gae hai.'''\n\nRoke waala hai $1.\nIske kaaran hai ''$2''.\n\n* Roke ke suruu: $8\n* Roke kab khatam hoi: $6\n* Kiske rokaa jae hai: $7\n\nAap $1 ke mile saktaa hai nai to duusra [[{{MediaWiki:Grouppage-sysop}}|administrator]] se rukawat ke baare me baat karo.\nAap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare saktaa hai jab tak ki ek kanuni email address aapke [[Special:Preferences|account preferences]] me nai hai aur aap ke iske kaam me laae ke roka nai gae hai.\nAap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.\nMeharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
        "autoblockedtext": "Aap ke IP address ke apne se rok dewa gais hai kahe ki koi duusra sadasya iske kaam me kawat rahaa, jiske $1 rokis hai.\n\nIske khatir kaaran hai:\n:''$2''\n\n* Roke ke suruu: $8\n* Roke kab khatam hoi: $6\n*Roke waala: $7\n\nAap $1 ke mile saktaa hai nai to duusra [[{{MediaWiki:Grouppage-sysop}}|administrator]] se rukawat ke baare me baat karo.\n\nAap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare saktaa hai jab tak ki ek kanuni email address aapke [[Special:Preferences|account preferences]] me nai hai aur aap ke iske kaam me laae ke roka nai gae hai.\n\nAap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.\nMeharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
+       "systemblockedtext": "Aaap ke username nai to IP address ke Mediawiki automatically block kar diis hai.\n\nDewa gais kaaran hai :\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.",
        "blockednoreason": "koi kaaran nai dewa gais hai",
        "whitelistedittext": "Aap ke panna badle khatir $1 kare ke parri.",
        "confirmedittext": "Panna ke badle se pahile aap ke aapan e-mail ke confirm kare ke parri.\nMeharbani kar ke aap aapan e-mail ke aapan [[Special:Preferences|user preferences]] se validate karna.",
        "accmailtext": "Ek randomly banawal password ke [[User talk:$1|$1]] ke khatir $2 ke lage bhaja gais hai.\nIi nawa account ke password ke ''[[Special:ChangePassword|change password]]''  panna pe badla jaae sake hai jab aap login karta hai.",
        "newarticle": "(Nawaa)",
        "newarticletext": "Aap ek panna ke jorr ke follow kara hae jon ki abhi nai hae.\nIi panna banae khatir, niche box me type karo (see the [$1 help page] for more info).\nAgar jo aap hian par galti se aae hai tab aapan browser ke '''back''' button pe click karo.",
-       "anontalkpagetext": "----''Ii salah kare waala panna uu anonymous sadasya ke baare me jon abhi account nai banais hai, nai to account ke kaam me nai lawe hai.\nIi kaaran se ham log ke IP address kaam me lae ke ii sadasya ke jaana jae hai.\n\nIi rakam ke IP address ke dher sadasya kaam me lae sake hai.\nAgar aap ek anonymous user hai aur ii sochta hai ki bekar baat aap ke baare me karaa gais hai, tab\n[[Special:CreateAccount|create an account]] or [[Special:UserLogin|log in]] aage ke garrbarri roke khatir aur duusra anonymous users se mistake nai kare ke khatir .''",
+       "anontalkpagetext": "----\n<em>Ii salah kare waala panna uu anonymous sadasya ke baare me jon abhi account nai banais hai, nai to, account ke kaam me nai lawe hai.</em>\nIi kaaran se ham log ke IP address ke kaam me lae ke ii sadasya ke jaana jae hai.\n\nIi rakam ke IP address ke dher sadasya kaam me lae sake hai.\nAgar aap ek anonymous user hai aur ii sochta hai ki bekaar baat aap ke baare me karaa gais hai, tab\n[[Special:CreateAccount|create an account]] nai to [[Special:UserLogin|log in]] aage ke garrbarri roke khatir aur duusra anonymous users se mistake nai kare ke khatir .''",
        "noarticletext": "Abhi ii panna me kuchh likhaa nai hai.\nAap saktaa hai [[Special:Search/{{PAGENAME}}|ii panna ke title khoje]] duusra panna me,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nnai to [{{fullurl:{{FULLPAGENAME}}|action=edit}} ii panna ke badlo]</span>.",
        "noarticletext-nopermission": "Abhi ii panna me koi chij likha nai hae.\nAap sakta hae [[Special:Search/{{PAGENAME}}|ii panna ke title ke khoje]] duusra panna me,\nnai to <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, lekin aap ke ii panna ke banae ke ijaaja tnai hae.",
        "missing-revision": "Panna \"{{FULLPAGENAME}}\" me #$1 badlao nai hae.\nIske kaaran ii hoe sake hae ki ek mitawa gais panna se link karaa jaawe hae.\nIske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me paawa jaae sake hae.",
        "userpage-userdoesnotexist": "User account \"<nowiki>$1</nowiki>\" abi registered nai hai.\nCheck karo ki Ii panna ke aap banae/badle mangta hai.",
        "userpage-userdoesnotexist-view": "User account \"$1\" abhi register nai karaa gais hae",
        "blocked-notice-logextract": "Ii sadasya ke abhi rok dewa gais hae.\nSab se nawaa block log entry, aap ke reference ke khatir,  niche dewa gais hae:",
-       "clearyourcache": "'''Note:''' - Save kare ke baad, aap ke sait browser ke cache ke bypass kare ke parri badlao ke dekhe khatir.\n* '''Firefox / Safari:''' me ''Shift'' ke dabae ke ''Reload,'' pe click karo, nai to chaahe ''Ctrl-F5'' nai to ''Ctrl-R'' (''⌘-R''  Mac pe)\n* '''Google Chrome:''' me ''Ctrl-Shift-R'' dabao (''⌘-Shift-R'' Mac pe)\n*  '''Internet Explorer:''' me ''Ctrl'' dabae ke  ''Refresh'' pe click karo, nai to  ''Ctrl-F5'' dabao",
+       "clearyourcache": "<strong>Note:</strong> - Save kare ke baad, aap ke sait browser ke cache ke bypass kare ke parri badlao ke dekhe khatir.\n* <strong>Firefox / Safari:</strong> me <em>Shift</em> ke dabae ke <em>Reload</em/>, pe click karo, nai to chaahe <em>Ctrl-F5</em> nai to <em>Ctrl-R</em> (<em>⌘-R</em>  Mac pe)\n* <strong>Google Chrome:</strong> me <em>Ctrl-Shift-R</em> dabao (<em>⌘-Shift-R</em> Mac pe)\n*  <strong>Internet Explorer:</strong> me <em>Ctrl</em> dabae ke  <em>Refresh</em> pe click karo, nai to  <em>Ctrl-F5</em> dabao\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Salah:''' Bachae se pahile \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa CSS ke test karo.",
        "userjsyoucanpreview": "'''Salah:''' Bachae se pahile  \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa JavaScript ke test karo.",
        "usercsspreview": "'''Yaad rakhna ki aap khali aapan CSS ke jhalak dekhta hai.\nIske abhi save nai karaa gais hai!'''",
        "previewnote": "'''Ii khaali ek jhalak dekhae hai'''\nTumar badlao abhi bachawa nai gais hai!",
        "continue-editing": "Badle waala jagha jaao",
        "previewconflict": "Ii preview uu text dekhae hai jon ki uppar ke text editing area me dekhai agar aap iske save karaa.",
-       "session_fail_preview": "''' Maaf karna! Ham log aap ke badlao ke process nai kare paya hai due to a loss of session data.\nFir se kosis karna.\nAgar ii fir bhi nai chale tab kosis karna [[Special:UserLogout|logging out]]aur fir logging back in.'''",
-       "session_fail_preview_html": "'''Maaf karna! Ham log aap ke badlao ke process ke process nai kare sakaa kahe ki session data abhi nai dekhae hai.'''\n\n''Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.''\n\n'''Agar ii kanuni badlao hai, tab fir se kosis karna.\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna.'''",
+       "session_fail_preview": "''' Maaf karna! Ham log aap ke badlao ke process nai kare paaya hai due to a loss of session data.\nSaait app ke logout kar dewa gais hai. <strong> Meharbaani kar ii verify karo ki aap logged in hai aur fir se kosis karo.</strong>\nAgar ii fir bhi nai chale tab kosis karna [[Special:UserLogout|logging out]] aur fir logging back in, aur ii check karo ki browser me cookies enabled hai.",
+       "session_fail_preview_html": "Maaf karna! Ham log aap ke badlao ke process nai kare sakaa kahe ki session data abhi nai dekhae hai.\n\n<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n\n<strong>Agar ii kanuni badlao hai, tab fir se kosis karna.</strong>\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna, aur ii check karna ki ii site ke khaatir cookies enabled hai.",
        "token_suffix_mismatch": "''' Aap ke badlao ke reject kar dewa gais hai kahe ki aap ke client punctuation charcters ke token edit me mangle kar diis hai.\nIi badlao ke reject kar dewa gais hai to prevent corruption of the page text.\nIi kabhi kabhi hoe hai jab aap ek buggy web-based anonymous proxy service ke use karta hai.'''",
        "edit_form_incomplete": "Edit form ke kuchh hissa server ke lage nai pahunche paais hae; fir se check karo ki aap ke badlao form me hae, aur fir se form ke bhejo.",
        "editing": "$1 badlawa jae hai",
        "readonlywarning": "<strong>Chetauni: Database ke maintenance khatir band kar dewa gais hai, tab abhi aap aapan badlao ke save nai kare paega.</strong>\nAap saait aapan badlao ke ek text file me cut-n-paste kar ke baad me use kare khatir save kar le sakta hai.\nAdministrator jon ki iske lock karis hai ii kaaran diis hai: $1",
        "protectedpagewarning": "'''CHETAUNI: Ii panna ke band kar dewa gais hai jisse ke khaali uu sadasya jiske sysop adhikaar hai iske badle sake hai.'''\nNiche sab se nawaa suchi aap ke dekhe ke khatir dewa gais hae:",
        "semiprotectedpagewarning": "'''Suchna:''' Ii panna ke band kar dewa gais hai jisse ki khali registered sadasya iske badle sake hai.\nNiche sab se nawaa suchi ke aap ke dekhe ke khatir dewa gais hae:",
-       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khali uu sadasya jiske lage sysop privileges hai iske badle sake hai, kahe ki iske niche likha gais cascade-protected {{PLURAL:$1|panna|panna}} me rakkha gais hai:",
+       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khaali uu sadasya jiske lage sysop privileges hai iske badle sake hai, kahe ki iske niche likha gais cascade-protected {{PLURAL:$1|panna}} me rakkha gais hai:",
        "titleprotectedwarning": "'''CHETAUNI: Ii panna ke band dewa gais hai jisse ki [[Special:ListGroupRights|specific rights]] ke jarie iske badla jaae sake hai.'''\nAap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} ke ii panna me kaam me lawa gais hae:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} ii jhalak me kaam me lawa gais hae:",
        "contentmodelediterror": "Aap iske badle nai saktaa hae kaaheki iske content model <code>$1</code> hae, aur ii  abhi ke content model <code>$2</code> ke rakam nai hae.",
        "recreate-moveddeleted-warn": "'''Chetawani: Jon panna ke pahile hatae dewa gais rahaa ke aap fir se banata hai.'''\n\nAap socho ki ii panna ke sampadan aap ke karte rahe ke chaahi ki nai.\nAap ke aaram khatir hatae waala suchi hian pe dewa jaawe hai:",
        "moveddeleted-notice": "Ii panna ke mitae dewa gais hai.\nIi panna ke mitae waala aur hatae waala log aap ke dekhe khatir niche dewa gais hai.",
+       "moveddeleted-notice-recent": "Maaf karna, ii panna ke abhi haali mitae dewa gais rahaa ( pichhle 24 ghantaa me).\nMitae aur hatae ke log panna ke niche, aap ke reference ke khaatir, dewea gais hai.",
        "log-fulllog": "Puura log dekho",
        "edit-hook-aborted": "Badalo ke hook rok diis hai.\nIi koi kaaran nai diis hai.",
        "edit-gone-missing": "Panna ke badle nai sakaa.\nJanae hai ki iske koi mitae dii hai.",
        "invalid-content-data": "Panna me likha gais chij right nai hae",
        "content-not-allowed-here": "Panna [[$2]] me \"$1\" likhe ke ijaajat nai hae",
        "editwarning-warning": "Ii panna ke chhore se jetna changes aap  karaa hae nai save hoi.\nAgar aap logged in hae, tab aap ii chetauni ke \"{{int:prefs-editing}}\"  vibhag me disable kare saktaa hae.",
+       "editpage-invalidcontentmodel-title": "Content model not supported",
+       "editpage-invalidcontentmodel-text": "Content model \"$1\" ke support nai karaa jaawe hai.",
        "editpage-notsupportedcontentformat-title": "Content ke format ke support nai karaa jaawe hae.",
        "editpage-notsupportedcontentformat-text": "Content format $1 ke content model $2 nai support kare hae.",
        "content-model-wikitext": "wikitext",
        "content-model-css": "CSS",
        "content-json-empty-object": "Khaali object",
        "content-json-empty-array": "Khaali array",
+       "deprecated-self-close-category": "Panna, jon ki invalid self-closed HTML tags, ke use kare hai",
+       "deprecated-self-close-category-desc": "Panna me, invalid self-closed HTML tags hai, jaise ki <code>&lt;b/></code> nai to <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
+       "duplicate-args-warning": "<strong>Chetauni:</strong> [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.",
        "duplicate-args-category": "Panna jiske tamplate call me duplicate argument hae",
        "duplicate-args-category-desc": "Panna me template calls hae jisme duplicate arguments hae, jaise ki <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.\n\nIske $2 {{PLURAL:$2|call|calls}} se kamti hoe ke chaahi, {{PLURAL:$1|abhi hai $1 call|abhi hai $1 calls}}.",
        "history-feed-description": "Ii panaa ke wiki me badlao ke itihaas",
        "history-feed-item-nocomment": "$1 pe $2",
        "history-feed-empty": "Aap jon panna mangta hai uu abhi tak banaa nai hai.\nSaait iske wiki me se mitae dewa gae hoi, nai to iske naam badal dewa gae hoi.\nTry karo [[Special:Search|wiki me khije ke]] aur nawaa panna ke.",
+       "history-edit-tags": "Edit tags of selected revisions",
        "rev-deleted-comment": "(badlao ke summary ke hatae dewa gais hae)",
        "rev-deleted-user": "(username ke hatae dewa gais hai)",
        "rev-deleted-event": "(log action ke hatae dewa gais hai)",
        "rev-showdeleted": "dekhao",
        "revisiondelete": "Badlao ke mitao/nai mitao",
        "revdelete-nooldid-title": "Target revision jon ki valid nai hai",
-       "revdelete-nooldid-text": "Aap chaahe target revision(s) ke specify nai karaa hai, ii function ke perform kare ke khatir, specified revision haiye nai, nai to aap abhi ke badlao ke lukae ke kosis karta hai.",
+       "revdelete-nooldid-text": "Aap chaahe target revision ke specify nai karaa hai, ii function ke perform kare ke khatir, specified revision haiye nai, nai to aap abhi ke badlao ke lukae ke kosis karta hai.",
        "revdelete-no-file": "Chuna gais file abhi nai banawa gais hai.",
        "revdelete-show-file-confirm": "Ka aap sure hai ki aap file ke mitawa gais revision ke dekhe mangtaa hai \"<nowiki>$1</nowiki>\" $2 se $3 talak?",
        "revdelete-show-file-submit": "Haan",
        "mergehistory-go": "Jorre jaae sake badlao ke dekhao",
        "mergehistory-submit": "Badlao ke jorro",
        "mergehistory-empty": "Koi badlao ke jorraa nai jaae sake hai.",
-       "mergehistory-done": "$1ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
+       "mergehistory-done": "$1 ke $3 {{PLURAL:$3|badlao}} ke safalta se [[:$2]] me jorr dewaa gais hai.",
        "mergehistory-fail": "Itihaas ke nai jorre paaya hae, meharbaani kar ke panna aur time parameters ke check karo.",
+       "mergehistory-fail-bad-timestamp": "Timestamp valid nai hai.",
+       "mergehistory-fail-invalid-source": "Source panna valid nai hai.",
+       "mergehistory-fail-invalid-dest": "Destination panna valid nai hai.",
+       "mergehistory-fail-no-change": "Itihaas ke merge kare ke time, koi badlao waala panna ke merge nai karaa gais hai. Meharbaani kar ke recheck the page and time parameters.",
+       "mergehistory-fail-permission": "Itihaas ke merge kare ke khaatir sufficient permission nai hai.",
+       "mergehistory-fail-self-merge": "Suruu aur khatam kare waala panna ekke hai.",
+       "mergehistory-fail-timestamps-overlap": "Source revisions overlap or come after destination revisions.",
        "mergehistory-fail-toobig": "History merge nai hoe sake, kaaheki limit of $1 {{PLURAL:$1|revision|revisions}} se jaada move hoe jaai.",
        "mergehistory-no-source": "Source panna $1 nai hai.",
        "mergehistory-no-destination": "Destination panna $1 nai hai.",
        "searchprofile-advanced-tooltip": "Custom namespaces me khojo",
        "search-result-size": "$1 ({{PLURAL:$2|1 sabd|$2 sabd}})",
        "search-result-category-size": " {{PLURAL:$1|1 sadasya|$1 sadasya}} ({{PLURAL:$2|1 chhota vibhag|$2 chhota vibhag}}, {{PLURAL:$3|1 file|$3 files}})",
-       "search-redirect": "(redirect $1)",
+       "search-redirect": "($1 se redirect karo)",
        "search-section": "(section $1)",
        "search-category": "(category $1)",
        "search-file-match": "(file content ke match kare hae)",
        "search-external": "Bahaari khoj",
        "searchdisabled": "{{SITENAME}} me abhi khoje ke anumati nai hai.\nAap tab tak Google se khoje sakta hai.\nYaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.",
        "search-error": "Khoje ke tim ek error hoe gais hae:$1",
+       "search-warning": "A warning has occured while searching: $1",
        "preferences": "Pasand",
        "mypreferences": "Pasand",
        "prefs-edits": "Badlao ke number:",
        "saveprefs": "Save karo",
        "restoreprefs": "Sab default settings ke pahile jaise karo (sab vibhag me)",
        "prefs-editing": "Badaltaa hai",
-       "rows": "Taytay:",
-       "columns": "Column:",
        "searchresultshead": "Khojo",
        "stub-threshold": "Threshold stub link formatting ke khatir ($1):",
        "stub-threshold-sample-link": "namuna",
        "prefs-help-recentchangescount": "Isme hai haali ke badlao, panna ke itihaas aur loga.",
        "prefs-help-watchlist-token2": "Aap ke dhyan suchi ke web feed ke ii secret key hae.\nAur koi agar iske bare me jaane hae aap ke dhyan suchi ke parrhae sake hae, tab iske aur ki ke nai dena.\n[[Special:ResetTokens|Agar aap iske reset kare mangtaa hae tab hian pe click karo]].",
        "savedprefs": "Aap ke pasand ke save kar lewa gais hai.",
-       "savedrights": "{{GENDER:$1|$1}} ke user rights ke bachae lewa gais hai.",
+       "savedrights": "{{GENDER:$1|$1}} ke user group ke bachae lewa gais hai.",
        "timezonelegend": "Time ke zone:",
        "localtime": "Sthaniye samay:",
        "timezoneuseserverdefault": "Wiki default ke kaam me laao ($1)",
        "prefswarning-warning": "Aap aapan preferences ke badla hae, jiske abhi talak save nai karaa gae hae.\nAgar aap ii panna ke bina \"$1\" me click kare chhorra, tab aap ke preferences save nai hoi.",
        "prefs-tabs-navigation-hint": "Tip: Aap left aur right arrow key use kar ke tab list me navigate kare saktaa hae.",
        "userrights": "Sadasya ke adhikaar ke chalao",
-       "userrights-lookup-user": "Sadasya ke group ke manage karo",
+       "userrights-lookup-user": "Ek sadasya ke chuno",
        "userrights-user-editname": "Ek Username ke enter karo:",
-       "editusergroup": "User groups ke badlo",
+       "editusergroup": "User groups ke load karo",
        "editinguser": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke badlaa jaawe hae $2",
+       "viewinguserrights": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke dekhaa jaawe hae $2",
        "userrights-editusergroup": "User groupske badlo",
-       "saveusergroups": "User groups ke save karo",
+       "userrights-viewusergroup": "User groups ke dekho",
+       "saveusergroups": "User groups, {{GENDER:$1|user}}, ke save karo",
        "userrights-groupsmember": "Iske member hai:",
        "userrights-groupsmember-auto": "Hian ke bhi member hae:",
        "userrights-groups-help": "Aap jon group me ii sadasya hai ke badle sakta hai:\n* Ek checked box ke matlab hai ki sadasya ii group me hai.\n* Ek unchecked box ke matlab hai ki sadasya ii group me nai hai.\n* Ek * ke matlab hai ki aap group ke jorre ke baad hatae nai sakta hai, nai to hatae ke baad jorre nai sakta hai.",
        "userrights-reason": "Kaaran:",
        "userrights-no-interwiki": "Aap ke duusra wiki me user rights ke badle ke adhikaar nai hai.",
        "userrights-nodatabase": "Database $1 abhi hai nai, nai to local nai hai.",
-       "userrights-nologin": "Sadasya ke user rights de ke khatir, ap ke chaahi ki aap [[Special:UserLogin|log in]] karo ek administrator ke account se.",
-       "userrights-notallowed": "Aap ke lage user rights de aur hatae ke adhikar nai hae.",
        "userrights-changeable-col": "Groups jiske aap badle sakta hai",
        "userrights-unchangeable-col": "Groups jiske aap badle nai sakta hai",
        "userrights-conflict": "User right me conflict hae! Meharbaani kar ke aapan badlao ke fir se review aur confirm karo.",
-       "userrights-removed-self": "App appan ijaajat ke hatae dia hae. Iske natija ii hoi ki app ii panna ke ab nai access kare sakegaa",
        "group": "Jhund:",
        "group-user": "Sadasya",
        "group-autoconfirmed": "Autoconfirmed sadasya",
        "right-createpage": "Panna banao (jon ki salah kare waala panna nai hai)",
        "right-createtalk": "Salah kare waala panna banao",
        "right-createaccount": "Nawaa sadasya ke account banao",
+       "right-autocreateaccount": "Ek bahaari account se automatically login ho",
        "right-minoredit": "Badlao ke chhota mark karo",
        "right-move": "Panna ke naam badlo",
        "right-move-subpages": "Panna aur uske subpanna ke naam badlo",
        "right-siteadmin": "Database ke band karo aur kholo",
        "right-override-export-depth": "Panna aur jurra panna, 5 ke gahirrai talak, ke export karo",
        "right-sendemail": "Duusra sadasya ke lage e-mail bhejo",
-       "right-passwordreset": "Password ke badle waala e-mail ke dekho",
-       "right-managechangetags": "Database se banao aur mitao [[Special:Tags|tags]]",
+       "right-managechangetags": "Database ke banao aur mitao [[Special:Tags|tags]]",
+       "right-applychangetags": "Aapan badlao ke saathe [[Special:Tags|tags]]  ke apply karo",
+       "right-changetags": "Individual entries aur log entries se arbitrary [[Special:Tags|tags]] ke jorro, nai to, hatao",
+       "right-deletechangetags": "Database se  [[Special:Tags|tags]] ke mitao",
+       "grant-generic": "\"$1\" rights bundle",
+       "grant-group-page-interaction": "Panna se interact karo",
+       "grant-group-file-interaction": "Media se interact karo",
+       "grant-group-watchlist-interaction": "Aapan watchlist se interact karo",
+       "grant-group-email": "Email bhejo",
+       "grant-group-high-volume": "Perform high volume activity",
+       "grant-group-customization": "Customization and preferences",
+       "grant-group-administration": "Perform administrative actions",
+       "grant-group-private-information": "Aaapan baare me private data ke access karo",
+       "grant-group-other": "Miscellaneous activity",
+       "grant-blockusers": "Sadasya ke block aur unblock karo",
+       "grant-createaccount": "Account banao",
+       "grant-createeditmovepage": "Panna ke banao, badlo aur hatao",
+       "grant-delete": "Pages, revisions, aur log entries ke mitao",
+       "grant-editinterface": "MediaWiki namespace aur user CSS/JavaScript ke badlo",
+       "grant-editmycssjs": "EAapan user CSS/JavaScript ke badlo",
+       "grant-editmyoptions": "Aapan user preferences ke badlo",
+       "grant-editmywatchlist": "Aapan dhyan suchi ke badlo",
+       "grant-editpage": "Abhi ke panna ke badlo",
+       "grant-editprotected": "Bachaawa gais panna ke badlo",
+       "grant-highvolume": "High-volume editing",
+       "grant-oversight": "Sadasya ke lukao aur revisions ke suppress karo",
+       "grant-patrol": "Panna me badlao pe pahraa do",
+       "grant-privateinfo": "Gupt jaankari ke access karo",
+       "grant-protect": "Panna ke protect aur unprotect karo",
+       "grant-rollback": "Rollback changes to pages",
+       "grant-sendemail": "Duusra sadasya ke lage e-mail bhejo",
+       "grant-uploadeditmovefile": "Upload, replace, and move files",
+       "grant-uploadfile": "Nawaa file ke upload karo",
+       "grant-basic": "Basic adhikaar",
+       "grant-viewdeleted": "Delete karaa gais file aur panna ke dekho",
+       "grant-viewmywatchlist": "Aapan dhyan suchi ke dekho",
+       "grant-viewrestrictedlogs": "Restricted log entries ke dekho",
        "newuserlogpage": "Sadasya ke banae waala log",
        "newuserlogpagetext": "Ii sadasya ke banae waala log hai.",
        "rightslog": "Sadasya adhikar suchi",
        "rightslogtext": "Ii sadasya ke adhikar ke badlao ke suchi hai.",
        "action-read": "ii panna ke parrho",
        "action-edit": "ii panna ke badlo",
-       "action-createpage": "panna banao",
-       "action-createtalk": "salah waala panna banao",
+       "action-createpage": "Ii panna ke banao",
+       "action-createtalk": "Ii salah waala panna banao",
        "action-createaccount": "ii user account ke banao",
+       "action-autocreateaccount": "Ek bahaari user account ke automatically banao",
        "action-history": "ii panna ke itihass ke dekho",
        "action-minoredit": "ii badlao ke chhota mark karo",
        "action-move": "ii panna ke naam badlo",
        "action-upload_by_url": "ek URL address se ii file ke upload karo",
        "action-writeapi": "Likhe waala API ke use karo",
        "action-delete": "ii panna ke mitao",
-       "action-deleterevision": "ii badlao ke mitao",
-       "action-deletedhistory": "i panna ke mitawa waala itihaas dekho",
+       "action-deleterevision": "Badlao ke mitao",
+       "action-deletelogentry": "Log entries ke mitao",
+       "action-deletedhistory": "ek panna ke mitawa waala itihaas dekho",
+       "action-deletedtext": "Mitaawa gais revision list ke dekho",
        "action-browsearchive": "mitawa gais panna ke khojo",
-       "action-undelete": "ii panna ke fir se pahile jaise karo do",
-       "action-suppressrevision": "ii lukawa gais badlao ke fir se dekh ke pahile jaise karo",
+       "action-undelete": "Panna ke fir se pahile jaise karo do",
+       "action-suppressrevision": "Lukawa gais badlao ke fir se dekh ke pahile jaise karo",
        "action-suppressionlog": "ii private log ke dekho",
        "action-block": "ii sadasya ke panna badle se roko",
        "action-protect": "ii panna ke protection levels ke badlo",
        "action-userrights-interwiki": "duusra wiki ke sadasya ke adhikar ke badlo",
        "action-siteadmin": "database ke band karo nai to kholo",
        "action-sendemail": "E-mail bhejo",
+       "action-editmyoptions": "Aapan preferences ke badlo",
        "action-editmywatchlist": "Aapan dhyan suchi ke badlo",
        "action-viewmywatchlist": "Aapan dhyan suchi ke dekho",
        "action-viewmyprivateinfo": "Aapan private jaankari ke dekho",
        "action-editmyprivateinfo": "Aapan private jaankari ke badlo",
        "action-editcontentmodel": "ek panna ke content model ke badlo",
        "action-managechangetags": "database se tags ke banao aur mitao",
+       "action-applychangetags": "Aapan badlao ke saathe tags ke apply karo",
+       "action-changetags": "Individual revisions aur log entries se arbitary tages jorro aur hatao",
+       "action-deletechangetags": "Database se tags ke mitao",
+       "action-purge": "Ii panna ke purge karo",
        "nchanges": "$1 {{PLURAL:$1|badlao|badlao}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|last time dekhe ke baad}}",
        "enhancedrc-history": "itihaas",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aur dekho [[Special:NewPages|nawaa panna ke suchi]])",
        "recentchanges-submit": "Dekhao",
+       "rcfilters-activefilters": "Active filters",
+       "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
+       "rcfilters-invalid-filter": "Invalid filter",
+       "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-noresults": "Koi filter nai milaa",
+       "rcfilters-filtergroup-authorship": "Edit authorship",
+       "rcfilters-filter-editsbyself-label": "Aapan badlao",
+       "rcfilters-filter-editsbyself-description": "Aap ke karaa gais badlao.",
+       "rcfilters-filter-editsbyother-label": "Duusra jan ke karaa gais badlao",
+       "rcfilters-filter-editsbyother-description": "Badlao jiske duusraa jan karin hai (aap nai)",
+       "rcfilters-filtergroup-userExpLevel": "User experience level",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Newcomers",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Bahut nawaa editor: 10 se kamtii badlao aur 4 din se kamtii activity.",
+       "rcfilters-filter-userExpLevel-learner-label": "Sikhe waala",
+       "rcfilters-filter-userExpLevel-learner-description": "More days of activity and edits than 'Newcomers' but fewer than 'Experienced users.'",
+       "rcfilters-filter-userExpLevel-experienced-label": "Experienced users",
+       "rcfilters-filter-userExpLevel-experienced-description": "30 din se jaada activity aur 500 se jaada badlao",
        "rcnotefrom": "Niche {{PLURAL:$5|badlao hae|badlao hae}} <strong>$3, $4</strong> (<strong>$1</strong> talak dekhawa gais) talak.",
        "rclistfrom": "$3 $2 se suruu kar ke nawaa badlao dekhao",
        "rcshowhideminor": "$1 chhota badlao",
        "rcshowhidemine": "$1 hamaar sampadan",
        "rcshowhidemine-show": "Dekhao",
        "rcshowhidemine-hide": "Lukao",
+       "rcshowhidecategorization": "$1 page categorization",
        "rcshowhidecategorization-show": "Dekhao",
+       "rcshowhidecategorization-hide": "Lukao",
        "rclinks": "Pichhla $1 badlao pichle $2 din me dekhao <br />$3",
        "diff": "farka",
        "hist": "itihaas",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|user|users}} ke dekhta hae]",
-       "rc_categories": "Categories me limit (\"|\" se separate  karo)",
-       "rc_categories_any": "Koi bhi",
+       "rc_categories": "Categories me limit (\"|\" se separate karo)",
+       "rc_categories_any": "Chuna gais me se koi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad",
        "newsectionsummary": "/* $1 */ nawaa vibhag",
        "rc-enhanced-expand": "Details dekhao",
        "recentchangeslinked-summary": "Ii panna pahile waala badlao jon panna hian pe jurra hae ke suchi de hae (nai to vises vibhag ke sadasya).\nPanna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae  '''mota''' kara gais hae.",
        "recentchangeslinked-page": "Panna ke naam:",
        "recentchangeslinked-to": "Badalo jon ki given panna se linked hai ke dekhao",
+       "recentchanges-page-added-to-category": "[[:$1]] added to category",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] added to category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] removed from category",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] removed from category, [[Special:WhatLinksHere/$1|this page is included within other pages]]",
+       "autochange-username": "MediaWiki automatic change",
        "upload": "File ke upload karo",
        "uploadbtn": "File upload karo",
        "reuploaddesc": "Upload ke cancel kar ke upload form pe lauto",
        "file-thumbnail-no": "File ke naam <strong>$1</strong> se suruu hoe hai.\nIi janawe hai ki ii chhota size ke chapa hai ''(thumbnail)''.\nAgar jo aap ke lage ii chapa full resolution me hai tab uske upload karna, nai to file ke naam badlo.",
        "fileexists-forbidden": "Ii naam ke file abhi hai, aur iske badlawa nai jaae sake hai.\nAgar jo aap fir bhi aapan file ke upload kare mangta hai, tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ii naam ke file abhi shared file repository me hai.\nAgar jo aap fir bhi aapan file upload kare manta hai tab pichhe jaae ke nawaa naam use karo. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Upload karaa gais chij <strong>[[:$1]]</strong> abhi ke version ke ekdam jaise hai.",
+       "fileexists-duplicate-version": "Upload karaa gais chij {{PLURAL:$2|an older version|older versions}} of <strong>[[:$1]]</strong> ke ekdam rakam hai.",
        "file-exists-duplicate": "Ii file following file ke duplicate hai {{PLURAL:$1|file|files}}:",
        "file-deleted-duplicate": "Yahii rakam ke ek aur file ([[:$1]]) ke pahile delete karaa gais hai. Aap ke file ke deletion history ke check kare ke chaahi, upload kare se pahile.",
        "file-deleted-duplicate-notitle": "Ii rakam ke ek file ke pahile delete karaa gais rahaa, aur iske title ke suppress karaa gais hae. Aap ke aisan koi jan, jiske lake suppressed data dekhe ke adhikar har, se situation ke review karae ke baad file ke upload kare ke chaahi.",
        "uploaddisabledtext": "File uploads ke disable kar dewa gais hai.",
        "php-uploaddisabledtext": "File uploads ke PHP me disable kar dewa gais hai. Meharbani kar ke file_uploads setting ke check karo.",
        "uploadscripted": "Ii file me HTML nai to script code hai jiske web browser erroneously interpret kare sake hai.",
+       "upload-scripted-pi-callback": "File jisme XML-stylesheet processing instruction hai ke upload nai karaa jaae sake hai.",
+       "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
+       "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.",
+       "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
+       "uploaded-href-attribute-svg": "href attributes in SVG files are only allowed to link to http:// or https:// targets, found <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Found href to unsafe data: URI target <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
+       "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.",
+       "uploaded-setting-href-svg": "Using the \"set\" tag to add \"href\" attribute to parent element is blocked.",
+       "uploaded-wrong-setting-svg": "Using the \"set\" tag to add a remote/data/script target to any attribute is blocked. Found <code>&lt;set to=\"$1\"&gt;</code> in the uploaded SVG file.",
+       "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
+       "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
        "uploadscriptednamespace": "Ii SVG file me illegal namespace \"$1\" hae.",
        "uploadinvalidxml": "Upload karaa gais file ke XML ke parse nai karaa jaae sake hae.",
        "uploadvirus": "Ii file me virus hai! Details: $1",
        "upload-options": "Upload kare ke version",
        "watchthisupload": "Ii panna pe dhyan rakhho",
        "filewasdeleted": "Ii naam ke file ke pahile upload kar ke baad me delete karaa gais hai.\nAap ke chaahi ki aap $1 check kar lo fir se upload kare se pahile.",
+       "filename-thumb-name": "Ii dekhe me thumbnail title ke rakam lage hai. Meharbaani kar ke yahii wiki me fir se thumbnail nai upload karo. Nai to, meharbaani kar ke fix the filename so it is more meaningful, and does not have the thumbnail prefix.",
        "filename-bad-prefix": "Jon file aap upload kartaa hai uske naam '''\"$1\"''' se suruu hoe hai, jon ki non-descriptive naam hai jiske jaada kar ke digital camera automatically assign kare hai.\nMeharbaani kar ke aur jaada descriptive filename chose karo.",
        "upload-proto-error": "Protocol right nai hai",
        "upload-proto-error-text": "Duur ke upload maange hai URLs jon ki suruu hoe hai <code>http://</code> nai to <code>ftp://</code>.",
        "upload-too-many-redirects": "Ii URL me bahut jaada redirects hae.",
        "upload-http-error": "Ek HTTP galti hoe gais hae: $1",
        "upload-copy-upload-invalid-domain": "Ii domain se copy upload nai karaa jaae sake hae.",
+       "upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.",
+       "upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.",
+       "upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.",
+       "upload-dialog-title": "File ke upload karo",
+       "upload-dialog-button-cancel": "Cancel karo",
+       "upload-dialog-button-back": "Piichhe",
+       "upload-dialog-button-done": "Kar dewa gais hae",
+       "upload-dialog-button-save": "Bachao",
+       "upload-dialog-button-upload": "Upload karo",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-name-tooltip": "File ke khaatir ek unique descriptive title, which will serve as a filename. You may use plain language with spaces. Do not include the file extension.",
+       "upload-form-label-infoform-description": "Baare me",
+       "upload-form-label-infoform-description-tooltip": "Briefly, kaam ke baare mesab chij describe karo.\nFor a photo, mention the main things that are depicted, the occasion, or the place.",
+       "upload-form-label-usage-title": "Usage",
+       "upload-form-label-usage-filename": "File ke naam",
+       "upload-form-label-own-work": "Ii hamaar kaam hai",
+       "upload-form-label-infoform-categories": "Vibhag",
+       "upload-form-label-infoform-date": "Taarik",
+       "upload-form-label-own-work-message-generic-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "{{SITENAME}} ke policy ke niche, agar aap file nai upload kare saktaa hai, tab please close this dialog and try another method.",
+       "upload-form-label-not-own-work-local-generic-local": "You may also want to try [[Special:Upload|the default upload page]].",
+       "upload-form-label-own-work-message-generic-foreign": "I understand that I am uploading this file to a shared repository. I confirm that I am doing so following the terms of service and licensing policies there.",
+       "upload-form-label-not-own-work-message-generic-foreign": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
+       "upload-form-label-not-own-work-local-generic-foreign": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
        "backend-fail-stream": "File $1 ke stream nai kare sakaa hae.",
        "backend-fail-backup": "File $1 ke backuo nai kare sakaa hae.",
        "backend-fail-notexists": "Ii file $1 nai hae.",
        "backend-fail-read": "File $1 ke nai parrhe sakaa hae.",
        "backend-fail-create": "File $1 pe nai likha jaae sake hae.",
        "backend-fail-maxsize": "File $1 ke nai likhe sakaa hae kaahe ki ii {{PLURAL:$2|ek byte|$2 byte}} se barraa hae.",
-       "backend-fail-readonly": "Storage backend \"$1\" abhi khaali read-only hae. Iske kaaran hae: \"$2\"",
+       "backend-fail-readonly": "Storage backend \"$1\" abhi khaali read-only hai. Iske kaaran hai: <em>$2</em>",
        "backend-fail-synced": "File \"$1\" internal storage backends me ek inconsistent state me hae",
        "backend-fail-connect": "Storage backend \"$1\" se connect nai kare sakaa hae.",
        "backend-fail-internal": "Storage backend \"$1\" me ek unknown error hoe gais hae.",
        "uploadstash-badtoken": "Aap uu chij nai kare saktaa hae, saait ii kaaran se ki aap ke ijaajat khalaas hoe gais hae. Fir se kosis karo.",
        "uploadstash-errclear": "File ke hatawa nai jaae sakaa hae.",
        "uploadstash-refresh": "File ke suchi ke fir se dekhao",
+       "uploadstash-thumbnail": "thumbnail ke dekho",
+       "uploadstash-exception": "Could not store upload in the stash ($1): \"$2\".",
        "invalid-chunk-offset": "Kharaab chunk offset",
        "img-auth-accessdenied": "ijajat nai hae",
        "img-auth-nopathinfo": "Aap ke server ke ii jankari de khatir set up nai karaa gais hae\nSaait ii CGI-based hoi aur img_auth ke nai support karat hoi.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization ke dekho.",
        "listfiles-delete": "mitao",
        "listfiles-summary": "Ii khaas panna sab uploaded file ke dekhae hai.",
        "listfiles_search_for": "Media ke naam khojo:",
+       "listfiles-userdoesnotexist": "Sadasya ke account \"$1\" registered nai hai.",
        "imgfile": "file",
        "listfiles": "Chapa ke suchi",
        "listfiles_thumb": "Chhota chapa",
        "filerevert-legend": "File ke pahile jaise karo",
        "filerevert-intro": "Aap '''[[Media:$1|$1]]''' ke [$4 version as of $3, $2] jaise kartaa hai.",
        "filerevert-comment": "Kaaran:",
-       "filerevert-defaultcomment": "Version as of $2, $1 pe revert kar dewa gais hai",
+       "filerevert-defaultcomment": "Version as of $2, $1 ($3) pe revert kar dewa gais hai",
        "filerevert-submit": "Pahile jaise karo",
        "filerevert-success": "'''[[Media:$1|$1]]''' ke [$4 version as of $3, $2] pe revert kar dewa gais hai.",
        "filerevert-badversion": "Dewa gais timestamp ke pahile ke ii file ke koi version nai hai.",
+       "filerevert-identical": "Abhi ke file ke version, chuna gais file ke ekdam rakam hai",
        "filedelete": "$1 ke mitao",
        "filedelete-legend": "File ke mitao",
        "filedelete-intro": "Aap file '''[[Media:$1|$1]]''' ke delete kare waala hai iske itihaas ke saathe.",
        "randomincategory-nopages": "[[:Category:$1|$1]] category me koi panna nai hae.",
        "randomincategory-category": "Vibhag:",
        "randomincategory-legend": "Category me random panna",
+       "randomincategory-submit": "Jaao",
        "randomredirect": "Koi bhi jagha redirect karo",
        "randomredirect-nopages": "Namespace \"$1\" me koi redirects nai hai.",
        "statistics": "Aankrra",
        "uncategorizedcategories": "Uncategorized vibhag",
        "uncategorizedimages": "Bina vibhag me kara gais file",
        "uncategorizedtemplates": "Bina categorise karaa gais template",
+       "uncategorized-categories-exceptionlist": " # Contains a list of catgeories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Bina use bhae category",
        "unusedimages": "Bina use bhae files",
        "wantedcategories": "Maange waala vibhag",
        "wantedpages": "Jaruri panna",
-       "wantedpages-summary": "List of non-existing pages with the most links to them, excluding pages which only have redirects linking to them. For a list of non-existent pages that have redirects linking to them, see [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "List of non-existing pages with the most links to them, excluding pages which only have redirects linking to them. For a list of non-existent pages that have redirects linking to them, see [[{{#special:BrokenRedirects}}|the list of broken redirects]].",
        "wantedpages-badtitle": "Result set me kharaa title hai: $1",
        "wantedfiles": "Maange waala files",
        "wantedfiletext-cat": "Niche likha gais file ke kaam me lawa gais hae lekin ii Wikipedia me nai hae. Ii Wikipedia me file rahe par bhi foreign repositories ke file ke list karaa jaae sake hae. Aisan koi galat positives ke <del>mitae dewa jaai</del>. Aur, uu panna jon ki non-existent files ke embed kare hae ke [[:$1]] me list karaa gais hae.",
        "mostrevisions": "Sab se jaada badlao waala panna",
        "prefixindex": "Sab panna jisme prefix index hai",
        "prefixindex-namespace": "Sab panna jisme prefix ($1 namespace)hae",
+       "prefixindex-submit": "Dekhao",
        "prefixindex-strip": "List me se prefix ke strip karo",
        "shortpages": "Chhota panna",
        "longpages": "Lamba panna",
        "protectedpages-performer": "Sadasya ke bachawa jaae hae",
        "protectedpages-params": "Protection parameters",
        "protectedpages-reason": "Kaaran",
+       "protectedpages-submit": "Panna ke dekhao",
        "protectedpages-unknown-timestamp": "Nai maluum",
        "protectedpages-unknown-performer": "Unknown sadasya",
        "protectedtitles": "Bachawa gais titles",
        "protectedtitles-summary": "Ii panna uu title ke list kare hae jon ki creation se protected hae. Protected panna ke suchi dekhe ke khatir \n[[{{#special:ProtectedPages}}|{{int:protectedpages}}]] ke dekho.",
        "protectedtitlesempty": "Ii parameters se koi bhi title ke nai bacawa gais hai.",
+       "protectedtitles-submit": "Title ke dekhao",
        "listusers": "Sadasya ke suchi",
        "listusers-editsonly": "Khaali uu sadasya ke dekhao jon ki koi badlao karis hai",
        "listusers-creationsort": "Banawa gais tarik se sort karo",
        "usereditcount": "$1 {{PLURAL:$1|badlao|badlao}}",
        "usercreated": "{{GENDER:$3|Banawa gais hae}}  $1 pe $2 me",
        "newpages": "Nawaa panna",
+       "newpages-submit": "Dekhao",
        "newpages-username": "Username:",
        "ancientpages": "Sab se purana panna",
        "move": "Naam badlo",
        "nopagetext": "Target panna jiske aap specify karaa hai exist nai hoe hai.",
        "pager-newer-n": "{{PLURAL:$1|nawaa 1|nawaa $1}}",
        "pager-older-n": "{{PLURAL:$1|purana 1|purana $1}}",
-       "suppress": "Oversight",
+       "suppress": "Suppress karo",
        "querypage-disabled": "Ii khaas panna ke performance kaaran se disable kar drwa gais hae.",
        "apihelp": "API madat",
        "apihelp-no-such-module": "Module \"$1\" ke paawa nai gais hae.",
+       "apisandbox": "API sandbox",
+       "apisandbox-jsonly": "JavaScript is required to use the API sandbox.",
+       "apisandbox-api-disabled": "Ii site pe API disabled hai.",
+       "apisandbox-intro": "Use this page to experiment with the <strong>MediaWiki web service API</strong>.\nRefer to [[mw:API:Main page|the API documentation]] for further details of API usage. Example: [https://www.mediawiki.org/wiki/API#A_simple_example get the content of a Main Page]. Select an action to see more examples.\n\nNote that, although this is a sandbox, actions you carry out on this page may modify the wiki.",
+       "apisandbox-fullscreen": "Panel ke expand karo",
+       "apisandbox-fullscreen-tooltip": "Sandbox panel ke barraa kar ke browser window ke size karo.",
+       "apisandbox-unfullscreen": "Panna ke dekhao",
+       "apisandbox-unfullscreen-tooltip": "Sandbox panel ke chhotaa karo, so MediaWiki navigation links are available.",
+       "apisandbox-submit": "Request karo",
+       "apisandbox-reset": "Clear karo",
+       "apisandbox-retry": "Fir se try karo",
+       "apisandbox-loading": "Loading information for API module \"$1\"...",
+       "apisandbox-load-error": "An error occurred while loading information for API module \"$1\": $2",
+       "apisandbox-no-parameters": "Ii API module me koi parameter nai hai.",
+       "apisandbox-helpurls": "Madat ke link",
+       "apisandbox-examples": "Examples",
+       "apisandbox-dynamic-parameters": "Aur parameters",
+       "apisandbox-dynamic-parameters-add-label": "Parameter jorro:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parameter ke naam",
+       "apisandbox-dynamic-error-exists": "Parameter, jiske naam \"$1\" hai, abhi hai.",
+       "apisandbox-deprecated-parameters": "Deprecated parameters",
+       "apisandbox-fetch-token": "Auto-fill the token",
+       "apisandbox-submit-invalid-fields-title": "Kuchh field valid nai hai",
+       "apisandbox-submit-invalid-fields-message": "Marked field ke correct kar ke fir se try karo.",
+       "apisandbox-results": "Results",
+       "apisandbox-sending-request": "Sending API request...",
+       "apisandbox-loading-results": "Receiving API results...",
+       "apisandbox-results-error": "An error occurred while loading the API query response: $1.",
+       "apisandbox-request-url-label": "Request ke URL:",
+       "apisandbox-request-time": "Request time: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Token ke sudhaar ke resubmit karo",
+       "apisandbox-results-fixtoken-fail": "Failed to fetch \"$1\" token.",
+       "apisandbox-alert-page": "Ii panna ke fields valid nai hai.",
+       "apisandbox-alert-field": "Ii field ke value, valid nai hai.",
+       "apisandbox-continue": "Continue",
+       "apisandbox-continue-clear": "Clear karo",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.",
+       "apisandbox-param-limit": "Enter <kbd>max</kbd> to use the maximum limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All namespaces)",
+       "apisandbox-multivalue-all-values": "$1 (All values)",
        "booksources": "Pustak sources",
        "booksources-search-legend": "Book sources ke khojo",
        "booksources-search": "Khojo",
        "booksources-text": "Niche ke suchi me uu websites ke jorr hai jon ki nawaa aur use karaa gais book ke beche hai aur jon book ke aap khojtaa hai uske baare aur jaankari de sake hai:",
        "booksources-invalid-isbn": "Dewa gais ISBN thiik nai hai; iske purana jagha se copy kare ke time ke error ke check karo.",
+       "magiclink-tracking-rfc": "Pages using RFC magic links",
+       "magiclink-tracking-rfc-desc": "This page uses RFC magic links. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] on how to migrate.",
+       "magiclink-tracking-pmid": "Jon panna PMID magic links ke use kare hai",
+       "magiclink-tracking-pmid-desc": "Ii panna PMID magic links ke kaam me laae hai. Dekho [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ki kaise migrate karaa jaawe hai.",
+       "magiclink-tracking-isbn": "Panna, jon ki RFC magic links ke kaam me laae hai",
+       "magiclink-tracking-isbn-desc": "Ii panna ISBN magic links ke kaam me laawe hai. Dekho [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ke on how to migrate.",
        "specialloguserlabel": "Sadasya:",
-       "speciallogtitlelabel": "Padwi:",
+       "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Suchi",
+       "logeventslist-submit": "Dekhao",
        "all-logs-page": "Sab janta waala suchi",
        "alllogstext": "{{SITENAME}} ke sab log ke ek saathe dekhawa jjawe hae.\nYou can narrow down the view by selecting a log type, the user name (case-sensitive), or the affected page (also case-sensitive).\nKetna chij dekhae hae ke aap kamti kare saktaa hae sadasya ke naam (case-sensitive), nai the affected panna (ii bhi case-sensitive) ke log type ke select kare se.",
        "logempty": "Log me koi matching item nai hai.",
        "log-title-wildcard": "Ii text se suruu hoe waala titles ke khojo",
        "showhideselectedlogentries": "Dekhao/lukao chuna gais log entries",
+       "log-edit-tags": "Edit tags of selected log entries",
+       "checkbox-select": "Select: $1",
+       "checkbox-all": "Sab",
+       "checkbox-none": "Koi bhi nai",
+       "checkbox-invert": "Ultaa karo",
        "allpages": "Sab panna",
        "nextpage": "Aglaa panna ($1)",
        "prevpage": "Pichhla panna ($1)",
        "cachedspecial-viewing-cached-ts": "Aap ii panna ke ek cached version ke dekhtaa hae, jon ki saait puura aslii nai hae.",
        "cachedspecial-refresh-now": "Sab se nawaa ke dekho.",
        "categories": "Vibhag",
+       "categories-submit": "Dekhao",
        "categoriespagetext": "Niche ke {{PLURAL:$1|vibhag me|vibhag me}}  panna aur media hae.\n[[Special:UnusedCategories|Unused categories]] hian nai dekhawa jaawe hae.\n[[Special:WantedCategories|wanted categories]] ke bhi dekho.",
        "categoriesfrom": "Vibhag jon ki hian pe suruu hoe hai, ke dekhao:",
        "deletedcontributions": "Sadasya ke yogdaan ke mitae dia hai",
        "activeusers-intro": "Ii suchi uu sadasya ke hae jon ki pahile {{PLURAL:$1|din|din}} me kuchh karin hae.",
        "activeusers-count": "$1 haali ke {{PLURAL:$1|badlao}} pichhle {{PLURAL:$3|din}} me",
        "activeusers-from": "Sadasya jon ki hian se suruu hoe hai ke dekhao:",
+       "activeusers-groups": "Display users belonging to groups:",
+       "activeusers-excludegroups": "Exclude users belonging to groups:",
        "activeusers-noresult": "koi sadasya ke pawa nai gais hai.",
+       "activeusers-submit": "Active sadasya ke dekhao",
        "listgrouprights": "Sadasya  ke group adhikar",
        "listgrouprights-summary": "Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan  associated access rights ke saathe\n[[{{MediaWiki:Listgrouprights-helppage}}|additional information]] individual rights ke baare me sait hoi.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dewa gais adhikar</span>\n* <span class=\"listgrouprights-revoked\">Hatawa gais adhikar</span>",
        "listgrouprights-namespaceprotection-header": "Namespace restrictions",
        "listgrouprights-namespaceprotection-namespace": "Namespace:",
        "listgrouprights-namespaceprotection-restrictedto": "Adhikar jon ki sadasya ke badlao kare de hae.",
+       "listgrants": "Grants",
+       "listgrants-summary": "Niche suchi hai of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "listgrants-grant": "Grant",
+       "listgrants-rights": "Adhikaar",
        "trackingcategories": "Vibhag ke track karaa jaawe hae",
        "trackingcategories-summary": "Ii panna me tracking vibhag ke suchi hae, jiske MediaWiki software automatically populate kare hae. Iske naam can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
        "trackingcategories-msg": "Tracking category",
        "trackingcategories-name": "Sandes ke naam",
        "trackingcategories-desc": "Category inclusion ke criteria",
+       "restricted-displaytitle-ignored": "Pages with ignored display titles",
+       "restricted-displaytitle-ignored-desc": "The page has an ignored <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> because it is not equivalent to the page's actual title.",
        "noindex-category-desc": "Ii panna ke robots nai index karis hae kaheki ispe magic word <code><nowiki>__NOINDEX__</nowiki></code> hae aur ii uu namespace me hae jisme uu flag allowed nai hae.",
        "index-category-desc": "Ii panna me  <code><nowiki>__INDEX__</nowiki></code> hae(aur ii uu namespace me hae jahaan pe flag allowed haeand), tab iske robots se index karaa gais hae where it normally wouldn't be.",
        "post-expand-template-inclusion-category-desc": "Ii panna ke size <code>$wgMaxArticleSize</code> se barraa hae after expanding all the templates, so some templates were not expanded.",
        "emailccsubject": "Aapke $1 ke khatir khabar ke copy: $2",
        "emailsent": "E-mail ke bhej dewa gais hai",
        "emailsenttext": "Aap ke e-mail sandes ke bhej dewa gais hai.",
-       "emailuserfooter": "Ii e-mail ke $1, $2 ke lage \"E-mail user\" function ke {{SITENAME}}se kaam me laae ke bhejis hai.",
+       "emailuserfooter": "Ii e-mail ke {{GENDER:$1|sent}}, {{GENDER:$2|$2}} ke lage \"{{int:emailuser}}\"  function ke {{SITENAME}} se kaam me laae ke bhejis hai. {{GENDER:$2|Your}} email will be sent directly to the {{GENDER:$1|original sender}}, revealing {{GENDER:$2|your}} email address to {{GENDER:$1|them}}.",
        "usermessage-summary": "System sandesh likha jaae hae.",
        "usermessage-editor": "System ke sandes de waala",
        "watchlist": "Dhyan suchi",
        "watchlistanontext": "Aapan dhyan suchi me ke dekhe nai to badle ke khatir meharbani kar ke log in karo.",
        "watchnologin": "Logged in nai hai",
        "addwatch": "Dhyan suchi me jorro",
-       "addedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|watchlist]] me jorr dewa gais hae.\nIi panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.",
+       "addedwatchtext": "\"[[:$1]]\" aur iske discussion panna ke aap ke   [[Special:Watchlist|watchlist]] me jorr diyaa gais hai.",
+       "addedwatchtext-talk": "\"[[:$1]]\" aur iske associated panna ke aap ke  [[Special:Watchlist|watchlist]] me jorr dewa gais hai.",
        "addedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me jorraa gais hae.",
        "removewatch": "Dhyan suchi me se hatao",
-       "removedwatchtext": "Panna \"[[:$1]]\" ke aap ke [[Special:Watchlist|aap ke dhyan suchi]] se hatae dewa gais hai.",
+       "removedwatchtext": "\"[[:$1]]\" aur iske discussion panna ke aaap ke [[Special:Watchlist|watchlist]] se hatae dewa gais hai.",
+       "removedwatchtext-talk": "\"[[:$1]]\" aur iske discussion panna ke aap ke   [[Special:Watchlist|watchlist]] se hatae dewa gais hai.",
        "removedwatchtext-short": "Panna \"$1\" ke aap ke watchlist me se hataawa gais hae.",
        "watch": "Dekho",
        "watchthispage": "Ii panna par dhyan rakho",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
        "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile <strong>$1</strong> badlao hai}} pichhle {{PLURAL:$2|ghanta|<strong>$2</strong> ghanta}} me as of $3, $4.",
        "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
+       "watchlist-hide": "Lukao",
+       "watchlist-submit": "Dekhao",
+       "wlshowtime": "Kon samay ke display karaa jaae:",
+       "wlshowhideminor": "chhotaa badlao",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "registered sadasya",
+       "wlshowhideanons": "binaa naam ke sadasya",
+       "wlshowhidepatr": "jon badlao pe pahraa dewaa jaae hai",
+       "wlshowhidemine": "hamaar badlao",
+       "wlshowhidecategorization": "panna categorization",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "unwatching": "Nai dekhtaa...",
        "deletepage": "Pana ke delete karo",
        "confirm": "Confirm karo",
        "excontent": "content rahaa: '$1'",
-       "excontentauthor": "content rahaa: '$1' (aur khaali ek contributor rahaa '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "content rahaa: \"$1\", aur khaali ek contributor rahaa \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "blanking se pahile content rahaa: '$1'",
        "delete-confirm": "\"$1\" ke mitao",
        "delete-legend": "Mitao",
        "historywarning": "<strong>Sawadhan</strong>: Jon panna ke aap mitae waala hai ke itihaas hai $1 {{PLURAL:$1|badlao|badlao}} ke saathe:",
+       "historyaction-submit": "Dekhao",
        "confirmdeletetext": "Aap ek panna ke uske itihaas ke saathe delete kare waala hai.\nMeharbani kar ke iske confirm karo, ki aap iske consequences ke samajhta hai, aur aap iske [[{{MediaWiki:Policy-url}}|the policy]] ke policy ke niche delete karta hai.",
        "actioncomplete": "Action puura hoe gais hai",
        "actionfailed": "Action fail hoe gais",
        "delete-toobig": "Ii panna ke barraa balao ke itihass hai, $1 se jaada {{PLURAL:$1|revision|revisions}}.\nAisan panna ke mitae pe rok lagawa gais hai so that accidental disruption of {{SITENAME}} ke roka jaae sake hai.",
        "delete-warning-toobig": "Ii panna ke lambaa badlao ke itihaas hai, $1 {{PLURAL:$1|revision|revisions}} se jaada.\nIske mitae se {{SITENAME}} me database operations me baadha parri;\nsawadhani se aage barrho.",
        "deleteprotected": "Aap ii panna ke mitae nai saktaa hae kaaheki iske protect karaa gais hae.",
-       "deleting-backlinks-warning": "'''Chetauni:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hae jiske aap delete kare waala hae.",
+       "deleting-backlinks-warning": "<string>Chetauni:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hai jiske aap delete kare waala hae.",
        "rollback": "Pahile jaise kare waala badlao",
        "rollbacklink": "pahile jaise karo",
        "rollbacklinkcount": "$1 {{PLURAL:$1|edit|edits}} ke rollback karo",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|edit|edits}} se jaada badlao ke rollback karo",
        "rollbackfailed": "Pahile jaise kare ke kosis safal nai bhais",
+       "rollback-missingparam": "Maange par, required parameters nai hai.",
+       "rollback-missingrevision": "Badalo ke data ke nai load kare sakaa hai.",
        "cantrollback": "Badlao ke pahile jaise nai kare sakta hai;\nisse pahile waala sadasya ii panna ke khaali yogdaan de waala hai.",
        "alreadyrolled": "[[:$1]] by [[User:$2|$2]] ke pahile jaise nai kare sakta hai. ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\naur koi ii panna ke badal nai to pahile jaise kar diis hai.\n\nIi panna ke pichla badla [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) se rahaa",
        "editcomment": "Badlao ke summary rahaa: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadal ke $2 ke aakhri version kar dewa gais hai.",
+       "rollback-success-notify": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadlao ke $2 ke aakhri version kar dewa gais hai.[$3 Show changes]",
        "sessionfailure-title": "Session fail hoe gais hae",
        "sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke  \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.",
+       "changecontentmodel": "Panna ke content model ke badlo",
+       "changecontentmodel-legend": "Content model ke badlo",
+       "changecontentmodel-title-label": "Panna ke title",
+       "changecontentmodel-model-label": "Nawaa content model",
+       "changecontentmodel-reason-label": "Kaaran:",
+       "changecontentmodel-submit": "Badlo",
+       "changecontentmodel-success-title": "Content model ke badal dewaa gais hai",
+       "changecontentmodel-success-text": "The content type of [[:$1]] ke badlaa gais hai.",
+       "changecontentmodel-cannot-convert": "The content on [[:$1]] ke $2 ke rakam nai convert karaa jaae sake hai.",
+       "changecontentmodel-nodirectediting": "The $1 content model, direct editing ke nai support kare hai",
+       "changecontentmodel-emptymodels-title": "Koi content model nai hai",
+       "changecontentmodel-emptymodels-text": "The content on [[:$1]] ke koi bhi type me nai badlaa jaae sake hai.",
+       "log-name-contentmodel": "Content model ke change log",
+       "log-description-contentmodel": "Ii panna lists changes to the content model of pages, and pages that were created with a content model other than the default.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|created}} the page $3 using a non-default content model \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|changed}} the content model of the page $3 from \"$4\" to \"$5\"",
+       "logentry-contentmodel-change-revertlink": "pahile jaise karo",
+       "logentry-contentmodel-change-revert": "pahile jaise karo",
        "protectlogpage": "Surakchha suchi",
        "protectlogtext": "Panna surakchha ke suchi niche dewa gais hae.\nAbhi ke laabu panna surakchha ke dekho [[Special:ProtectedPages|protected pages list]] me",
        "protectedarticle": "bachawal \"[[$1]]\"",
        "modifiedarticleprotection": "[[$1]]\" ke protection level ke badal dia hai",
        "unprotectedarticle": "surakchha suchi \"[[$1]]\" me se hatawa gais",
        "movedarticleprotection": "protection settings ke \"[[$2]]\" se \"[[$1]]\" kae dia hai",
+       "protectedarticle-comment": "{{GENDER:$2|Protected}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Changed protection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removed protection}} from \"[[$1]]\"",
        "protect-title": "\"$1\" ke protection level ke badlo",
        "protect-title-notallowed": "\"$1\" ke protection level ke dekho",
        "prot_1movedto2": "[[$1]] ke naam badal ke [[$2]] kar dewa gae hai",
        "undeletepagetext": "Niche dekhawa gais {{PLURAL:$1|panna ke mitae dewa gais hai lekin|$1 panna ke mitae dewa gais hai lekin}} abhi archive me hai aur iske pahile jaise karaa jaawe sake hai.\nArchive ke time time se safaa karaa jaawe hai.",
        "undelete-fieldset-title": "Badlao ke pahile jaise karo",
        "undeleteextrahelp": "Panna ke itihaas ke pahile jaise kare ke khatir sab checkboxes me kuch nai karna aur ''''{{int:undeletebtn}}''''' ke click karo.\nChuna gais panna ke pahile jaise kare ke khatir, uu box ke check karo jon badlao ke aap pahile jaise kare mangta hai aur ''''{{int:undeletebtn}}''''' ke click karo.\n'''''Reset''''' click kare se comment field aur sab checkboxes clear hoe jaai.",
-       "undeleterevisions": "$1 {{PLURAL:$1|badlao|badlao}} ke archive kar dewa gais hai",
+       "undeleterevisions": "$1 {{PLURAL:$1|badlao}} ke mitae dewa gais hai",
        "undeletehistory": "Agar aap panna ke pahile jaise karaa tab sab badlao itihass me restore hoe jaai.\nAgar koi wahii naam ke nawaa panna mitae ke baad banaa hoi tab restore karaa gais badlao pahile ke itihass me dekhai.",
        "undeleterevdel": "Pahile jaise nai kare sakega agar isse uppar waala panna nai to file revision bhi delete hoe jaai.\nAisan time pe, aap ke chaahi ki aap sab se nawaa deleted revision ke uncheck nai to unhide karo.",
        "undeletehistorynoadmin": "Ii panna ke mitae dewa gais hai.\nMitae ke kaaran niche ke summary me dewa gais hai, aur iske saathe uu sadasya ke baare me bhi jaankari hai jon ki ii panna ke badle rahin.\nIi mitawa gais badlao ke baare me puura jankari khaali administrators ke mile sake hai.",
        "undelete-revision": "$1 ke badlao ke (as of $4, at $5) by $3 mitae dewa gais hai:",
        "undeleterevision-missing": "Badlao kharaab nai to pawa nai jaawe sake hai.\nSait aap ke kharaab link hoi, nai to badlao ke sait pahile jaise kar dewa gais hoi, nai to archive se mitae dewa gais hoi.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1 revisions}} could not be restored, because {{PLURAL:$1|its|their}} <code>rev_id</code> was already in use.",
        "undelete-nodiff": "Koi pahile ke badlao ke nai pawa gais hai.",
        "undeletebtn": "Pahile jaise kar do",
        "undeletelink": "dekho/pahile jaise karo",
        "undeletedrevisions": "{{PLURAL:$1|1 badlao|$1 badlao}} ke pahile jaise kar dewa gais hai",
        "undeletedrevisions-files": "{{PLURAL:$1|1 badlao|$1 badlao}} aur {{PLURAL:$2|1 file|$2 files}} ke pahile jaise kar dewa gais hai",
        "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} ke pahile jaise kar dewa gais hai",
-       "cannotundelete": "Undelete failed:\n$1",
+       "cannotundelete": "Kuchh, nai to sab undelete fail hoe gais hai:\n$1",
        "undeletedpage": "'''$1 ke pahile jaise kar dewa gais hai'''\n\nNawaa mitawa gais aur badlao ke ulta karaa gais panna ke dekhe ke khatir [[Special:Log/delete|deletion log]] ke dekho.",
        "undelete-header": "Nawaa mitawa gais panna ke dekhe ke khatir [[Special:Log/delete|the deletion log]] ke dekho.",
        "undelete-search-title": "Mitawa gais panna ke khojo",
        "contributions": "{{GENDER:$1|Sadasya}} ke yogdaan",
        "contributions-title": "$1 ke yogdaan",
        "mycontris": "Yogdaan",
+       "anoncontribs": "Yogdaan",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ke khatir",
        "contributions-userdoesnotexist": "User account \"$1\" register nai karaa gais hae",
        "nocontribs": "Ii critera ke rakam ke koi badlao nai pawa gais hai.",
        "sp-contributions-newbies-sub": "Nawaa account khatir",
        "sp-contributions-newbies-title": "Nawaa account ke sadasya ke yogdaan",
        "sp-contributions-blocklog": "Suchi roko",
-       "sp-contributions-suppresslog": "Sadasya ke yogdaan jiske suppress karaa gais hae",
-       "sp-contributions-deleted": "Mitawa gais adasya ke yogdaan",
+       "sp-contributions-suppresslog": "{{GENDER:$1|sadasya}}  ke yogdaan jiske suppress karaa gais hae",
+       "sp-contributions-deleted": "Mitawa gais {{GENDER:$1|sadasya}} ke yogdaan",
        "sp-contributions-uploads": "upload karaa gais file",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "baat",
        "sp-contributions-username": "IP Address nai to username:",
        "sp-contributions-toponly": "Khaali sab se nawaa badlao ke dekhao",
        "sp-contributions-newonly": "Khaali uu badlao ke dekhao jon ke panna banae waala hae",
+       "sp-contributions-hideminor": "Chhotaa badlao ke lukao",
        "sp-contributions-submit": "Khojo",
        "whatlinkshere": "Hian konchij jurre hae",
        "whatlinkshere-title": "Panna jon ki $1 se jurre hai",
        "whatlinkshere-prev": "{{PLURAL:$1|pahile waala|pahile waala $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|aage waala|aage waala $1}}",
        "whatlinkshere-links": "← jorr",
-       "whatlinkshere-hideredirs": "$1 redirects",
-       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hideredirs": "$1 redirect",
+       "whatlinkshere-hidetrans": "$1 transclusion",
        "whatlinkshere-hidelinks": "$1 jorr",
        "whatlinkshere-hideimages": "$1 file ke jorr",
        "whatlinkshere-filters": "Filters",
+       "whatlinkshere-submit": "Jaao",
        "autoblockid": "#$1 ke apne se block karo",
        "block": "Sadasya ke roko",
        "unblock": "Sadasya ke rukawat k khalaas karo",
        "blockip": "{{GENDER:$1|sadasya}} ke roko",
        "blockip-legend": "Sadasya ke roko",
-       "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir use kare ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nNiche ek khaas kaaran likho (jaise ki, citing particular pages that were vandalized).",
+       "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir kaam me laae ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nFill in a specific reason below (for example, citing particular pages that were vandalized).\nYou can block IP address ranges using the [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; the largest allowed range is /$1 for IPv4 and /$2 for IPv6.",
        "ipaddressorusername": "IP Address nai to username:",
        "ipbexpiry": "Expiry:",
        "ipbreason": "Kaaran:",
        "ipb-unblock": "Ek username nai to IP address ke rukawat ke khalaas karo",
        "ipb-blocklist": "Abhi ke rukawat ke dekho",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} ke yogdaan",
+       "ipb-blocklist-duration-left": "$1 left",
        "unblockip": "Sadasya ke rukawat ke khalaas karo",
        "unblockiptext": "Niche ke form ke use kar ke pahile roka gais IP address nai to username ke likhe ke adhikar do.",
        "ipusubmit": "Ii rukawat ke hatao",
        "block-log-flags-hiddenname": "username ke lukae dewa gais hai",
        "range_block_disabled": "Administrator ke adhikar, jisse range block banawa jaawat rahaa, ke rok dewa gais hai.",
        "ipb_expiry_invalid": "Khalaas hoe waala time galat hai.",
+       "ipb_expiry_old": "Khalas hoe waala time past me hai.",
        "ipb_expiry_temp": "Lukawa gais username ke rukawat ke permanent hoe ke chaahi.",
        "ipb_hide_invalid": "Ii account ke dabae nai sakaa hai; saait {{PLURAL:$1|one edit|$1 edits}} se jaada badlao hae.",
        "ipb_already_blocked": "\"$1\" ke pahile rok dewa gais hai",
        "proxyblockreason": "Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai.\nMeharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.",
        "sorbsreason": "DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.",
        "sorbs_create_account_reason": "DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.\nAap ke ek account banae ke ijajat nai hai",
+       "softblockrangesreason": "Anonymous contributions are not allowed from your IP address ($1). Please log in karo.",
        "xffblockreason": "Ek IP address jon ki X-Forwarded-For header me hae, chaahe aap ke nai to jon proxy server ke aap use kartaa hae ke, ke block kar dewa gais hae. Suruu waala block kare ke kaaran rahaa:$1",
        "cant-see-hidden-user": "Jon sadasya ke aap roke mangtaa hae ke pahile rok ke lukae dewa gais hae.\nJab ki aap ke lage hideuser adhikaar nai hae, tab aap ii sadasya ke rukawat ke nai dekhe aur badle saktaa hae.",
        "ipbblocked": "Aap duusra sadasya ke roke nai to kohle nai sakta hae, kaahe ki aap ke bhi rokaa gais hae",
        "lockdbsuccesstext": "Database ke band kar dewa gais hai.<br />\nYaad kar ke [[Special:UnlockDB|lock ke hatae dena]] maintenance khalaas kare ke baad.",
        "unlockdbsuccesstext": "Database ke khol dewa gais hai.",
        "lockfilenotwritable": "Database lock file me likha nai jaawe sake hai.\nDatabase ke khole nai to band kare ke khatir, iske web server se likhe ke laayek hoe ke chaahi",
+       "databaselocked": "Database already band hai.",
        "databasenotlocked": "Database band nai hai.",
        "lockedbyandtime": "(se {{GENDER:$1|$1}} pe $2 hian $3)",
        "move-page": "$1 ke naam badlo",
        "move-page-legend": "Panna ke naam badlo",
-       "movepagetext": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nAap uu redirect, jon ki pahile waala title pe jawe hai, ke update kare sakta hai.\nAgar aap ii nai kare mangta hai, tab [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karna.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
-       "movepagetext-noredirectfixer": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nIi jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n'''CHETAWANI'''\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
-       "movepagetalktext": "Saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\n* Aap nivhe waala box ke uncheck karo\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
+       "movepagetext": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nAap uu redirect, jon ki pahile waala title pe jawe hai, ke update kare sakta hai.\nAgar aap ii nai kare mangta hai, tab [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karna.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move <strong>nai</strong> hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n<strong>CHETAWANI</strong>\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
+       "movepagetext-noredirectfixer": "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.\nPuraana title nawaa title pe redirect hoe jaai.\nIi jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.\nAap ke jimewaari hai ki dekho ki links right jagah point kare hai.\n\nKhayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move <strong>nai</strong> hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.\nIske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.\n\n<strong>CHETAWANI</strong>\nIi ek lokpriye panna ke galti se badal de sake hai;\nmeharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
+       "movepagetalktext": "Agar aap box ke tick karaa tab, saathe ke talk panna ke automatically move kar dewa jai ii panna ke saathe '''agar jo:'''\n* khali nahi talk page nawaa naam ke already hai, yah\nIi prastithi me, aap ke manually move yah merge kare ke parri.",
        "moveuserpage-warning": " '''Chetauni:'''  Aap ek sadasya ke panna ke naam badle waala hae. Ii yaad rakhna ki khaali panna ke naam badla jaai, sadasya ke naam ''nai'' badlaa jaai.",
        "movecategorypage-warning": "<strong>Chetauni:</strong> Aap ek category panna ke hatae waala hae. Khaali ii panna ke hataawa jaai aur purana category ke aur panna ke nawaa category me <em>nai</em>  recategorize karaa jaai.",
        "movenologintext": "Panna ke naam badle ke khatir aap ke ek registered sadasya rahe ke parri aur  [[Special:UserLogin|logged in]].",
        "cant-move-to-user-page": "Aap ke koi panna ke hatae ke sadasya ke panna pe kare ke ijajat nai hai (sadasya ke subpage ke chhorr ke).",
        "cant-move-category-page": "Aap ke panna ke category panna ke hatae ke ijajat nai hai.",
        "cant-move-to-category-page": "Aap ke panna ke category panna me hatae ke ijajat nai hai.",
-       "newtitle": "Nawaa title pe:",
+       "cant-move-subpages": "Aap ke subpages ke naam badle ke ijajat nai hai.",
+       "namespace-nosubpages": "Namespace \"$1\" subpages ke nai allow kare hai.",
+       "newtitle": "Nawaa title:",
        "move-watch": "Ii panna pe dhyan rakho",
        "movepagebtn": "Panna ke naam badlo",
        "pagemovedsub": "Panna ke naam badle me safalta",
        "movelogpagetext": "Niche sab panna, jiske naam badla gais hai, ke suchi hai.",
        "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
        "movesubpagetext": "Ii panna me $1 {{PLURAL:$1|subpage|subpages}} hai jiske niche dekhawa gais hai.",
+       "movesubpagetalktext": "Corresponding baat waala panna $1 {{PLURAL:$1|subpage|subpages}} ke niche dekhawa gais hai.",
        "movenosubpage": "Ii panna me koi subpages nai hai.",
        "movereason": "Kaaran:",
        "revertmove": "purana copy pe lae jao",
-       "delete_and_move_text": "== Mitae ke jaruri hai ==\nDestination panna \"[[:$1]]\" abhi hai.\nKa aap mangta hai ki iske mitae dewa jaae, jisse ki ii naam se duusra paana ke save karaa jaae sake?",
+       "delete_and_move_text": "Destination panna \"[[:$1]]\" abhi hai.\nKa aap mangta hai ki iske mitae dewa jaae, jisse ki ii naam se duusra paana ke save karaa jaae sake?",
        "delete_and_move_confirm": "Haan, panna ke mitao",
        "delete_and_move_reason": "\"[[$1]]\" se move kare ke khatir isk mitaya",
        "selfmove": "Source aur destination title ke naam ekke hai;\npanna ke wahi ke uppar nai save karaa jaae sake hai.",
        "move-leave-redirect": "Ek redirect ke pichhe chhorro",
        "protectedpagemovewarning": "Chetauni: Ii panna ke band kar dewa gais hai jisse ki khaali administrator logan iske naam badle sake hai.\nAap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
        "semiprotectedpagemovewarning": "Dhyan me rakhna: Ii panna ke band kar dewa gais hai jisse ki khaali registered sadasya iske naam badle sake hai.\nAap ke jaankari ke khatir sab se nawaa suchi ke niche dewa gais hae:",
-       "move-over-sharedrepo": "==File hae==\n[[:$1]] shared repository me hae. Ek file ke naam badal ke ii naam kare se shared file mit jaai.",
+       "move-over-sharedrepo": "[[:$1]] shared repository me hae. Ek file ke naam badal ke ii naam kare se shared file mit jaai.",
        "file-exists-sharedrepo": "Jon file ke naam ke chuna gais hae, pahile se shared repository me hae.\nMeharbani kar ke duusra naam do.",
        "export": "Panna niryat karo",
        "exporttext": "Aap ek khaas panna, nai to dher panna jon ki XML me bandha hai, ke text aur balao ke itihass ke export kare saktaa hai.\nIske duusra wiki me MediaWiki [[Special:Import|import panna]] se import karaa jaawe sake hai.\n\nPanna ke export kare ke khatir titles ke niche ke text box me likho, ek line pe ek title, aur ii select karo ki aap abhi ke version ke saathe purana version mangtaa hai, panna ke itihaas ke saathe, nai to abhi ke version jisme last badlao ke jankari hai.\n\nDuusra case me aap ek link ke bhi use kare saktaa hai, jaise ki [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] panna ke khatir \"[[{{MediaWiki:Mainpage}}]]\".",
        "export-download": "Save as file",
        "export-templates": "Templates ke include karo",
        "export-pagelinks": "Include linked pages to a depth of:",
+       "export-manual": "Panna ke manually jorro",
        "allmessages": "System sandesh",
        "allmessagesname": "Naam",
        "allmessagesdefault": "Default text",
        "import-interwiki-history": "Ii panna ke sab badlao ke itihaas ke copy karo",
        "import-interwiki-templates": "Sab template ke include karo",
        "import-interwiki-submit": "Import karo",
+       "import-mapping-default": "Default locations pe import karo",
+       "import-mapping-namespace": "Name space pe import karo:",
+       "import-mapping-subpage": "Import as subpages of the following page:",
        "import-upload-filename": "File ke naam:",
        "import-comment": "Aapan bichar do:",
        "importtext": "Meharbani kar ke file ke [[Special:Export|export utility]] use kar ke source wiki me se export karo.\nAapan computer me save kar ke  hian pe upload karo.",
        "import-nonewrevisions": "Koi badalo ke import nai karaa gais hae (sab ke chaahe pahile import karaa gais rahaa, nai to error ke kaaran skip karaa gais rahaa).",
        "xml-error-string": "$1 line $2 me, col $3 (byte $4): $5",
        "import-upload": "XML data ke upload karo",
-       "import-token-mismatch": "Loss of session data.\nMeharbani kar ke, fir se kosis karo.",
+       "import-token-mismatch": "Loss of session data.\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "import-invalid-interwiki": "Naam dewa gais wiki se import nai kare saktaa hai.",
        "import-error-edit": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke badle ke adhikar nai hae.",
        "import-error-create": "Panna \"$1\" ke import nai kara gais kaahe ki aap ke panna banae ke adhikar nai hae.",
        "javascripttest": "JavaScript ke testing",
        "javascripttest-pagetext-unknownaction": "Unknown action \"$1\".",
        "javascripttest-qunit-intro": "mediawiki.org me [$1 testing documentation] ke dekho.",
-       "tooltip-pt-userpage": "Aap ke sadasya panna",
+       "tooltip-pt-userpage": "{{GENDER:|Aap ke user}} panna",
        "tooltip-pt-anonuserpage": "IP jisme se aap edit karta hai ke sadasya panna",
-       "tooltip-pt-mytalk": "Aap ke baat waala panna",
+       "tooltip-pt-mytalk": "{{GENDER:|Aap ke}} baat waala panna",
        "tooltip-pt-anontalk": "Ii IP address se badlao pe salah",
-       "tooltip-pt-preferences": "Hamaar pasand",
+       "tooltip-pt-preferences": "{{GENDER:|Aap ke}} pasand",
        "tooltip-pt-watchlist": "Panna ke suchi jispe aap dhyan rakhaa hae",
-       "tooltip-pt-mycontris": "Aap ke yogdaan ke suchi",
+       "tooltip-pt-mycontris": "{{GENDER:|Aap ke}} yogdaan ke suchi",
+       "tooltip-pt-anoncontribs": "Ii IP address se badlao karaa gais chij ke suchi",
        "tooltip-pt-login": "Aap log in kartaa tab achchha rahataa; lekin jaruri nai hae.",
        "tooltip-pt-logout": "Log out",
        "tooltip-pt-createaccount": "Aap ke ek account banae ke log in kare ke encourage karaa jaae hae; lekin iske jaruri nai hae",
        "tooltip-ca-talk": "Content waala panna ke baare me salah",
-       "tooltip-ca-edit": "Aap ii panna ke badle sakta hai. Meherbaani kar ke bachae se pahile preview button ke kaam me laana.",
+       "tooltip-ca-edit": "Ii panna ke badlo",
        "tooltip-ca-addsection": "Nawaa section suruu karo",
        "tooltip-ca-viewsource": "Ii panna surakchhit hai. Aap iske sooti dekhe sakta hai.",
        "tooltip-ca-history": "Ii panna ke pahile ke badlao",
        "tooltip-t-recentchangeslinked": "Panna jon ki ii panna se jurra hai ke nawaa badlao",
        "tooltip-feed-rss": "Ii panna ke khatir RSS feed",
        "tooltip-feed-atom": "Ii panna ke khatir atom feed",
-       "tooltip-t-contributions": "Ii sadasya ke yogdaan ke suchi dekho",
-       "tooltip-t-emailuser": "Ii user ke lage ek mail bhejo",
+       "tooltip-t-contributions": "Yogdaan ke suchi dekho {{GENDER:$1|ii sadasya se}}",
+       "tooltip-t-emailuser": "Email bhejo {{GENDER:$1|ii sadasya}} ke lage",
        "tooltip-t-info": "Ii panna ke bare me aur jankari",
        "tooltip-t-upload": "File upload karo",
        "tooltip-t-specialpages": "Sab khaas panna ke suchi",
        "tooltip-ca-nstab-category": "Vibhag panna ke dekho",
        "tooltip-minoredit": "Ii badlao ke chhota badlao ke chihna lagao",
        "tooltip-save": "Aapan badlao ke bachao",
+       "tooltip-publish": "Aapan panna ke publish karo",
        "tooltip-preview": "Badlao ke preview karo, bachae se pahile!",
        "tooltip-diff": "Dekhao ki aap kon chij badlaa hae",
        "tooltip-compareselectedversions": "Ii panna ke dui chuna gais version ke antar dekho.",
        "lastmodifiedatby": "Ii panna ke aakhri dafe $3 badlis rahaa $2, $1.",
        "othercontribs": "Ii $1 ke kaam pe based hae.",
        "others": "duusra jane",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|sadasya|sadasya}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|sadasya}} $1",
        "anonusers": "{{SITENAME}} benaam {{PLURAL:$2|sadasya|sadasya}} $1",
        "creditspage": "Panna ke credit",
        "nocredits": "Ii panna ke khatir koi credit ke baare me jaankari nai hai.",
        "spam_reverting": "Pahile waala badalo, jisme $1 se link nai hai, pe karaa jaawe hai",
        "spam_blanking": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
        "spam_deleting": "Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai",
-       "simpleantispam-label": "Anti-spam check.\nIske fill <strong>NAI</strong> karo!",
+       "simpleantispam-label": "Anti-spam check.\nIske fill <strong>nai</strong> karo!",
        "pageinfo-title": "\"$1\" ke khatir jaankari",
        "pageinfo-not-current": "Maaf karna, lekin purana badlao ke baare me ii jaankari nai de saktaa hae.",
        "pageinfo-header-basic": "Basic jaankari",
        "pageinfo-length": "Panna ke lambai (bytes me)",
        "pageinfo-article-id": "Panna ke ID",
        "pageinfo-language": "Panna ke bhasa",
+       "pageinfo-language-change": "badlo",
        "pageinfo-content-model": "Page content model",
+       "pageinfo-content-model-change": "badlo",
        "pageinfo-robot-policy": "Robots se indexing",
        "pageinfo-robot-index": "Ijajat hae",
        "pageinfo-robot-noindex": "Ijajat nai hae",
        "pageinfo-watchers": "Ketnaa jane panna ke dekhe hae",
+       "pageinfo-visiting-watchers": "Etna page wathchers recent edits ke visit karin hai",
        "pageinfo-few-watchers": "$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae",
+       "pageinfo-few-visiting-watchers": "There may or may not be a watching user visiting recent edits",
        "pageinfo-redirects-name": "Ii panna me etna redirect hae",
        "pageinfo-subpages-name": "Ii panna ke subpage",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
        "pageinfo-protect-cascading-yes": "Haan",
        "pageinfo-protect-cascading-from": "Protections isse cascade hoe hae",
        "pageinfo-category-info": "Category ke bare me jaankari",
+       "pageinfo-category-total": "Sadasya ke total",
        "pageinfo-category-pages": "Ketnaa panna hae",
        "pageinfo-category-subcats": "Etnaa subcategories hae",
        "pageinfo-category-files": "Etnaa file hae",
+       "pageinfo-user-id": "Sadasya ke ID",
        "markaspatrolleddiff": "Mark karo ke pahraa dewa jaawe hai",
        "markaspatrolledtext": "Mark karo ki panna pe pahraa dewa jaawe hai",
+       "markaspatrolledtext-file": "Mark this file version as patrolled",
        "markedaspatrolled": "Mark karo ke pahraa dewa jaawe hai",
        "markedaspatrolledtext": "Pasand karaa gais [[:$1]]  ke badlao pe pahraa dewa jaawe hai",
        "rcpatroldisabled": "Nawaa badlao pe pahraa de ke ijajat nai hai",
        "patrol-log-page": "Pahraa de waala suchi",
        "patrol-log-header": "Ii pahraa dewa gais badlao ke suchi hai.",
        "log-show-hide-patrol": "$1 pahraa de waala suchi",
+       "log-show-hide-tag": "$1 tag log",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Mark karo ki ii revision $3 of $2 patrolled hai?",
        "deletedrevision": "Purana badlao ke mitae dia hai $1",
        "filedeleteerror-short": "File ke mitae me galti hoe gais: $1",
        "filedeleteerror-long": "File ke mitae ke time garrbarr hoe gais:\n\n$1",
        "svg-long-error": "SCG file valid nai hae: $1",
        "show-big-image": "Original file",
        "show-big-image-preview": "Ii preview ke size: $1",
+       "show-big-image-preview-differ": "Size of this $3 preview of this $2 file: $1.",
        "show-big-image-other": "Duusra {{PLURAL:$2|resolution|resolutions}}: $1",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "Ghuum ghumae ke wahii jagha pe aawe hae",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
        "newimages-showbots": "Bots se upload dekhawa jaae hae",
+       "newimages-hidepatrolled": "Patrolled uploads ke lukao",
        "noimages": "Koi chij dekhe ke nai hai.",
+       "gallery-slideshow-toggle": "Toggle thumbnails",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
        "sp-newimages-showfrom": " $2, $1 se suruu kar ke nawaa file ke dekhao",
        "exif-compression-4": "CCITT Group 4 fax ke encoding",
        "exif-copyrighted-true": "Copyright karaa gais hae",
        "exif-copyrighted-false": "Copyright status ke nai set karaa gais hae",
+       "exif-photometricinterpretation-1": "Kariyaa aur ujjar (Kariyaa 0 hai)",
        "exif-unknowndate": "Taarik nai maalum",
        "exif-orientation-1": "Saamaan",
        "exif-orientation-2": "Baraabar ultawa gais hae",
        "confirmemail_body_set": "Koi, hoe sake aap IP address $1 se, ek account \"$2\" with this email address on {{SITENAME}} ke set karis hae.\n\nIi confirm kare ke khatir ki asliyat me ii acount aap ke hae, {{SITENAME}} me email features ke activate karo, aur aapan browser me ii link ke kholo:\n\n$3\n\nAgar aapa ii account ke nai register karaa hae, ii link ke follow karo aur email address confirmation ke cancel karo:\n\n$5\n\nIi confirmation code $4 ke expire hoi.",
        "confirmemail_invalidated": "Email address confirmation ke cancel kae dewa gais hae",
        "invalidateemail": "Email confirmation ke cancel karo",
+       "notificationemail_subject_changed": "{{SITENAME}} ke registered email address ke badal dewa gais hai",
+       "notificationemail_subject_removed": "{{SITENAME}} ke registered email address ke hatae dewa gais hai",
+       "notificationemail_body_changed": "Koi jan, hoe sake aap, IP address $1 se,\nemail address ke badlis hai account \"$2\" to \"$3\" {{SITENAME}} pe.\n\nAgar ii aap nai hai to ek site administrator ke contact karo",
+       "notificationemail_body_removed": "Koi jan, hoe sake aap, IP address $1 se,\nemail address ke hate diis hai, account \"$2\" {{SITENAME}} pe.\n\nAgar ii aap nai hai to ek site administrator ke contact karo",
        "scarytranscludedisabled": "[Interwiki transcluding ke disable kar dewa gais hae]",
        "scarytranscludefailed": "[Template fetch $1 ke khatir fail hoe gais hae]",
        "scarytranscludefailed-httpstatus": "[$1: HTTP $2 ke khatir template fetch fail hoe gais hae]",
        "scarytranscludetoolong": "[URL bahut lambaa hae]",
        "deletedwhileediting": "'''Chetauni:''' Aap ke editing suruu kare ke baad ii panna ke delete kar dewa gais hae!",
-       "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) mitae dewa gais ii pannaa aap ke badlao suruu kare ke baad, ii kaaran se: ''$2''\nMeharbaani kar ke confirm karo ki aap ii panna ke fir banae mangtaa hae.",
-       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) mitae dewa gais ii pannaa aap ke badlao suruu kare ke baad.\nMeharbaani kar ke confirm karo ki aap ii panna ke fir banae mangtaa hae.",
+       "confirmrecreate": "Sadasya [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|mitais}} ii panna after you started editing with reason:\n: <em>$2</em>\nMeharbaani kar ke ii confirm karo ki aap asliyat me ii panna ke fir se banae mangtaa hai.",
+       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]){{GENDER:$1|deleted}} this page after you started editing. Please confirm that you really want to recreate this page.",
        "recreate": "Fir se banao",
        "confirm_purge_button": "Thik hae",
        "confirm-purge-top": "Ii panna ke cache ke mitao",
        "confirm-watch-top": "Ii panna ke aap ke dhyan suchi me jorro?",
        "confirm-unwatch-button": "Thiik hae",
        "confirm-unwatch-top": "Ii panna ke aap ke dhyan suchi se hatao?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ii panna ke badlao ke pahile jaise karo?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pahile waala panna",
        "imgmultipagenext": "aage waala panna →",
        "watchlistedit-raw-done": "Aap ke watchlist ke update kar dewa gais hae.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
-       "watchlistedit-clear-title": "Watchlist ke clear karaa gais hae",
+       "watchlistedit-clear-title": "Watchlist ke clear karo",
        "watchlistedit-clear-legend": "Watchlist ke clear karo",
        "watchlistedit-clear-explain": "Aap ke watchlist me se sab title ke hatae dewa jaai",
        "watchlistedit-clear-titles": "Titles:",
        "watchlisttools-edit": "Dhyan suchi ke dekho aur badlo",
        "watchlisttools-raw": "Dhyan suchi ke apne sampadan karo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-local": "Local",
        "duplicate-defaultsort": "'''Chetauni:''' Default sort key \"$2\" pahile ke default sort key \"$1\" ke override kare hae.",
        "duplicate-displaytitle": "<strong>Chetauni:</strong> Display title \"$2\" pahile ke display title \"$1\" ke override kare hae.",
+       "restricted-displaytitle": "<strong>Chetauni:</strong> Display title \"$1\" was ignored since it is not equivalent to the page's actual title.",
        "invalid-indicator-name": "<strong>Error:</strong> Panna status indicators' <code>naam</code> attribute khaali nai rahe sake hae.",
        "version": "Badlao",
        "version-extensions": "Installed extensions",
        "version-libraries": "Installed libraries",
        "version-libraries-library": "Library",
        "version-libraries-version": "Version",
+       "version-libraries-license": "License",
+       "version-libraries-description": "Baare me",
+       "version-libraries-authors": "Likhe waale",
        "redirect": "File, sadasya, panna, nai to, revision ID se redirect",
        "redirect-summary": "Ii khaas panna ek file (given the filename), panna (given a revision ID or page ID), nai to, sadasya ke panna (given a numeric user ID) pe redirect hoe hae.  Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Jaao",
        "redirect-page": "Sadasya ke ID",
        "redirect-revision": "Panna ke revision",
        "redirect-file": "Filename",
+       "redirect-logid": "Log ID",
        "redirect-not-exists": "Value ke nai paawa gais hae",
        "fileduplicatesearch": "Duplicate files ke khojo",
        "fileduplicatesearch-summary": "Duplicate files based on hash values ke khojo.",
        "tag-filter": "[[Special:Tags|Tag]] filter karo:",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tag-mw-contentmodelchange": "Content model ke badlao",
+       "tag-mw-contentmodelchange-description": "Badlao, jon ki [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] of a page",
        "tags-title": "Tags",
        "tags-intro": "Ii panna uu tag ke list kare hae jiske software edit with, aur their meaning se mark kare hae.",
        "tags-tag": "Tag ke naam",
        "tags-actions-header": "Actions",
        "tags-active-yes": "Haan",
        "tags-active-no": "Nai",
-       "tags-source-extension": "Ek extension se define hoe hae",
+       "tags-source-extension": "Software define karis hai",
        "tags-source-manual": "Sadasya aur bot se manually apply karaa jaawe hae",
        "tags-source-none": "Ab iske kaam me nai lawa jaae hae",
        "tags-edit": "badlo",
        "tags-deactivate": "deactivate karo",
        "tags-hitcount": "$1 {{PLURAL:$1|badlao|badlao}}",
        "tags-manage-no-permission": "Aap ke change tags ke manage kare ke ijaajat nai hae.",
+       "tags-manage-blocked": "Aap tags ke nai badle saktaa hai, jab {{GENDER:$1|aap}} blocked hai.",
        "tags-create-heading": "Ek nawaa tag ke banao",
        "tags-create-explanation": "Default se, jon nawaa tag banawa gais hae ke sadasya aur bots ke kaam me laae khatir dewa jaai.",
        "tags-create-tag-name": "Tag ke naam:",
        "tags-delete-title": "Tag ke delete karo",
        "tags-delete-explanation-initial": "Aap tag \"$1\" ke database se mitae waala hae.",
        "tags-delete-explanation-in-use": "Iske {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} se hatae dewa jaai jahaan pe it is currently applied.",
+       "tags-delete-explanation-warning": "Ii action <strong>irreversible</strong> hai aur <strong>cannot be undone</strong>, not even by database administrators. Be certain this is the tag you mean to delete.",
+       "tags-delete-explanation-active": "<strong>Ii tag \"$1\" abhi bhi active hai, and will continue to be applied in the future.</strong> To stop this from happening, go to the place(s) where the tag is set to be applied, and disable it there.",
        "tags-delete-reason": "Kaaran:",
+       "tags-delete-submit": "Irreversibly delete this tag",
+       "tags-delete-not-allowed": "Tags jiske ek an extension  se define karaa gais hai, ke nai mataawa jaae sake hai unless the extension specifically allows it.",
+       "tags-delete-not-found": "Tag \"$1\" nai hai.",
+       "tags-delete-too-many-uses": "Tag \"$1\" ke $2 {{PLURAL:$2|revision|revisions}} time se jaada apply karaa gais hai, jiske matalab hai is iske mitaawa nai jaae sake hai.",
+       "tags-delete-warnings-after-delete": "Tag \"$1\" ke mitae dewa gais rahaa, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
+       "tags-delete-no-permission": "Aap ke change tags ke mitae ke ijaajat nai hae.",
+       "tags-activate-title": "Tag ke activate karo",
+       "tags-activate-question": "Aap tag \"$1\" ke activate kare waala hai.",
+       "tags-activate-reason": "Kaaran:",
+       "tags-activate-not-allowed": "Tag \"$1\" ke nai activate karaa jaae sake hai.",
+       "tags-activate-not-found": "Tag \"$1\" nai hai.",
+       "tags-activate-submit": "Activate karo",
+       "tags-deactivate-title": "Tag ke Deactivate karo",
+       "tags-deactivate-question": "Aap tag \"$1\" ke deactivate kare waala hai.",
+       "tags-deactivate-reason": "Kaaran:",
+       "tags-deactivate-not-allowed": "Tag \"$1\" ke deactivate nai karaa jaae sake hai.",
+       "tags-deactivate-submit": "Deactivate karo",
+       "tags-apply-no-permission": "Aap ke lage, aapan badlao ke saathe, tag ke badle ke ijaajat nai hai.",
+       "tags-apply-blocked": "Aap ke lage, aapan badlao ke saathe, tag ke badle ke ijaajat nai hai jab ke {{GENDER:$1|aap}} blocked hai.",
+       "tags-apply-not-allowed-one": "Tag \"$1\" ke manually apply kare ke ijaajat nai hai.",
+       "tags-apply-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually apply nai karaa jaae sake hai: $1",
+       "tags-update-no-permission": "Aap ke lage individual revisions nai to log entries pe tags ke jorre aur hatae ke adhikaar nai hai.",
+       "tags-update-blocked": "Aap tags ke nai hatae saktaa hai, jab {{GENDER:$1|aap}} blocked hai.",
+       "tags-update-add-not-allowed-one": "Tag \"$1\" ke manually jorre ke ijaajat nai hai.",
+       "tags-update-add-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually jorra nai jaae sake hai: $1",
+       "tags-update-remove-not-allowed-one": "Tag \"$1\" ke hatae ke adhikaae nai hai.",
+       "tags-update-remove-not-allowed-multi": "Niche ke {{PLURAL:$2|tag}} ke manually hataawa nai jaae sake hai: $1",
+       "tags-edit-title": "Tags ke badlo",
+       "tags-edit-manage-link": "Tags ke manage karo",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Chunaa gais badlao}} [[:$2]] ke:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Chuna gais log event}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|Ii badlao|sab $1 badlao}} se tag ke jorro , nai to hatao",
+       "tags-edit-logentry-legend": "{{PLURAL:$1|Ii log entry se|sab $1 log entry}} se tag ke jorro, nai to hatao",
+       "tags-edit-existing-tags": "Abhi ke tag:",
+       "tags-edit-existing-tags-none": "<em>Kuchh bhi nai</em>",
+       "tags-edit-new-tags": "Nawaa tag:",
+       "tags-edit-add": "Ii tag ke jorro:",
+       "tags-edit-remove": "Ii tag ke hatao:",
+       "tags-edit-remove-all-tags": "(sab tag ke hatao)",
+       "tags-edit-chosen-placeholder": "Kuchh tag ke select karo",
+       "tags-edit-chosen-no-results": "Uu match se koi tag nai milaa",
+       "tags-edit-reason": "Kaaran:",
+       "tags-edit-revision-submit": "{{PLURAL:$1|Ii badlao|$1 badlao}} pe changes ke apply karo",
+       "tags-edit-logentry-submit": "{{PLURAL:$1|Ii log entry|$1 log entry}} pe changes ke apply karo",
+       "tags-edit-success": "Badlao ke apply kar dewa gais hai.",
+       "tags-edit-failure": "Balao ke nai apply karaa jaae sakaa gais hai:\n$1",
+       "tags-edit-nooldid-title": "Target revision jon ki valid nai hai",
+       "tags-edit-nooldid-text": "Aap saait koi target revision ke nai specify karaa hai, jispe ii function perfom karaa jaae sake hai, nai to specified revision does not exist.",
+       "tags-edit-none-selected": "Meharbaani kar ke ek tag ke chuno jiske jorra, nai to, hataawa jaae sake hai.",
        "comparepages": "Panna ke biich me antar dekho",
        "compare-page1": "Panna 1",
        "compare-page2": "Panna 2",
        "htmlform-cloner-create": "Aur add karo",
        "htmlform-cloner-delete": "Remove karo",
        "htmlform-cloner-required": "Kamti se kamti ek value ke jaruri hae",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Jon value ke aap specify karaa hai, ke date nai maana jaawe hai. Format YYYY-MM-DD ke use kare ke kosis karo.",
+       "htmlform-time-invalid": "Jon value ke aap specify karaa hai, ke time nai maana jaawe hai. Format HH:MM:SS ke use kar ke format kare ke kosis karo.",
+       "htmlform-datetime-invalid": "Jon value ke aap specify karaa hai, ke date nai maana jaawe hai. Format YYYY-MM-DD HH-MM-SS ke use kar ke format kare ke kosis karo.",
+       "htmlform-date-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed date $1 se pahile hai:",
+       "htmlform-date-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed date ke baad hai:$1",
+       "htmlform-time-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed time $1 se pahile hai",
+       "htmlform-time-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed time $1 ke baad hai.",
+       "htmlform-datetime-toolow": "Jon value ke aap specify karaa hai, sab se puraana allowed date $1 se pahile hai.",
+       "htmlform-datetime-toohigh": "Jon value ke aap specify karaa hai, sab se nawaa allowed date $1 ke baad hai.",
+       "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
+       "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
+       "htmlform-title-not-exists": "$1 nai hae",
+       "htmlform-user-not-exists": "<strong>$1</strong> nai hai.",
+       "htmlform-user-not-valid": "<strong>$1</strong> valid username nai hai.",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} panna $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} panna $3: $4 pe",
        "revdelete-uname-unhid": "username ke lukawa gais hae",
        "revdelete-restricted": "sysops pe llabu restrictions",
        "revdelete-unrestricted": "sysops se hatawa gae rukawat",
+       "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|imported}} $3 from $5 ($4 {{PLURAL:$4|revision|revisions}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moved}} panna $3 se $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} panna $3 se $4 without leaving a redirect",
        "logentry-newusers-create2": "Sadasya $3 ke account  {{GENDER:$2|created}} ke $1 banais hae.",
        "logentry-newusers-byemail": "Sadasya $3 ke account {{GENDER:$2|created}} ke $1 banais hae  aur password ke email se bheja gais hae",
        "logentry-newusers-autocreate": "Sadasya $1 ke account {{GENDER:$2|created}} ke automatically banawa gais hae",
-       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir $4 se lai ke $5 talak",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|moved}} protection settings from $4 to $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removed}} protection from $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection level for $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection level for $3 $4 [cascading]",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$6|$3}} from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group ke membership $3 ke khatir",
        "logentry-rights-autopromote": "$1 ke apne se $4 se $5 {{GENDER:$2|promoted karaa gais hae}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|uploaded}} a new version of $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|upload karaa gais hae}} $3",
+       "log-name-managetags": "Tag management log",
+       "log-description-managetags": "Ii panna me [[Special:Tags|tags]] ke suchi hai.\nThe log contains only actions carried out manually by an administrator; tags may be created or deleted by the wiki software without an entry being recorded in this log.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|created}} the tag \"$4\"",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|deleted}} the tag \"$4\" (removed from $5 {{PLURAL:$5|revision or log entry|revisions and/or log entries}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|activated}} the tag \"$4\" for use by users and bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|deactivated}} the tag \"$4\" for use by users and bots",
+       "log-name-tag": "Tag log",
+       "log-description-tag": "Ii panna sadasya ke dekhae hai jab uu [[Special:Tags|tags]] ke jorre, nai to, hatae hai, individual revision, nai to, log entries se. The log does not list tagging actions when they occur as part of an edit, deletion, or similar action.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to revision $4 of page $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to log entry $5 of page $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from revision $4 of page $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from log entry $5 of page $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|updated}} tags on revision $4 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|updated}} tags on log entry $5 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
        "rightsnone": "(koi nai hai)",
        "revdelete-summary": "summary ke badlo",
        "feedback-adding": "Panna me subject jorra jaawe hae...",
+       "feedback-back": "Piichhe",
        "feedback-bugcheck": "Julum! Khaali ii check karna ki ii ek pahile se jaana waala bugs me se nai hae [$1 known bugs].",
        "feedback-bugnew": "Ham karaa hae. Nawaa bug ke report karo",
        "feedback-bugornote": "Agar aap ek technical problem ke detail me describe kare mangtaa hae tab meharbaani kar ke [$1 report a bug].\n\nNai to, aap niche ke sahaj form ke kaam me laae saktaa hae. Aap ke comment ke, aap ke naam ke saathe, panna \"[$3 $2]\" me jorra jaai.",
        "feedback-cancel": "Cancel karo",
        "feedback-close": "Kar dewa gais hae",
+       "feedback-external-bug-report-button": "Ek technical task ke file karo",
+       "feedback-dialog-title": "Feedback ke submit karo",
+       "feedback-dialog-intro": "App niche ke easy form ke kaam me laae ke aapan feedback bheje saktaa hai. App ke comment ke panna \"$1\" me, aap ke username ke saathe jorra jaai.",
        "feedback-error1": "Error: Unrecognized result from API",
        "feedback-error2": "Error: Edit fail hoi gais hae",
        "feedback-error3": "Error: API se koi response nai mila",
+       "feedback-error4": "Error: Dewa gais feedback title ke post nai kare sakaa",
        "feedback-message": "Sandes:",
        "feedback-subject": "Subject:",
        "feedback-submit": "Submit karo",
+       "feedback-terms": "Ham samajhtaa hai ki hamaar user agent jaankaari me hamaar exact browser aur operating system version ke jaankaari rahii aur iske hamaar feedback ke saathe publically share karaa jaai.",
+       "feedback-termsofuse": "Ham Terms of Use ke niche feedback provide karegaa.",
        "feedback-thanks": "Dhanyabaad! Aap ke feedback ke panna \"[$2 $1]\" me post karaa gais hae.",
-       "searchsuggest-search": "Khojo",
+       "feedback-thanks-title": "Dhanbaad!",
+       "feedback-useragent": "User agent:",
+       "searchsuggest-search": "{{SITENAME}} me khojo",
        "searchsuggest-containing": "isme hae.....",
-       "api-error-badaccess-groups": "Aap ke ii wiki me file upload kare ke ijajat nai hae.",
        "api-error-badtoken": "Internal error: Bad token.",
-       "api-error-copyuploaddisabled": "Uploading by URL ke ii server me disable kar dewa gais hae.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was another file|were some other files}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-empty-file": "Jon file ke aap submit karaa rahaa, khaali hae.",
        "api-error-emptypage": "Nawaa, khaali panna ke banae ke ijajat nai hae.",
-       "api-error-fetchfileerror": "Internal error: File khoje ke time kuch wrong hoe gais hae.",
-       "api-error-fileexists-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae, aur iske overwrite nai karaa jaae sake hae.",
-       "api-error-fileexists-shared-forbidden": "Ek file, jiske naam \"$1\" hae abhi hae aur file repository me shared hae, aur iske overwrite nai karaa jaae sake hae.",
-       "api-error-file-too-large": "Jon file ke aap submit karaa hae bahut barraa hae.",
-       "api-error-filename-tooshort": "Filename bahut chhota hae.",
-       "api-error-filetype-banned": "Ii rakam ke file banned hae."
+       "api-error-publishfailed": "Internal error: Server temporary file ke publish nai kare sakis hai.",
+       "api-error-stashfailed": "Internal error: Server temporary file ke store nai kare sakis hai.",
+       "api-error-unknown-warning": "Unknown warning: \"$1\".",
+       "api-error-unknownerror": "Unknown error: \"$1\".",
+       "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
+       "duration-hours": "$1 {{PLURAL:$1|ghantaa}}",
+       "duration-days": "$1 {{PLURAL:$1|din}}",
+       "duration-weeks": "$1 {{PLURAL:$1|haptaa}}",
+       "duration-years": "$1 {{PLURAL:$1|saal}}",
+       "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
+       "limitreport-title": "Parser profiling data:",
+       "limitreport-cputime": "CPU time usage",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-walltime": "Real time usage",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-ppvisitednodes": "Preprocessor visited node count",
+       "limitreport-ppgeneratednodes": "Preprocessor generated node count",
+       "limitreport-postexpandincludesize": "Post-expand include size",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-templateargumentsize": "Template argument size",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-expansiondepth": "Highest expansion depth",
+       "limitreport-expensivefunctioncount": "Expensive parser function count",
+       "expandtemplates": "Expand templates",
+       "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
+       "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
+       "expand_templates_input": "Input text:",
+       "expand_templates_output": "Natiija",
+       "expand_templates_xml_output": "XML output",
+       "expand_templates_html_output": "Raw HTML output",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Comment ke hatao",
+       "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
+       "expand_templates_generate_xml": "Show XML parse tree",
+       "expand_templates_generate_rawhtml": "raw HTML ke dekhao",
+       "expand_templates_preview": "Jhalak dekhao",
+       "expand_templates_preview_fail_html": "<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai, preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n<strong>Agar ii kanuni badlao hai, tab fir se kosis karna.</strong>\nAgar ii fir bhi kaam nai kare, tab [[Special:UserLogout|logging out]] aur logging back in ke kosis karna, aur ii check karna ki ii site ke khaatir cookies enabled hai.",
+       "expand_templates_preview_fail_html_anon": "<em>Iske kaaran hai ki {{SITENAME}} me raw HTML enabled hai aur aap logged in nai hai, tab preview ke lukae dewa gais hai as a precaution against JavaScript attacks.</em>\n<strong>Agar ii kanuni badlao hai, tab [[Special:UserLogin|log in]] karna aur fir se kosis karna </strong>",
+       "expand_templates_input_missing": "Aap ke kuchh input text de ke parri.",
+       "pagelanguage": "Panna ke bhasa badlo",
+       "pagelang-name": "Panna",
+       "pagelang-language": "Bhasa",
+       "pagelang-use-default": "Default bhasa ke use karo",
+       "pagelang-select-lang": "Bhasa ke chuno",
+       "pagelang-reason": "Kaaran",
+       "pagelang-submit": "Submit karo",
+       "pagelang-nonexistent-page": "Panna $1 nai hai.",
+       "pagelang-unchanged-language": "Panna $1 is already set to language $2.",
+       "pagelang-unchanged-language-default": "The panna $1 is already set to the wiki's default content language.",
+       "pagelang-db-failed": "Database panna ke bhasa ke nai badle sakis.",
+       "right-pagelang": "Panna ke bhasa badlo",
+       "action-pagelang": "panna ke bhasa badlo",
+       "log-name-pagelang": "Bhasa badlao ke log",
+       "log-description-pagelang": "Ii panna ke bhasa me badlao ke log hai.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} the language of $3 from $4 to $5",
+       "default-skin-not-found": "Whoops! aap ke wiki ke khaatir default skin, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, available nai hai.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "Whoops! Aap ke wiki ke default skin, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, available nai hai.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabled</strong>)",
+       "mediastatistics": "Media statistics",
+       "mediastatistics-summary": "Uploaded file types ke statistics. This only includes the most recent version of a file. Old or deleted versions of files are excluded.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)$3$3$3",
+       "mediastatistics-bytespertype": "Total file size for this section: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Total file size for all files: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
+       "mediastatistics-table-mimetype": "MIME ke rakam:",
+       "mediastatistics-table-extensions": "Possible extensions",
+       "mediastatistics-table-count": "Etnaa file hai",
+       "mediastatistics-table-totalbytes": "Combined size",
+       "mediastatistics-header-unknown": "Nai maluum",
+       "mediastatistics-header-bitmap": "Bitmap images",
+       "mediastatistics-header-drawing": "Drawings (vector images)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videos",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Textual",
+       "mediastatistics-header-executable": "Executables",
+       "mediastatistics-header-archive": "Compressed formats",
+       "mediastatistics-header-total": "Sab file",
+       "json-warn-trailing-comma": "$1 trailing {{PLURAL:$1|comma was|commas were}} removed from JSON",
+       "json-error-unknown": "JSON me kuchh garrbarr hai. Error: $1",
+       "json-error-depth": "Maximum stack depth ke exceed kar dewa gais hai.",
+       "json-error-state-mismatch": "Invalid, nai to, malformed JSON",
+       "json-error-ctrl-char": "Control character error, possibly incorrectly encoded",
+       "json-error-syntax": "Syntax me galti",
+       "json-error-utf8": "Malformed UTF-8 characters, possibly incorrectly encoded",
+       "json-error-recursion": "One or more recursive references in the value to be encoded",
+       "json-error-inf-or-nan": "One or more NAN or INF values in the value to be encoded",
+       "json-error-unsupported-type": "A value of a type that cannot be encoded was given",
+       "headline-anchor-title": "Ii section pe link karo",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-latinextended": "Latin extended",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Symbols",
+       "special-characters-group-greek": "Greek",
+       "special-characters-group-greekextended": "Greek extended",
+       "special-characters-group-cyrillic": "Cyrillic",
+       "special-characters-group-arabic": "Arabic",
+       "special-characters-group-arabicextended": "Arabic extended",
+       "special-characters-group-persian": "Persian",
+       "special-characters-group-hebrew": "Hebrew",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
+       "special-characters-title-minus": "minus sign",
+       "mw-widgets-dateinput-no-date": "Koi date ke select nai karaa gais hai",
+       "mw-widgets-mediasearch-input-placeholder": "Media ke khojo",
+       "mw-widgets-mediasearch-noresults": "Koi result nai milaa.",
+       "mw-widgets-titleinput-description-new-page": "ii panna abhi nai hai",
+       "mw-widgets-titleinput-description-redirect": "$1 pe redirect karo",
+       "mw-widgets-categoryselector-add-category-placeholder": "Category me jorro...",
+       "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
+       "sessionprovider-generic": "$1 sessions",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
+       "sessionprovider-nocookies": "Cookies disabled hoi. Ensure you have cookies enabled and start again.",
+       "randomrootpage": "Random root page",
+       "log-action-filter-block": "Type of block:",
+       "log-action-filter-contentmodel": "Type of content model change:",
+       "log-action-filter-delete": "Type of deletion:",
+       "log-action-filter-import": "Type of import:",
+       "log-action-filter-managetags": "Type of tag management action:",
+       "log-action-filter-move": "Type of move:",
+       "log-action-filter-newusers": "Type of account creation:",
+       "log-action-filter-patrol": "Type of patrol:",
+       "log-action-filter-protect": "Type of protection:",
+       "log-action-filter-rights": "Type of right change:",
+       "log-action-filter-suppress": "Type of suppression:",
+       "log-action-filter-upload": "Type of upload:",
+       "log-action-filter-all": "Sab",
+       "log-action-filter-block-block": "Block",
+       "log-action-filter-block-reblock": "Block modification",
+       "log-action-filter-block-unblock": "Unblock",
+       "log-action-filter-contentmodel-change": "Content model ke badlao",
+       "log-action-filter-contentmodel-new": "Creation of page with non-default content model",
+       "log-action-filter-delete-delete": "Page deletion",
+       "log-action-filter-delete-delete_redir": "Redirect overwrite",
+       "log-action-filter-delete-restore": "Page undeletion",
+       "log-action-filter-delete-event": "Log deletion",
+       "log-action-filter-delete-revision": "Revision deletion",
+       "log-action-filter-import-interwiki": "Transwiki import",
+       "log-action-filter-import-upload": "Import by XML upload",
+       "log-action-filter-managetags-create": "Tag creation",
+       "log-action-filter-managetags-delete": "Tag deletion",
+       "log-action-filter-managetags-activate": "Tag activation",
+       "log-action-filter-managetags-deactivate": "Tag deactivation",
+       "log-action-filter-move-move": "Move without overwriting of redirects",
+       "log-action-filter-move-move_redir": "Move with overwriting of redirects",
+       "log-action-filter-newusers-create": "Creation by anonymous user",
+       "log-action-filter-newusers-create2": "Registered user banais hai",
+       "log-action-filter-newusers-autocreate": "Automatically banaawa gais hai",
+       "log-action-filter-newusers-byemail": "I banaawa gais hai with password sent by e-mail",
+       "log-action-filter-patrol-patrol": "Manual patrol",
+       "log-action-filter-patrol-autopatrol": "Automatic patrol",
+       "log-action-filter-protect-protect": "Protection",
+       "log-action-filter-protect-modify": "Protection modification",
+       "log-action-filter-protect-unprotect": "Unprotection",
+       "log-action-filter-protect-move_prot": "Moved protection",
+       "log-action-filter-rights-rights": "Manual change",
+       "log-action-filter-rights-autopromote": "Automatic change",
+       "log-action-filter-suppress-event": "Log suppression",
+       "log-action-filter-suppress-revision": "Revision suppression",
+       "log-action-filter-suppress-delete": "Page suppression",
+       "log-action-filter-suppress-block": "User suppression by block",
+       "log-action-filter-suppress-reblock": "User suppression by reblock",
+       "log-action-filter-upload-upload": "Nawaa upload",
+       "log-action-filter-upload-overwrite": "Reupload",
+       "authmanager-authn-not-in-progress": "Authentication progress me nai hai, nai to, session data has been lost. Please start again from the beginning.",
+       "authmanager-authn-no-primary": "Supplied credentials ke authenticate nai kare sakaa hai.",
+       "authmanager-authn-no-local-user": "Supply karaa gais credentials are not associated with any user on this wiki.",
+       "authmanager-authn-no-local-user-link": "Supply karaa gais credentials are valid but are not associated with any user on this wiki. Login in a different way, or create a new user, and you will have an option to link your previous credentials to that account.",
+       "authmanager-authn-autocreate-failed": "Auto-creation of a local account failed: $1",
+       "authmanager-change-not-supported": "Supply karaa gais credentials cannot be changed, as nothing would use them.",
+       "authmanager-create-disabled": "Nawaa account banae ke disable kar dewa gais hai.",
+       "authmanager-create-from-login": "Account banae ke khaatir, fields ke fill karo.",
+       "authmanager-create-not-in-progress": "Account creation progress me nai hai, nai to, session data has been lost. Please start again from the beginning.",
+       "authmanager-create-no-primary": "Supplied credentials ke account banae me nai kaam me laae sakaa.",
+       "authmanager-link-no-primary": "Supplied credentials ke account linking me nai kaam me laae sakaa.",
+       "authmanager-link-not-in-progress": "Account linking progress me nai hai, nai to, session data has been lost. Meharbaani kar ke suruu se suruu karo.",
+       "authmanager-authplugin-setpass-failed-title": "Pasword ke nai badle sakaa",
+       "authmanager-authplugin-setpass-failed-message": "The authentication plugin denied the password change.",
+       "authmanager-authplugin-create-fail": "The authentication plugin denied the account creation.",
+       "authmanager-authplugin-setpass-denied": "The authentication plugin does not allow changing passwords.",
+       "authmanager-authplugin-setpass-bad-domain": "Domain invalid hai.",
+       "authmanager-autocreate-noperm": "Automatic account creation, allowed nai hai.",
+       "authmanager-autocreate-exception": "Automatic account creation ke temporarily disable kar dewa gais hai, due to prior errors.",
+       "authmanager-userdoesnotexist": "User account \"$1\" abhi registered nai hai",
+       "authmanager-userlogin-remembermypassword-help": "Whether the password should be remembered for longer than the length of the session.",
+       "authmanager-username-help": "Authentication ke khaatir username.",
+       "authmanager-password-help": "Authentication ke khaatir password.",
+       "authmanager-domain-help": "External authentication ke khaatoir domain.",
+       "authmanager-retype-help": "Confirm kare ke khaatir paasword fir se likho.",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Email address",
+       "authmanager-realname-label": "Asli naam",
+       "authmanager-realname-help": "Sadasya ke aslii naam",
+       "authmanager-provider-password": "Password-based authentication",
+       "authmanager-provider-password-domain": "Password- and domain-based authentication",
+       "authmanager-provider-temporarypassword": "Kachchaa password",
+       "authprovider-confirmlink-message": "Abhi haali ke login attempts ke dekh ke, the following accounts can be linked to your wiki account. Linking them enables logging in via those accounts. Please select which ones should be linked.",
+       "authprovider-confirmlink-request-label": "Accounts, jiske link kare ke chaahi",
+       "authprovider-confirmlink-success-line": "$1: Linked successfully.",
+       "authprovider-confirmlink-failed": "Account linking nai hoe paais: $1",
+       "authprovider-confirmlink-ok-help": "Continue after displaying linking failure messages.",
+       "authprovider-resetpass-skip-label": "Skip karo",
+       "authprovider-resetpass-skip-help": "Resetting the password ke skip karo.",
+       "authform-nosession-login": "Authentication successful rahaa, but your browser cannot \"remember\" being logged in.\n\n$1",
+       "authform-nosession-signup": "Account ke banae dewaa gais, but your browser cannot \"remember\" being logged in.\n\n$1",
+       "authform-newtoken": "Missing token. $1",
+       "authform-notoken": "Missing token",
+       "authform-wrongtoken": "Wrong token",
+       "specialpage-securitylevel-not-allowed-title": "Not allowed",
+       "specialpage-securitylevel-not-allowed": "Maaf karna, app ke ii panna me aae ke ijaajat nai hai, because your identity could not be verified.",
+       "authpage-cannot-login": "Login ke suruu nai kare sakaa.",
+       "authpage-cannot-login-continue": "Unable to continue login. Your session most likely timed out.",
+       "authpage-cannot-create": "Account creation ke start nai kare sakaa.",
+       "authpage-cannot-create-continue": "Account creation ke continue nai kare saktaa. Your session most likely timed out.",
+       "authpage-cannot-link": "Account linking ke suruu nai kare sakaa.",
+       "authpage-cannot-link-continue": "Account linking ke continue nai kare saktaa. Your session most likely timed out.",
+       "cannotauth-not-allowed-title": "Ijaajat nai hai",
+       "cannotauth-not-allowed": "Aap ke ii panna ke kaam me laae ke adhikaar nai hai.",
+       "changecredentials": "Credentials ke badlo",
+       "changecredentials-submit": "Credentials ke badlo",
+       "changecredentials-invalidsubpage": "$1 is not a valid credential type.",
+       "changecredentials-success": "App ke credentials ke badal dewa gais hai.",
+       "removecredentials": "Credentials ke hatao",
+       "removecredentials-submit": "Credentials ke hatao",
+       "removecredentials-invalidsubpage": "$1 valid credential type nai hai.",
+       "removecredentials-success": "App ke credentials ke hatae dewa gais hai.",
+       "credentialsform-provider": "Credentials type:",
+       "credentialsform-account": "Account naam:",
+       "cannotlink-no-provider-title": "Koi linkable accounts nai hai",
+       "cannotlink-no-provider": "Koi linkable accounts nai hai",
+       "linkaccounts": "Accounts ke link karo",
+       "linkaccounts-success-text": "Account ke link kar dewa gais hai.",
+       "linkaccounts-submit": "Accounts ke link karo",
+       "unlinkaccounts": "Accounts ke unlink karo",
+       "unlinkaccounts-success": "Account ke unlink kar dewa gais hai.",
+       "authenticationdatachange-ignored": "Authentication data change ke handle nai karaa gais hai. Maybe no provider was configured?",
+       "userjsispublic": "Note karnaa: JavaScript subpages should not contain confidential data as they are viewable by other users.",
+       "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
+       "restrictionsfield-badip": "IP ke range me galti hai: $1",
+       "restrictionsfield-label": "Allowed IP ranges:",
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "badlao $1",
+       "pageid": "panna ID $1"
 }
index de0baab..1d22515 100644 (file)
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
-       "category_header": "Članci u kategoriji \"$1\"",
+       "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Mediji u kategoriji \"$1\":",
        "category-empty": "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "Ova kategorija sadrži $2 {{PLURAL:$2|podkategoriju|podkategorije|podkategorija}}, ovaj popis prikazuje $1.",
        "category-subcat-count-limited": "Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.",
-       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži $2 članak.|{{PLURAL:$1|Prikazano je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od njih $2 ukupno.}}",
+       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži jednu stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} od njih $2 ukupno.}}",
        "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.",
        "template-protected": "(zaštićen)",
        "template-semiprotected": "(djelomično zaštićen)",
        "hiddencategories": "Ova stranica je član {{PLURAL:$1|1 skrivene kategorije|$1 skrivene kategorije|$1 skrivenih kategorija}}:",
+       "edittools": "<!-- Ovaj će tekst biti prikazan ispod obrasca za uređivanje i postavljanje. -->",
        "nocreatetext": "Na ovom je projektu ograničeno otvaranje novih stranica.\nMožete se vratiti i uređivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti suradnički račun]].",
        "nocreate-loggedin": "Nemate ovlasti za stvaranje novih stranica.",
        "sectioneditnotsupported-title": "Uređivanje odjeljka nije podržano",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim izmjenama",
        "revdelete-log": "Razlog:",
        "revdelete-submit": "Primijeni na {{PLURAL:$1|odabranu inačicu|odabrane inačice}}",
-       "revdelete-success": "'''Vidljivost izmjene uspješno ažurirana.'''",
+       "revdelete-success": "Vidljivost izmjene ažurirana.",
        "revdelete-failure": "'''Vidljivost inačice nije mogla biti ažurirana:'''\n$1",
-       "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
+       "logdelete-success": "Vidljivost uređivanja postavljena.",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
        "revdel-restore": "promijeni dostupnost",
        "pagehist": "stare izmjene",
        "searchprofile-advanced-tooltip": "Traži u zadanom imenskom prostoru",
        "search-result-size": "$1 ({{PLURAL:$2|1 riječ|$2 riječi}})",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
-       "search-redirect": "(preusmjeravanje $1)",
+       "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(odlomak $1)",
        "search-category": "(kategorija $1)",
        "search-suggest": "Mislili ste: $1",
        "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Sestrinski projekti",
-       "search-interwiki-default": "$1 rezultati:",
+       "search-interwiki-default": "Rezultati s projekta $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "prefs-watchlist-edits-max": "Maksimalni broj: 1000",
        "prefs-watchlist-token": "Token popisa praćenja:",
        "prefs-misc": "Razno",
-       "prefs-resetpass": "Promijeni zaporku",
-       "prefs-changeemail": "promijeni adresu e-pošte",
+       "prefs-resetpass": "promijeni zaporku",
+       "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
        "restoreprefs": "Vrati sve postavke na prvotno zadane",
        "prefs-editing": "Širina okvira za uređivanje",
-       "rows": "Redova",
-       "columns": "Stupaca",
        "searchresultshead": "Prikaz rezultata pretrage",
        "stub-threshold": "Prag za formatiranje poveznice na mrve ($1):",
        "stub-threshold-disabled": "Onemogućeno",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebali bi biti potpisani s \"<nowiki>~~~~</nowiki>\" što će biti pretvoreno u Vaš potpis i datum.",
        "badsig": "Kôd Vašeg potpisa nije valjan; provjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
-       "yourgender": "Spol:",
-       "gender-unknown": "Neodređeni",
-       "gender-male": "Muški",
-       "gender-female": "Ženski",
+       "yourgender": "Na koji način želite da Vam se ostali suradnici obraćaju?",
+       "gender-unknown": "Kad Vas se spominje, programska će oprema pokušati upotrijebiti srednji rod kad god je to moguće.",
+       "gender-male": "Uređivač sam wikistranica.",
+       "gender-female": "Uređivačica sam wikistranica.",
        "prefs-help-gender": "Mogućnost softvera da ispravno oslovljava razlikujući spol. Ovaj će podatak biti javan.",
        "email": "Adresa elektroničke pošte *",
        "prefs-help-realname": "Pravo ime nije obvezno. Ako ga navedete, može biti rabljeno za pripisivanje Vaših doprinosa.",
        "prefs-advancedrendering": "Napredne mogućnosti",
        "prefs-advancedsearchoptions": "Napredne mogućnosti",
        "prefs-advancedwatchlist": "Napredne mogućnosti",
-       "prefs-displayrc": "Prikaži opcije",
+       "prefs-displayrc": "Mogućnosti prikaza",
        "prefs-displaywatchlist": "Mogućnosti prikaza",
        "prefs-diffs": "Razlike između inačica uređivanja",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
        "prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: možete rabiti tipke sa strjelicama lijevo i desno za prebacivanje između kartica na popisu kartica.",
        "userrights": "Upravljanje suradničkim pravima",
-       "userrights-lookup-user": "Upravljaj suradničkim skupinama",
+       "userrights-lookup-user": "Izaberi suradnika",
        "userrights-user-editname": "Unesite suradničko ime:",
-       "editusergroup": "Uredi suradničke skupine",
-       "editinguser": "Promjena suradničkih prava za suradnika '''[[User:$1|$1]]''' $2",
+       "editusergroup": "Učitaj suradničke skupine",
+       "editinguser": "Promjena suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Pregled suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Uredi suradničke skupine",
-       "saveusergroups": "Snimi suradničke skupine",
+       "userrights-viewusergroup": "Vidi suradničke skupine",
+       "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Uključeni član:",
        "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
        "group": "Skupina:",
        "group-user": "Suradnici",
-       "group-autoconfirmed": "automatski potvrđeni suradnici",
+       "group-autoconfirmed": "Automatski potvrđeni suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
        "rightslogtext": "Ovo je evidencija promjena suradničkih prava.",
        "action-read": "čitanje ove stranice",
        "action-edit": "uređivanje ove stranice",
-       "action-createpage": "stvaranje stranica",
-       "action-createtalk": "stvaranje stranica za razgovor",
+       "action-createpage": "započni ovu stranicu",
+       "action-createtalk": "započni stranicu za razgovor",
        "action-createaccount": "stvaranje ovog suradničkog računa",
        "action-history": "Vidi povijest uređivanja ove stranice",
        "action-minoredit": "označavanje ove izmjene kao manju",
        "action-upload_by_url": "postavljanje ove datoteke preko URL adrese",
        "action-writeapi": "za korištenje pisanja API",
        "action-delete": "brisanje ove stranice",
-       "action-deleterevision": "brisanje ove izmjene",
+       "action-deleterevision": "brisanje izmjena",
        "action-deletedhistory": "gledanje obrisane povijesti ove stranice",
        "action-browsearchive": "pretraživanje izbrisanih stranica",
-       "action-undelete": "vraćanje ove stranice",
-       "action-suppressrevision": "pregledavanje i vraćanje ove sakrivene izmjene",
+       "action-undelete": "vraćanje stranica",
+       "action-suppressrevision": "pregledavanje i vraćanje sakrivenih izmjena",
        "action-suppressionlog": "gledanje ove privatne evidencije",
        "action-block": "blokiranje ovog suradnika",
        "action-protect": "promjenu stupnja zaštite ove stranice",
        "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Prikaži",
        "rcnotefrom": "Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).",
        "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
        "uploadnewversion-linktext": "Postavi novu inačicu datoteke",
        "shared-repo-from": "s projekta $1",
        "shared-repo": "zajednički poslužitelj",
+       "shared-repo-name-wikimediacommons": "Zajednički poslužitelj",
        "upload-disallowed-here": "Ne možete prepisati ovu datoteku.",
        "filerevert": "Ukloni ← $1",
        "filerevert-legend": "Vrati datoteku",
        "statistics-users": "Prijavljeni [[Special:ListUsers|suradnici]]",
        "statistics-users-active": "Aktivni suradnici",
        "statistics-users-active-desc": "Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}",
-       "pageswithprop": "Stranice sa osobinom stranice",
-       "pageswithprop-legend": "Stranice sa osobinom stranice",
+       "pageswithprop": "Stranice s određenim osobinama",
+       "pageswithprop-legend": "Stranice s određenim osobinama",
+       "pageswithprop-text": "Ovo je popis stranica koje koriste određene osobine stranica.",
        "pageswithprop-prop": "Ime osobine:",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjeravanja",
        "booksources-search": "Traži",
        "booksources-text": "Ovdje je popis vanjskih poveznica na internetskim stranicama koje prodaju nove i rabljene knjige, ali mogu sadržavati i ostale podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Čini se da dani ISBN nije valjan; provjerite greške kopirajući iz izvornika.",
+       "magiclink-tracking-rfc": "Stranice s čarobnim RFC poveznicama",
+       "magiclink-tracking-rfc-desc": "Ova stranica rabi čarobne RFC poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "Stranice s čarobnim PMID poveznicama",
+       "magiclink-tracking-pmid-desc": "Ova stranica rabi čarobne PMID poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "magiclink-tracking-isbn": "Stranice s čarobnim ISBN poveznicama",
        "magiclink-tracking-isbn-desc": "Ova stranica rabi čarobne ISBN poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Suradnik:",
        "listgrants-summary": "Slijedi popis dozvola s pridruženim pristupom suradničkim pravima. Suradnici mogu omogućiti aplikacijama uporabu svojih računa, ali s ograničenim ovlastima na temelju dozvola koje je suradnik dodijelio aplikaciji. Aplikacija koja djeluje u ime suradnika međutim ne može rabiti prava koje suradnik nema.\nMoguće su [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
        "listgrants-grant": "Dozvola",
        "listgrants-rights": "Prava",
+       "trackingcategories": "Kategorije za praćenje",
+       "trackingcategories-msg": "Praćene kategorije",
+       "trackingcategories-name": "Naziv poruke",
+       "trackingcategories-desc": "Kriteriji za uključenje u kategoriju",
+       "restricted-displaytitle-ignored": "Stranice sa zanemarenim naslovima za prikaz",
+       "restricted-displaytitle-ignored-desc": "Na stranici je zanemaren <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> jer ne odgovara trenutačnom naslovu stranice.",
        "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija onemogućena",
        "mailnologin": "Nema adrese pošiljatelja",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]\nda bi mogli slati poštu drugim suradnicima.",
        "emailuser": "Pošalji mu e-poruku",
        "watchlistanontext": "Molimo Vas prijavite se kako biste mogli vidjeti ili uređivati Vaš popis praćenih stranica.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj u popis praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodana na Vaš [[Special:Watchlist|popis praćenja]].\nPromjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popisu praćenja.",
+       "addedwatchtext": "Stranica »[[:$1]]« dodana je na Vaš [[Special:Watchlist|popis praćenja]]; ujedno i njoj pripadajuća razgovorna stranica.",
+       "addedwatchtext-talk": "Stranica »[[:$1]]« i njoj pripadajuća razgovorna stranica dodane su na Vaš [[Special:Watchlist|popis praćenih stranica]].",
        "addedwatchtext-short": "Stranica \"$1\" dodana je Vašem popisu praćenja.",
        "removewatch": "Ukloni s popisa praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena s [[Special:Watchlist|Vašeg popisa praćenja]].",
+       "removedwatchtext": "Stranica »[[:$1]]« i pripadajuća razgovorna stranica uklonjene su s Vašega [[Special:Watchlist|popisa praćenih stranica]].",
+       "removedwatchtext-talk": "Stranica »[[:$1]]« i njoj pripadajuća razgovorna stranica uklonjene su s Vašega [[Special:Watchlist|popis praćenih stranica]].",
        "removedwatchtext-short": "Stranica \"$1\" uklonjena je s Vašeg popisa praćenja.",
        "watch": "Prati",
        "watchthispage": "Prati ovu stranicu",
        "deletepage": "Izbriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1' (a jedini urednik '$2')",
+       "excontentauthor": "sadržaj je bio: »$1«; {{GENDER:$2|jedini pridonositelj bio je|jedina pridonositeljica bila je}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Obriši \"$1\"",
        "delete-legend": "Izbriši",
        "rollback-success": "uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
        "sessionfailure-title": "Prekid sesije",
        "sessionfailure": "Uočili smo problem s Vašom prijavom. Zadnja naredba nije izvršena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je učitate i zatim pokušate opet.",
-       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel": "Promjena modela sadržaja stranice",
        "changecontentmodel-legend": "Promijeni model sadržaja",
        "changecontentmodel-title-label": "Naziv stranice",
        "changecontentmodel-model-label": "Novi model sadržaja",
        "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-submit": "Promijeni",
        "changecontentmodel-success-title": "Sadržaj modela je promijenjen",
        "protectlogpage": "Evidencija zaštićivanja",
        "protectlogtext": "Ispod je evidencija zaštićivanja i uklanjanja zaštite pojedinih stranica.\nPogledajte [[Special:ProtectedPages|zaštićene stranice]] za popis trenutačno zaštićenih stranica.",
        "tooltip-pt-userpage": "Moja suradnička stranica",
        "tooltip-pt-anonuserpage": "Suradnička stranica za IP adresu pod kojom uređujete",
        "tooltip-pt-mytalk": "Vaša stranica za razgovor",
-       "tooltip-pt-anontalk": "Razgovor o suradnicima s ove IP adrese",
+       "tooltip-pt-anontalk": "Razgovor o uređivanjima s ove IP adrese",
        "tooltip-pt-preferences": "Vaše postavke",
        "tooltip-pt-watchlist": "Popis stranica koje pratite.",
        "tooltip-pt-mycontris": "Popis Vaših doprinosa",
+       "tooltip-pt-anoncontribs": "Popis uređivanja učinjenih s ove IP adrese",
        "tooltip-pt-login": "Predlažemo Vam da se prijavite, međutim nije obvezno.",
        "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Predlažemo Vam mogućnost stvaranja računa i prijave, iako to nije nužno.",
-       "tooltip-ca-talk": "Razgovor o stranici",
+       "tooltip-ca-talk": "Razgovorna stranica",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Dodaj novi odlomak",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena. Možete pogledati izvorni kod.",
        "tooltip-ca-move": "Premjesti ovu stranicu",
        "tooltip-ca-watch": "Dodaj ovu stranicu na svoj popis praćenja",
        "tooltip-ca-unwatch": "Ukloni ovu stranicu s popisa praćenja",
-       "tooltip-search": "Pretraži {{SITENAME}}",
+       "tooltip-search": "Pretraži projekt {{SITENAME}}",
        "tooltip-search-go": "Idi na stranicu s ovim imenom ako ona postoji",
        "tooltip-search-fulltext": "Traži ovaj tekst na svim stranicama",
        "tooltip-p-logo": "Posjeti glavnu stranicu",
        "tooltip-watchlistedit-normal-submit": "Ukloni naslove",
        "tooltip-watchlistedit-raw-submit": "Osvježi popis praćenja",
        "tooltip-recreate": "Vrati stranicu unatoč tome što je obrisana",
-       "tooltip-upload": "Pokreni snimanje (''upload'')",
+       "tooltip-upload": "Pokreni postavljanje datoteke (''upload'')",
        "tooltip-rollback": "\"Ukloni\" uklanja uređivanja posljednjeg suradnika na ovoj stranici.",
        "tooltip-undo": "\"Ukloni ovu izmjenu\" uklanja ovu izmjenu i otvara okvir za uređivanje. Omogućava unošenje razloga u sažetak.",
        "tooltip-preferences-save": "Spremi postavke",
        "pageinfo-subpages-value": "Ukupno $1 ($2 {{PLURAL:$2|preusmjeravanje|preusmjeravanja}}; $3 {{PLURAL:$3|obična podstranica|obične podstranice|običnih podstranica}})",
        "pageinfo-firstuser": "Suradnik koji je stvorio stranicu",
        "pageinfo-firsttime": "Datum stvaranja stranice",
-       "pageinfo-lastuser": "Posljednji urednik stranice",
+       "pageinfo-lastuser": "Posljednji uređivač stranice",
        "pageinfo-lasttime": "Datum posljednjeg uređivanja",
        "pageinfo-edits": "Ukupan broj uređivanja",
        "pageinfo-authors": "Broj različitih autora",
        "markaspatrolledtext-file": "Označi ovu inačicu datoteke kao pregledanu",
        "markedaspatrolled": "Pregledano",
        "markedaspatrolledtext": "Odabrana promjena [[:$1]] označena je pregledanom.",
-       "rcpatroldisabled": "Nadzor nedavnih promjena isključen",
-       "rcpatroldisabledtext": "Naredba \"Nadziri nedavne promjene\" trenutačno je isključena.",
+       "rcpatroldisabled": "Ophodnja nedavnih promjena isključena",
+       "rcpatroldisabledtext": "Naredba \"Ophodnja nedavnih promjena\" trenutačno je isključena.",
        "markedaspatrollederror": "Ne mogu označiti za pregledano",
        "markedaspatrollederrortext": "Morate odabrati inačicu koju treba označiti za pregledanu.",
        "markedaspatrollederror-noautopatrol": "Ne možete vlastite promjene označiti patroliranima.",
        "autoredircomment": "preusmjeravanje na [[$1]]",
        "autosumm-new": "nova stranica: $1",
        "autosumm-newblank": "stvorena prazna stranica",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
        "tag-filter": "Filtar [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filtar",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-mw-contentmodelchange": "promjena modela sadržaja",
+       "tag-mw-contentmodelchange-description": "Uređivanja koja [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjanju model sadržaja] stranice",
        "tags-title": "Oznake",
        "tags-intro": "Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.",
        "tags-tag": "Naziv oznake",
        "feedback-termsofuse": "Slažem se da povratne informacije objavljujem u skladu s Uvjetima uporabe.",
        "feedback-thanks": "Hvala! Vaš odgovor je snimljen na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
-       "searchsuggest-search": "Traži",
+       "searchsuggest-search": "Pretraži projekt {{SITENAME}}",
        "searchsuggest-containing": "sadrži....",
-       "api-error-badaccess-groups": "Nemate ovlasti za postavljanje datoteka na ovu wiki.",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanje datoteka putem URL-a nije omogućeno na ovom projektu.",
-       "api-error-duplicate": "{{PLURAL:$1|Postoji druga datoteka|Postoje $1 druge datoteke|Postoji $1 drugih datoteka}} istog sadržaja.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke|Postojalo je nekih drugih datoteka}} na projektu s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je prazna.",
        "api-error-emptypage": "Stvaranje praznih novih stranica nije dopušteno.",
-       "api-error-fetchfileerror": "Interna pogrješka: Pojavio se neki problem pri dobivanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Datoteka s imenom \"$1\" već postoji i ne može biti prepisana.",
-       "api-error-fileexists-shared-forbidden": "Datoteka s imenom \"$1\" već postoji u zajedničkom spremištu i ne može biti prepisana.",
-       "api-error-file-too-large": "Datoteka koju ste poslali bila je prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nije dopušteni tip datoteke|su nedopušteni tipovi datoteke|su nedopušteni tipovi datoteka}}. Dopušteni {{PLURAL:$3|tip datoteke je|tipovi datoteke su|tipovi datoteka su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je otkazana preko \"kuke\" proširenja mediawiki softvera.",
-       "api-error-http": "Interna pogrješka: Ne može se povezati na poslužitelj.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Interna pogrješka: Pojavio se neki problem s obradom postavljanja datoteke na wiki.",
-       "api-error-invalid-file-key": "Poslužitelj nije mogao naći tu datoteku u vašim postavljenim datotekama.",
-       "api-error-missingparam": "Interna pogrješka: Nedostaju parametri HTTP(S) zahtjeva.",
-       "api-error-missingresult": "Interna pogrješka: Nismo mogli utvrditi je li kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da bi mogli postavljati datoteke.",
-       "api-error-mustbeposted": "Postoji pogreška u ovom softveru; ne rabi ispravnu HTTP metodu.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali poslužitelj nije vratio nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Interna pogrješka: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Interna pogrješka: nema odgovora od poslužitelja.",
-       "api-error-overwrite": "Postavljanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
        "api-error-publishfailed": "Interna pogrješka: poslužitelj nije uspio objaviti privremenu datoteku.",
-       "api-error-timeout": "Poslužitelj nije odgovorio unutar očekivanog vrjemena.",
-       "api-error-unclassified": "Dogodila se nepoznata pogrješka.",
-       "api-error-unknown-code": "Nepoznata pogrješka: \"$1\"",
-       "api-error-unknown-error": "Interna pogrješka: dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.",
+       "api-error-stashfailed": "Interna pogrješka: Poslužitelj nije uspio spremiti privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata pogrješka: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje datoteka je onemogućeno na ovom wikiprojektu.",
-       "api-error-verification-error": "Ova datoteka je možda oštećena ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minute|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
index ce3aaba..c639828 100644 (file)
@@ -44,7 +44,8 @@
                        "JulesWinnfield-hu",
                        "Bencoke",
                        "Máté",
-                       "Wolf Rex"
+                       "Wolf Rex",
+                       "BanKris"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
@@ -70,7 +71,7 @@
        "tog-enotifwatchlistpages": "Kapjak értesítést e-mailben, ha egy általam figyelt lap vagy fájl megváltozik",
        "tog-enotifusertalkpages": "Kapjak értesítést e-mailben, ha megváltozik a vitalapom",
        "tog-enotifminoredits": "Kapjak értesítést e-mailben a lapok és fájlok apró változtatásairól",
-       "tog-enotifrevealaddr": "Jelenjen meg az e-mail címem a figyelmeztető e-mailekben",
+       "tog-enotifrevealaddr": "Jelenjen meg az e-mail-címem az értesítő e-mailekben",
        "tog-shownumberswatching": "A lapot figyelő szerkesztők számának megjelenítése",
        "tog-oldsig": "A jelenlegi aláírásod:",
        "tog-fancysig": "Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)",
        "searcharticle": "Menj",
        "history": "Laptörténet",
        "history_short": "Laptörténet",
+       "history_small": "laptörténet",
        "updatedmarker": "az utolsó látogatásom óta frissítették",
        "printableversion": "Nyomtatható változat",
        "permalink": "Hivatkozás erre a változatra",
        "passwordreset-emaildisabled": "Az e-mail funkció le van tiltva ezen a wikin.",
        "passwordreset-username": "Felhasználónév:",
        "passwordreset-domain": "Tartomány:",
-       "passwordreset-capture": "Meg szeretnéd nézni az elkészült üzenetet?",
-       "passwordreset-capture-help": "Ha kipipálod a dobozt, elmegy az üzenet a felhasználónak és megjelenik számodra (az ideiglenes jelszóval együtt).",
        "passwordreset-email": "E-mail cím:",
        "passwordreset-emailtitle": "A(z) {{SITENAME}}-fiók adatai",
        "passwordreset-emailtext-ip": "Valaki (vélhetően Te, a $1 IP-címről) a jelszavad visszaállítását kérte a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
        "passwordreset-emailsentemail": "Ha ez az e-mail-cím van a fiókodhoz társítva, egy jelszó-visszaállító e-mailt küldünk.",
        "passwordreset-emailsentusername": "Ha ehhez a felhasználónévhez tartozik e-mail cím, akkor egy jelszó-visszaállító levelet küld a rendszer.",
-       "passwordreset-emailsent-capture2": "A jelszóvisszaállító {{PLURAL:$1|e-mailt|e-maileket}} elküldtük. A {{PLURAL:$1|felhasználónév és a jelszó|felhasználónevek és jelszavak listája}} itt látható.",
-       "passwordreset-emailerror-capture2": "Az e-mail-küldés {{GENDER:$2|sikertelen}}: $1. A {{PLURAL:$3|felhasználónév és a jelszó|felhasználónevek és jelszavak listája}} itt látható.",
        "passwordreset-nocaller": "A hívó megadása kötelező",
        "passwordreset-nosuchcaller": "A hívó nem létezik: $1",
        "passwordreset-ignored": "A jelszó-visszaállítás nem lett kezelve. Talán nincs konfigurálva szolgáltató?",
        "saveprefs": "Mentés",
        "restoreprefs": "A beállítások alaphelyzetbe állítása minden szakaszban",
        "prefs-editing": "Szerkesztés",
-       "rows": "Sor",
-       "columns": "Oszlop",
        "searchresultshead": "Keresés",
        "stub-threshold": "A hivatkozások csonkként történő formázásának határa ($1):",
        "stub-threshold-sample-link": "minta",
        "prefs-help-recentchangescount": "Ez vonatkozik a friss változtatásokra, laptörténetekre és naplókra is.",
        "prefs-help-watchlist-token2": "Ez a titkos kulcs a figyelőlistádhoz.\nAki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszdd meg másokkal.\n[[Special:ResetTokens|Kattints ide, ha meg akarod változtatni]].",
        "savedprefs": "Az új beállításaid érvénybe léptek.",
-       "savedrights": "$1 felhasználói jogai el lettek mentve.",
+       "savedrights": "{{GENDER:$1|$1}} felhasználói csoportjai el lettek mentve.",
        "timezonelegend": "Időzóna:",
        "localtime": "Helyi idő:",
        "timezoneuseserverdefault": "Az alapértelmezett beállítás használata ($1)",
        "prefswarning-warning": "A beállításaidban tett módosítások nincsenek elmentve. Ha a $1 megnyomása nélkül hagyod el az oldalt, a beállításaid nem módosulnak.",
        "prefs-tabs-navigation-hint": "Tipp: a jobbra-balra nyilakkal navigálhatsz a fülek között.",
        "userrights": "Szerkesztői jogok beállítása",
-       "userrights-lookup-user": "Szerkesztőcsoportok beállítása",
+       "userrights-lookup-user": "Válasszon ki egy felhasználót",
        "userrights-user-editname": "Add meg a szerkesztő nevét:",
-       "editusergroup": "{{GENDER:$1|Szerkesztőcsoportok}} módosítása",
+       "editusergroup": "Szerkesztőcsoportok betöltése",
        "editinguser": "<strong>[[User:$1|$1]]</strong> felhasználó jogainak megváltoztatása $2",
        "userrights-editusergroup": "Szerkesztőcsoportok módosítása",
        "saveusergroups": "{{GENDER:$1|Szerkesztőcsoportok}} mentése",
        "userrights-reason": "Ok:",
        "userrights-no-interwiki": "Nincs jogod a szerkesztők jogainak módosításához más wikiken.",
        "userrights-nodatabase": "$1 adatbázis nem létezik vagy nem helyi.",
-       "userrights-nologin": "[[Special:UserLogin|Be kell jelentkezned]] egy adminisztrátori fiókkal, hogy szerkesztői jogokat adhass.",
-       "userrights-notallowed": "Nincs jogosultságod jogosultságok adására vagy elvételére.",
        "userrights-changeable-col": "Megváltoztatható csoportok",
        "userrights-unchangeable-col": "Nem megváltoztatható csoportok",
        "userrights-conflict": "Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.",
-       "userrights-removed-self": "Eltávolítottad a saját jogosultságaidat, így már nem tudod elérni ezt az oldalt.",
        "group": "Csoport:",
        "group-user": "szerkesztők",
        "group-autoconfirmed": "automatikusan megerősített szerkesztők",
        "right-siteadmin": "adatbázis lezárása, felnyitása",
        "right-override-export-depth": "Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig",
        "right-sendemail": "e-mail küldése más felhasználóknak",
-       "right-passwordreset": "Jelszó visszaállítási emailek megtekintése",
        "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és (de)aktiválása",
        "right-applychangetags": "[[Special:Tags|címkék]] alkalmazása saját változatokra",
        "right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
        "action-upload_by_url": "fájl feltöltése URL-címről",
        "action-writeapi": "író API használata",
        "action-delete": "lap törlése",
-       "action-deleterevision": "változat törlése",
+       "action-deleterevision": "változatok törlése",
        "action-deletedhistory": "lap törölt laptörténetének megtekintése",
        "action-browsearchive": "keresés a törölt lapok között",
-       "action-undelete": "lap helyreállítása",
-       "action-suppressrevision": "rejtett változat megtekintése és helyreállítása",
+       "action-undelete": "lapok helyreállítása",
+       "action-suppressrevision": "rejtett változatok megtekintése és helyreállítása",
        "action-suppressionlog": "privát napló megtekintése",
        "action-block": "szerkesztő blokkolása",
        "action-protect": "lap védelmi szintjének megváltoztatása",
        "recentchanges-legend-heading": "<strong>Jelmagyarázat:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "recentchanges-submit": "Megjelenítés",
+       "rcfilters-filter-registered-label": "Regisztrált",
+       "rcfilters-filter-registered-description": "Bejelentkezett szerkesztők.",
+       "rcfilters-filter-unregistered-description": "Nem bejelentkezett szerkesztők.",
+       "rcfilters-filter-editsbyself-label": "Saját szerkesztéseid",
+       "rcfilters-filter-userExpLevel-learner-label": "Tanulók",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Automatizált eszközök szerkesztései.",
+       "rcfilters-filter-humans-label": "Ember (nem bot)",
+       "rcfilters-filter-humans-description": "Emberi szerkesztők szerkesztései",
+       "rcfilters-filter-minor-label": "Apró szerkesztések",
+       "rcfilters-filter-minor-description": "Szerző által aprónak jelölt szerkesztések",
+       "rcfilters-filter-major-label": "Nem apró szerkesztések",
+       "rcfilters-filter-major-description": "Nem aprónak jelölt szerkesztések.",
+       "rcfilters-filtergroup-changetype": "Változtatás típusa",
+       "rcfilters-filter-pageedits-label": "Lapszerkesztések",
+       "rcfilters-filter-newpages-description": "Új oldalt létrehozó szerkesztések.",
+       "rcfilters-filter-categorization-label": "Kategóriaváltoztatások",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3, $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "uncategorizedcategories": "Kategorizálatlan kategóriák",
        "uncategorizedimages": "Kategorizálatlan fájlok",
        "uncategorizedtemplates": "Kategorizálatlan sablonok",
+       "uncategorized-categories-exceptionlist": "# Lista azokról a kategóriákról, amiknek nem szabad szerepelniük a Special:UncategorizedCategories oldalon. Soronként egy, „*” jellel kezdve. Más karakterrel (akár szóközzel) kezdődő sorok nem számítanak. Használd a „#” karaktert megjegyzésekhez.",
        "unusedcategories": "Nem használt kategóriák",
        "unusedimages": "Nem használt fájlok",
        "wantedcategories": "Keresett kategóriák",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
        "log-show-hide-patrol": "járőrnapló $1",
        "log-show-hide-tag": "címkenapló $1",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Régebbi változat törölve: $1",
        "filedeleteerror-short": "Hiba a fájl törlésekor: $1",
        "filedeleteerror-long": "Hibák merültek föl a következő fájl törlésekor:\n\n$1",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Keresés a wikin",
        "searchsuggest-containing": "tartalmazza…",
-       "api-error-autoblocked": "Az IP-címed automatikusan blokkolva lett, mert korábban egy blokkolt szerkesztő használta.",
-       "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
-       "api-error-blocked": "Letiltották a szerkesztési jogosultságodat.",
-       "api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
-       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal.",
-       "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
-       "api-error-empty-file": "Az általad elküldött fájl üres volt.",
        "api-error-emptypage": "Új, üres lap létrehozása nem engedélyezett.",
-       "api-error-fetchfileerror": "Belső hiba: valami baj történt a fájl beolvasása közben.",
-       "api-error-fileexists-forbidden": "Már létezik „$1” nevű fájl, és nem lehet felülírni.",
-       "api-error-fileexists-shared-forbidden": "Már létezik „$1” nevű fájl a megosztott fájlok között, és nem lehet felülírni.",
-       "api-error-file-too-large": "Az általad elküldött fájl túl nagy.",
-       "api-error-filename-tooshort": "A fájlnév túl rövid.",
-       "api-error-filetype-banned": "Tiltott fájltípus.",
-       "api-error-filetype-banned-type": "!A következő {{PLURAL:$4|fájltípus nem engedélyezett|fájltípusok nem engedélyezettek}}: $1. Engedélyezett {{PLURAL:$3|típus|típusok}}: $2.",
-       "api-error-filetype-missing": "Hiányzik a fájl kiterjesztése.",
-       "api-error-hookaborted": "Az általad kezdeményezett módosítást nem lehet végrehajtani. (Egy bővítmény megakadályozta.)",
-       "api-error-http": "Belső hiba: nem sikerült kapcsolódni a kiszolgálóhoz.",
-       "api-error-illegal-filename": "Nem megengedett fájlnév.",
-       "api-error-internal-error": "Belső hiba: valami baj történt a feltöltésed feldolgozása közben.",
-       "api-error-invalid-file-key": "Belső hiba: a fájl nem található az ideiglenes tárhelyen.",
-       "api-error-missingparam": "Belső hiba: paraméterek hiányoznak a kérésből.",
-       "api-error-missingresult": "Belső hiba: nem sikerült megállapítani, hogy a másolás sikeres volt-e.",
-       "api-error-mustbeloggedin": "Be kell jelentkezned fájlok feltöltéséhez.",
-       "api-error-mustbeposted": "Belső hiba: a kérésnek HTTP POST-nak kell lennie.",
-       "api-error-noimageinfo": "A feltöltés sikerült, de a szerver nem szolgáltatott semmilyen információt a fájlról.",
-       "api-error-nomodule": "Belső hiba: nincs feltöltőmodul beállítva.",
-       "api-error-ok-but-empty": "Belső hiba: nem érkezett válasz a kiszolgálótól.",
-       "api-error-overwrite": "Létező fájlok felülírására nem engedélyezett.",
-       "api-error-ratelimited": "A megengedettnél több fájlt próbálsz feltölteni rövid időn belül.\nPróbálkozz újra néhány perc múlva.",
-       "api-error-stashfailed": "Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.",
        "api-error-publishfailed": "Belső hiba: a kiszolgálónak nem sikerült közzétennie az ideiglenes fájlt.",
-       "api-error-stasherror": "Hiba történt a fájl feltöltése közben.",
-       "api-error-stashedfilenotfound": "Az félretett fájl nem található a feltöltés során.",
-       "api-error-stashpathinvalid": "Az félretett fájlhoz tartozó útvonal érvénytelen.",
-       "api-error-stashfilestorage": "Hiba történt a tartalék helyre történő mentés során.",
-       "api-error-stashzerolength": "A szerver nem tudta tartalékba tenni a fájlt, mert nulla a mérete.",
-       "api-error-stashnotloggedin": "Be kell jelentkezned a fájl feltöltéséhez.",
-       "api-error-stashwrongowner": "A elérni kívánt tartalék fájl nem a tied.",
-       "api-error-stashnosuchfilekey": "Az elérni kívánt tartalék fájl kulcs nem létezik.",
-       "api-error-timeout": "A kiszolgáló nem adott választ a várt időn belül.",
-       "api-error-unclassified": "Ismeretlen hiba történt",
-       "api-error-unknown-code": "Ismeretlen hiba: „$1”",
-       "api-error-unknown-error": "Belső hiba: valami baj történt a fájl feltöltése közben.",
-       "api-error-unknown-warning": "Ismeretlen figyelmeztetés: $1",
+       "api-error-stashfailed": "Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.",
+       "api-error-unknown-warning": "Ismeretlen figyelmeztetés: „$1”.",
        "api-error-unknownerror": "Ismeretlen hiba: „$1”.",
-       "api-error-uploaddisabled": "A feltöltés le van tiltva ezen a wikin.",
-       "api-error-verification-error": "A fájl feltehetőleg sérült, vagy hibás a kiterjesztése.",
-       "api-error-was-deleted": "Ilyen nevű fájlt már töltöttek fel, majd törölték.",
        "duration-seconds": "{{PLURAL:$1|másodperc|másodperc}}",
        "duration-minutes": "$1 {{PLURAL:$1|perc|perc}}",
        "duration-hours": "{{PLURAL:$1|egy|$1}} óra",
        "pagelang-use-default": "Alapértelmezett nyelv használata",
        "pagelang-select-lang": "Nyelv kiválasztása",
        "pagelang-submit": "Küldés",
+       "pagelang-nonexistent-page": "A(z) $1 lap nem létezik.",
        "right-pagelang": "oldal nyelvének megváltoztatása",
        "action-pagelang": "oldal nyelvének módosítása",
        "log-name-pagelang": "Nyelvváltoztatások naplója",
        "mw-widgets-dateinput-no-date": "Nincs kiválasztott dátum",
        "mw-widgets-dateinput-placeholder-day": "ÉÉÉÉ-HH-NN",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
+       "mw-widgets-mediasearch-noresults": "Nincs találat.",
        "mw-widgets-titleinput-description-new-page": "a lap még nem létezik",
        "mw-widgets-titleinput-description-redirect": "átirányítás ide: $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Kategória hozzáadása…",
        "sessionmanager-tie": "Nem kombinálható többféle hitelesítési típus: $1.",
        "sessionprovider-generic": "$1-munkamenetek",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sütialapú munkamenetek",
        "usercssispublic": "Figyelem: CSS-allapokon ne tárolj bizalmas adatokat, mivel minden felhasználó számára láthatóak.",
        "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:<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Hiba: $1",
-       "edit-error-long": "Hibák:\n\n$1"
+       "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 9735a24..e5cbf84 100644 (file)
        "saveprefs": "Հիշել",
        "restoreprefs": "Զրոյացնել, բերելով իլռելայն նախընտրանքներին (բոլոր բաժիններում)",
        "prefs-editing": "Խմբագրում",
-       "rows": "Տողեր`",
-       "columns": "Սյունակներ",
        "searchresultshead": "Որոնում",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Պատառ հոդվածների հղումների</a> ձևավորման որոշման սահմանը.",
        "stub-threshold-sample-link": "օրինակ",
        "recentchanges-legend-heading": "<strong>Լեգենդ՝</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "recentchanges-submit": "Ցույց տալ",
+       "rcfilters-filterlist-title": "Զտիչներ",
+       "rcfilters-filter-editsbyself-label": "Ձեր խմբագրումներ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "pageinfo-length": "Ծավալ (բայթերով)",
        "pageinfo-article-id": "Էջի N",
        "pageinfo-language": "Բովանդակության լեզու",
+       "pageinfo-language-change": "փոխել",
        "pageinfo-robot-policy": "Կարգավիճակը որոնողական համակարգերում",
        "pageinfo-robot-index": "ինդեքսավորվող",
        "pageinfo-robot-noindex": "ինդեքսավորվող չէ",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|քննարկում]]) մասնակիցը ջնջել է այս էջը ձեր խմաբգրումը սկսելուց հետո՝ հետևյալ պատճառով.\n: ''$2''\nԽնդրում ենք հաստատել, որ դուք իսկապես ուզում եք վերստեղծել այս էջը։",
        "recreate": "Վերստեղծել",
        "unit-pixel": " փիքսել",
-       "confirm_purge_button": "ԼԱՎ",
+       "confirm_purge_button": "Լավ",
        "confirm-purge-top": "Մաքրե՞լ այս էջի քեշը։",
-       "confirm-watch-button": "ԼԱՎ",
+       "confirm-watch-button": "Լավ",
        "confirm-watch-top": "Ավելացնե՞լ ձեր հսկացանկին",
-       "confirm-unwatch-button": "ԼԱՎ",
+       "confirm-unwatch-button": "Լավ",
        "confirm-unwatch-top": "Հեռացնե՞լ Ձեր հսկացանկից։",
        "imgmultipageprev": "← նախորդ էջ",
        "imgmultipagenext": "հաջորդ էջ →",
        "watchlisttools-raw": "Խմբագրել հում հսկացանկը",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|քննարկում]])",
        "version": "ՄեդիաՎիքի տարբերակը",
-       "version-ext-license": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡",
+       "version-ext-license": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80",
        "version-ext-colheader-name": "Ընդլայնում",
        "version-ext-colheader-version": "Տարբերակ",
-       "version-ext-colheader-license": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡",
-       "version-license-title": "Ô¼Õ«Ö\81Õ¥Õ¶Õ¦Õ«Õ¡ $1-ի համար",
+       "version-ext-colheader-license": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80",
+       "version-license-title": "Ô±Ö\80Õ¿Õ¸Õ¶Õ¡Õ£Õ«Ö\80 $1-ի համար",
        "version-poweredby-credits": "Այս վիքին աշխատում է '''[https://www.mediawiki.org/ MediaWiki]'''֊ով, copyright © 2001-$1 $2։",
        "fileduplicatesearch": "Փնտրել կրկնօրինակ պատկերներ",
        "fileduplicatesearch-summary": "Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա",
        "duration-centuries": "$1 {{PLURAL:$1|դար}}",
        "duration-millennia": "$1 {{PLURAL:$1|հազարամյակ}}",
        "expandtemplates": "Կաղապարների ընդարձակում",
+       "pagelang-nonexistent-page": "$1 էջը գոյություն չունի",
        "special-characters-group-latin": "Լատիներեն",
        "special-characters-group-latinextended": "Լատիներեն ընդլայնված",
        "special-characters-group-ipa": "IPA",
index 6efe0d0..cf3c23b 100644 (file)
@@ -15,7 +15,8 @@
                        "Carlosedepaula",
                        "Macofe",
                        "Karmwiki",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Rafaneta"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
        "searcharticle": "Va",
        "history": "Historia del pagina",
        "history_short": "Historia",
+       "history_small": "historia",
        "updatedmarker": "actualisate post mi ultime visita",
        "printableversion": "Version pro imprimer",
        "permalink": "Ligamine permanente",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "autoblockedtext": "Tu adresse de IP ha essite automaticamente blocate proque un altere usator lo usava qui esseva blocate per $1.\nLe motivo presentate es:\n\n:''$2''\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu pote contactar $1 o un del altere [[{{MediaWiki:Grouppage-sysop}}|administratores]] pro discuter le blocada.\n\nNota que tu non pote utilisar le function \"inviar e-mail a iste usator\" salvo que tu ha registrate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]] e que tu non ha essite blocate de usar lo.\n\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
+       "systemblockedtext": "Tu nomine de usator o adresse IP ha essite blocate automaticamente per MediaWiki.\nLe motivo presentate es:\n\n:<em>$2</em>\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu adresse IP actual es $3.\nPer favor, include tote le detalios enumerate hic supra in omne questiones que tu pone.",
        "blockednoreason": "nulle motivo specificate",
        "whitelistedittext": "Tu debe $1 pro poter modificar paginas.",
        "confirmedittext": "Tu debe confirmar tu adresse de e-mail pro poter modificar paginas.\nPer favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferences|preferentias de usator]].",
        "saveprefs": "Confirmar",
        "restoreprefs": "Restaurar tote le preselectiones (in tote le sectiones)",
        "prefs-editing": "Modification",
-       "rows": "Lineas:",
-       "columns": "Columnas:",
        "searchresultshead": "Recerca",
        "stub-threshold": "Limite pro formatar ligamines a peciettas ($1):",
        "stub-threshold-sample-link": "exemplo",
        "userrights-user-editname": "Entra un nomine de usator:",
        "editusergroup": "Cargar gruppos de usator",
        "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Ecce le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar gruppos de usatores",
+       "userrights-viewusergroup": "Vider gruppos del usator",
        "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implicite de:",
        "action-upload_by_url": "incargar iste file ab un adresse URL",
        "action-writeapi": "usar le API pro modificar le wiki",
        "action-delete": "deler iste pagina",
-       "action-deleterevision": "deler iste version",
-       "action-deletedhistory": "vider le historia delite de iste pagina",
+       "action-deleterevision": "deler versiones",
+       "action-deletelogentry": "deler entratas de registro",
+       "action-deletedhistory": "vider le historia delite de un pagina",
+       "action-deletedtext": "vider le texto de un version delite",
        "action-browsearchive": "cercar in paginas delite",
-       "action-undelete": "restaurar iste pagina",
-       "action-suppressrevision": "revider e restaurar iste version celate",
+       "action-undelete": "restaurar paginas",
+       "action-suppressrevision": "revider e restaurar versiones celate",
        "action-suppressionlog": "vider iste registro private",
        "action-block": "blocar iste usator de facer modificationes",
        "action-protect": "cambiar le nivellos de protection pro iste pagina",
        "action-userrights-interwiki": "modificar le derectos de usatores in altere wikis",
        "action-siteadmin": "blocar e disblocar le base de datos",
        "action-sendemail": "inviar e-mail",
+       "action-editmyoptions": "modificar tu preferentias",
        "action-editmywatchlist": "modificar le proprie observatorio",
        "action-viewmywatchlist": "vider le proprie observatorio",
        "action-viewmyprivateinfo": "vider le proprie information private",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Monstrar",
+       "rcfilters-activefilters": "Filtros active",
+       "rcfilters-search-placeholder": "Filtrar le modificationes recente (naviga o comencia a scriber)",
+       "rcfilters-invalid-filter": "Filtro non valide",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Nulle filtro trovate",
+       "rcfilters-filtergroup-registration": "Registration del usator",
+       "rcfilters-filter-registered-label": "Registrate",
+       "rcfilters-filter-registered-description": "Redactores que ha aperite session.",
+       "rcfilters-filter-unregistered-label": "Non registrate",
+       "rcfilters-filter-unregistered-description": "Redactores que non ha aperite session.",
+       "rcfilters-filtergroup-authorship": "Autor del modificationes",
+       "rcfilters-filter-editsbyself-label": "Tu proprie modificationes",
+       "rcfilters-filter-editsbyself-description": "Modificationes per te.",
+       "rcfilters-filter-editsbyother-label": "Modificationes per alteres",
+       "rcfilters-filter-editsbyother-description": "Modificationes create per altere usatores (non te).",
+       "rcfilters-filtergroup-userExpLevel": "Nivello de experientia (solmente pro usatores registrate)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novicios",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
+       "rcfilters-filter-userExpLevel-learner-label": "Apprentisses",
+       "rcfilters-filter-userExpLevel-learner-description": "Plus dies de activitate e modificationes que \"Novicios\" ma minus que \"Usatores con experientia\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usatores con experientia",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 dies de activitate e 500 modificationes.",
+       "rcfilters-filtergroup-automated": "Contributiones automatisate",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modificationes facite per instrumentos automatisate.",
+       "rcfilters-filter-humans-label": "Persona (non robot)",
+       "rcfilters-filter-humans-description": "Modificationes facite per esseres human.",
+       "rcfilters-filtergroup-significance": "Importantia",
+       "rcfilters-filter-minor-label": "Modificationes minor",
+       "rcfilters-filter-minor-description": "Modificationes que le autor ha marcate como minor.",
+       "rcfilters-filter-major-label": "Modificationes non minor",
+       "rcfilters-filter-major-description": "Modificationes non marcate como minor.",
+       "rcfilters-filtergroup-changetype": "Typo de cambiamento",
+       "rcfilters-filter-pageedits-label": "Modificationes de paginas",
+       "rcfilters-filter-pageedits-description": "Modificationes de contento wiki, discussiones, descriptiones de categorias…",
+       "rcfilters-filter-newpages-label": "Creationes de paginas",
+       "rcfilters-filter-newpages-description": "Modificationes que face nove paginas.",
+       "rcfilters-filter-categorization-label": "Cambios de categoria",
+       "rcfilters-filter-categorization-description": "Registros del addition o remotion de paginas a/de categorias.",
+       "rcfilters-filter-logactions-label": "Actiones traciate",
+       "rcfilters-filter-logactions-description": "Actiones administrative, creation de contos, deletion de paginas, incargamentos…",
        "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfrom": "Monstrar nove modificationes a partir del $3 a $2",
        "rcshowhideminor": "$1 modificationes minor",
        "uncategorizedcategories": "Categorias sin categoria",
        "uncategorizedimages": "Files non categorisate",
        "uncategorizedtemplates": "Patronos sin categoria",
+       "uncategorized-categories-exceptionlist": " # Contine un lista de categorias que non debe esser mentionate sur Special:UncategorizedCategories. Un per linea, comenciante con \"*\". Lineas que comencia con un altere character (incluse spatios) es ignorate. Usa \"#\" for commentos.",
        "unusedcategories": "Categorias non usate",
        "unusedimages": "Imagines non usate",
        "wantedcategories": "Categorias plus demandate",
        "emailccsubject": "Copia de tu message a $1: $2",
        "emailsent": "E-mail inviate",
        "emailsenttext": "Tu message de e-mail ha essite inviate.",
-       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.\n{{GENDER:$2|Le}} message ha essite inviate directemente al {{GENDER:$1|expeditor|expeditrice}} original, revelante {{GENDER:$2|tu}} adresse de e-mail a {{GENDER:$1|ille|illa}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
        "changecontentmodel-emptymodels-title": "Nulle modello de contento disponibile",
        "changecontentmodel-emptymodels-text": "Le contento in [[:$1]] non pote esser convertite in alcun typo.",
        "log-name-contentmodel": "Registro de cambiamentos de modello de contento",
-       "log-description-contentmodel": "Eventos relative al modellos de contento de un pagina",
+       "log-description-contentmodel": "Iste pagina monstra cambiamentos in le modello de contento de paginas, e paginas que ha essite create con un modello de contento altere que le predefinite.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creava}} le pagina $3 con le modello de contento non predefinite \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiava}} le modello de contento del pagina $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "proxyblockreason": "Tu adresse IP ha essite blocate proque illo es un proxy aperte.\nPer favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.",
        "sorbsreason": "Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.",
        "sorbs_create_account_reason": "Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.\nTu non pote crear un conto",
+       "softblockrangesreason": "Contributiones anonime non son permittite de vostre adresse de IP ($1). Si il vos place, identifica vos.",
        "xffblockreason": "Un adresse IP presente in le capite X-Forwarded-For, o le tue o illo de un servitor proxy que tu usa, ha essite blocate. Le motivo original pro le blocada es: $1",
        "cant-see-hidden-user": "Le usator que tu tenta blocar ha ja essite blocate e celate. Post que tu non ha le derecto hideuser, tu non pote vider o modificar le blocada del usator.",
        "ipbblocked": "Tu non pote blocar o disblocar altere usatores, proque tu mesme es blocate",
        "cant-move-to-user-page": "Tu non ha le permission de renominar un pagina verso un pagina de usator (excepte un subpagina de usator).",
        "cant-move-category-page": "Tu non ha le permission de renominar paginas de categoria.",
        "cant-move-to-category-page": "Tu non ha le permission de renominar un pagina in un pagina de categoria.",
+       "cant-move-subpages": "Tu non ha le permission de renominar subpaginas.",
+       "namespace-nosubpages": "Le spatio de nomines \"$1\" non permitte subpaginas.",
        "newtitle": "Nove titulo:",
        "move-watch": "Observar le paginas de origine e de destination",
        "movepagebtn": "Renominar pagina",
        "pageinfo-length": "Dimension del pagina (in bytes)",
        "pageinfo-article-id": "ID del pagina",
        "pageinfo-language": "Lingua del contento del pagina",
+       "pageinfo-language-change": "cambiar",
        "pageinfo-content-model": "Modello de contento de pagina",
        "pageinfo-content-model-change": "cambiar",
        "pageinfo-robot-policy": "Indexation per robots",
        "feedback-useragent": "Agente usator:",
        "searchsuggest-search": "Cercar in {{SITENAME}}",
        "searchsuggest-containing": "continente...",
-       "api-error-autoblocked": "Tu adresse IP ha essite blocate automaticamente, perque illo ha essite usate per un usator blocate.",
-       "api-error-badaccess-groups": "Tu non ha le permission de incargar files in iste wiki.",
        "api-error-badtoken": "Error interne: indicio invalide.",
-       "api-error-blocked": "Le modification ha essite blocate pro te.",
-       "api-error-copyuploaddisabled": "Le incargamentos per URL es disactivate in iste servitor.",
-       "api-error-duplicate": "Existe jam {{PLURAL:$1|un altere file|altere files}} in le wiki con le mesme contento.",
-       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|un altere file|altere files}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
-       "api-error-empty-file": "Le file que tu submitteva es vacue.",
        "api-error-emptypage": "Le creation de nove paginas vacue non es permittite.",
-       "api-error-fetchfileerror": "Error interne: qualcosa errava durante le obtention del file.",
-       "api-error-fileexists-forbidden": "Un file con le nomine \"$1\" jam existe, e non pote esser superscribite.",
-       "api-error-fileexists-shared-forbidden": "Un file con le nomine \"$1\" jam existe in le repositorio commun de files, e non pote esser superscribite.",
-       "api-error-file-too-large": "Le file que tu submitteva es troppo grande.",
-       "api-error-filename-tooshort": "Le nomine del file es troppo curte.",
-       "api-error-filetype-banned": "Iste typo de file es prohibite.",
-       "api-error-filetype-banned-type": "$1 non es {{PLURAL:$4|un typo|typos}} de file permittite. Le {{PLURAL:$3|typo|typos}} de file permittite es $2.",
-       "api-error-filetype-missing": "Le nomine del file non ha un extension.",
-       "api-error-hookaborted": "Le modification que tu ha tentate facer ha essite abortate per un extension.",
-       "api-error-http": "Error interne: impossibile connecter al servitor.",
-       "api-error-illegal-filename": "Iste nomine de file non es permittite.",
-       "api-error-internal-error": "Error interne: qualcosa errava durante le processamento de tu file incargate in le wiki.",
-       "api-error-invalid-file-key": "Error interne: file non trovate in le spatio de immagazinage temporari.",
-       "api-error-missingparam": "Error interne: certe parametros mancava al requesta.",
-       "api-error-missingresult": "Error interne: non poteva determinar si le copia succedeva.",
-       "api-error-mustbeloggedin": "Es necessari aperir session pro incargar files.",
-       "api-error-mustbeposted": "Error interne: le requesta require HTTP POST.",
-       "api-error-noimageinfo": "Le incargamento succedeva, ma le servitor non forniva alcun information super le file.",
-       "api-error-nomodule": "Error interne: nulle modulo de incargamento definite.",
-       "api-error-ok-but-empty": "Error interne: nulle responsa del servitor.",
-       "api-error-overwrite": "Superscriber un file existente non es permittite.",
-       "api-error-ratelimited": "Tu tenta incargar plus files in curte tempore que iste wiki permitte.\nPer favor, reproba in alcun minutas.",
-       "api-error-stashfailed": "Error interne: le servitor non poteva immagazinar le file temporari.",
        "api-error-publishfailed": "Error interne: le servitor non poteva publicar le file temporari.",
-       "api-error-stasherror": "Un error ha occurrite durante le incargamento del file in \"stash\".",
-       "api-error-stashedfilenotfound": "Le file in reserva non ha essite trovate durante le tentativa de incargar lo ab le reserva.",
-       "api-error-stashpathinvalid": "Le cammino ubi le file in reserva deberea haber essite trovate non es valide.",
-       "api-error-stashfilestorage": "Un error ha occurrite durante le immagazinage del file in reserva.",
-       "api-error-stashzerolength": "Le servitor non ha potite mitter le file in reserva perque illo ha un longitude de zero.",
-       "api-error-stashnotloggedin": "Tu debe aperir session pro poter salveguardar files in le reserva de incargamento.",
-       "api-error-stashwrongowner": "Le file al qual tu tentava acceder in le reserva non pertine a te.",
-       "api-error-stashnosuchfilekey": "Le clave de file al qual tu tentava acceder in le reserva non existe.",
-       "api-error-timeout": "Le servitor non ha respondite intra le tempore expectate.",
-       "api-error-unclassified": "Un error incognite ha occurrite.",
-       "api-error-unknown-code": "Error incognite: \"$1\"",
-       "api-error-unknown-error": "Error interne: qualcosa errava durante le tentativa de incargar le file.",
-       "api-error-unknown-warning": "Advertimento incognite: $1",
+       "api-error-stashfailed": "Error interne: le servitor non poteva immagazinar le file temporari.",
+       "api-error-unknown-warning": "Advertimento incognite: \"$1\".",
        "api-error-unknownerror": "Error incognite: \"$1\".",
-       "api-error-uploaddisabled": "Le incargamento es disactivate in iste wiki.",
-       "api-error-verification-error": "Le file pote esser corrumpite o su nomine pote haber un extension errate.",
-       "api-error-was-deleted": "Un file con iste nomine ha jam essite incargate e postea delite.",
        "duration-seconds": "$1 {{PLURAL:$1|secunda|secundas}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minutas}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Usar lingua predefinite",
        "pagelang-select-lang": "Selige lingua",
+       "pagelang-reason": "Ration",
        "pagelang-submit": "Submitter",
+       "pagelang-nonexistent-page": "Le pagina $1 non existe.",
+       "pagelang-unchanged-language": "Le pagina $1 es jam fixate sur le lingua $2.",
+       "pagelang-unchanged-language-default": "Le pagina $1 es jam fixate sur le lingua predefinite de contento del wiki.",
+       "pagelang-db-failed": "Le base de datos non ha potite cambiar le lingua del pagina.",
        "right-pagelang": "Cambiar lingua del pagina",
        "action-pagelang": "cambiar le lingua del pagina",
        "log-name-pagelang": "Registro de cambios de lingua",
        "sessionprovider-nocookies": "Le cookies pote esser disactivate. Assecura te de haber activate le cookies e recomencia.",
        "randomrootpage": "Pagina radice aleatori",
        "log-action-filter-block": "Typo de blocada:",
-       "log-action-filter-contentmodel": "Typo de modification de modello de contento:",
+       "log-action-filter-contentmodel": "Typo de cambiamento del modello de contento:",
        "log-action-filter-delete": "Typo de deletion:",
        "log-action-filter-import": "Typo de importation:",
        "log-action-filter-managetags": "Typo de action de gestion de etiquettas:",
        "log-action-filter-block-block": "Blocar",
        "log-action-filter-block-reblock": "Modification de blocada",
        "log-action-filter-block-unblock": "Disblocar",
-       "log-action-filter-contentmodel-change": "Cambio de modello de contento",
-       "log-action-filter-contentmodel-new": "Creation de pagina con modello de contento non standard",
+       "log-action-filter-contentmodel-change": "Cambiamento de modello de contento",
+       "log-action-filter-contentmodel-new": "Creation de pagina con un modello de contento non predefinite",
        "log-action-filter-delete-delete": "Deletion de pagina",
        "log-action-filter-delete-delete_redir": "Superscriptura de redirection",
        "log-action-filter-delete-restore": "Restauration de pagina",
        "usercssispublic": "Nota ben: Subpaginas CSS non debe continer datos confidential perque altere usatores pote vider los.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "version $1",
+       "pageid": "ID de pagina $1"
 }
index 501e638..45be55c 100644 (file)
        "tagline": "Dari {{SITENAME}}",
        "help": "Bantuan",
        "search": "Pencarian",
+       "search-ignored-headings": "# <pre>\n# Judul yang akan diabaikan oleh pencarian.\n# Suntingan ini akan diterapkan setelah halaman dengan judul ini diindeks.\n# Anda bisa memaksakan pengindeksan kembali halaman ini dengan melakukan suntingan kosong (''null edit'')\n# Sintaksisnya adalah seperti berikut:\n#   * Semuanya dari karakter \"#\" ke akhir baris adalah sebuah komentar.\n#   * Setiap baris tak-kosong adalah judul tepat yang akan diabaikan.\nReferensi\nPranala luar\nLihat pula\n #</pre>",
        "searchbutton": "Cari",
        "go": "Tuju ke",
        "searcharticle": "Lanjut",
        "views": "Tampilan",
        "toolbox": "Perkakas",
        "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
+       "tool-link-userrights-readonly": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat halaman pengguna",
        "projectpage": "Lihat halaman proyek",
        "botpasswords-updated-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" berhasil diperbarui.",
        "botpasswords-deleted-title": "Kata sandi bot dihapus",
        "botpasswords-deleted-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" telah dihapus.",
-       "botpasswords-newpassword": "Kata sandi baru untuk masuk log dengan '''$1''' adalah '''$2'''. ''Mohon simpan untuk referensi di kemudian hari.''",
+       "botpasswords-newpassword": "Kata sandi baru untuk masuk log dengan <strong>$1</strong> adalah <strong>$2</strong>. <em>Catatlah kata sandi ini untuk referensi ke depan.</em> <br> (Untuk bot lama yang memerlukan nama masuk log yang sama dengan nama pengguna, dapat menggunakan <strong>$3</strong> sebagai nama pengguna dan <strong>$4</strong> sebagai kata sandi.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.",
        "botpasswords-restriction-failed": "Batasan kata sandi menghalangi masuk log ini.",
        "botpasswords-invalid-name": "Nama pengguna yang diberikan tidak mengandung pemisah kata sandi bot (\"$1\").",
        "blockedtitle": "Pengguna diblokir",
        "blockedtext": "'''Nama pengguna atau alamat IP Anda telah diblokir.'''\n\nBlokir dilakukan oleh $1.\nAlasan yang diberikan adalah ''$2''.\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur 'Kirim surel ke pengguna ini' kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda adalah $3, dan ID pemblokiran adalah $5.\nTolong sertakan salah satu atau kedua informasi ini pada setiap pertanyaan yang Anda buat.",
        "autoblockedtext": "Alamat IP Anda telah terblokir secara otomatis karena digunakan oleh pengguna lain, yang diblokir oleh $1. Pemblokiran dilakukan atas alasan:\n\n:''$2''\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur \"kirim surel ke pengguna ini\" kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] Anda dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda saat ini adalah $3, dan ID pemblokiran adalah #$5.\nTolong sertakan informasi-informasi ini dalam setiap pertanyaan Anda.",
+       "systemblockedtext": "Nama pengguna atau alamat IP Anda telah diblokir secara otomatis oleh MediaWiki.\nAlasan yang diberikan adalah:\n\n:<em>$2</em>\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAlamat IP Anda saat ini adalah $3\nMohon sertakan semua perincian di atas dalam setiap pertanyaan yang Anda ajukan.",
        "blockednoreason": "tidak ada alasan yang diberikan",
        "whitelistedittext": "Anda harus $1 untuk dapat menyunting halaman.",
        "confirmedittext": "Anda harus mengkonfirmasikan dulu alamat surel Anda sebelum menyunting halaman.\nHarap masukkan dan validasikan alamat surel Anda melalui [[Special:Preferences|halaman preferensi pengguna]] Anda.",
        "invalid-content-data": "Data konten tidak sah",
        "content-not-allowed-here": "Konten \"$1\" tidak diizinkan di halaman [[$2]]",
        "editwarning-warning": "Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.\nJika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian \"Penyuntingan\" pada halaman preferensi Anda.",
+       "editpage-invalidcontentmodel-title": "Model konten tidak didukung",
+       "editpage-invalidcontentmodel-text": "Model konten \"$1\" tidak didukung.",
        "editpage-notsupportedcontentformat-title": "Format konten tidak didukung",
        "editpage-notsupportedcontentformat-text": "Format konten $1 tidak didukung oleh model konten $2.",
        "content-model-wikitext": "teks wiki",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objek kosong",
        "content-json-empty-array": "Larik kosong",
+       "deprecated-self-close-category": "Halaman yang menggunakan tag HTML tertutup-sendiri tidak sah",
+       "deprecated-self-close-category-desc": "Halaman ini mengandung tag HTML tertutup-sendiri yang tidak sah, seperti <code>&lt;b/></code> atau <code>&lt;span/></code>.  Perilaku tag seperti ini akan segera berubah agar konsisten dengan spesifikasi HTML5, jadi penggunaannya dalam teks wiki tidak lagi disarankan.",
        "duplicate-args-warning": "<strong>Peringatan:</strong> [[:$1]] memanggil [[:$2]] dengan nilai lebih dari satu untuk parameter \"$3\". Hanya nilai terakhir yang tersedia yang akan digunakan.",
        "duplicate-args-category": "Halaman dengan argumen ganda di pemanggilan templat",
        "duplicate-args-category-desc": "Halaman ini berisi pemanggilan templat yang menggunakan argumen ganda, seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-external": "Pencarian eksternal",
        "searchdisabled": "Pencarian {{SITENAME}} sementara dimatikan.\nAnda dapat mencari melalui Google untuk sementara waktu.\nPerlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.",
        "search-error": "Kesalahan terjadi saat mencari: $1",
+       "search-warning": "Peringatan terjadi ketika mencari: $1",
        "preferences": "Preferensi",
        "mypreferences": "Preferensi",
        "prefs-edits": "Jumlah suntingan:",
        "userrights-user-editname": "Masukkan nama pengguna:",
        "editusergroup": "Muat kelompok pengguna",
        "editinguser": "Mengubah hak pengguna untuk {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Melihat hak pengguna dari {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Sunting kelompok pengguna",
+       "userrights-viewusergroup": "Lihat kelompok pengguna",
        "saveusergroups": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "userrights-groupsmember": "Anggota dari:",
        "userrights-groupsmember-auto": "Anggota implisit dari:",
        "grant-group-high-volume": "Melakukan aktivitas yang amat banyak",
        "grant-group-customization": "Kustomisasi dan preferensi",
        "grant-group-administration": "Melakukan tindakan administratif",
+       "grant-group-private-information": "Akses data pribadi tentang Anda",
        "grant-group-other": "Aktivitas lain-lain",
        "grant-blockusers": "Blokir dan buka pemblokiran pengguna",
        "grant-createaccount": "Buat akun",
        "grant-highvolume": "Penyuntingan dengan volume tinggi",
        "grant-oversight": "Sembunyikan pengguna dan revisinya",
        "grant-patrol": "Tandai halaman terpatroli",
+       "grant-privateinfo": "Akses informasi pribadi",
        "grant-protect": "Melindungi dan membuka perlindungan halaman",
        "grant-rollback": "Membalikkan perubahan pada halaman",
        "grant-sendemail": "Mengirim surel kepada pengguna lain",
        "grant-basic": "Akses dasar",
        "grant-viewdeleted": "Melihat halaman dan berkas yang dihapus",
        "grant-viewmywatchlist": "Lihat daftar pantauan Anda",
+       "grant-viewrestrictedlogs": "Lihat entri log terbatas",
        "newuserlogpage": "Log pengguna baru",
        "newuserlogpagetext": "Di bawah ini adalah log pendaftaran pengguna baru",
        "rightslog": "Log perubahan hak akses",
        "action-upload_by_url": "memuatkan berkas ini dari sebuah alamat URL",
        "action-writeapi": "menggunakan API penulisan",
        "action-delete": "menghapus halaman ini",
-       "action-deleterevision": "menghapus revisi ini",
-       "action-deletedhistory": "melihat versi terdahulu halaman yang telah dihapus ini",
+       "action-deleterevision": "menghapus revisi",
+       "action-deletelogentry": "hapus entri log",
+       "action-deletedhistory": "melihat versi terdahulu halaman yang telah dihapus",
+       "action-deletedtext": "lihat teks revisi yang dihapus",
        "action-browsearchive": "mencari halaman-halaman yang telah dihapus",
-       "action-undelete": "membatalkan penghapusan halaman ini",
-       "action-suppressrevision": "meninjau dan mengembalikan revisi yang disembunyikan ini",
+       "action-undelete": "batalkan penghapusan halaman",
+       "action-suppressrevision": "tinjau dan kembalikan revisi yang disembunyikan",
        "action-suppressionlog": "melihat log privat ini",
        "action-block": "Blokir pengguna ini dari penyuntingan",
        "action-protect": "mengganti tingkat pelindungan halaman ini",
        "action-userrights-interwiki": "menyunting hak akses dari pengguna di wiki lain",
        "action-siteadmin": "mengunci atau membuka kunci basis data",
        "action-sendemail": "kirim surel",
+       "action-editmyoptions": "sunting preferensi Anda",
        "action-editmywatchlist": "sunting daftar pantauan Anda",
        "action-viewmywatchlist": "lihat daftar pantau Anda",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-applychangetags": "terapkan tag bersamaan dengan perubahan Anda",
        "action-changetags": "menambah dan menghapus tag semaunya pada revisi individu dan entri log",
        "action-deletechangetags": "hapus tag dari basis data",
+       "action-purge": "hapus singgahan halaman ini",
        "nchanges": "$1 {{PLURAL:$1|perubahan|perubahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak kunjungan terakhir}}",
        "enhancedrc-history": "riwayat",
        "file-thumbnail-no": "Nama berkas dimulai dengan <strong>$1</strong>.\nTampaknya berkas ini merupakan gambar dengan ukuran diperkecil ''(miniatur)''.\nJika Anda memiliki versi resolusi penuh dari gambar ini, harap muatkan berkas tersebut. Jika tidak, harap ubah nama berkas ini.",
        "fileexists-forbidden": "Suatu berkas dengan nama ini telah ada dan tak dapat ditimpa.\nJika Anda masih ingin memuat berkas Anda, silakan kembali dan gunakan nama baru. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ditemukan berkas lain dengan nama yang sama di repositori bersama.\nJika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Unggahan ini adalah salinan persis versi saat ini dari <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Unggahan ini adalah salinan persis {{PLURAL:$2|versi terdahulu version|beberapa versi terdahulu}} dari <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Berkas ini berduplikasi dengan {{PLURAL:$1|berkas|berkas-berkas}} berikut:",
        "file-deleted-duplicate": "Sebuah berkas yang identik dengan berkas ini ([[:$1]]) sudah pernah dihapuskan sebelumnya. Anda harus memeriksa sejarah penghapusan berkas tersebut sebelum melanjutkan memuat ulang berkas ini.",
        "file-deleted-duplicate-notitle": "Sebuah berkas yang identik dengan berkas ini sebelumnya telah dihapus, dan judul yang digunakan telah ditahan.\nAnda harus meminta bantuan seseorang dengan kemampuan untuk melihat data berkas yang ditahan untuk meninjau situasi sebelum anda mengunggah kembali.",
        "modifiedarticleprotection": "mengubah tingkat pelindungan \"[[$1]]\"",
        "unprotectedarticle": "menghilangkan perlindungan dari \"[[$1]]\"",
        "movedarticleprotection": "memindahkan pengaturan proteksi dari \"[[$2]]\" ke \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Melindungi}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Mengubah tingkat perlindungan}} untuk \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Menghapus perlindungan}} dari \"[[$1]]\"",
        "protect-title": "Melindungi \"$1\"",
        "protect-title-notallowed": "Lihat tingkat perlindungan dari \"$1\"",
        "prot_1movedto2": "[[$1]] dipindahkan ke [[$2]]",
        "undeletehistorynoadmin": "Halaman ini telah dihapus.\nAlasan penghapusan diberikan pada ringkasan di bawah ini, berikut rincian pengguna yang telah melakukan penyuntingan pada halaman ini sebelum dihapus. Isi terakhir dari revisi yang telah dihapus ini hanya tersedia untuk pengurus.",
        "undelete-revision": "Revisi yang telah dihapus dari $1 (pada $5, $4) oleh $3:",
        "undeleterevision-missing": "Revisi salah atau tak ditemukan. Anda mungkin mengikuti pranala yang salah, atau revisi tersebut telah dipulihkan atau dibuang dari arsip.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Sebuah revisi|$1 revisi}} tidak dapat dipulihkan, karena <code>rev_id</code> {{PLURAL:$1|mereka|mereka}} sedang digunakan.",
        "undelete-nodiff": "Tidak ada revisi yang lebih lama.",
        "undeletebtn": "Kembalikan",
        "undeletelink": "lihat/kembalikan",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Tampilkan hanya revisi teratas",
        "sp-contributions-newonly": "Hanya tampilkan suntingan yang berupa pembuatan halaman",
+       "sp-contributions-hideminor": "Sembunyikan suntingan kecil",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pranala balik",
        "whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
        "movelogpagetext": "Di bawah ini adalah log pemindahan halaman.",
        "movesubpage": "{{PLURAL:$1|Subhalaman|Subhalaman}}",
        "movesubpagetext": "Halaman ini memiliki $1 {{PLURAL:$1|subhalaman|subhalaman}} seperti ditampilkan berikut.",
+       "movesubpagetalktext": "Halaman pembicaraan terkait mempunyai $1 {{PLURAL:$1|subhalaman|subhalaman}} yang tampil di bawah ini.",
        "movenosubpage": "Halaman ini tak memiliki subhalaman.",
        "movereason": "Alasan:",
        "revertmove": "batalkan",
        "pageinfo-length": "Panjang halaman (dalam bita)",
        "pageinfo-article-id": "ID Halaman",
        "pageinfo-language": "Bahasa isi halaman",
+       "pageinfo-language-change": "ubah",
        "pageinfo-content-model": "Model isi halaman",
+       "pageinfo-content-model-change": "ubah",
        "pageinfo-robot-policy": "Pengindeksan oleh robot",
        "pageinfo-robot-index": "Diperbolehkan",
        "pageinfo-robot-noindex": "Tidak diperbolehkan",
        "pageinfo-category-pages": "Jumlah halaman",
        "pageinfo-category-subcats": "Jumlah subkategori",
        "pageinfo-category-files": "Jumlah berkas",
+       "pageinfo-user-id": "ID pengguna",
        "markaspatrolleddiff": "Tandai telah dipatroli",
        "markaspatrolledtext": "Tandai halaman ini telah dipatroli",
        "markaspatrolledtext-file": "Tandai versi berkas sebagai terpatroli",
        "patrol-log-header": "Ini adalah log revisi terpatroli.",
        "log-show-hide-patrol": "$1 log patroli",
        "log-show-hide-tag": "log tag $1",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Tandai revisi $3 dari $2 sebagai terperiksa?",
        "deletedrevision": "Revisi lama yang dihapus $1",
        "filedeleteerror-short": "Kesalahan waktu menghapus berkas: $1",
        "filedeleteerror-long": "Terjadi kesalahan sewaktu menghapus berkas:\n\n$1",
        "tags-create-warnings-below": "Apakah Anda ingin melanjutkan pembuatan tanda ini?",
        "tags-delete-title": "Hapus tag",
        "tags-delete-explanation-initial": "Anda akan menghapus tag \"$1\" dari basisdata.",
+       "tags-delete-explanation-warning": "Tindakan ini <strong>tidak bisa dikembalikan</strong> dan <strong>tidak bisa dibatalkan</strong> oleh siapa pun termasuk pengurus basis data. Pastikan sebaik-baiknya bahwa inilah tag yang ingin Anda hapus.",
        "tags-delete-reason": "Alasan:",
+       "tags-delete-submit": "Hapus tag ini juga",
+       "tags-delete-not-allowed": "Tag yang diberikan oleh ekstensi tidak dapat dihapus kecuali ekstensi tersebut mengizinkan.",
+       "tags-delete-not-found": "Tag \"$1\" tidak ada.",
+       "tags-delete-too-many-uses": "Tag \"$1\" diterapkan ke $2 atau lebih {{PLURAL:$2|revisi|revisi}} yang artinya tag tersebut tidak dapat dihapus.",
+       "tags-delete-warnings-after-delete": "Tag \"$1\" dihapus, namun {{PLURAL:$2|peringatan|peringatan}} berikut menemukan:",
+       "tags-delete-no-permission": "Anda tak memiliki hak akses untuk menghapus perubahan tag.",
+       "tags-activate-title": "Aktifkan tag",
+       "tags-activate-question": "Anda akan mengaktifkan tag \"$1\".",
        "tags-activate-reason": "Alasan:",
+       "tags-activate-not-allowed": "Tag \"$1\" tidak mungkin dapat diaktifkan.",
+       "tags-activate-not-found": "Tag \"$1\" tidak ada.",
        "tags-activate-submit": "Aktifkan",
+       "tags-deactivate-title": "Nonaktifkan tag",
+       "tags-deactivate-question": "Anda akan menonaktifkan tag \"$1\".",
        "tags-deactivate-reason": "Alasan:",
+       "tags-deactivate-not-allowed": "Tag \"$1\" tidak mungkin dapat dinonaktifkan.",
        "tags-deactivate-submit": "Matikan",
+       "tags-apply-no-permission": "Anda tidak memiliki izin untuk menerapkan perubahan tag bersama-sama dengan perubahan Anda.",
        "tags-apply-blocked": "Anda tidak dapat menerapkan perubahan tag dengan perubahan Anda ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-apply-not-allowed-one": "Tag \"$1\" tidak diizinkan untuk diterapkan secara manual.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Tag|Tag}} berikut tidak diizinkan untuk diterapkan secara manual: $1",
+       "tags-update-no-permission": "Anda tidak memiliki izin untuk menambah atau menghapus perubahan tag dari revisi atau entri log individu.",
        "tags-update-blocked": "Anda tidak dapat menambahkan atau menghapus perubahan tag ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-edit-title": "Sunting tag",
+       "tags-edit-manage-link": "Kelola tag",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Log peristiwa terpilih|Log peristiwa terpilih}}:",
+       "tags-edit-revision-legend": "Tambah atau hapus tag dari {{PLURAL:$1|revisi ini|semua revisi $1}}",
+       "tags-edit-logentry-legend": "Tambah atau hapus tag dari {{PLURAL:$1|entri log ini|semua entri log $1}}",
        "tags-edit-existing-tags": "Tag yang ada:",
        "tags-edit-existing-tags-none": "<em>Tidak ada</em>",
        "tags-edit-new-tags": "Tag baru:",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
        "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
+       "htmlform-date-placeholder": "TTTT-BB-HH",
+       "htmlform-time-placeholder": "JJ:MM:DD",
+       "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
+       "htmlform-date-invalid": "Nilai yang diberikan tidak dikenali sebagai tanggal. Coba lagi menggunakan format TTTT-BB-HH.",
+       "htmlform-datetime-invalid": "Nilai yang Anda masukkan tidak dikenali sebagai tanggal dan waktu. Coba gunakan format YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-toolow": "Nilai yang Anda masukkan adalah sebelum tanggal paling dini yang dibolehkan $1",
+       "htmlform-date-toohigh": "Nilai yang Anda masukkan adalah setelah tanggal paling akhir  yang dibolehkan $1",
+       "htmlform-time-toolow": "Nilai yang Anda tentukan adalah sebelum waktu paling dini yang dibolehkan $1",
+       "htmlform-time-toohigh": "Nilai yang Anda tentukan adalah setelah waktu paling baru yang dibolehkan $1",
        "htmlform-title-badnamespace": "[[:$1]] tidak berada dalam ruang nama \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" bukan merupakan judul halaman yang dapat dibuat",
        "htmlform-title-not-exists": "$1 tidak ada.",
        "mw-widgets-dateinput-no-date": "Tanggal tidak ada yang terpilih",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-HH",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "mw-widgets-mediasearch-input-placeholder": "Cari media",
+       "mw-widgets-mediasearch-noresults": "Tidak ada hasil ditemukan.",
        "mw-widgets-titleinput-description-new-page": "halaman belum ada",
        "mw-widgets-titleinput-description-redirect": "mengalihkan ke $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Tambah sebuah kategori...",
        "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
        "sessionprovider-generic": "sesi $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
        "linkaccounts-success-text": "Akun telah ditautkan.",
        "linkaccounts-submit": "Tautkan akun",
        "unlinkaccounts": "Lepastautkan akun",
-       "unlinkaccounts-success": "Akun berikut telah dilepastautkan."
+       "unlinkaccounts-success": "Akun berikut telah dilepastautkan.",
+       "userjsispublic": "Harap perhatikan: subhalaman Javascript sebaiknya tidak mengandung data rahasia, karena dapat dilihat oleh pengguna lain.",
+       "usercssispublic": "Harap perhatikan: subhalaman CSS sebaiknya tidak mengandung data rahasia karena dapat dilihat oleh pengguna lain.",
+       "restrictionsfield-badip": "Alamat IP atau rentang IP tidak sah: $1",
+       "restrictionsfield-label": "Rentang IP yang diizinkan:",
+       "restrictionsfield-help": "Satu alamat IP atau rentang CIDR per baris. Untuk mengaktifkan semuanya, gunakan <br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "revisi $1",
+       "pageid": "ID halaman $1"
 }
index 4184353..6990ca0 100644 (file)
        "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
-       "search-redirect": "(дIа-Ñ\81ахьожадар $1 тIара)",
+       "search-redirect": "(дIа-Ñ\85Ñ\8cахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "search-interwiki-caption": "Гаргара проекташ",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(яц)",
        "revdelete-summary": "хувцамий сурт оттадар",
-       "searchsuggest-search": "Ð\9bаÑ\85аÑ\80",
+       "searchsuggest-search": "Ð¥Ñ\8cалаÑ\85а {{grammar:prepositional|{{SITENAME}}}} Ñ\87Ñ\83",
        "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
        "special-characters-group-latin": "Латиной",
index 41aa59c..c9fc595 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Robin van der Vliet"
+                       "Robin van der Vliet",
+                       "Algentem",
+                       "Joao Xavier"
                ]
        },
        "tog-underline": "Sub-strekizez ligili:",
        "tog-hideminor": "Celez mikra redaktaji de recenta chanji",
        "tog-hidepatrolled": "Celez patroliita redakti en recenta chanji",
        "tog-newpageshidepatrolled": "Celez patroliita pagini en la listo di nova pagino",
+       "tog-hidecategorization": "Celar kategorizeso di la pagini",
        "tog-extendwatchlist": "Expansez surveyo-listo por montrar omna chanji, vice nur la maxim recenta",
-       "tog-usenewrc": "Usez augmentita Recenta chanji (JavaScript bezonesas)",
+       "tog-usenewrc": "Chanji al grupo po pagino en recenta chanji e \"watchlist\"",
        "tog-numberheadings": "Autonumerez tituli",
        "tog-showtoolbar": "Montrez redaktilo (JavaScript bezonesas)",
        "tog-editondblclick": "Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)",
-       "tog-editsectiononrightclick": "Kapabligez redakto di secioni kande on dextra-klikus tituli di secioni (JavaScript bezonesas)",
-       "tog-watchcreations": "Adjuntez pagini kreota da me ad mea surveyaji",
-       "tog-watchdefault": "Adjuntez pagini redaktota da me ad mea surveyaji",
-       "tog-watchmoves": "Adjuntez pagini movota da me ad mea surveyaji",
-       "tog-watchdeletion": "Adjuntez pagini efacota da me ad mea surveyaji",
+       "tog-editsectiononrightclick": "Kapabligez redakto di secioni per dextre-klikar tituli di secioni",
+       "tog-watchcreations": "Adjuntez la pagini qui me kreos a mea surveyaji",
+       "tog-watchdefault": "Adjuntez pagini qui me redaktos a mea surveyaji",
+       "tog-watchmoves": "Adjuntez pagini qui me movos a mea surveyaji",
+       "tog-watchdeletion": "Adjuntez pagini qui me efacos a mea surveyaji",
+       "tog-watchuploads": "Adjuntez nov arkivi qui me sendos a mea surveyaji",
+       "tog-watchrollback": "Adjuntez pagini ube me desfacos editadi a mea surveyaji",
        "tog-minordefault": "Markizez kustume omna redaktajo kom mikra",
        "tog-previewontop": "Montrez prevido avan la redakto-buxo",
        "tog-previewonfirst": "Montrez prevido pos la unesma redakto",
-       "tog-enotifwatchlistpages": "Sendez e-posto a me kande pagino quan me surveyas chanjesas",
+       "tog-enotifwatchlistpages": "Sendez e-posto a me kande pagino quan me surveyas chanjesos",
        "tog-enotifusertalkpages": "Sendez e-posto a me kande mea diskuto-pagino chanjesas",
        "tog-enotifminoredits": "Sendez e-posto a me mem por mikra chanji",
        "tog-enotifrevealaddr": "Montrez mea e-posto adreso en notifiko e-posti",
        "tog-shownumberswatching": "Montrez nombro di surveyanta uzanti",
+       "tog-oldsig": "Vua existanta signaturo:",
        "tog-fancysig": "Traktez signaturo kom wikikodo (sen automata ligilo)",
+       "tog-uselivepreview": "Uzes quika previdado",
        "tog-forceeditsummary": "Notifikez me kande skribanta vakua redakto-rezumo",
        "tog-watchlisthideown": "Celez mea redaktaji de la surveyaji",
        "tog-watchlisthidebots": "Celez redaktaji da roboti de la surveyaji",
        "tog-watchlisthideminor": "Celez mikra redaktaji de la surveyaji",
+       "tog-watchlisthideliu": "Celar l'editadi dal uzanti enrejistrita qui esas en la listo",
+       "tog-watchlistreloadautomatically": "Rimontrez automatale la listo, kande filtrilo modifikesos (bezonas JavaScript)",
+       "tog-watchlisthideanons": "Celar de la listo l'editadi facita da anonima redakteri",
        "tog-watchlisthidepatrolled": "Celez patroliita chanji en la surveyo-listo",
+       "tog-watchlisthidecategorization": "Celar la kategorizeso di pagini",
        "tog-ccmeonemails": "Sendez a me exemplero di e-posti quin me sendos ad altra uzanti",
        "tog-diffonly": "Ne montrez pagino kontenajo sub diferi",
        "tog-showhiddencats": "Montrar celita kategorii",
        "tog-norollbackdiff": "Omisar difero-komparo pos retrorulo",
+       "tog-useeditwarning": "Avertez se me probos klozar ula pagino sen sparar mea modifiki ed edituri",
+       "tog-prefershttps": "Sempre uzar sekura konekto kande facar log in",
        "underline-always": "Sempre",
        "underline-never": "Nulatempe",
+       "editfont-style": "Stilo di fonto uzata por editar la texto:",
+       "editfont-monospace": "Tipo por redaktar kun singla spaco",
+       "editfont-sansserif": "tipo Sans-serif",
+       "editfont-serif": "tipo di fonto Serif",
        "sunday": "sundio",
        "monday": "lundio",
        "tuesday": "mardio",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
+       "january-date": "$1ma di januaro",
+       "february-date": "$1ma di februaro",
+       "march-date": "$1ma di marto",
+       "april-date": "$1ma di aprilo",
+       "may-date": "$1ma di mayo",
+       "june-date": "$1ma di junio",
+       "july-date": "$1ma di julio",
+       "august-date": "$1ma di agosto",
+       "september-date": "$1ma di septembro",
+       "october-date": "$1ma di oktobro",
+       "november-date": "$1ma di novembro",
+       "december-date": "$1ma di decembro",
+       "period-am": "matine",
+       "period-pm": "posdimezo",
        "pagecategories": "{{PLURAL:$1|Kategorio|Kategorii}}",
        "category_header": "Artikli en kategorio \"$1\"",
        "subcategories": "Subkategorii",
        "category-file-count": "{{PLURAL:$2|Ica kategorio havas nur la sequanta arkivo.|La sequanta {{PLURAL:$1|arkivo|$1 arkivi}} es en ica kategorio, ek $2.}}",
        "category-file-count-limited": "La sequanta {{PLURAL:$1|arkivo|$1 arkivi}} es en la aktuala kategorio.",
        "listingcontinuesabbrev": "seq.",
+       "index-category": "indexigata pagini",
+       "noindex-category": "pagini sen indexi",
+       "broken-file-category": "Pagini kun ligili a neexistanta pagini",
        "about": "Pri",
        "article": "artiklo",
        "newwindow": "(aparos en nova panelo)",
        "cancel": "Anular",
-       "moredotdotdot": "Plus...",
+       "moredotdotdot": "Plusa...",
+       "morenotlisted": "Ca listo povas esar nekompleta.",
        "mypage": "Mea pagino",
        "mytalk": "Diskuti",
        "anontalk": "Diskuto relatant ad ica IP",
        "navigation": "Navigado",
        "and": "&#32;ed",
        "qbfind": "Trovez",
+       "qbbrowse": "Montrez listo",
        "qbedit": "Redaktar",
        "qbpageoptions": "Ica pagino",
        "qbmyoptions": "Mea pagini",
+       "faq": "Maxim komuna questioni",
+       "faqpage": "Project:FAQ - maxim komuna questioni",
        "actions": "Agi",
        "namespaces": "Nomari",
        "variants": "Varianti",
+       "navigation-heading": "Selektar dum la navigado",
        "errorpagetitle": "Eroro",
        "returnto": "Retrovenar a $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Helpo",
        "search": "Sercho",
+       "search-ignored-headings": " #<!-- mantenez ica lineo sen modifiki --> <pre>\n# Tituli qui ignoresos per la sistemo di serchado.\n# Modifiki en ca parto efikeskos balde pos la titulo di la pagino adicionesos a l'indexo.\n# Tu povas acelerar la riindexigo di la pagino facante nihila editado.\n# La sintaxo esas quale infre:\n#   * Omna texti qui finas kun la signo \"#\" fine de la lineo, esas komentaro.\n#   * Omna lineo ne blanka - to esas: skriptata -, esas l'exakta titulo por ignorar la diferi inter mayuskula e minuskula literi, ed altra.\nReferi\nExtera ligili\nVidez anke\n #</pre> <!-- mantenez ica lineo sen modifiki -->",
        "searchbutton": "Serchez",
        "go": "Irar",
        "searcharticle": "Irez",
        "history": "Paginala historio",
        "history_short": "Versionaro",
+       "history_small": "historio",
        "updatedmarker": "aktualigita pos mea lasta vizito",
        "printableversion": "Imprimebla versiono",
        "permalink": "Permananta ligilo",
        "print": "Imprimar",
+       "view": "Videz",
+       "view-foreign": "Videz en $1",
        "edit": "Redaktar",
+       "edit-local": "Facar deskriptado lokale",
        "create": "Krear",
+       "create-local": "Inkluzar lokala deskriptado",
        "editthispage": "Redaktar ca pagino",
        "create-this-page": "Kreez ca pagino",
        "delete": "Efacar",
        "deletethispage": "Efacar ica pagino",
+       "undeletethispage": "Desfacar l'efaco di ca pagino",
        "undelete_short": "Restaurar {{PLURAL:$1|1 redakto|$1 redakti}}",
+       "viewdeleted_short": "Vidar {{PLURAL:$1|1 redakto efacita|$1 redakti efacita}}",
        "protect": "Protektar",
        "protect_change": "chanjar",
        "protectthispage": "Protektar ica pagino",
        "talk": "Diskuto",
        "views": "Apari",
        "toolbox": "Utensili",
-       "userpage": "Vidar uzanto-pagino",
+       "tool-link-userrights": "Chanjar la grupi di {{GENDER:$1|uzero}}",
+       "tool-link-userrights-readonly": "Vidar grupi {{GENDER:$1|user}}",
+       "tool-link-emailuser": "Sendar e-posto a {{GENDER:$1|}}",
+       "userpage": "Vidar uzeropagino",
        "projectpage": "Vidar projeto-pagino",
        "imagepage": "Vidar arkivo-pagino",
        "mediawikipage": "Vidar mesajo-pagino",
        "otherlanguages": "En altra lingui",
        "redirectedfrom": "(Ridirektita de $1)",
        "redirectpagesub": "Ridirektanta pagino",
+       "redirectto": "Ridirektar a:",
        "lastmodifiedat": "Ica pagino modifikesis ye $2, $1.",
        "viewcount": "Ica pagino acesesis {{PLURAL:$1|1 foyo|$1 foyi}}.",
        "protectedpage": "Protektita pagino",
        "jumpto": "Irez ad:",
        "jumptonavigation": "pilotado",
        "jumptosearch": "serchez",
+       "view-pool-error": "Pardonez, la sistemo esas okupata nun.\nMulta uzanti deziras vidar ca pagino.\nVoluntez vartar kelka instanti ante itere probar vidar ol.\n\n$1",
+       "generic-pool-error": "Pardonez, la servo-komputeri esas okupata nun.\nMulta uzanti probas vidar ta pagino.\nVoluntez vartar kelka instanti ante itere probar vidar ol.",
+       "pool-timeout": "Limito di tempo vartante la klozado",
+       "pool-queuefull": "La serio di taski esas plena",
+       "pool-errorunknown": "nekonocata eroro",
+       "pool-servererror": "La sistemo qua kontrolas l'aceso a $1 ne esas disponebla",
+       "poolcounter-usage-error": "Eroro di uzado:$1",
        "aboutsite": "Pri {{SITENAME}}",
        "aboutpage": "Project:Pri {{SITENAME}}",
-       "copyright": "La kontenajo esas disponebla sub $1.",
+       "copyright": "La kontenajo esas disponebla sub $1, ecepte kande kontree mencionata.",
        "copyrightpage": "{{ns:project}}:Autor-yuri",
        "currentevents": "Aktualaji",
        "currentevents-url": "Project:Aktualaji",
        "disclaimers": "Legala averto",
        "disclaimerpage": "Project:Generala des-agnosko",
        "edithelp": "Helpo pri redaktado",
-       "mainpage": "Frontispico",
-       "mainpage-description": "Frontispico",
+       "helppage-top-gethelp": "Helpo",
+       "mainpage": "Chefpagino",
+       "mainpage-description": "Chefpagino",
        "policy-url": "Project:Sistemo di agado",
        "portal": "Komuneso-portalo",
        "portal-url": "Project:Komuneso-portalo",
        "ok": "O.K.",
        "retrievedfrom": "Obtenita de \"$1\"",
        "youhavenewmessages": "Vu havas $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Vu havas}} $1 dal {{PLURAL:$3|altra uzero|$3 uzeri}} ($2).",
+       "youhavenewmessagesmanyusers": "Tu havas $1 da multa uzanti ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1| nova mesajo|999= nova mesaji}}",
+       "newmessagesdifflinkplural": "Lasta {{PLURAL:$1|chanjo|chanji}}",
        "youhavenewmessagesmulti": "Vu havas nova mesaji ye $1",
        "editsection": "redaktar",
        "editold": "redaktar",
        "toc": "Indexo",
        "showtoc": "montrar",
        "hidetoc": "celar",
+       "collapsible-collapse": "Celar la listo",
+       "collapsible-expand": "Montrar la listo",
+       "confirmable-confirm": "Ka vu {{GENDER:$1|vi}} fakte deziras facar to?",
+       "confirmable-yes": "Yes",
+       "confirmable-no": "No",
        "thisisdeleted": "Ka vidar o restaurar $1?",
        "viewdeleted": "Vidar $1?",
        "restorelink": "{{PLURAL:$1|1 redakto efacita|$1 redakti efacita}}",
+       "feedlinks": "Fonto RSS:",
+       "feed-invalid": "Tipo di fonto RSS nevalida",
        "site-rss-feed": "$1 RSS Provizajo",
        "site-atom-feed": "$1 Atom Provizajo",
        "page-rss-feed": "\"$1\" RSS Provizajo",
        "page-atom-feed": "\"$1\" Atom Provizajo",
        "red-link-title": "$1 (pagino ne existas)",
+       "sort-descending": "En ordino dekreskanta",
+       "sort-ascending": "En ordino kreskanta",
        "nstab-main": "Pagino",
-       "nstab-user": "Uzanto-pagino",
+       "nstab-user": "Uzeropagino",
+       "nstab-media": "Media pagino",
        "nstab-special": "Specala pagino",
        "nstab-project": "Projeto pagino",
        "nstab-image": "Failo",
        "nstab-template": "Shablono",
        "nstab-help": "Helpo",
        "nstab-category": "Kategorio",
+       "mainpage-nstab": "Chefpagino",
        "nosuchaction": "Ne esas tala ago",
+       "nosuchactiontext": "L'agado determinata en la URL esas nevalida.\nPosible vu skribis la URL nekorekte, o sequis nevalida ligilo.\nTo anke povas indikar \"bug\" en la programo por *komputero uzata per {{SITENAME}}.",
        "nosuchspecialpage": "Ne existas tala specala pagino",
        "nospecialpagetext": "<strong>Vu demandis specala pagino qua ne existas.</strong>\n\nOn povas trovar listo di valida specala pagini en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Eroro",
        "databaseerror": "Datumarala eroro",
+       "databaseerror-text": "Eventis eroro en datum-bazal demando.\nTo indikus eror en la programaro.",
+       "databaseerror-textcl": "Eventis eroro en datumbazal demando.",
+       "databaseerror-query": "Demando:$1",
+       "databaseerror-function": "Funciono: $1",
+       "databaseerror-error": "Eroro:$1",
+       "laggedslavemode": "<strong>Averto:</strong> La pagino povas ne kontenar la maxim recenta modifiki.",
        "readonly": "Datumaro esas blokusita",
        "enterlockreason": "Explikez la motivo por la blokuso, inkluzante\nevaluo pri kande eventos la desblokuso",
+       "readonlytext": "La datumaro nuntempe esas klozata por nova modifiki, probable pro facesar manteni rutinala. Pos la manteni, ol retrovenos a la normala stando.\n\nL'administranto di la sistemo qua klozis la datumaro explikis to: $1",
        "missingarticle-rev": "(versiono#: $1)",
        "missingarticle-diff": "(Difero: $1, $2)",
        "internalerror": "Interna eroro",
        "formerror": "Eroro: Onu ne povis sendar la kontenajo di la formularo",
        "badarticleerror": "Ica ago ne povas facesar en ca pagino.",
        "cannotdelete": "Ne es posibla efacar la pagino od arkivo \"$1\".\nForsan, ulu ja efacis ol.",
+       "cannotdelete-title": "Ne povas efacar pagino \"$1\"",
+       "no-null-revision": "Ne povis krear nova nula-revizo por pagino \"$1\"",
        "badtitle": "Nekorekta titulo",
        "badtitletext": "La solicitita pagino esas nevalida, vakua od esas\nnekorekta interlinguale od interwikale ligilo.",
+       "title-invalid-empty": "La demandita pagino-titulo es vakua o kontenas nur la nome di \"namespace\".",
+       "title-invalid-utf8": "La demandita pagino-titulo kontenas ne-valida sequo UTF-8.",
+       "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.",
        "viewsource": "Vidar font-kodo",
-       "protectedpagetext": "Ica pagino esis protektita por preventar redaktar.",
-       "viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino:",
+       "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.",
        "ns-specialprotected": "On ne povas redaktar speciala pagini.",
-       "logouttext": "'''Vu nun esas nun ek {{SITENAME}}.'''\n\nVu povas durar uzante {{SITENAME}} anonimale, o vu povas <span class='plainlinks'>[$1 enirar itere]</span> kom la sama o diferenta uzanto.\nAtencez ke kelka pagini posible duras montresar semblante ke vu ne ekirus, til vu vakuigas la tempala-magazino di vua navigilo.",
+       "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.",
+       "virus-badscanner": "Mala selektajo: Nekonocata skanilo di virusi: <em>$1</em>",
+       "virus-scanfailed": "skano ne sucesis (kodexo $1)",
+       "virus-unknownscanner": "antiviruso nekonocata:",
+       "logouttext": "<strong>Vu ekirabas.</strong>\n\nAtencez ke kelka pagini posible duras montresar quaze vu ne ekiris, til ke vu vakuigos la tempala-magazino di la navigilo.",
+       "cannotlogoutnow-title": "Ne povas ekirar nun",
+       "cannotlogoutnow-text": "Ekirar ne esas posibla kande vu uzas $1.",
+       "welcomeuser": "Esez bonvenanta, $1!",
+       "welcomecreation-msg": "Vua konto kreesis.\n\nVu povas modifikar vua [[Special:Preferences|preferaji en la {{SITENAME}}]] se vu deziras.",
        "yourname": "Vua uzantonomo:",
+       "userlogin-yourname": "Uzantonomo",
+       "userlogin-yourname-ph": "Enirez vua uzantonomo",
+       "createacct-another-username-ph": "Enirez la uzantonomo",
        "yourpassword": "Pasovorto:",
+       "userlogin-yourpassword": "pasovorto",
+       "userlogin-yourpassword-ph": "Enirez vua pasovorto",
+       "createacct-yourpassword-ph": "Enirez pasovorto",
        "yourpasswordagain": "Riskribez la pasovorto:",
+       "createacct-yourpasswordagain": "Konfirmez la pasovorto",
+       "createacct-yourpasswordagain-ph": "Enirez itere la pasovorto",
+       "userlogin-remembermypassword": "Mantenez me konektata",
+       "userlogin-signwithsecure": "Usez sekura konekto",
+       "cannotlogin-title": "Ne povis enirar",
+       "cannotlogin-text": "Ne esas posibla konektar a la sistemo",
+       "cannotloginnow-title": "Ne povas enirar nun",
+       "cannotloginnow-text": "Enirar ne esas posibla kande vu usas $1",
+       "cannotcreateaccount-title": "Ne povas krear la konti",
+       "cannotcreateaccount-text": "Krear uzerokonto ne posibligas en ita wiki.",
        "yourdomainname": "Vua domano:",
+       "password-change-forbidden": "Vu ne darfas chanjar pasovorti en ita wiki.",
        "login": "Enirar",
-       "nav-login-createaccount": "Enirar",
+       "login-security": "Kontrolez vua identeso.",
+       "nav-login-createaccount": "Enirar / Krear konto",
        "userlogin": "Enirar / krear konto",
        "userloginnocreate": "Enirar",
        "logout": "Ekirar",
        "userlogout": "Ekirar",
        "notloggedin": "Sesiono ne esas iniciata",
+       "userlogin-noaccount": "Ka vu ne havas konto?",
+       "userlogin-joinproject": "Enirez la {{SITENAME}}",
        "nologin": "Ka vu ne havas konto? $1.",
        "nologinlink": "Kreez konto",
        "createaccount": "Krear nova konto",
        "gotaccount": "Ka vu ja havas konto? '''$1'''.",
        "gotaccountlink": "Enirar",
-       "createaccountmail": "per e-posto",
+       "userlogin-resetlink": "Ka tu obliviis la detalii pri tua konekto?",
+       "userlogin-resetpassword-link": "Ka tu obliviis tua pasovorto?",
+       "userlogin-helplink2": "Helpo pri quale enirar",
+       "userlogin-loggedin": "Tu ja eniris, kun la nomo {{GENDER:$1|$1}}\n\nUsez la formulario infre por enirar quale altra uzero.",
+       "userlogin-reauth": "Vu mustas ri-enirar por kontrolar ke vu esas {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "Kreez plusa konto.",
+       "createacct-emailrequired": "E-postal adreso",
+       "createacct-emailoptional": "E-postal adreso (ne-obligita)",
+       "createacct-email-ph": "Prizentez vua e-postal adreso",
+       "createacct-another-email-ph": "Prizentez vua e-postal adreso",
+       "createaccountmail": "Uzez provizora pasovorto, ed ad adresizez ol a la korespondanta e-posto",
+       "createacct-realname": "Vera nomo (fakultativa)",
        "createaccountreason": "Motivo:",
+       "createacct-reason": "Motivo",
+       "createacct-reason-ph": "Pro quo tu kreas nova konto",
+       "createacct-submit": "Kreez konto",
+       "createacct-another-submit": "Krear konto",
+       "createacct-continue-submit": "Durez krear konto",
+       "createacct-another-continue-submit": "Durez krear konto",
+       "createacct-benefit-heading": "{{SITENAME}} facesas da homi simile a vu.",
+       "createacct-benefit-body1": "{{PLURAL:$1|redakto|redakti}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|pagino|pagini}}",
+       "createacct-benefit-body3": "recenta {{PLURAL:$1|kontributero|kontributeri}}",
        "badretype": "La pasovorti vu donis ne esas sama.",
-       "userexists": "La uzantonomo, quan vu skribis, ja selektesis antee.\nVoluntez, elektez ula diferanta uzantonomo.",
+       "usernameinprogress": "Kontokreado por ita uzero duras. Voluntez vartar.",
+       "userexists": "La uzeronomo ja selektesis antee.\nVoluntez elektar diferanta uzeronomo.",
        "loginerror": "Eroro enirante",
+       "createacct-error": "Eroro pri kontokreado",
+       "createaccounterror": "Ne povis krear konto: $1",
+       "nocookiesnew": "L'uzero-konto esis kreita, ma vu ne esas eniranta.\n{{SITENAME}} uzas ''bisquiti'' por eniras uzeri.\n''Bisquiti'' esas desacendita.\nVoluntez acendar li, lore enirez per vua nova uzero e pasovorto.",
        "nocookieslogin": "{{SITENAME}} uzas ''cookies'' por la registrago dil uzanti. Vu havas la ''cookies'' desaktivigita. Voluntez aktivigar oli e probez altrafoye.",
+       "nocookiesfornew": "La uzerokonto ne kreesis, nam ni ne povis konfirmar lua fonto.\nEsez certa ke navigilo aceptas 'cookies', ri-apertez ita pagino, e riprobez.",
+       "createacct-loginerror": "Konto kreesis sucesoze ma vu ne eniris la reto. Voluntez vizitar [[Special:UserLogin|manual login]].",
        "noname": "Vu ne donis valida uzantonomo.",
-       "loginsuccesstitle": "Eniro sucesoza",
+       "loginsuccesstitle": "Eniris sucesoze",
        "loginsuccess": "'''Vu eniris a {{SITENAME}} kom \"$1\".'''",
-       "nosuchuser": "Ne existas uzanto \"$1\".\nUzanto-nomi esas mayu/minuskulo-distingenda.\nKontrolez vua espelado, o [[Special:CreateAccount|krear nova konto]].",
-       "nosuchusershort": "Esas nula uzanto \"$1\".\nKontrolez la espelado.",
+       "nosuchuser": "Ne existas uzero \"$1\".\nUzeronomi esas mayu/minuskulo-distingenda.\nKontrolez la espelado, o [[Special:CreateAccount|krear nova konto]].",
+       "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.",
        "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}}.",
+       "passwordtoopopular": "Voluntez selektar plu unika pasovorto.",
+       "password-name-match": "Pasovorto mustas diferar de vua uzeronomo.",
+       "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}}",
-       "noemail": "Ne esas e-adreso konservita por la uzanto \"$1\".",
+       "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.",
+       "blocked-mailpassword": "Vua adreso di IP blokuzesis por redaktado. Por preventar misuzo, ne permisesas rekuperar pasovorti de ca adreso di IP.",
+       "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.",
-       "emailauthenticated": "Vua e-postala adreso autentikigesis ye $2, ye $3.",
+       "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",
+       "cannotchangeemail": "E-posto-adreso dil konto ne povas chanjesar ye ta wikio.",
+       "emaildisabled": "Ita ret-sito ne povas sendar e-mesaji.",
        "accountcreated": "Konto kreesis",
-       "accountcreatedtext": "La uzantokonto por $1 kreatesis.",
+       "accountcreatedtext": "La uzerokonto por [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuto]]) kreesis.",
        "createaccount-title": "Kreo di konto en {{SITENAME}}",
+       "createaccount-text": "Ulu kreis konto por vua e-posto adreso ye {{SITENAME}} ($4) nomita \"$2\", kun pasovorto \"$3\".\nVu devas enirar la konto e chanjar vua pasovorto nun.\n\nVu darfas ignorar ita mesajo, se ita konto kreesis en eroro.",
+       "login-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "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",
+       "pt-login": "Enirar",
+       "pt-login-button": "Enirar",
+       "pt-login-continue-button": "Durez enirar",
+       "pt-createaccount": "Krear konto",
+       "pt-userlogout": "Ekirar",
+       "php-mail-error-unknown": "Nekonocata eroro en la funciono mail() de PHP",
+       "user-mail-no-addy": "Probis sendar e-posto sen e-post-adreso.",
+       "user-mail-no-body": "Probis sendar e-posto kun vakua o tre kurta mesajo.",
        "changepassword": "Chanjar pasovorto",
+       "resetpass_announce": "Por kompletigar l'enirado, vu mustas krear nova pasvorto.",
        "resetpass_header": "Chanjar pasovorto di konto",
        "oldpassword": "Anciena pasovorto:",
        "newpassword": "Nova pasovorto:",
        "retypenew": "Riskribez la nova pasovorto:",
        "resetpass_submit": "Establisez pasovoro ed enirez",
-       "changepassword-success": "Vua chanjo di pasovorto sucesis! Nun, vu eniras...",
+       "changepassword-success": "Vua chanjo di pasovorto sucesis!",
+       "changepassword-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "botpasswords": "Robotala pasovorti",
+       "botpasswords-label-create": "Krear",
+       "botpasswords-label-update": "Aktualigar",
+       "botpasswords-label-cancel": "Anular",
+       "botpasswords-label-delete": "Efacar",
+       "botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
+       "botpasswords-label-grants": "Uzebla grantaji:",
        "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-recycled": "Voluntez chanjar vua pasovorto ad ulo diferanta de vua aktuala 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-username": "Uzantonomo:",
-       "changeemail": "Chanjar e-adreso*",
+       "passwordreset-invalidemail": "Ne-valida e-posto-adreso",
+       "passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita",
+       "changeemail": "Chanjar od efacar e-postal adreso",
+       "changeemail-header": "Plenigez ita formulario por chanjar vua e-posto-adreso. Se vu volas forigar irga e-posto-adreso de vua konto, lasez la nova e-posto-adreso vakua en la formulario.",
+       "changeemail-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.",
+       "changeemail-oldemail": "Aktuala e-posto-adreso:",
+       "changeemail-newemail": "Nova e-posto-adreso:",
+       "changeemail-none": "(nula)",
+       "changeemail-password": "Vua {{SITENAME}} pasovorto:",
+       "changeemail-submit": "Chanjar e-posto-adreso",
+       "changeemail-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.",
+       "changeemail-nochange": "Voluntez skribar diferanta nova e-posto-adreso.",
+       "resettokens": "Rinovigar klefi",
+       "resettokens-no-tokens": "Esas nula klefi rinovigebla.",
+       "resettokens-tokens": "Klefi:",
+       "resettokens-token-label": "$1 (nuna valoro: $2)",
+       "resettokens-done": "Klefi rinovigita.",
+       "resettokens-resetbutton": "Rinovigar selektita klefi",
        "bold_sample": "Dika literi",
        "bold_tip": "Dika literi",
        "italic_sample": "Kursiva literi",
        "sig_tip": "Vua signaturo kun 'timestamp'",
        "hr_tip": "Horizontala lineo (ne trouzez ol)",
        "summary": "Rezumo:",
-       "subject": "Temo / Titulo:",
+       "subject": "Temo:",
        "minoredit": "Ico esas mikra redaktajo",
        "watchthis": "Surveyar ica pagino",
        "savearticle": "Registragar pagino",
+       "savechanges": "Konservez la chanji",
        "publishpage": "Publikigar pagino",
        "publishchanges": "Publikigar chanji",
        "preview": "Previdar",
        "showpreview": "Previdar",
        "showdiff": "Montrez chanji",
-       "anoneditwarning": "'''Averto:''' Vu ne eniris.\nVua IP-adreso registragesos en la versionaro di ca pagino.",
+       "blankarticle": "<strong>Averto:</strong> La pagino vu kreas es vakua.\nSe vu ri-selektos \"{{int:savearticle}}\", la pagino kreesos sen irga kontenajo.",
+       "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:",
-       "blockedtitle": "La uzanto esas blokusita",
+       "blockedtitle": "La uzero esas blokusita",
        "blockednoreason": "nula motivo donesis",
        "whitelistedittext": "Vu mustas $1 por redaktar pagini.",
        "nosuchsectiontitle": "On ne povis trovar la seciono",
        "accmailtext": "Hazarde genitita pasovorto por [[User talk:$1|$1]] sendesis ad $2.\n\nLa pasovorto por ica nova konto povas chanjesar che la ''[[Special:ChangePassword|chanjar pasovorto]]'' pagino pos on eniras.",
        "newarticle": "(nova)",
        "newarticletext": "Vu sequis ligilo a pagino qua ne existas ankore.\nPor krear ica pagino, voluntez startar skribar en la infra buxo.\n(regardez la [$1 helpo] por plusa informo).\nSe vu esas hike erore, kliktez sur la butono por retrovenar en vua navigilo.",
-       "noarticletext": "Prezente, ne esas texto en ica pagino.\nVu povas [[Special:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>.",
-       "userpage-userdoesnotexist": "Uzanto-nomo \"<nowiki>$1</nowiki>\" no registragesis.\nVoluntez konfirmez se vu volas krear/redaktar ica pagino.",
-       "userpage-userdoesnotexist-view": "Uzanto-nomo \"$1\" no registragesis.",
+       "noarticletext": "Til nun ne existas texto en ica pagino.\nVu povas [[Specala:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>.",
+       "userpage-userdoesnotexist": "Uzeronomo \"$1\" no registragesis.\nVoluntez konfirmez se vu volas krear/redaktar ica pagino.",
+       "userpage-userdoesnotexist-view": "Uzeronomo \"$1\" no registragesis.",
        "clearyourcache": "'''Atencez: Pos registragar, vu probable mustas renovigar la tempala-magazino di vua navigilo por vidar la chanji.'''\n'''Mozilla / Firefox / Safari:''' tenez ''Shift'' kliktante ''Reload'', o presez sive  ''Ctrl-F5'' sive ''Ctrl-R'' (''Command-R'' ye Mac);\n'''Konqueror''': kliktez ''Reload'' o presez ''F5'';\n'''Opera:''' vakuigez la tempala-magazino en ''Tools → Preferences'';\n'''Internet Explorer:''' tenez ''Ctrl'' kliktante ''Refresh,'' o presez ''Ctrl-F5''.",
-       "usercsspreview": "'''Memorez ke vu nur previdas vua uzanto-CSS.'''\n'''Ol ne registragesis ankore!'''",
-       "userjspreview": "'''Memorez ke vu nur previdas vua javascript di uzanto. Ol ne registragesis ankore!'''",
+       "usercsspreview": "'''Memorez ke vu nur previdas vua uzero-CSS.'''\n'''Ol ne registragesis ankore!'''",
+       "userjspreview": "'''Memorez ke vu nur previdas vua JavaScript di uzero. Ol ne registragesis ankore!'''",
        "updated": "(Aktualigita)",
        "note": "'''Noto:'''",
        "previewnote": "'''Atencez ke ico esas nur prevido ed ol ne registragesis ankore!'''",
        "permissionserrorstext-withaction": "Vu ne darfas $2, pro la {{PLURAL:$1|kauzo|kauzi}} sequanta:",
        "moveddeleted-notice": "Ca pagino efacesabas.\nLa efaco-registraro e movo-registraro dil pagino provizesar sequante por refero.",
        "edit-conflict": "Konflikto di editi.",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "vakua objekto",
+       "content-json-empty-array": "vakua tabelo",
+       "deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
        "viewpagelogs": "Videz registrari por ca pagino",
        "nohistory": "Ne esas redakto-historio por ica pagino.",
        "currentrev": "Aktuala versiono",
        "histlast": "Maxim nova",
        "historysize": "({{PLURAL:$1|1 bicoko|$1 bicoki}})",
        "historyempty": "(vakua)",
+       "history-feed-title": "Historio di redakti",
+       "history-feed-description": "Historio di redakti por ta pagino en la wikio",
        "history-feed-item-nocomment": "$1 ye $2",
-       "rev-deleted-comment": "(komento forigita)",
+       "rev-deleted-comment": "(rezumo di redakti forigesis)",
        "rev-deleted-user": "(uzantonomo forigita)",
+       "rev-deleted-event": "(detali dil registro forigesis)",
        "rev-delundel": "montrar/celar",
        "rev-showdeleted": "montrar",
        "revdelete-show-file-submit": "Yes",
        "revdelete-hide-image": "Celar kontenajo dil arkivo",
-       "revdelete-hide-comment": "Celar komento pri redakto",
-       "revdelete-hide-user": "Celar uzantonomo od IP di redaktanto",
-       "revdelete-radio-set": "Yes",
-       "revdelete-radio-unset": "No",
+       "revdelete-hide-comment": "Rezumo di redakto",
+       "revdelete-hide-user": "uzeronomo di redaktanto/IP-adreso",
+       "revdelete-radio-set": "Celita",
+       "revdelete-radio-unset": "Videbla",
        "revdelete-log": "Motivo:",
        "revdel-restore": "chanjar videbleso",
        "pagehist": "Pagino-versionaro",
        "revdelete-reasonotherlist": "Altra motivo",
        "mergehistory-reason": "Motivo:",
        "revertmerge": "Desmixar",
-       "history-title": "Versionaro di \"$1\"",
+       "history-title": "Version-historio di \"$1\"",
+       "difference-title": "Diferi inter la revizi di $1",
        "lineno": "Lineo $1:",
        "compareselectedversions": "Komparar selektita versioni",
        "editundo": "des-facez",
+       "diff-multi-sameuser": "(ne montresas {{PLURAL:$1|1 meza revizo|$1 meza revizi}} facita da la sama uzero)",
        "searchresults": "Rezultaji dil sercho",
        "searchresults-title": "Sercho-rezultaji por \"$1\"",
        "titlematches": "Koincidi de titulo di artiklo",
        "searchprofile-articles-tooltip": "Serchez en $1",
        "searchprofile-images-tooltip": "Serchez arkivi",
        "search-result-size": "$1 ({{PLURAL:$2|1 vorto|$2 vorti}})",
-       "search-redirect": "(ridirektilo $1)",
+       "search-redirect": "(Ridirektita de $1)",
        "search-section": "(seciono $1)",
        "search-suggest": "Ka vu volis dicar: $1",
        "search-interwiki-caption": "Altra projekti",
-       "search-interwiki-default": "Rezultaji di $1:",
+       "search-interwiki-default": "Rezultaji de $1:",
        "search-interwiki-more": "(plusa)",
        "searchall": "omna",
        "showingresults": "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
+       "search-nonefound": "Nula rezulto trovesis por lua serchado.",
        "powersearch-legend": "Avancita sercho",
        "powersearch-ns": "Serchez en nomari:",
        "powersearch-toggleall": "Omna",
        "preferences": "Preferaji",
        "mypreferences": "Preferaji",
        "prefs-edits": "Nombro di redaktaji:",
+       "prefsnologintext2": "Voluntez enirar por chanjar vua ajusti.",
        "prefs-skin": "Pelo",
        "skin-preview": "Pre-videz",
        "datedefault": "Sen prefero",
        "prefs-rc": "Recenta chanji",
        "prefs-watchlist": "Surveyo-listo",
        "prefs-watchlist-days": "Dii montrata en surveyaji:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "Maxime $1 {{PLURAL:$1|dio|dii}}",
        "prefs-watchlist-edits-max": "Maxima nombro: 1000",
        "prefs-misc": "Mixaji",
        "prefs-resetpass": "Chanjar pasovorto",
        "prefs-rendering": "Aspekto",
        "saveprefs": "Registragar",
        "prefs-editing": "Grandeso dil areo por texto",
-       "rows": "Linei:",
-       "columns": "Kolumni:",
        "searchresultshead": "Preferaji di la rezultaji dil sercho",
        "recentchangesdays": "Dii montrota en la recenta chanji:",
        "recentchangesdays-max": "Maximo $1 {{PLURAL:$1|dio|dii}}",
        "prefs-namespaces": "Nomari",
        "prefs-files": "Arkivi",
        "youremail": "Vua e-adreso:",
-       "username": "Uzantonomo:",
-       "prefs-memberingroups": "Membro di la {{PLURAL:$1|grupo|grupi}}:",
+       "username": "{{GENDER:$1|Uzeronomo}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} di {{PLURAL:$1|grupo|grupi}}:",
        "yourrealname": "Reala nomo:",
        "yourlanguage": "Linguo:",
        "yournick": "Signaturo:",
        "badsiglength": "Vua signaturo es tro longa.\nOl mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.",
-       "yourgender": "Genro:",
-       "gender-unknown": "Nespecigita",
-       "gender-male": "Maskula",
-       "gender-female": "Femina",
+       "yourgender": "Quale vu preferas esar priskribata?",
+       "gender-unknown": "Lor mencionar vu, la programaro uzos sexuo-neutrala vorti tam ofte kam posibla",
+       "gender-male": "Ilu redaktas wikiopagini",
+       "gender-female": "Elu redaktas wikiopagini",
        "email": "Elek-posto",
        "prefs-help-email-required": "E-postala adreso es bezonata.",
        "prefs-info": "Bazala informeso",
        "prefs-signature": "Signaturo",
+       "prefs-editor": "Redaktilo",
+       "prefs-preview": "Previdar",
        "prefs-diffs": "Diferi",
        "userrights-user-editname": "Skribez uzantonomo:",
        "userrights-groupsmember": "Membro di:",
        "group-sysop": "Administranti",
        "group-bureaucrat": "Burokrati",
        "group-all": "(omna)",
-       "group-user-member": "Uzanto",
-       "group-bot-member": "Roboto",
-       "group-sysop-member": "Administranto",
-       "group-bureaucrat-member": "Burokrato",
+       "group-user-member": "{{GENDER:$1|uzero}}",
+       "group-bot-member": "{{GENDER:$1|roboto}}",
+       "group-sysop-member": "{{GENDER:$1|administrero}}",
+       "group-bureaucrat-member": "{{GENDER:$1|burokrato}}",
        "grouppage-user": "{{ns:project}}:Uzanti",
        "grouppage-bot": "{{ns:project}}:Roboti",
        "grouppage-sysop": "{{ns:project}}:Administranti",
        "right-upload": "Adkargar arkivi",
        "right-delete": "Efacar pagini",
        "right-browsearchive": "Serchar pagini efacita",
-       "right-rollback": "Rapide retrorular la redakti da la lasta uzanto qua redaktis specigita pagino",
-       "newuserlogpage": "Uzanto-kreo-registro",
-       "rightslog": "Uzanto-yuri-registraro",
+       "right-rollback": "Rapide retrorular la redakti da la lasta uzero qua redaktis specigita pagino",
+       "newuserlogpage": "Uzero-kreo-registro",
+       "rightslog": "Uzero-yuri-registraro",
        "action-read": "lektar ca pagino",
        "action-edit": "redaktar ca pagino",
-       "action-createpage": "krear pagini",
+       "action-createpage": "kreez ita pagino",
        "action-move": "movar ca pagino",
        "action-movefile": "movar ca arkivo",
        "action-upload": "adkargar ca arkivo",
        "action-browsearchive": "serchar pagini efacita",
        "nchanges": "$1 {{PLURAL:$1|chanjo|chanji}}",
+       "enhancedrc-history": "Versionaro",
        "recentchanges": "Recenta chanji",
        "recentchanges-legend": "Recenta chanji preferaji",
        "recentchanges-summary": "Regardez la maxim recenta chanji en Wiki per ica pagino.",
        "recentchanges-label-newpage": "Ca redaktajo kreis nova pagino",
        "recentchanges-label-minor": "Ica es mikra redaktajo",
        "recentchanges-label-bot": "Ta chanjo facita da bot",
+       "recentchanges-label-unpatrolled": "Ica modifiko ne patroliesas ankore.",
+       "recentchanges-label-plusminus": "La pagino modifikesis segun ica quanto di *bicoki",
        "recentchanges-legend-newpage": "$1 - nova pagino",
+       "rcfilters-filter-userExpLevel-experienced-description": "Plu kam 30 dii di agemeso e 500 redakti.",
        "rcnotefrom": "Infre esas la lasta chanji depos '''$2''' (montrita til '''$1''').",
        "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "rcshowhideminor": "$1 mikra redakti",
+       "rcshowhideminor-show": "Montrar",
+       "rcshowhideminor-hide": "Celar",
        "rcshowhidebots": "$1 roboti",
-       "rcshowhideliu": "$1 enirinta uzanti",
+       "rcshowhidebots-show": "Montrar",
+       "rcshowhidebots-hide": "Celar",
+       "rcshowhideliu": "$1 enrejistrita uzeri",
+       "rcshowhideliu-hide": "Celar",
        "rcshowhideanons": "$1 anonima uzanti",
+       "rcshowhideanons-show": "Montrar",
+       "rcshowhideanons-hide": "Celar",
        "rcshowhidemine": "$1 mea redakti",
+       "rcshowhidemine-show": "Montrar",
+       "rcshowhidemine-hide": "Celar",
        "rclinks": "Montrar la lasta $1 chanji dum la lasta $2 dii<br />$3",
        "diff": "dif",
        "hist": "vers",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "r",
-       "rc_categories_any": "Ula",
+       "rc_categories_any": "Irga selektita",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bicoko|bicoki}} pos la modifiki",
        "newsectionsummary": "/* $1 */ nova seciono",
-       "rc-enhanced-expand": "Montrar detali (JavaScript bezonesas)",
+       "rc-enhanced-expand": "Montrez detali",
        "rc-enhanced-hide": "Celar detali",
        "recentchangeslinked": "Relatanta chanji",
        "recentchangeslinked-feed": "Relatanta chanji",
        "uploadbtn": "Adkargar arkivo",
        "reuploaddesc": "Retrovenar al adkargo-formularo.",
        "uploadnologin": "Vu ne eniris",
-       "uploadnologintext": "Vu mustas [[Special:UserLogin|enirir]] por adkargar arkivi.",
+       "uploadnologintext": "Voluntez $1 por adkargar arkivi.",
        "uploaderror": "Eroro dum adkargo",
        "uploadlogpage": "Adkargo-registraro",
        "uploadlogpagetext": "Infre esas listo di la plu recenta adkargaji.\nVidez rezumo plu vidala en la [[Special:NewFiles|galerio di nova arkivi]].",
        "filesource": "Fonto:",
        "ignorewarning": "Ignorar la averto e gardar la arkivo irgakaze.",
        "badfilename": "La imajo-nomo chanjesis a \"$1\".",
-       "fileexists": "Arkivo kun ica nomo ja existas.\nVolutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.\n[[$1|thumb]]",
+       "fileexists": "Arkivo kun ta nomo ja existas.\nVolutez kontrolar <strong>[[:$1]]</strong> se {{GENDER:|vu}} ne esas certa pri chanjar olu.\n[[$1|thumb]]",
        "uploadwarning": "Averto pri la adkargo di arkivo",
        "savefile": "Registragar arkivo",
        "uploaddisabled": "Pardonez, la adkargo esas desaktiva.",
        "listfiles": "Listo di imaji",
        "listfiles_date": "Dato",
        "listfiles_name": "Nomo",
-       "listfiles_user": "Uzanto",
+       "listfiles_user": "Uzero",
        "listfiles_count": "Versioni",
        "file-anchor-link": "Failo",
        "filehist": "Historio dil arkivo",
        "filehist-datetime": "Dato/Horo",
        "filehist-thumb": "Imajeto",
        "filehist-thumbtext": "Imajeto di versiono ye $1",
-       "filehist-user": "Uzanto",
+       "filehist-user": "Uzero",
        "filehist-dimensions": "Dimensioni",
        "filehist-filesize": "Grandeso dil arkivo",
        "filehist-comment": "Komento",
        "linkstoimage": "La {{PLURAL:$1|pagino|$1 pagini}} infre ligas a ca arkivo:",
        "nolinkstoimage": "Nula pagino ligas a ca pagino.",
        "sharedupload": "Ca arkivo esas de $1 e posible esas uzata da altra projekti.",
+       "sharedupload-desc-here": "Ca arkivo jacas en $1, e povas uzesar en altra projeti.\nLa deskriptado en lua [$2 pagino di deskriptado] montresas infre.",
        "uploadnewversion-linktext": "Adkargez nova versiono dil arkivo",
        "shared-repo-from": "ek $1",
+       "upload-disallowed-here": "Vu ne povas modifikar ica arkivo.",
        "filerevert-comment": "Motivo:",
        "filedelete": "Efacar $1",
        "filedelete-legend": "Efacar arkivo",
        "randompage": "Hazarda pagino",
        "randomredirect": "Hazarda ridirektilo",
        "statistics": "Statistiko",
-       "statistics-header-users": "Statistiki di uzanto",
+       "statistics-header-users": "Statistiki di uzero",
        "statistics-header-hooks": "Altra statistiki",
        "statistics-pages": "Pagini",
        "doubleredirects": "Duopla ridirektili",
        "deadendpages": "Pagini sen ekiraji",
        "protectedpages": "Protektita pagini",
        "protectedtitles": "Protektita tituli",
-       "listusers": "Uzanto-listo",
+       "listusers": "Uzerolisto",
        "usereditcount": "$1 {{PLURAL:$1|redakto|redakti}}",
        "usercreated": "{{GENDER:$3|Kreita}} ye $1 $2",
        "newpages": "Nova pagini",
        "ancientpages": "Maxim anciena artikli",
        "move": "Movar",
        "movethispage": "Rinomizar ica pagino",
-       "unusedimagestext": "Voluntez egardez ke altra ret-situi povus ligar a arkivo per direta URL, e do ol povus esar enlistizita hike malgre olu havas aktiva uzo.",
+       "unusedimagestext": "La sequanta arkivi existas ma ne enterigita en irga pagino.\nVoluntez remarkar ke altra ret-siti povus ligar ad arkivo per direta URL, e do ol povus esar listizita hike malgre ke on aktive uzas lo.",
        "notargettitle": "Ne esas vakua pagino",
        "notargettext": "Vu ne definis en qua pagino agar ica funciono.",
        "pager-newer-n": "{{PLURAL:$1|plu nova 1|plu nova $1}}",
        "pager-older-n": "{{PLURAL:$1|plu anciena 1|plu anciena $1}}",
+       "apihelp-no-such-module": "Modulo « $1 » ne esis trovita.",
+       "apisandbox-loading": "Charjas informo pri modulo « $1 » di API...",
        "booksources": "Fonti di libri",
        "booksources-search-legend": "Serchez librala fonti",
-       "specialloguserlabel": "Uzanto:",
-       "speciallogtitlelabel": "Titulo:",
+       "booksources-search": "Serchar",
+       "specialloguserlabel": "Agero:",
+       "speciallogtitlelabel": "Skopo (titulo od {{ns:user}}:uzernomo por uzero):",
        "log": "Registrari",
        "all-logs-page": "Omna publika registrari",
        "allpages": "Omna pagini",
        "allpagessubmit": "Irez",
        "allpages-bad-ns": "{{SITENAME}} ne havas nomaro \"$1\".",
        "categories": "Kategorii",
-       "deletedcontributions": "Efacita uzanto-kontributadi",
-       "deletedcontributions-title": "Efacita uzanto-kontributadi",
-       "linksearch": "Extera ligili",
+       "deletedcontributions": "Efacita uzero-kontributadi",
+       "deletedcontributions-title": "Efacita uzero-kontributadi",
+       "linksearch": "Sercho di extera ligili",
        "linksearch-ns": "Nomaro:",
        "linksearch-ok": "Serchez",
        "listusers-submit": "Montrez",
-       "activeusers-noresult": "Nula uzanto trovesis.",
+       "activeusers-noresult": "Nula uzero trovesis.",
        "listgrouprights-group": "Grupo",
        "listgrouprights-members": "(listo di membri)",
        "mailnologin": "Ne sendar adreso",
        "mailnologintext": "Vu mustas [[Special:UserLogin|enirir]] e havar valida e-adreso en vua [[Special:Preferences|preferaji]] por sendar e-posto ad altra uzanti.",
-       "emailuser": "Sendar e-posto a ca uzanto",
-       "defemailsubject": "E-posto di {{SITENAME}}",
+       "emailuser": "Sendar e-posto a ca uzero",
+       "defemailsubject": "{{SITENAME}} e-mesaji de uzero \"$1\"",
        "noemailtitle": "Ne esas e-adreso",
        "emailfrom": "De:",
        "emailto": "Ad:",
        "mywatchlist": "Surveyaji",
        "nowatchlist": "Vu ne havas objekti en vua listo di surveyaji.",
        "watchnologin": "Vu ne startis sesiono",
-       "addedwatchtext": "La pagino \"<nowiki>$1</nowiki>\" atachesis a vua [[Special:Watchlist|listo de surveyaji]]. Futura chanji di ica pagino ed olua relatanta debato-pagini montresos ibe, ed la pagino aparos per '''dika literi''' en la [[Special:RecentChanges|listo de recenta chanji]] por faciligar sua trovebleso.\n\n<p> Se vu volas efacar la pagino de vua listo de surveyaji pose, presez \"Ne plus surveyar\" en la selektaro.",
-       "removedwatchtext": "La pagino \"[[:$1]]\" forigesis de [[Special:Watchlist|vua surveyado]].",
+       "addedwatchtext": "\"[[:$1]]\" atachesis a vua [[Special:Watchlist|listo di surveyaji]].",
+       "removedwatchtext": "\"[[:$1]]\" ed relatanta diskutado forigesis de [[Special:Watchlist|vua surveyado]].",
        "watch": "Surveyar",
        "watchthispage": "Surveyar ica pagino",
        "unwatch": "Ne plus surveyar",
        "unwatchthispage": "Ne plus surveyar",
        "notanarticle": "Ne esas artiklo",
-       "wlnote": "Infre esas la lasta {{PLURAL:$1|chanjo|'''$1''' chanji}} dum la lasta {{PLURAL:$2|horo|'''$2''' hori}}.",
-       "wlshowlast": "Montrar la lasta $1 hori $2 dii",
+       "wlnote": "Yen la maxim recenta {{PLURAL:$1|chanjo|<strong>$1</strong> chanji}} dum la lasta {{PLURAL:$2|horo|<strong>$2</strong> hori}}, desde $3,$4.",
+       "wlshowlast": "Montrez la lasta $1 hori $2 dii",
        "watchlist-options": "Surveryo-listo selekti",
        "watching": "Surveyanta…",
        "unwatching": "Cesanta surveyar…",
-       "enotif_impersonal_salutation": "Uzanto di {{SITENAME}}",
-       "enotif_anon_editor": "anonima uzanto $1",
+       "enotif_impersonal_salutation": "Uzero di {{SITENAME}}",
+       "enotif_anon_editor": "anonima uzero $1",
        "deletepage": "Efacar pagino",
        "confirm": "Konfirmar",
        "excontent": "La kontenajo esis: '$1'",
        "exbeforeblank": "La kontenajo ante efaco esis: '$1'",
        "delete-confirm": "Efacar \"$1\"",
        "delete-legend": "Efacar",
-       "historywarning": "Egardez: La pagino, quan vu efaceskas, havas versionaro:",
+       "historywarning": "<strong>Averto:</strong> La pagino quan vu efaceskas havas historio kun $1 {{PLURAL:$1|revizo|revizi}}:",
        "actioncomplete": "Ago kompletigita",
        "deletedtext": "\"$1\" efacesis.\nVidez $2 por obtenar registro di recenta efaci.",
        "dellogpage": "Efaco-registraro",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Altra/suplementala motivo:",
        "deletereasonotherlist": "Altra motivo",
-       "deletereason-dropdown": "*Ordinara motivi por efaco\n** Demandita da autoro\n** Kopiyuro Violaco\n** Korupto",
+       "deletereason-dropdown": "*Ordinara motivi por efacado\n** \"Spam\" nedezirata mesaji\n** Vandalismo\n** Kopiyuro Violaco\n** Demandita da autoro\n** Nefuncionanta ligilo",
        "rollback": "Retrorulez redakti",
        "rollbacklink": "retrorulez",
+       "rollbacklinkcount": "nuligar $1 {{PLURAL:$1|modifiko|modifiki}}",
        "rollbackfailed": "Retrorular ne sucesis",
        "cantrollback": "Ne esas posibla retrorular. La lasta kontributanto esas la nura autoro di ica pagino.",
        "alreadyrolled": "Vu ne povas retrorular la lasta chanjo di [[:$1]] da [[User:$2|$2]] ([[User talk:$2|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nulu pluse ja redaktis o retrorulis ica pagino.\n\nLa lasta chanjo a la pagino esis da [[User:$3|$3]] ([[User talk:$3|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "rollback-success": "Desfacis redakti da $1;\nrestauris ad lasta versiono da $2.",
        "protectlogpage": "Protekto-registraro",
        "protectedarticle": "protektita \"[[$1]]\"",
-       "unprotectedarticle": "desprotektita [[$1]]",
+       "unprotectedarticle": "desprotektita de \"[[$1]]\"",
        "protect-title": "Protektante \"$1\"",
        "prot_1movedto2": "[[$1]] movita a [[$2]]",
        "protect-legend": "Konfirmar protekto",
        "protect_expiry_invalid": "Expirotempo es ne-valida.",
        "protect_expiry_old": "Expirotempo es in pasinta.",
        "protect-default": "Permisar omna uzanti",
-       "protect-fallback": "Bezonar permiso \"$1\"",
-       "protect-level-sysop": "Nur administranti",
+       "protect-fallback": "Permisez nur uzeri kun permiso \"$1\"",
+       "protect-level-sysop": "Permisez nur administreri",
        "protect-summary-cascade": "kaskade",
        "protect-expiring": "expiras ye $1 (UTC)",
        "protect-expiry-indefinite": "nefinita",
        "undelete": "Vidar efacita pagini",
        "undeletepage": "Vidar e restaurar efacita pagini",
        "undeletepagetext": "La sequanta {{PLURAL:$1|pagino|pagini}} efacesis ma {{PLURAL:$1|ol|li}} ankore esas en la arkivo ed esas restaurebla. La arkivo povas netigesar periodale.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} konservita",
+       "undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} efacita",
        "undeletebtn": "Restaurar",
        "undeletelink": "vidar/restaurar",
        "undeleteviewlink": "videz",
-       "undeletecomment": "Komento:",
+       "undeletecomment": "Motivo:",
        "undelete-search-box": "Serchez efacita pagini",
        "undelete-search-submit": "Serchar",
        "undelete-show-file-submit": "Yes",
        "namespace": "Nomaro:",
        "invert": "Inversigar selektajo",
        "blanknamespace": "(Chefa)",
-       "contributions": "Kontributadi dil {{GENDER:$1|uzanto}}",
-       "contributions-title": "Uzanto-kontributadi di $1",
+       "contributions": "Kontributadi dil {{GENDER:$1|uzero}}",
+       "contributions-title": "Uzero-kontributadi di $1",
        "mycontris": "Kontributadi",
+       "anoncontribs": "Kontributadi",
        "contribsub2": "Pro $1 ($2)",
        "nocontribs": "Ne trovesis chanji qui fitez ita kriterii.",
        "uctop": "(aktuala)",
        "sp-contributions-newbies": "Montrez nur kontributadi di nova konti",
        "sp-contributions-newbies-sub": "Di nova konti",
        "sp-contributions-blocklog": "blokusar-registraro",
-       "sp-contributions-deleted": "efacita uzanto-kontributadi",
+       "sp-contributions-deleted": "efacita {{GENDER:$1|uzero}}-kontributadi",
        "sp-contributions-logs": "registrari",
        "sp-contributions-talk": "diskutez",
        "sp-contributions-search": "Serchar kontributadi",
        "whatlinkshere-hideimages": "$1 ligili di arkivi",
        "whatlinkshere-filters": "Filtrili",
        "blockip": "Blokusado di IP-adresi",
-       "blockip-legend": "Blokusar uzanto",
+       "blockip-legend": "Blokusar uzero",
        "ipaddressorusername": "IP-adreso od uzantonomo:",
        "ipbexpiry": "Expiro:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago\n** Trouzar multa konti\n** Neaceptebla uzanto-nomo",
+       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago\n** Trouzar multa konti\n** Neaceptebla uzeronomo",
        "ipbcreateaccount": "Preventez kreo di konti",
-       "ipbsubmit": "Blokusar ica uzanto",
+       "ipbsubmit": "Blokusar ica uzero",
        "ipbother": "Altra tempo:",
        "ipboptions": "2 horo:2 hours,1 dio:1 day,3 dii:3 days,1 semano:1 week,2 semani:2 weeks,1 monato:1 month,3 monati:3 months,6 monati:6 months,1 yaro:1 year,infinita:infinite",
        "badipaddress": "IP-adreso ne esas valida",
        "blockipsuccesssub": "Blokusado sucesis",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokusesis.<br />\nVidez [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.",
        "ipb-edit-dropdown": "Redaktar blokuso-motivi",
-       "unblockip": "Desblokusar uzanto",
+       "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "ipblocklist": "Blokusita uzanti",
        "move-page": "Movar $1",
        "move-page-legend": "Rinomizar pagino",
        "movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
-       "movenologintext": "Vu mustas esar registragita uzanto ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
+       "movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
        "newtitle": "A nova titulo:",
        "move-watch": "Surveyar ca pagino",
        "movepagebtn": "Movar pagino",
        "importtext": "Voluntez exportacar l' arkivo de la fonto-wiki uzante la utensilo \"Special:Export\", registragar ol a vua disko ed adkargar ol hike.",
        "importfailed": "La importaco faliis: $1",
        "importsuccess": "Importaco sucesoza!",
-       "tooltip-pt-userpage": "Vua uzanto-pagino",
-       "tooltip-pt-mytalk": "Vua diskuto-pagino",
-       "tooltip-pt-preferences": "Mea preferaji",
+       "tooltip-pt-userpage": "{{GENDER:|Vua uzero}} pagino",
+       "tooltip-pt-mytalk": "{{GENDER:|Vua}} diskuto-pagino",
+       "tooltip-pt-preferences": "{{GENDER:|Vua}} preferaji",
        "tooltip-pt-watchlist": "Listo di pagini quin vu kontrolas",
-       "tooltip-pt-mycontris": "Listo di vua kontributaji",
+       "tooltip-pt-mycontris": "Listo di {{GENDER:|vua}} kontributaji",
        "tooltip-pt-login": "Vu darfas enirar uzante vua pas-vorto, ma lo ne esas preskriptata.",
        "tooltip-pt-logout": "Ekirar",
+       "tooltip-pt-createaccount": "Vu stimulesas a krear konto e facar \"log in\". Tamen, to ne esas obliganta",
        "tooltip-ca-talk": "Diskuto pri la pagino di kontenajo",
-       "tooltip-ca-edit": "Vu darfas chanjar ta pagino. Voluntez pre-vidar chanji ante registragar oli.",
+       "tooltip-ca-edit": "Redaktar ita pagino",
        "tooltip-ca-addsection": "Komencar nova seciono",
        "tooltip-ca-viewsource": "Ca pagino esas protektita. Vu povas vidar olua fonto-kodo",
        "tooltip-ca-history": "Pasinta versioni di ca pagino",
        "tooltip-search": "Serchez en {{SITENAME}}",
        "tooltip-search-go": "Irez a pagino havanta ta exakta nomo, se existus",
        "tooltip-search-fulltext": "Serchez ca texto en la pagini",
-       "tooltip-p-logo": "Frontispico",
-       "tooltip-n-mainpage": "Vizitez la Frontispico",
-       "tooltip-n-mainpage-description": "Vizitez la frontispico",
+       "tooltip-p-logo": "Chefpagino",
+       "tooltip-n-mainpage": "Vizitez la Chefpagino",
+       "tooltip-n-mainpage-description": "Vizitez la chefpagino",
        "tooltip-n-portal": "Pri la projeto, quon vu facus, ube trovus utilaji",
        "tooltip-n-currentevents": "Trovez informeco pri aktuala eventi",
        "tooltip-n-recentchanges": "Listo di recenta chanji en la wiki.",
        "tooltip-t-recentchangeslinked": "Recenta chanji di pagini ligita de ca pagino",
        "tooltip-feed-rss": "RSS provizero por ica pagino",
        "tooltip-feed-atom": "Atom provizero por ica pagino",
-       "tooltip-t-contributions": "Videz kontributaji di ta uzanto",
-       "tooltip-t-emailuser": "Sendez mesajo al uzanto",
+       "tooltip-t-contributions": "Videz kontributaji di {{GENDER:$1|ta uzanto}}",
+       "tooltip-t-emailuser": "Sendez mesajo al {{GENDER:$1|uzanto}}",
+       "tooltip-t-info": "Plua informo pri ca pagino",
        "tooltip-t-upload": "Adkargez arkivi",
        "tooltip-t-specialpages": "Montrez listo di omna specala pagini",
        "tooltip-t-print": "Imprimebla versiono di ca pagino",
        "tooltip-t-permalink": "Permananta ligilo vers ita versiono di ta pagino",
        "tooltip-ca-nstab-main": "Vidar la kontenajo di ca pagino",
-       "tooltip-ca-nstab-user": "Videz la pagino dil uzanto",
-       "tooltip-ca-nstab-special": "Ito esas specala pagino, vu ne povas redaktar la pagino ipsa",
+       "tooltip-ca-nstab-user": "Vidar la pagino dil uzero",
+       "tooltip-ca-nstab-special": "Ito esas specala pagino, ed es ne-redaktebla",
        "tooltip-ca-nstab-project": "Vidar la projekto-pagino",
        "tooltip-ca-nstab-image": "Videz la pagino dil arkivo",
        "tooltip-ca-nstab-template": "Vidar la shablono",
        "tooltip-rollback": "\"Retrorular\" desfacas omna chanji ad ca pagino da la lasta kontributanto per un kliko",
        "tooltip-undo": "\"Desfacez\" nuligas ca versiono e apertas la redakto-pagino en prevido-modo.\nVu darfos adjuntar kauso en la rezumo.",
        "tooltip-summary": "Skribez kurta rezumo",
-       "anonymous": "Anonima {{PLURAL:$1|uzanto|uzanti}} di {{SITENAME}}",
-       "siteuser": "Uzanto che {{SITENAME}} $1",
+       "anonymous": "Anonima {{PLURAL:$1|uzero|uzeri}} di {{SITENAME}}",
+       "siteuser": "Uzero che {{SITENAME}} $1",
        "lastmodifiedatby": "Ica pagino modifikesis ye $2, $1 da $3.",
        "othercontribs": "Bazizita en la laboro da $1.",
        "others": "altra",
-       "siteusers": "{{PLURAL:$2|Uzanto|Uzanti}} che {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|uzero}}|uzeri}} $1 di {{SITENAME}}",
        "spamprotectiontitle": "Filtrilo kontre spamo",
+       "simpleantispam-label": "Surveyo kontre \"spam\".\n<strong>NE SKRIBEZ</strong> hike!",
        "pageinfo-toolboxlink": "Informo di ca pagino",
        "previousdiff": "← Plu anciena versiono",
        "nextdiff": "Plu recenta versiono →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pagino|pagini}}",
        "file-nohires": "Ne existas grandeso plu granda.",
-       "show-big-image": "Grandeso kompleta",
+       "svg-long-desc": "arkivo SVG, nominale $1 x $2 \"pixels\", kun $3",
+       "show-big-image": "Arkivo originala",
+       "show-big-image-size": "$1 x $2 pixels",
        "newimages": "Galerio di nova arkivi",
        "imagelisttext": "Infre esas listo di '''$1''' {{PLURAL:$1|arkivo|arkivi}} rangizita $2.",
        "newimages-legend": "Filtrilo",
        "ilsubmit": "Serchar",
        "bydate": "per dato",
        "metadata": "Metadonaji",
+       "metadata-help": "Ca arkivo kontenas plusa informo, probable furnisita per la kamero elektronikala o per la \"scanner\" uzata por krear o kopiar l'imajo.\nSe l'arkivo modifikesos de lua originala stando, kelka detali povos ne reprezentar exakte l'arkivo modifikata.",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\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": "Larjeso",
        "exif-imagelength": "Alteso",
+       "exif-orientation": "Orientizo",
+       "exif-xresolution": "Horizontala distingivo",
+       "exif-yresolution": "Vertikala distingivo",
+       "exif-datetime": "Dio e horo di la modifiko dil arkivo",
+       "exif-make": "Fabrikanto di la fotografilo",
+       "exif-model": "Fotografilo uzita",
+       "exif-software": "*Komputeroprogramo uzata",
        "exif-artist": "Autoro",
+       "exif-exifversion": "versiono Exif",
+       "exif-datetimeoriginal": "Dio e horo di produktado di la datumaro",
+       "exif-datetimedigitized": "Dio e horo di la kopio kun \"scanner\"",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-gpslatitude": "Latitudo",
        "exif-gpslongitude": "Longitudo",
        "watchlisttools-view": "Vidar relatanta chanji",
        "watchlisttools-edit": "Vidar e redaktar surveyo-listo",
        "watchlisttools-raw": "Redaktar texto di surveyo-listo",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuto]])",
        "version": "Versiono",
        "version-specialpages": "Specala pagini",
        "version-other": "Altra",
        "version-version": "($1)",
-       "version-license": "Licenco",
+       "version-license": "MediaWiki Licenco",
        "version-software-product": "Produkturo",
        "version-software-version": "Versiono",
        "fileduplicatesearch-submit": "Serchar",
        "specialpages-group-redirects": "Specala pagini di ridirektili",
        "blankpage": "Pagino sen-skribura",
        "tag-filter-submit": "Filtrez",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2)",
        "tags-edit": "redaktar",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
        "htmlform-reset": "Desfacar chanji",
        "htmlform-selectorother-other": "Altra",
+       "htmlform-cloner-create": "Adjuntar plue",
+       "logentry-move-move": "$1 {{GENDER:$2|movis}} la pagino $3 a $4",
+       "logentry-newusers-create": "La konto dil uzero $1 kreesis.",
+       "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "rightsnone": "(nula)",
        "revdelete-summary": "redakto-rezumo",
-       "searchsuggest-search": "Serchez",
+       "searchsuggest-search": "Serchez en {{SITENAME}}",
        "searchsuggest-containing": "quan kontenas...",
        "expand_templates_output": "Rezulto",
        "expand_templates_ok": "O.K.",
        "special-characters-group-greek": "Grekiana",
        "special-characters-group-cyrillic": "Kirila",
        "special-characters-group-arabic": "Arabiana",
-       "special-characters-group-persian": "Persiana"
+       "special-characters-group-persian": "Persiana",
+       "sessionprovider-nocookies": "''Bisquiti'' forsan esas desacendita. Certigez ke vu acendar ''bisquiti'' e riprobez."
 }
index a6344cc..d4666ed 100644 (file)
        "searcharticle": "Áfram",
        "history": "Breytingaskrá",
        "history_short": "Breytingaskrá",
+       "history_small": "skrá",
        "updatedmarker": "uppfært frá síðustu heimsókn minni",
        "printableversion": "Prentvæn útgáfa",
        "permalink": "Varanlegur tengill",
        "talk": "Spjall",
        "views": "Sýn",
        "toolbox": "Verkfæri",
+       "tool-link-userrights": "Breyta {{GENDER:$1|notanda}} hópum",
+       "tool-link-userrights-readonly": "Skoða {{GENDER:$1|notanda}} hópa",
+       "tool-link-emailuser": "Senda þessum {{GENDER:$1|notanda}} tölvupóst",
        "userpage": "Skoða notandasíðu",
        "projectpage": "Skoða verkefnissíðu",
        "imagepage": "Skoða skráarsíðu",
        "passwordreset-emaildisabled": "Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.",
        "passwordreset-username": "Notandanafn:",
        "passwordreset-domain": "Lén:",
-       "passwordreset-capture": "Sjá áminninguna sem var send í tölvupósti?",
-       "passwordreset-capture-help": "Ef þú hakar við þennan reit verður tölvupósturinn (með bráðabirgðalykilorðinu) sýndur þér og einnig sendur notandanum.",
        "passwordreset-email": "Netfang:",
        "passwordreset-emailtitle": "Notendaupplýsingar á {{SITENAME}}",
        "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notenda er}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt, og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
        "saveprefs": "Vista",
        "restoreprefs": "Endurstilla allar sjálfgefnar stillingar (í öllum hlutum)",
        "prefs-editing": "Breytingarflipinn",
-       "rows": "Raðir",
-       "columns": "Dálkar",
        "searchresultshead": "Leit",
        "stub-threshold": "Þröskuldur fyrir stílsnið stubbatengla ($1):",
        "stub-threshold-sample-link": "dæmi",
        "recentchangescount": "Fjöldi síðna:",
        "prefs-help-recentchangescount": "Taldar eru með nýlegar breytingar, breytingaskrár og aðgerðaskrár.",
        "savedprefs": "Kjörstillingarnar þínar hafa verið vistaðar.",
-       "savedrights": "Notandaréttindi {{GENDER:$1|$1}} hafa verið vistuð.",
+       "savedrights": "Notanda hópur {{GENDER:$1|$1}} hefur verið vistaður.",
        "timezonelegend": "Tímabelti:",
        "localtime": "Staðartími:",
        "timezoneuseserverdefault": "Nota sjálfgefið tímabelti ($1)",
        "prefs-help-prefershttps": "Þessi stilling tekur gildi í næsta skiptið sem þú skráir þig inn.",
        "prefswarning-warning": "Þú hefur gert breytingar á kjörstillingum þínum sem ekki er búið að vista.\nEf þú ferð af þessari síðu án þess að smella á \"$1\" verða kjörstillingar þínar ekki uppfærðar.",
        "userrights": "Breyta notandaréttindum",
-       "userrights-lookup-user": "Yfirlit notandahópa",
+       "userrights-lookup-user": "Velja notanda",
        "userrights-user-editname": "Skráðu notandanafn:",
-       "editusergroup": "Breyta {{GENDER:$1|notanda}} hópum",
+       "editusergroup": "Hlaða inn notanda hópum",
        "editinguser": "Breyti réttindum {{GENDER:$1|notandans}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Breyta notandahópum",
        "saveusergroups": "Vista {{GENDER:$1|notanda}} hópa",
        "userrights-reason": "Ástæða:",
        "userrights-no-interwiki": "Þú hefur ekki leyfi til að breyta notandaréttindum á öðrum wiki-síðum.",
        "userrights-nodatabase": "Gagnagrunnurinn $1 er ekki til eða ekki staðbundinn.",
-       "userrights-nologin": "Þú verður að [[Special:UserLogin|innskrá]] þig á möppudýraaðgang til að geta útdeilt notandaréttindum.",
-       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttindi.",
        "userrights-changeable-col": "Hópar sem þú getur breytt",
        "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Árekstur í að breyta notandaréttindum! Skoðaðu þetta aftur og staðfestu breytingar þínar.",
-       "userrights-removed-self": "Þér hefur tekist að fjarlægja þín eigin réttindi. Vegna þess mátt þú ekki lengur skoða þessa síðu.",
        "group": "Hópur:",
        "group-user": "Notendur",
        "group-autoconfirmed": "Sjálfvirkt staðfestir notendur",
        "right-siteadmin": "Læsa og aflæsa gagnagrunninum",
        "right-override-export-depth": "Flytja út síður með greinum þar sem allt að 5 greinar tengja þær saman.",
        "right-sendemail": "Senda tölvupóst til annara notenda",
-       "right-passwordreset": "Skoða tölvupósta um endurstillingu lykilorðs",
        "right-managechangetags": "Búa til og (af)virkja [[Special:Tags|merki]] úr gagnagrunni",
        "right-applychangetags": "Virkja [[Special:Tags|merki]] ásamt öðrum breytingum",
        "grant-group-email": "Senda tölvupóst",
        "action-upload_by_url": "hlaða inn þessari skrá af vefslóð",
        "action-writeapi": "Nota API skrifun",
        "action-delete": "eyða þessari síðu",
-       "action-deleterevision": "eyða þessari breytingu",
-       "action-deletedhistory": "skoða breytingaskrá þessarar síðu",
+       "action-deleterevision": "eyða breytingar",
+       "action-deletedhistory": "skoða breytingaskrá síðu",
        "action-browsearchive": "leita í eyddum síðum",
-       "action-undelete": "endurvekja þessa síðu",
-       "action-suppressrevision": "Skoða og endurvekja þessa falda breytingu",
+       "action-undelete": "endurvekja síður",
+       "action-suppressrevision": "Skoða og endurvekja faldar breytingar",
        "action-suppressionlog": "skoða þessa einka-aðgerðaskrá",
        "action-block": "Banna notandanum að gera breytingar",
        "action-protect": "breyta verndunarstigum fyrir þessa síðu",
        "emailccsubject": "Afrit af skilaboðinu þínu til $1: $2",
        "emailsent": "Sending tókst",
        "emailsenttext": "Skilaboðin þín hafa verið send.",
-       "emailuserfooter": "Þessi tölvupóstur var {{GENDER:$1|sendur}} af $1 til {{GENDER:$2|$2}} með möguleikanum \"{{int:emailuser}}\" á {{SITENAME}}.",
+       "emailuserfooter": "Þessi tölvupóstur var {{GENDER:$1|sendur}} af $1 til {{GENDER:$2|$2}} með möguleikanum \"{{int:emailuser}}\" á {{SITENAME}}. Netfangið {{GENDER:$2|þitt}} verður sent {{GENDER:$1|upphaflega sendandanum}}, sem uppljóstrar netfangi {{GENDER:$2|þínu}} til hans.",
        "usermessage-summary": "Skil eftir kerfismeldingu.",
        "usermessage-editor": "Skilaboðakerfi",
        "watchlist": "Vaktlistinn",
        "tags-deactivate": "gera óvirkt",
        "tags-hitcount": "$1 {{PLURAL:$1|breyting|breytingar}}",
        "tags-manage-no-permission": "Þú hefur ekki leyfi til að stjórna breytingamerkjum.",
-       "tags-manage-blocked": "Þú hefur ekki leyfi til að breyta merkjum á meðan þú ert bannaður.",
+       "tags-manage-blocked": "Þú hefur ekki leyfi til að breyta merkjum á meðan {{GENDER:$1|þú}} ert bannaður.",
        "tags-create-heading": "Búa til nýtt merki",
        "tags-create-explanation": "Sjálfgefið eru ný merki tiltæk notendum og vélmennum.",
        "tags-create-tag-name": "Heiti merkis",
        "feedback-useragent": "Aðgangsforrit:",
        "searchsuggest-search": "Leita á {{SITENAME}}",
        "searchsuggest-containing": "sem innihalda ...",
-       "api-error-badaccess-groups": "Þú hefur ekki leyfi til að hlaða inn skrám.",
        "api-error-badtoken": "Innri villa: Skemmdur tóki.",
-       "api-error-copyuploaddisabled": "Ekki er hægt að hlaða inn með vefslóð á þessum vefþjóni.",
-       "api-error-duplicate": "Það {{PLURAL:$1|er önnur skrá|eru aðrar skrár}} þegar til á vefsvæðinu sem hafa sama innihald.",
-       "api-error-duplicate-archive": "Það {{PLURAL:$1|var önnur skrá|voru aðrar skrár}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
-       "api-error-empty-file": "Skráin sem þú valdir er tóm.",
        "api-error-emptypage": "Stofnun nýrra, tómra síðna er óheimil.",
-       "api-error-fetchfileerror": "Innri villa: Mistókst að sækja skrána.",
-       "api-error-fileexists-forbidden": "Skrá með nafninu \"$1\" er þegar til og ekki er hægt að yfirskrifa hana.",
-       "api-error-fileexists-shared-forbidden": "Skrá með nafninu \"$1\" er þegar til á miðlæga gagnaþjóninum og ekki er hægt að yfirskrifa hana.",
-       "api-error-file-too-large": "Skráin sem þú valdir er of stór.",
-       "api-error-filename-tooshort": "Skráarheitið er of stutt",
-       "api-error-filetype-banned": "Þessi gerð skráar er bönnuð.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|er óleyfileg skráargerð|eru óleyfilegar skráargerðir}}. {{PLURAL:$3|Leyfð skráargerð er|Leyfðar skráargerðir eru}} $2.",
-       "api-error-filetype-missing": "Skráin hefur enga skráarendingu.",
-       "api-error-hookaborted": "Hætt var við breytinguna sem þú reyndir að gera með viðbót.",
-       "api-error-http": "Innri villa: Get ekki tengst vefþjón.",
-       "api-error-illegal-filename": "Þetta skráarheiti er ekki leyft.",
-       "api-error-internal-error": "Innri villa: Mistókst að vinna úr innsendingunni þinni.",
-       "api-error-invalid-file-key": "Innri villa: Skrá fannst ekki í bráðabirgðageymslu.",
-       "api-error-missingparam": "Innri villa: Breytur vantar í beiðni.",
-       "api-error-missingresult": "Innri villa: Gat ekki ákvarðað hvort tókst að afrita.",
-       "api-error-mustbeloggedin": "Þú verður að vera skráður inn til að hlaða inn skrám.",
-       "api-error-mustbeposted": "Innri villa: Beiðnin þarfnast HTTP POST.",
-       "api-error-noimageinfo": "Innsending skrárinnar tókst, en vefþjónninn gaf okkur engar upplýsingar um skrána.",
-       "api-error-nomodule": "Innri villa: Engin innsendingareining valin.",
-       "api-error-ok-but-empty": "Innri villa: ekkert svar frá vefþjón.",
-       "api-error-overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
-       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-publishfailed": "Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.",
-       "api-error-timeout": "Vefþjónninn svaraði ekki á tilætluðum tíma.",
-       "api-error-unclassified": "Óþekkt villa kom upp.",
-       "api-error-unknown-code": "Óþekkt villa: \"$1\"",
-       "api-error-unknown-error": "Innri villa: Eitthvað fór úrskeiðis þegar að skráinni þinni var hlaðið inn.",
+       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-unknown-warning": "Óþekkt viðvörun: $1",
        "api-error-unknownerror": "Óþekkt villa: \"$1\".",
-       "api-error-uploaddisabled": "Ekki er leyft að hlaða inn á þessum wiki.",
-       "api-error-verification-error": "Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekúnda|sekúndur}}",
        "duration-minutes": "$1 {{PLURAL:$1|mínúta|mínútur}}",
        "duration-hours": "$1 {{PLURAL:$1|klukkustund|klukkustundir}}",
index 700c0a7..ce3d5e7 100644 (file)
        "searcharticle": "Vai",
        "history": "Versioni precedenti",
        "history_short": "Cronologia",
+       "history_small": "cronologia",
        "updatedmarker": "modificata dalla mia ultima visita",
        "printableversion": "Versione stampabile",
        "permalink": "Link permanente",
        "blockedtitle": "Utente bloccato.",
        "blockedtext": "'''Il tuo nome utente o indirizzo IP è stato bloccato.'''\n\nIl blocco è stato imposto da $1. La motivazione del blocco è la seguente: ''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nSe lo si desidera, è possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per discutere del blocco.\n\nSi noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] o se l'utilizzo di tale funzione è stato bloccato.\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5.\nSi prega di specificare tutti i dettagli precedenti in qualsiasi richiesta di chiarimenti.",
        "autoblockedtext": "Questo indirizzo IP è stato bloccato automaticamente perché condiviso con un altro utente, a sua volta bloccato da $1.\nLa motivazione del blocco è la seguente:\n\n:''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nÈ possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per richiedere eventuali chiarimenti circa il blocco.\n\nSi noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] e, comunque, se nell'applicare il blocco, tale funzione è stata disabilitata (per la durata del blocco).\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
+       "systemblockedtext": "Il tuo nome utente o l'indirizzo IP è stato bloccato automaticamente da MediaWiki.\nLa motivazione del blocco è la seguente:\n\n:''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nL'indirizzo IP attuale è $3.\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
        "blockednoreason": "nessuna motivazione indicata",
        "whitelistedittext": "Per modificare le pagine è necessario $1.",
        "confirmedittext": "Per essere abilitati alla modifica delle pagine è necessario confermare il proprio indirizzo e-mail. Per impostare e confermare l'indirizzo servirsi delle [[Special:Preferences|preferenze]].",
        "search-external": "Ricerca esterna",
        "searchdisabled": "La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)",
        "search-error": "Si è verificato un errore durante la ricerca: $1",
+       "search-warning": "Si è verificato un avviso durante la ricerca: $1",
        "preferences": "Preferenze",
        "mypreferences": "preferenze",
        "prefs-edits": "Modifiche effettuate:",
        "saveprefs": "Salva",
        "restoreprefs": "Ripristina le impostazioni predefinite (in tutte le sezioni)",
        "prefs-editing": "Casella di modifica",
-       "rows": "Righe:",
-       "columns": "Colonne:",
        "searchresultshead": "Ricerca",
        "stub-threshold": "Soglia per i collegamenti agli abbozzi ($1):",
        "stub-threshold-sample-link": "esempio",
        "userrights-user-editname": "Inserire il nome utente:",
        "editusergroup": "Modifica gruppi utente",
        "editinguser": "Modifica in corso dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Visualizzazione dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modifica gruppi utente",
+       "userrights-viewusergroup": "Visualizza gruppi utente",
        "saveusergroups": "Salva gruppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Appartiene {{PLURAL:$1|al gruppo|ai gruppi}}:",
        "userrights-groupsmember-auto": "Membro implicito di:",
        "action-upload_by_url": "caricare questo file da un indirizzo URL",
        "action-writeapi": "usare le API in scrittura",
        "action-delete": "cancellare questa pagina",
-       "action-deleterevision": "cancellare questa versione",
-       "action-deletedhistory": "visualizzare la cronologia cancellata di questa pagina",
+       "action-deleterevision": "cancellare versioni",
+       "action-deletelogentry": "cancellare le voci di registro",
+       "action-deletedhistory": "visualizzare la cronologia cancellata di una pagina",
+       "action-deletedtext": "visualizzare il testo delle versioni cancellate",
        "action-browsearchive": "cercare pagine cancellate",
-       "action-undelete": "recuperare questa pagina",
-       "action-suppressrevision": "rivedere e ripristinare le modifiche nascoste",
+       "action-undelete": "recuperare pagine",
+       "action-suppressrevision": "rivedere e ripristinare le versioni nascoste",
        "action-suppressionlog": "vedere questo registro privato",
        "action-block": "bloccare questo utente in scrittura",
        "action-protect": "modificare i livelli di protezione per questa pagina",
        "action-userrights-interwiki": "modificare i diritti degli utenti su altre wiki",
        "action-siteadmin": "bloccare e sbloccare il database",
        "action-sendemail": "inviare email",
+       "action-editmyoptions": "modificare le proprie preferenze",
        "action-editmywatchlist": "modificare i propri osservati speciali",
        "action-viewmywatchlist": "vedere i propri osservati speciali",
        "action-viewmyprivateinfo": "vedere i propri dati personali",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi le [[Special:NewPages|nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
+       "rcfilters-activefilters": "Filtri attivi",
+       "rcfilters-restore-default-filters": "Ripristina i filtri predefiniti",
+       "rcfilters-clear-all-filters": "Pulisci tutti i filtri",
+       "rcfilters-search-placeholder": "Filtra le ultime modifiche (naviga o inizia a digitare)",
+       "rcfilters-invalid-filter": "Filtro non valido",
+       "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Nessun filtro trovato",
+       "rcfilters-filtergroup-registration": "Registrazione utente",
+       "rcfilters-filter-registered-label": "Registrato",
+       "rcfilters-filtergroup-authorship": "Modifica paternità",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filtergroup-significance": "Significato",
+       "rcfilters-filter-minor-label": "Modifiche minori",
+       "rcfilters-filter-major-label": "Modifiche non minori",
+       "rcfilters-filtergroup-changetype": "Tipo di modifica",
+       "rcfilters-filter-pageedits-label": "Modifiche alle pagine",
+       "rcfilters-filter-newpages-label": "Creazioni pagine",
+       "rcfilters-filter-logactions-description": "Azioni amministrative, creazione utenze, cancellazioni pagine, caricamenti....",
        "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "rcshowhideminor": "$1 le modifiche minori",
        "changecontentmodel-emptymodels-title": "Nessun modello di contenuto disponibile",
        "changecontentmodel-emptymodels-text": "Il contenuto di [[:$1]] non può essere convertito in alcun tipo.",
        "log-name-contentmodel": "Modifiche del modello contenuti",
-       "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
+       "log-description-contentmodel": "Questa pagina elenca le modifiche al modello di contenuto delle pagine, e le pagine che sono state create con un modello di contenuto diverso da quello predefinito.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ha creato}} la pagina $3 utilizzando un modello di contenuto non predefinito \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "cant-move-to-user-page": "Non si dispone dei permessi necessari per spostare la pagina su una pagina utente (escluse le sottopagine utente).",
        "cant-move-category-page": "Non si dispone dei permessi necessari per spostare categorie.",
        "cant-move-to-category-page": "Non si dispone dei permessi necessari per spostare la pagina su una categoria.",
+       "cant-move-subpages": "Non si dispone dei permessi necessari per spostare le sottopagine.",
+       "namespace-nosubpages": "Il namespace \"$1\" non consente sottopagine.",
        "newtitle": "Nuovo titolo:",
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "pageinfo-length": "Lunghezza della pagina (in byte)",
        "pageinfo-article-id": "ID della pagina",
        "pageinfo-language": "Lingua del contenuto della pagina",
+       "pageinfo-language-change": "cambia",
        "pageinfo-content-model": "Modello del contenuto della pagina",
        "pageinfo-content-model-change": "cambia",
        "pageinfo-robot-policy": "Indicizzazione per i robot",
        "feedback-useragent": "Agente utente:",
        "searchsuggest-search": "Cerca all'interno di {{SITENAME}}",
        "searchsuggest-containing": "contenente...",
-       "api-error-autoblocked": "Il tuo indirizzo IP è stato bloccato automaticamente, perché è stato utilizzato da un utente bloccato.",
-       "api-error-badaccess-groups": "Non sei autorizzato a caricare documenti su questa wiki.",
        "api-error-badtoken": "Errore interno: token errato.",
-       "api-error-blocked": "Sei stato bloccato, non puoi fare modifiche.",
-       "api-error-copyuploaddisabled": "Il caricamento tramite URL è disabilitato su questo server.",
-       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già un altro documento|ci sono già altri documenti}} con lo stesso contenuto.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era un altro file|C'erano altri file}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
-       "api-error-empty-file": "Il file selezionato era vuoto.",
        "api-error-emptypage": "La creazione di nuove pagine vuote non è consentita.",
-       "api-error-fetchfileerror": "Errore interno: si è verificato un problema durante il recupero del file.",
-       "api-error-fileexists-forbidden": "Un file di nome \"$1\" già esiste e non può essere sovrascritto.",
-       "api-error-fileexists-shared-forbidden": "Un file di nome \"$1\" già esiste nel repository condiviso e non può essere sovrascritto.",
-       "api-error-file-too-large": "Il file selezionato era troppo grande.",
-       "api-error-filename-tooshort": "Il nome del file è troppo breve.",
-       "api-error-filetype-banned": "Questo tipo di file non è accettato.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|non è un tipo di file consentito|non sono tipi di file consentiti}}. {{PLURAL:$3|Il tipo di file consentito è|I tipi di file consentiti sono}} $2.",
-       "api-error-filetype-missing": "Al file manca l'estensione.",
-       "api-error-hookaborted": "La modifica hai tentato di fare è stata interrotta da un passaggio dell'estensione.",
-       "api-error-http": "Errore interno: impossibile connettersi al server.",
-       "api-error-illegal-filename": "Il nome del file non è ammesso.",
-       "api-error-internal-error": "Errore interno: qualcosa è andato storto con l'elaborazione del tuo caricamento sulla wiki.",
-       "api-error-invalid-file-key": "Errore interno: file non presente nella cartella dei file temporanei.",
-       "api-error-missingparam": "Errore interno: parametri della richiesta mancanti.",
-       "api-error-missingresult": "Errore interno: impossibile determinare se la copia è riuscita.",
-       "api-error-mustbeloggedin": "Devi aver effettuato l'accesso per caricare i file.",
-       "api-error-mustbeposted": "Errore interno: la richiesta richiede HTTP POST.",
-       "api-error-noimageinfo": "Il caricamento è riuscito, ma il server non ci ha dato alcuna informazione sul file.",
-       "api-error-nomodule": "Errore interno: non è stato impostato il modulo di caricamento.",
-       "api-error-ok-but-empty": "Errore interno: nessuna risposta dal server.",
-       "api-error-overwrite": "Sovrascrivere un file esistente non è consentito.",
-       "api-error-ratelimited": "Stai cercando di caricare più file in meno tempo di quanto questo wiki permette.\nRiprova tra pochi minuti.",
-       "api-error-stashfailed": "Errore interno: il server non è riuscito a memorizzare il documento temporaneo.",
        "api-error-publishfailed": "Errore interno: il server non è riuscito a pubblicare il documento temporaneo.",
-       "api-error-stasherror": "Si è verificato un errore durante il caricamento del file in stash.",
-       "api-error-stashedfilenotfound": "Il file in stash non è stato trovato durante il tentativo di caricamento dallo stash.",
-       "api-error-stashpathinvalid": "Il percorso in cui il file in stash dovrebbe trovarsi non è valido.",
-       "api-error-stashfilestorage": "Si è verificato un errore durante la memorizzazione del file in stash.",
-       "api-error-stashzerolength": "Il server non può inserire il file in stash, poiché ha lunghezza zero.",
-       "api-error-stashnotloggedin": "Devi aver effettuato l'accesso per poter salvare il file nel caricamento in stash.",
-       "api-error-stashwrongowner": "Il file a cui stai tentando di accedere nello stash non appartiene a te.",
-       "api-error-stashnosuchfilekey": "La chiave del file a cui stai tentando di accedere nello stash non esiste.",
-       "api-error-timeout": "Il server non ha risposto entro il tempo previsto.",
-       "api-error-unclassified": "Si è verificato un errore sconosciuto.",
-       "api-error-unknown-code": "Errore sconosciuto: \"$1\"",
-       "api-error-unknown-error": "Errore interno: qualcosa è andato storto provando a caricare il file.",
-       "api-error-unknown-warning": "Avviso sconosciuto: $1",
+       "api-error-stashfailed": "Errore interno: il server non è riuscito a memorizzare il documento temporaneo.",
+       "api-error-unknown-warning": "Avvertimento sconosciuto: \"$1\".",
        "api-error-unknownerror": "Errore sconosciuto: \"$1\".",
-       "api-error-uploaddisabled": "Il caricamento è disabilitato su questa wiki.",
-       "api-error-verification-error": "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
-       "api-error-was-deleted": "Un file con lo stesso nome è stato precedentemente caricato e successivamente eliminato.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|secondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
        "pagelang-language": "Lingua",
        "pagelang-use-default": "Utilizza la lingua predefinita",
        "pagelang-select-lang": "Seleziona lingua",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Invia",
+       "pagelang-nonexistent-page": "La pagina $1 non esiste.",
        "right-pagelang": "Modifica la lingua della pagina",
        "action-pagelang": "modificare la lingua della pagina",
        "log-name-pagelang": "Modifiche lingua",
        "log-action-filter-block-reblock": "Modifica blocco",
        "log-action-filter-block-unblock": "Sblocco",
        "log-action-filter-contentmodel-change": "Modifica del modello di contenuto",
-       "log-action-filter-contentmodel-new": "Creazione di pagina con modello di contenuto non standard",
+       "log-action-filter-contentmodel-new": "Creazione di pagina con modello di contenuto non predefinito",
        "log-action-filter-delete-delete": "Cancellazione pagina",
        "log-action-filter-delete-restore": "Ripristino pagina",
        "log-action-filter-delete-event": "Cancellazione registro",
        "usercssispublic": "Ricorda: le sottopagine CSS non devono contenere dati riservati poichè sono visualizzabili da altri utenti.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "versione $1",
+       "pageid": "ID della pagina $1"
 }
index 5e555e6..7280e51 100644 (file)
@@ -76,7 +76,8 @@
                        "Foresttttttt",
                        "ネイ",
                        "Mirinano",
-                       "Suchichi02"
+                       "Suchichi02",
+                       "にょきにょき"
                ]
        },
        "tog-underline": "リンクの下線:",
        "views": "表示",
        "toolbox": "ツール",
        "tool-link-userrights": "{{GENDER:$1|利用者}}グループの変更",
+       "tool-link-userrights-readonly": "{{GENDER:$1|利用者}}グループの表示",
        "tool-link-emailuser": "この{{GENDER:$1|利用者}}にメールを送信",
        "userpage": "利用者ページを表示",
        "projectpage": "プロジェクトのページを表示",
        "throttled-mailpassword": "パスワード再設定メールを過去 {{PLURAL:$1|$1 時間}}に送信済みです。\n悪用防止のため、パスワードの再設定は {{PLURAL:$1|$1 時間}}に 1 回のみです。",
        "mailerror": "メールを送信する際にエラーが発生しました: $1",
        "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、直近 $2 で {{PLURAL:$1|$1 個のアカウント}}を作成しており、この期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスからこれ以上のアカウントを作成できません。",
-       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
+       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
        "emailnotauthenticated": "メールアドレスが確認されていません。\n確認されるまで、以下のいかなる機能でもメールは送信されません。",
        "noemailprefs": "これらの機能を有効にするには、個人設定でメールアドレスを登録してください。",
        "emailconfirmlink": "あなたのメールアドレスを確認",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
        "passwordreset-invalidemail": "無効なメールアドレスです",
+       "passwordreset-nodata": "利用者名もメールアドレスも入力されていません",
        "changeemail": "メールアドレスの変更または除去",
        "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "saveprefs": "保存",
        "restoreprefs": "すべて初期設定に戻す (すべての節について)",
        "prefs-editing": "編集",
-       "rows": "行数:",
-       "columns": "列数:",
        "searchresultshead": "検索",
        "stub-threshold": "スタブリンク形式 ($1)として表示する閾値 :",
        "stub-threshold-sample-link": "サンプル",
        "userrights": "利用者権限を管理",
        "userrights-lookup-user": "利用者を選択",
        "userrights-user-editname": "利用者名を入力:",
-       "editusergroup": "å\88©ç\94¨è\80\85ã\82°ã\83«ã\83¼ã\83\97ã\82\92ã\83­ã\83¼ã\83\89",
+       "editusergroup": "å\88©ç\94¨è\80\85ã\82°ã\83«ã\83¼ã\83\97ã\81®è¡¨ç¤º",
        "editinguser": "利用者<strong> [[User:$1|$1]]</strong> $2 の権限を変更",
+       "viewinguserrights": "{{GENDER:$1|利用者}} <strong>[[User:$1|$1]]</strong> $2 の利用者権限",
        "userrights-editusergroup": "利用者グループを編集",
+       "userrights-viewusergroup": "利用者グループ",
        "saveusergroups": "{{GENDER:$1|利用者}}グループを保存",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "right-reupload-own": "自身がアップロードした既存のファイルに上書き",
        "right-reupload-shared": "共有メディアリポジトリ上のファイルにローカルで上書き",
        "right-upload_by_url": "URL からファイルをアップロード",
-       "right-purge": "確認なしでサイトキャッシュを破棄",
+       "right-purge": "確認なしでサイト上のページ・キャッシュを破棄",
        "right-autoconfirmed": "IPベースの速度制限を受けない",
        "right-bot": "自動処理と認識させる",
        "right-nominornewtalk": "議論ページの細部の編集をした際に、新着メッセージとして通知しない",
        "action-upload_by_url": "URL からのこのファイルのアップロード",
        "action-writeapi": "書き込みAPIの使用",
        "action-delete": "このページの削除",
-       "action-deleterevision": "この版の削除",
-       "action-deletedhistory": "このページの削除履歴の閲覧",
+       "action-deleterevision": "版の削除",
+       "action-deletelogentry": "記録項目の削除",
+       "action-deletedhistory": "ページの削除履歴の閲覧",
        "action-browsearchive": "削除されたページの検索",
-       "action-undelete": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¾©å\85\83",
+       "action-undelete": "ページの復元",
        "action-suppressrevision": "隠された版の確認と復元",
        "action-suppressionlog": "非公開記録の閲覧",
        "action-block": "この利用者の編集ブロック",
        "emailccsubject": "$1 に送信したメールの控え: $2",
        "emailsent": "メールを送信しました",
        "emailsenttext": "メールを送信しました。",
-       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。",
+       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。返信する場合は、{{GENDER:$2|あなた}}からのメールは{{GENDER:$1|もとの送信者}}に直接送信され、{{GENDER:$2|あなたの}}メールアドレスは{{GENDER:$2|返信先}}に開示されます。",
        "usermessage-summary": "システムメッセージを残す。",
        "usermessage-editor": "システムメッセンジャー",
        "watchlist": "ウォッチリスト",
        "modifiedarticleprotection": "「[[$1]]」の保護レベルを変更しました",
        "unprotectedarticle": "「[[$1]]」の保護を解除しました",
        "movedarticleprotection": "が保護の設定を「[[$2]]」から「[[$1]]」へ移動しました",
+       "protectedarticle-comment": "「[[$1]]」を{{GENDER:$2|保護しました}}",
+       "modifiedarticleprotection-comment": "「[[$1]]」の{{GENDER:$2|保護レベルを変更しました}}",
+       "unprotectedarticle-comment": "「[[$1]]」の{{GENDER:$2|保護を解除しました}}",
        "protect-title": "「$1」の保護レベルを変更",
        "protect-title-notallowed": "「$1」の保護レベルを表示",
        "prot_1movedto2": "[[$1]] を [[$2]] へ移動しました",
        "protect-cascadeon": "このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、保護されています。\nこのページの保護レベルの変更は、カスケード保護には影響しません。",
        "protect-default": "すべての利用者に許可",
        "protect-fallback": "「$1」権限を持つ利用者のみに許可",
-       "protect-level-autoconfirmed": "自動承認された利用者のみ許可",
-       "protect-level-sysop": "管理者のみ許可",
+       "protect-level-autoconfirmed": "自動承認された利用者のみ許可",
+       "protect-level-sysop": "管理者のみ許可",
        "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "カスケード",
        "protect-expiring": "$1(UTC)で自動的に解除",
        "pageinfo-length": "ページの長さ (バイト単位)",
        "pageinfo-article-id": "ページ ID",
        "pageinfo-language": "ページ本文の言語",
+       "pageinfo-language-change": "変更",
        "pageinfo-content-model": "ページのコンテンツ モデル",
        "pageinfo-content-model-change": "設定変更",
        "pageinfo-robot-policy": "ロボットによるインデックス作成",
        "unit-pixel": "ピクセル",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "このページのキャッシュを破棄しますか?",
-       "confirm-purge-bottom": "ã\83\9aã\83¼ã\82¸ã\82\92ã\83\91ã\83¼ã\82¸ã\81\99ã\82\8bã\81¨ã\80\81ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\8cç ´æ£\84ã\81\95ã\82\8cã\80\81å¼·å\88¶ç\9a\84ã\81«æ\9c\80æ\96°ç\89\88ã\81\8c表示ã\81\95ã\82\8cます。",
+       "confirm-purge-bottom": "ã\83\9aã\83¼ã\82¸ã\81®ã\83\91ã\83¼ã\82¸ã\81«ã\82\88ã\82\8aã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ç ´æ£\84ã\81\97ã\80\81å¼·å\88¶ç\9a\84ã\81«æ\9c\80æ\96°ç\89\88ã\82\92表示ã\81\97ます。",
        "confirm-watch-button": "OK",
        "confirm-watch-top": "このページをウォッチリストに追加しますか?",
        "confirm-unwatch-button": "OK",
        "htmlform-user-not-exists": "<strong>$1</strong>は存在しません。",
        "htmlform-user-not-valid": "<strong>$1</strong>は有効な利用者名ではありません。",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
-       "logentry-delete-delete_redir": "$1 ã\81\8cã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\80\8c$3ã\80\8dã\82\92ä¸\8aæ\9b¸ã\81\8dã\81§{{GENDER:$2|削除しました}}",
+       "logentry-delete-delete_redir": "$1 ã\81\8cã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\80\8c$3ã\80\8dã\82\92ä¸\8aæ\9b¸ã\81\8dã\81«ã\82\88ã\82\8a{{GENDER:$2|削除しました}}",
        "logentry-delete-restore": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
        "logentry-delete-event": "$1 が $3 の{{PLURAL:$5|記録項目|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "log-action-filter-newusers": "アカウント作成の種類:",
        "log-action-filter-patrol": "巡回の種類:",
        "log-action-filter-protect": "保護の種類:",
+       "log-action-filter-rights": "権限変更の種類:",
        "log-action-filter-suppress": "秘匿の種類:",
        "log-action-filter-upload": "アップロードの種類",
        "log-action-filter-all": "すべて",
index 25c1aab..aedb811 100644 (file)
@@ -44,7 +44,7 @@
        "tog-enotifminoredits": "Uga kirimi aku layangtronik yèn ana besutan cilik ing kaca lan barkas",
        "tog-enotifrevealaddr": "Singkab alamat layangtronikku ing layang pawarta",
        "tog-shownumberswatching": "Tuduhaké cacah wong sing ngawasi",
-       "tog-oldsig": "Tandha tangan sing ana:",
+       "tog-oldsig": "Tandha tangan panjenengan sing ana:",
        "tog-fancysig": "Anggep tandha tangan minangka tulisan wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Nganggo pratuduh langsung",
        "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
@@ -61,7 +61,7 @@
        "tog-showhiddencats": "Tuduhaké kategori sing didhelikaké",
        "tog-norollbackdiff": "Aja tuduhaké prabédan sawisé mbalèkaké.",
        "tog-useeditwarning": "Élingaké kula yèn kula ninggalaké suntingan sing durung kasimpen",
-       "tog-prefershttps": "Tansah nganggo sambungan aman nalika mlebu",
+       "tog-prefershttps": "Tansah anggoa sambungan sing aman nalika mlebu log",
        "underline-always": "Tansah",
        "underline-never": "Ora tau",
        "underline-default": "Baku kulit utawa pangluron",
        "talk": "Parembugan",
        "views": "Praèn",
        "toolbox": "Piranti",
+       "tool-link-userrights": "Owahi golongan {{GENDER:$1|panganggo}}",
+       "tool-link-userrights-readonly": "Deleng golongan {{GENDER:$1|panganggo}}",
+       "tool-link-emailuser": "Kirimi {{GENDER:$1|panganggo}} iki layang-é",
        "userpage": "Deleng kaca panganggo",
        "projectpage": "Deleng kaca proyèk",
        "imagepage": "Deleng kaca barkas",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
        "poolcounter-usage-error": "Cacad panganggo: $1",
-       "aboutsite": "Bab {{SITENAME}}",
-       "aboutpage": "Project:Bab",
+       "aboutsite": "Ngenani {{SITENAME}}",
+       "aboutpage": "Project:Ngenani",
        "copyright": "Kabèh isi kasedyakaké miturut $1.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kadadian saiki",
        "portal": "Gapura paguyuban",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Niti priangga",
-       "privacypage": "Project:Niti pripasi",
+       "privacypage": "Project:Niti priangga",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
        "badaccess-groups": "Pratingkah panjenengan diwatesi tumrap panganggo ing {{PLURAL:$2|klompoké|klompoké}}: $1.",
        "protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
        "editinginterface": "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.\nPangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.\nKanggo terjemahan, mangga nganggo [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
        "translateinterface": "Saperlu nambah utawa ngowah pertalan tumrap kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk panglokaling MediaWiki.",
-       "cascadeprotected": "Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi \"runtun\" diaktifaké:\n$2",
+       "cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca, sing|kaca-kaca, sing}} kareksa mawa pilihan \"runut\" murub:\n$2",
        "namespaceprotected": "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
        "customcssprotected": "Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.",
        "customjsprotected": "Sampéyan ora dililakaké nyunting kaca JavaScript iki amarga kaisi pangaturan pribadi saka panganggo liya.",
        "createacct-yourpasswordagain-ph": "Lebokaké manèh tembung wadiné",
        "userlogin-remembermypassword": "Gawé amrih aku panggah kalebu",
        "userlogin-signwithsecure": "Nganggo koneksi aman",
+       "cannotlogin-title": "Ora bisa mlebu log",
+       "cannotlogin-text": "Mokal mlebu log.",
        "cannotloginnow-title": "Ora bisa mlebu saiki",
        "cannotloginnow-text": "Mlebu ora mungkin menawa nganggo $1.",
+       "cannotcreateaccount-title": "Ora bisa gawé akun",
+       "cannotcreateaccount-text": "Gawé akun langsung ora bisa ing wiki iki.",
        "yourdomainname": "Dhomain panjenengan",
        "password-change-forbidden": "Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.",
        "externaldberror": "Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.",
        "login": "Mlebu",
+       "login-security": "Vèrifikasi idhèntitas panjenengan",
        "nav-login-createaccount": "Log mlebu / nggawé rékening (akun)",
        "userlogin": "Mlebu log / gawé rékening (akun)",
        "userloginnocreate": "Mlebu",
        "passwordremindertext": "Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung sandhi anyar kanggo {{SITENAME}} ($4). Tembung sandi sawetara kanggo panganggo \"$2\" wis digawé lan saiki \"$3\". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung sandi saiki.\nTembung sandi sawetara mau bakal kadaluwarsa ing {{PLURAL:$5|sadina|$5 dina}}.\nYèn wong liya sing nglakoni panyuwunan iki, utawa panjenengan éling tembung sandi panjenengan, lan ora kepéngin ngowahi, panjenengan ora usah nggubris pesen iki lan bisa tetep nganggo tembung sandi lawas.",
        "noemail": "Ora ana alamat layang e-mail sing kacathet kanggo panganggo \"$1\".",
        "noemailcreate": "Panjenengan kudu maringi alamat e-mail sing absah",
-       "passwordsent": "Tembung sandhi anyar wis dikirim menyang alamat layang e-mail panjenengan sing wis didaftar kanggo \"$1\". Mangga mlebu log manèh sawisé nampa e-mail iku.",
+       "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
        "blocked-mailpassword": "Alamat IP panjenengan diblokir saka panyuntingan, mulané panjenengan ora olèh nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
        "eauthentsent": "Sawijining layang élèktronik (e-mail) kanggo ndhedhes (konfirmasi) wis dikirim menyang alamat layang élèktronik sampeyan. \n\nSadhurunge layang élèktronik liyane dikirim menyang akun kuwi, sampeyan kudu melu parentah ing layang kuwi, kanggo mastikne yen alamat layang kuwi bener-bener dhuweke sampeyan.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung sandhi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung sandhi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
-       "pt-login": "Mlebu",
+       "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu",
        "pt-login-continue-button": "Banjuraké mlebu",
        "pt-createaccount": "Gawé akun",
        "showpreview": "Deleng pratuduh",
        "showdiff": "Tuduhaké owahan",
        "anoneditwarning": "<strong>Pènget:</strong> Panjenengan durung mlebu log. Alamat IP-né panjenengan bakal katon marang wong akèh manawa panjenengan mbesut. Manawa panjenengan <strong>[$1 mlebu log]</strong> utawa <strong>[$2 nggawé akun]</strong>, besutané panjenengan bakal dadi darbéné naragunané panjenengan lan uga ana kauntungan liya.",
-       "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
+       "anonpreviewwarning": "<em>Panjenengan durung mlebu log. Yèn disimpen, alamat IP panjenengan bakal kacathet ing sujarah besutan kaca iki.</em>",
        "missingsummary": "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
        "selfredirect": "<strong>Pélik:</strong> Sampéyan ngalih kaca iki iya nyang kaca iki dhéwé.\nSampéyan mungkin salah wènèh tujuan kanggo alihan utawa salah mbesut kaca.\nYèn sampéyan ngeklik \"{{int:savearticle}}\" manèh, kaca alihan bakal digawé.",
        "missingcommenttext": "Mangga isi tanggapan ing ngisor iki.",
        "loginreqtitle": "Kudu mlebu",
        "loginreqlink": "mlebu",
        "loginreqpagetext": "Panjenengan kudu $1 kanggo bisa mirsani kaca liyané.",
-       "accmailtitle": "Tembung wadi wis kinirim",
-       "accmailtext": "Sawijining tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi kanggo panganggo anyar iki isa diganti ing kaca ''[[Special:ChangePassword|ganti tembung sandi]]'' sawisé mlebu log.",
+       "accmailtitle": "Tembung sandi wis kinirim",
+       "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca <em>[[Special:ChangePassword|salin tembung sandi]]</em> sawisé mlebu log.",
        "newarticle": "(Anyar)",
        "newarticletext": "Katonané panjenengan ngetutaké pranala artikel sing durung ana.\nManawa kersa manulis artikel iki, manggaa. (Mangga mirsani [$1 Pitulung] kanggo informasi sabanjuré).\nYèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjlajah wèb panjenengan.",
        "anontalkpagetext": "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:CreateAccount|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''",
        "previewnote": "<strong>Élinga yèn iki mung pratuduh.</strong>\nOwahanmu durung kasimpen!",
        "continue-editing": "Menyang pambesutan",
        "previewconflict": "Pratilik iki nuduhaké tèks ing bagian dhuwur kothak suntingan tèks kayadéné bakal katon yèn panjenengan bakal simpen.",
-       "session_fail_preview": "'''Nuwun sèwu, suntingan panjenengan ora bisa diolah amarga dhata sèsi kabusak.\nCoba kirim dhata manèh. Yèn tetep ora bisa, coba log metua lan mlebu log manèh.''''''Amerga wiki iki marengaké panggunan kodhe HTML mentah, mula pratilik didhelikaké minangka pancegahan marang serangan JavaScript.'''\n'''Menawa iki sawijining usaha panyuntingan sing sah, mangga dicoba manèh.\nYèn isih tetep ora kasil, cobanen metu log lan mlebu manèh.'''",
+       "session_fail_preview": "Ngapunten! Kita ora bisa mrosès besutan panjenengan amarga ilangé sèsi data.\n\nPanjenengan bokmanawa wis metu log. <strong>Mangga vèrifikasi manawa panjenengan isih mlebu log lan jajala manèh</strong>.\nManawa isih durung kena, jajala [[Special:UserLogout|metu log]] lan mlebu log manèh, banjur priksaa apa browser panjenengan ngidinaké kuki saka situs iki.",
        "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
        "token_suffix_mismatch": "'''Suntingan panjenengan ditulak amerga aplikasi klièn panjenengan ngowahi karakter tandha wewacan ing suntingan. Suntingan iku ditulak kanggo untuk menggak kaluputan ing tèks artikel. Prekara iki kadhangkala dumadi yèn panjenengan ngangem dines layanan proxy anonim adhedhasar situs wèb sing duwé masalah.'''",
        "edit_form_incomplete": "'''Sebagéyan pormulir suntingan ora tekan nèng sasana; cèk pindho yèn suntingan Sampéyan isih wutuh lan jajal manèh.'''",
        "readonlywarning": "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''\n\nPangurus sing ngunci basis data mènèhi katrangan kaya mengkéné: $1",
        "protectedpagewarning": "'''PÈNGET:  Kaca iki wis dikunci dadi namung panganggo sing nduwé hak aksès pangurus baé sing bisa nyunting.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
        "semiprotectedpagewarning": "'''Cathetan:''' Kaca iki lagi pinuju direksa, dadi namung panganggo kadaftar sing bisa nyunting.\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
-       "cascadeprotectedwarning": "'''PÈNGET:''' Kaca iki wis dikunci dadi namung panganggo mawa hak aksès pangurus waé sing bisa nyunting, amerga kalebu {{PLURAL:$1|kaca|kaca-kaca}} ing ngisor iki sing wis direksa mawa opsi 'pangreksan runtun' diaktifaké:",
+       "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé sing bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} sing kareksa runut ngisor iki:",
        "titleprotectedwarning": "'''Pènget: Kaca iki wis dikunci saéngga perlu [[Special:ListGroupRights|hak mligi]] kanggo gawéné.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
        "templatesused": "{{PLURAL:$1|Cithakan|Cithakan}} sing dienggo ing kaca iki:",
        "templatesusedpreview": "{{PLURAL:$1|Cithakan|Cithakan-cithakan}} sing dienggo ing pratilik iki:",
        "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
        "edit-conflict": "Cengkah besutan",
        "edit-no-change": "Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.",
+       "postedit-confirmation-created": "Kaca wis kagawé.",
        "postedit-confirmation-saved": "Besutan sampeyan wis kasimpen.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
        "editundo": "wurung",
        "diff-empty": "(Ora ana bedane)",
-       "diff-multi-sameuser": "({{PLURAL:$1|$1 owahan antara}} déning naraguna sing padha ora katuduhaké)",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 owahan antara}} déning panganggo sing padha ora katuduhaké)",
        "diff-multi-manyusers": "({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
        "searchprofile-advanced-tooltip": "Golèk ing jagat aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
-       "search-redirect": "(pangalihan $1)",
+       "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog karo isi barkas)",
        "grant-editinterface": "Besut jagad aran MediaWiki lan CSS/JavaScript panganggo",
        "grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
        "grant-editmyoptions": "Besut préferènsi panganggomu",
-       "newuserlogpage": "Log naraguna anyar",
+       "newuserlogpage": "Log panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log hak panganggo",
        "rightslogtext": "Ing ngisor iki kapacak log pangowahan marang hak-hak panganggo.",
        "action-createpage": "gawé kaca iki",
        "action-createtalk": "gawé kaca parembugan iki",
        "action-createaccount": "gawé akun panganggo iki",
-       "action-minoredit": "tandhani iki minangka besutan cilik",
+       "action-minoredit": "tandhani besutan iki yèn besutan cilik",
        "action-move": "alih kaca iki",
        "action-move-subpages": "mindahaké kaca iki, lan kabèh anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan nèng sawijining saca",
        "action-import": "impor kaca iki saka wiki liya",
        "action-importupload": "impor kaca iki saka pamunggahan berkas",
-       "action-patrol": "nandhani suntingan panganggo liya minangka wis kapriksa",
-       "action-autopatrol": "nandhani suntingan panjenengan dhéwé minangka wis kapriksa",
-       "action-unwatchedpages": "pirsani dhaftar kaca-kaca sing ora kaawasi",
+       "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
+       "action-autopatrol": "nandhani besutan panjenengan dhéwé yèn wis kapriksa",
+       "action-unwatchedpages": "deleng pratélan kaca sing ingawasan",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "ngowahi kabèh hak panganggo",
        "action-userrights-interwiki": "ngowahi hak aksès saka panganggo ing wiki liya",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
        "rc_categories": "Watesana nganti kategori (dipisah karo \"|\")",
        "rc_categories_any": "Apa waé",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sabubaré diowah",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sawisé diowah",
        "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "rc-enhanced-hide": "Dhelikaké princèn",
        "minlength1": "Jeneng berkas paling ora minimal kudu awujud saaksara.",
        "illegalfilename": "Jeneng berkas \"$1\" ngandhut aksara sing ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng berkas iku lan cobanen  diunggahaké manèh.",
        "filename-toolong": "Jeneng berkas ora olèh luwih dawa saka 240 bita.",
-       "badfilename": "Berkas wis diowahi dados \"$1\".",
+       "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
        "filetype-mime-mismatch": "Èkstènsi berkas \".$1\" ora cocok karo jinis MIME sing kadètèk saka berkas ($2).",
        "filetype-badmime": "Berkas mawa tipe MIME \"$1\" ora pareng diunggahaké.",
        "filetype-bad-ie-mime": "Ora bisa ngunggahaké berkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", sing ora diidinaké lan minangka tipe berkas sing nduwèni potènsi mbebayani.",
        "listfiles_thumb": "Gambar mini",
        "listfiles_date": "Tanggal",
        "listfiles_name": "Jeneng",
-       "listfiles_user": "Naraguna",
+       "listfiles_user": "Panganggo",
        "listfiles_size": "Ukuran (bita)",
        "listfiles_description": "Dèskripsi",
        "listfiles_count": "Vèrsi",
        "filehist-thumb": "Gambar cilik",
        "filehist-thumbtext": "Gambar cilik kanggo owahan $1",
        "filehist-nothumb": "Ora ana miniatur",
-       "filehist-user": "Naraguna",
+       "filehist-user": "Panganggo",
        "filehist-dimensions": "Alang ujur",
        "filehist-filesize": "Gedhené berkas",
        "filehist-comment": "Tanggapan",
        "unusedtemplates": "Cithakan sing ora dienggo",
        "unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} sing ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
        "unusedtemplateswlh": "pranala liya-liyané",
-       "randompage": "Waton kaca",
+       "randompage": "Sembarang kaca",
        "randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "linksearch-error": "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
        "listusersfrom": "Tuduhna panganggo sing diawali karo:",
        "listusers-submit": "Tuduhna",
-       "listusers-noresult": "Naraguna ora ana.",
+       "listusers-noresult": "Panganggo ora ana.",
        "listusers-blocked": "(diblokir)",
        "activeusers": "Dhaptar panganggo aktif",
        "activeusers-intro": "Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
-       "activeusers-noresult": "Naraguna ora ana.",
+       "activeusers-noresult": "Panganggo ora ana.",
        "listgrouprights": "Hak-hak grup panganggo",
        "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak sing diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak sing dijabel</span>",
        "confirmdeletetext": "Panjenengan bakal mbusak kaca utawa berkas iki minangka permanèn karo kabèh sajarahé saka basis data. Pastèkna dhisik menawa panjenengan pancèn nggayuh iki, ngerti kabèh akibat lan konsekwènsiné, lan apa sing bakal panjenengan tumindak iku cocog karo [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].",
        "actioncomplete": "Kasil diayahi",
        "actionfailed": "Tindakan gagal",
-       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka rekamaning busak-busakan pungkasan.",
+       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani sing pungkasan kabusak.",
        "dellogpage": "Log busak",
        "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
        "deletionlog": "log busak",
        "deletereasonotherlist": "Alesan liya",
        "deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandalisme\n** Nglanggar hak cipta\n** Disuwun sing nulis\n** Pangalihan rusak",
        "delete-edit-reasonlist": "Besut jalaraning pambusak",
-       "delete-toobig": "Kaca iki ndarbèni sajarah panyuntingan sing dawa, yaiku ngluwihi $1 {{PLURAL:$1|revision|révisi}}.\nPambusakan kaca sing kaya mangkono mau wis ora diparengaké kanggo menggak anané karusakan ing {{SITENAME}}.",
+       "delete-toobig": "Kaca iki darbé sujarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nPambusak tumrap kaca sing kaya mangkono wis ora diidinaké nedya njagani murih ora ana karusakan ing {{SITENAME}}.",
        "delete-warning-toobig": "Kaca iki duwé sajarah panyuntingan sing dawa, luwih saka $1 {{PLURAL:$1|révisi|révisi}}.\nMbusak kaca iki bisa ngrusak operasi basis data ing {{SITENAME}};\nkudu ngati-ati.",
        "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
        "rollback": "Pulihaké besutan",
        "protect-legend": "Konfirmasi pangreksan",
        "protectcomment": "Alesan:",
        "protectexpiry": "Kadaluwarsa:",
-       "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
+       "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
        "protect_expiry_old": "Wektu kadaluwarsané kuwi ana ing jaman biyèn.",
        "protect-unchain-permissions": "Urubaké pilihan panjagan sabanjuré",
        "protect-text": "Ing kéné, sampéyan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
        "protect-existing-expiry": "Wektu kadaluwarsa saiki: $3, $2",
        "protect-otherreason": "Alesan liya/tambahan:",
        "protect-otherreason-op": "Alesan liya",
-       "protect-dropdown": "*Alesan umum pangreksan\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang suntingan\n** Kaca kerep disunting",
+       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca sing dhuwur trafiké",
        "protect-edit-reasonlist": "Mbesut jalaraning pangreksa",
        "protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "restriction-type": "Pangreksan:",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
        "whatlinkshere-next": "{{PLURAL:$1|sabanjuré|$1 sabanjuré}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 lih-lihan",
+       "whatlinkshere-hideredirs": "$1 alihan",
        "whatlinkshere-hidetrans": "$1 transklusi",
-       "whatlinkshere-hidelinks": "pranala-pranala $1",
+       "whatlinkshere-hidelinks": "$1 pranala",
        "whatlinkshere-hideimages": "$1 pranala berkas",
        "whatlinkshere-filters": "Panyaringan",
        "autoblockid": "Blokir otomatis #$1",
        "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
-       "ipbreason-dropdown": "*Alesan umum mblokir panganggo\n** Mènèhi informasi palsu\n** Ngilangi isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak intimidasi/nglècèhaké\n** Nyalahgunakaké sawetara akun utawa rékening\n** Jeneng panganggo ora layak",
+       "ipbreason-dropdown": "*Alesan umum mblokir\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak nglècèhaké\n** Ngujar-ujari sawenèh akun\n** Jeneng panganggo ora patut",
        "ipb-hardblock": "Alangi panganggo sing wis mlebu log nyunting saka alamat IP iki",
        "ipbcreateaccount": "Penggak nggawé akun utawa rékening",
        "ipbemailban": "Penggak panganggo ngirim layang e-mail",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca parembugan sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca parembugané sing dituju wis ana isiné.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
-       "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
+       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé sing bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movenotallowedfile": "Panjenengan ora duwé hak kanggo mindhahaké berkas.",
        "movepagebtn": "Ngalih kaca",
        "pagemovedsub": "Kasil dilih",
        "movepage-moved": "<strong>\"$1\" wis dilih nyang \"$2\"</strong>",
-       "movepage-moved-redirect": "Kaca pengalihan wis kacipta.",
+       "movepage-moved-redirect": "Kaca alihan wis kagawé.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
        "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng sing kokpilih ora valid.\nMangga pilih jeneng liya.",
        "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
        "tooltip-t-emailuser": "Kirimna e-mail menyang panganggo iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
-       "tooltip-t-print": "Cara cithakan kaca iki",
+       "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca isi",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "feedback-subject": "Jejer:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané \"[$2 $1]\".",
-       "searchsuggest-search": "Golèk",
+       "searchsuggest-search": "Golèk {{SITENAME}}",
        "searchsuggest-containing": "ngemu...",
        "api-error-badaccess-groups": "Sampéyan ora dililakaké ngunggah berkas nèng wiki iki.",
        "api-error-badtoken": "Kasalahan njero: Token èlèk.",
index a2fd8c9..f5066c9 100644 (file)
        "passwordreset-emaildisabled": "ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.",
        "passwordreset-username": "მომხმარებლის სახელი:",
        "passwordreset-domain": "დომენი:",
-       "passwordreset-capture": "გამოსული ელ-ფოსტის ხილვა?",
-       "passwordreset-capture-help": "თუ მონიშნავთ ამ უჯრას, მაშინ თქვენ შეგეძლებათ მომხმარებლისათვის გაგზავნილი ელ.ფოსტის ნახვა (დროებითი პაროლით).",
        "passwordreset-email": "ელ. ფოსტის მისამართი:",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
        "passwordreset-emailsentemail": "თუ ეს მეილი თქვენს ანგარიშთანაა დაკავშირებული, გაიგზავნება პაროლის თავიდან დასაყენებელი ელექტრონული ფოსტა.",
        "passwordreset-emailsentusername": "თუ არსებობს მეილი, რომელიც ამ ანგარიშთანაა დაკავშირებული, გაიგზავნება პაროლის თავიდან დასაყენებელი ელექტრონული ფოსტა.",
-       "passwordreset-emailsent-capture2": "პაროლის გაუქმების შესახებ {{PLURAL:$1|მეილი|მეილები}} გაიგზავნა. {{PLURAL:$1|სახელი და პაროლი|სახელებისა და პაროლების სია}} არის ნაჩვენები ქვემოთ.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|მომხმარებელთან}} მეილის გაგზავნა ვერ მოხერხდა: $1 {{PLURAL:$3|სახელი და პაროლი|სახელებისა და პაროლების სია}} არის ნაჩვენები ქვემოთ.",
        "passwordreset-nocaller": "გამომძახებელი უნდა იყოს მიწოდებული",
        "passwordreset-nosuchcaller": "გამომძახებელი არ არსებობს: $1",
        "passwordreset-ignored": "პაროლის გაუქმება არ იქნა შესრულებული. შეიძლება კონფიგურაციაში პროვაიდერი არ იყო გათვალისწინებული?",
        "sectioneditnotsupported-text": "სექციის რედაქტირება გათიშულია ამ გვერდისთვის",
        "permissionserrors": "ნებართვის შეცდომა",
        "permissionserrorstext": "თქვენ არ გაქვთ ამის გაკეთების უფლება, შემდეგი {{PLURAL:$1|მიზეზის|მიზეზების}} გამო:",
-       "permissionserrorstext-withaction": "თქვენ არ გაქვთ ამ მოქმედების - „$2“ განხორციელების ნებართვა შემდეგი {{PLURAL:$1|მიზეზის|მიზეზის}} გამო:",
+       "permissionserrorstext-withaction": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83\92á\83\90á\83¥á\83\95á\83\97 á\83\90á\83\9b á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡ - â\80\9e$2â\80\9c á\83\92á\83\90á\83\9cá\83®á\83\9dá\83 á\83ªá\83\98á\83\94á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\9cá\83\94á\83\91á\83\90á\83 á\83\97á\83\95á\83\90 á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 {{PLURAL:$1|á\83\9bá\83\98á\83\96á\83\94á\83\96á\83\98á\83¡|á\83\9bá\83\98á\83\96á\83\94á\83\96á\83\94á\83\91á\83\98á\83¡}} á\83\92á\83\90á\83\9bá\83\9d:",
        "contentmodelediterror": "არ შეგიძლიათ ამ ვერსიის რედაქტირება, რადგან მისი კონტენტის მოდელი არის <code>$1</code>, რაც განსხვავდება გვერდის მიმდინარე კონტენტის მოედლისაგან <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''\n\nგთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.\nინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
        "moveddeleted-notice": "ეს გვერდი წაიშალა. ინფორმაციის მისაღებად ქვემოთ წარმოდგენილია შესაბამისი ჩანაწერები წაშლისა და გადარქმევის ჟურნალებიდან.",
        "saveprefs": "შენახვა",
        "restoreprefs": "ყველა საწყისი პარამეტრის აღდგენა (ყველა სექციაში)",
        "prefs-editing": "რედაქტირება",
-       "rows": "რიგები:",
-       "columns": "სვეტები",
        "searchresultshead": "ძიება",
        "stub-threshold": "გაფორმების გასაუმჯობესებლად მოცემულია ესკიზის ბმული ($1):",
        "stub-threshold-sample-link": "მაგალითი",
        "userrights-reason": "შეცვლის მიზეზი:",
        "userrights-no-interwiki": "თქვენ არ გაქვთ მომხმარებლის უფლებების რედაქტირების უფლება სხვა ვიკი-ებში.",
        "userrights-nodatabase": "მონაცემთა ბაზა $1 არ არსებობს, ან არ არის ლოკალური.",
-       "userrights-nologin": "თქვენ უნდა [[Special:UserLogin|წარადგინოთ თავი სისტემისადმი]] ადმინისისტრატორის ანგარიშით იმისთვის, რომ გასცეთ მომხმარებელთა უფლებები.",
-       "userrights-notallowed": "თქვენ არ გაქვთ მომხმარებელთა უფლებების შეცვლის უფლება.",
        "userrights-changeable-col": "ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ",
        "userrights-unchangeable-col": "ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.",
-       "userrights-removed-self": "თქვენ წაშალეთ საკუთარი უფლება. შესაბამისად, თქვენ აღარ გექნებათ ამ გვერდთან წვდომის საშუალება",
        "group": "ჯგუფი:",
        "group-user": "მომხმარებლები",
        "group-autoconfirmed": "ავტომატურად დადასტურებული მომხმარებლები",
        "right-siteadmin": "მონაცემთა ბაზის დაბლოკვა და განბლოკვა",
        "right-override-export-depth": "გვერდების ექსპორტირება, დაკავშირებული გვერდების ჩათვლით 5-მდე სიიღრმით",
        "right-sendemail": "გაგუგზავნე ელექტრონული ფოსტა სხვა მომხმარებლებს",
-       "right-passwordreset": "ელ.ფოსტის ნახვა პაროლის შეცვლით",
        "right-managechangetags": "[[Special:Tags|ტეგების]] შექმნა და (დე)აქტივაცია",
        "right-applychangetags": "[[Special:Tags|tags]] მიღება თქვენ ცვლილებებთან ერთად",
        "right-changetags": "თვითნებური [[Special:Tags|tags]] დამატება ან წაშლა ცალკეულ ცვლილებებსა და ჟურნალის ჩანაწერებში",
        "listfiles_date": "თარიღი",
        "listfiles_name": "სახელი",
        "listfiles_user": "მომხმარებელი",
-       "listfiles_size": "ზომა (ბაიტები)",
+       "listfiles_size": "ზომა",
        "listfiles_description": "აღწერილობა",
        "listfiles_count": "ვერსიები",
        "listfiles-show-all": "სურათების ძველი ვერსიების ჩართვა",
        "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",
        "restriction-type": "უფლება",
        "restriction-level": "შეზღუდვის დონე:",
-       "minimum-size": "მინ ზომა",
+       "minimum-size": "მინ. ზომა",
        "maximum-size": "მაქს. ზომა",
        "pagesize": "(ბაიტი)",
        "restriction-edit": "რედაქტირება",
        "htmlform-user-not-exists": "<strong>$1</strong> არ არსებობს.",
        "htmlform-user-not-valid": "<strong>$1</strong> არ არის სწორი მომხმარებლის სახელი.",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
+       "logentry-delete-delete_redir": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გადამისამართება $3 გადაწერით",
        "logentry-delete-restore": "მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3",
        "logentry-delete-event": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4",
        "logentry-delete-revision": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4",
        "feedback-useragent": "მომხმარებლის აგენტი:",
        "searchsuggest-search": "ძიება",
        "searchsuggest-containing": "შეიცავს...",
-       "api-error-autoblocked": "თქვენი IP მისამართი ავტომატურად დაიბლოკა, რადგან ის გამოიყენა დაბლოკილმა მომხმარებელმა.",
-       "api-error-badaccess-groups": "თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.",
        "api-error-badtoken": "შიდა შეცდომა: ცუდი ტოკენი.",
-       "api-error-blocked": "თქვენთვის რედაქტირება დაბლოკილია.",
-       "api-error-copyuploaddisabled": "ამ სერვერზე URL-მისამართის საშუალებით ატვირთვა გამორთულია.",
-       "api-error-duplicate": "საიტზე უკვე {{PLURAL:$1|არსებობს სხვა ფაილი|არსებობს სხვა ფაილები}} ანალოგიური შინაარსით.",
-       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო ფაილი}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
-       "api-error-empty-file": "არჩეული ფაილი ცარიელია.",
        "api-error-emptypage": "ახალი, ცარიელი გვერდების შექმნა აკრძალულია.",
-       "api-error-fetchfileerror": "შიდა შეცდომა: ფაილის მიღებისას მოხდა რაღაც შეცდომა.",
-       "api-error-fileexists-forbidden": "ფაილი სახელით „$1“ უკვე არსებობს და მისი გადაწერა შეუძლებელია.",
-       "api-error-fileexists-shared-forbidden": "ფაილი სახელით „$1“ უკვე არსებობს საერთო ფაილების საცავში და გადაწერა შეუძლებელია.",
-       "api-error-file-too-large": "არჩეული ფაილი ძალიან დიდია.",
-       "api-error-filename-tooshort": "ფაილის სახელი ზედმეტად მოკლეა",
-       "api-error-filetype-banned": "ფაილის ეს ტიპი აკრძალულია",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|მიუღებელი ფაილის ტიპია|მიუღებელი ფაილის ტიპებია}}. მისაღებიი ფაილის {{PLURAL:$3|ტიპია|ტიპებია}} $2.",
-       "api-error-filetype-missing": "ფაილს აკლია გაფართოვება.",
-       "api-error-hookaborted": "თქვენ მიერ შემოთავაზებული ცვლილება მოინიშნა გაფართოების დოკუმენტაციაში.",
-       "api-error-http": "აღმოჩენილია შეცდომა სერვერთან დაკავშირებისას.",
-       "api-error-illegal-filename": "ფაილის ეს სახელი აკრძალულია.",
-       "api-error-internal-error": "შიდა შეცდომა: ვიკიში თქვენი ატვირთვის დამუშავებისას მოხდა შეცდომა.",
-       "api-error-invalid-file-key": "სერვერმა ვერ იპოვა თქვენ მიერ მითითებული ფაილი",
-       "api-error-missingparam": "შიდა შეცდომა: მოთხოვნილი პარამეტრები დაიკარგა.",
-       "api-error-missingresult": "შიდა შეცდომა. ვერ მოხერხდა იმის დადგენა, იყო თუ არა კოპირება წარმატებული.",
-       "api-error-mustbeloggedin": "ფაილების ასატვირთად თქვენ უნდა შეხვიდეთ სისტემაში.",
-       "api-error-mustbeposted": "პროგრამული შეცდომა; გამოყენებულია არასწორი HTTP-მეთოდი.",
-       "api-error-noimageinfo": "ატვირთვა წარმატებით განხორციელდა, მაგრამ სერვერმა არ აჩვენა ფაილის შესახებ არანაირი ინფორმაცია.",
-       "api-error-nomodule": "შიდა შეცდომა. ატვირთვის მოდული არ არის კონფიგურირებული.",
-       "api-error-ok-but-empty": "შიდა შეცდომა. სერვერს არ დაუბრუნებია ინფორმაცია ატვირთვადი ფაილის შესახებ.",
-       "api-error-overwrite": "არსებული ფაილის შეცვლა მიუღებელია.",
-       "api-error-stashfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
        "api-error-publishfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
-       "api-error-stasherror": "ფაილის ჩატვირთვისას საცავში მოხდა შეცდომა",
-       "api-error-stashedfilenotfound": "დროებითი საცავიდან ფაილის ჩატვირთვისას საწყისი ფაილი არ იქნა ნაპოვნი",
-       "api-error-stashpathinvalid": "გზა, რომელზედაც უნდა იყოს განლაგებული ფაილი, ჩატვირთული დროებით საცავში, არაკორექტულია",
-       "api-error-stashfilestorage": "ფაილის ჩატვირთვისას დროებით საცავში მოხდა შეცდომა.",
-       "api-error-stashzerolength": "სერვერს არ შეუძლია შეინახოს ფაილი დროებით საცავში, რამეთუ მას აქვს ნულოვანი სიგრძე",
-       "api-error-stashnotloggedin": "თქვენ უნდა შეხვიდეთ სისტემაში, რათა გქონდეთ შესაძლებლობა ფაილის შეინახვისა დროებით საცავში",
-       "api-error-stashwrongowner": "ფაილი, რომლის გახსნასაც ცდილობდით დროებით საცავში, თქვენ არ გეკუთვნით",
-       "api-error-stashnosuchfilekey": "ფაილის გასაღები, რომელთანაც ცდილობდით წვდომას დროებით საცავში, არ არსებობს",
-       "api-error-timeout": "სერვერმა არ მოახდინა რეაგირება მოსალოდნელ დროში.",
-       "api-error-unclassified": "აღმოჩენილია უცნობი შეცდომა.",
-       "api-error-unknown-code": "უცნობი შეცდომა : „$1“",
-       "api-error-unknown-error": "შიდა შეცდომა: ფაილის ატვირთვისას აღმოჩენილია უცნობი შეცდომა.",
+       "api-error-stashfailed": "შიდა შეცდომა: სერვერმა ვერ შეძლო დროებითი ფაილის შენახვა.",
        "api-error-unknown-warning": "უცნობი გაფრთხილება: „$1“.",
        "api-error-unknownerror": "უცნობი შეცდომა: „$1“.",
-       "api-error-uploaddisabled": "ატვირთვის მექანიზმი ამ ვიკიზე გამორთულია",
-       "api-error-verification-error": "ეს ფაილი ან რაიმე შეცდომას შეიცავს, ან არ აქვს სახელის გაფართოება.",
-       "api-error-was-deleted": "ფაილი ამ სახელწოდებით ადრე აიტვირთა და შემდეგ წაიშალა.",
        "duration-seconds": "$1 {{PLURAL:$1|წამი|წამი}}",
        "duration-minutes": "$1 {{PLURAL:$1|წუთი|წუთი}}",
        "duration-hours": "$1 {{PLURAL:$1|საათი|საათი}}",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "სიმბოლოები",
        "special-characters-group-greek": "ბერძნული",
+       "special-characters-group-greekextended": "ბერძნული გაფართოებული",
        "special-characters-group-cyrillic": "კირილიცა",
        "special-characters-group-arabic": "არაბული",
        "special-characters-group-arabicextended": "არაბული გაფართოება",
        "mw-widgets-dateinput-no-date": "თარიღი არ არის არჩეული",
        "mw-widgets-dateinput-placeholder-day": "წწწწ-თთ-დდ",
        "mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
+       "mw-widgets-mediasearch-noresults": "შედეგები ვერ მოიძებნა.",
        "mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
        "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
        "sessionmanager-tie": "შეუძლებელია მრავალი მოთხოვნის ავთენთიფიკაციის ტიპების გაერთიანება: $1.",
index 590caf6..f7ad3d9 100644 (file)
        "mypage": "Жеке бет",
        "mytalk": "Талқылау",
        "anontalk": "Талқылау",
-       "navigation": "Ð\91аÒ\93Ñ\8bÑ\82Ñ\82ау",
+       "navigation": "ШаÑ\80лау",
        "and": "&#32;және",
        "qbfind": "Табу",
        "qbbrowse": "Шолу",
        "undeleterevisions": "$1 {{PLURAL:$1|нұсқа|нұсқа}} жойылды",
        "undeletehistory": "Егер бетті қалпына келтірсеңіз тарихындағы барлық түзетулер де қалпына келтіріледі. Егер жоюдан соң дәл солай атауымен жаңа бет басталса қалпына келтірілген түзетулер бұрынғы өңделу тарихында көрсетіледі.",
        "undeleterevdel": "Егер бұл үстіңгі бетте аяқталса, не файл түзетуі жарым-жартылай жойылған болса, жою болдырмауы орындалмайды.\nОсындай жағдайларда, ең жаңа жойылған түзетуін алып тастауыңыз не жасыруын болдырмауыңыз жөн.",
-       "undeletehistorynoadmin": "Бұл бет жойылған.\nЖою себебі алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген.\nМына жойылған түзетулерін көкейкесті мәтіні тек әкімшілерге жетімді.",
+       "undeletehistorynoadmin": "Бұл бет жойылған.\nЖойған себебі жою алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген. Осы жойылған нұсқалардың мәтіні тек әкімшілерге қатынаулы.",
        "undelete-revision": "$4,  $5  кезіндегі $3 жасаған $1 дегеннің жойылған түзетуі:",
        "undeleterevision-missing": "Жарамсыз не жоғалған түзету.\nСілтемеңіз жарамсыз, не түзету қалпына келтірілген, немесе мұрағаттан аласталған болуы мүмкін.",
        "undelete-nodiff": "Еш алдыңғы түзету табылмады.",
index 387f558..3f45d64 100644 (file)
@@ -64,7 +64,8 @@
                        "Ykhwong",
                        "Matma Rex",
                        "Tursetic",
-                       "Jerrykim306"
+                       "Jerrykim306",
+                       "Sukjong0406"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "searcharticle": "보기",
        "history": "문서 역사",
        "history_short": "역사",
+       "history_small": "역사",
        "updatedmarker": "마지막으로 방문한 뒤 바뀜",
        "printableversion": "인쇄용 판",
        "permalink": "고유 링크",
        "eauthentsent": "입력한 이메일로 확인 이메일을 보냈습니다.\n다른 모든 형태의 이메일을 당신의 계정으로 보내기 전에, 계정이 정말 당신의 것인지 확인하기 위해 이메일 내용의 지시대로 계정 확인 절차를 실행해 주셔야 합니다.",
        "throttled-mailpassword": "비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.\n악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.",
        "mailerror": "메일을 보내는 중 오류: $1",
-       "acct_creation_throttle_hit": "당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.\n따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.",
+       "acct_creation_throttle_hit": "당신의 IP 주소를 이용한 이 위키의 방문자가 $2에 {{PLURAL:$1|계정 $1개}}를 만들었으며, 이 기간 안에 허용되는 계정 만들기 한도를 초과하였습니다.\n따라서 지금 이 IP 주소를 사용하는 방문자는 더 이상 계정을 만들 수 없습니다.",
        "emailauthenticated": "이메일 주소가 $2 $3에 인증되었습니다.",
        "emailnotauthenticated": "이메일 주소를 인증하지 않았습니다.\n이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.",
        "noemailprefs": "이 기능을 사용하려면 사용자 환경 설정에서 이메일 주소를 지정하세요.",
        "botpasswords-updated-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 업데이트되었습니다.",
        "botpasswords-deleted-title": "봇 비밀번호 제거",
        "botpasswords-deleted-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 삭제되었습니다.",
-       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호가 <strong>$2</strong>입니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
+       "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호는 <strong>$2</strong>입니다. <em>추후 참조를 위해 이것을 기록해두시기 바랍니다.</em> <br> (로그인 이름이 최종 사용자 이름과 동일해야 하는 오래된 봇의 경우, 사용자 이름으로 <strong>$3</strong>을(를), 비밀번호로 <strong>$4</strong>을(를) 사용할 수도 있습니다)",
        "botpasswords-no-provider": "'BotPasswordsSessionProvider'는 이용할 수 없습니다.",
        "botpasswords-restriction-failed": "봇 비밀번호 제한으로 인해 로그인할 수 없습니다.",
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "minoredit": "사소한 편집입니다",
        "watchthis": "이 문서 주시하기",
        "savearticle": "문서 저장",
-       "savechanges": "변경 사항 저장",
+       "savechanges": "변경사항 저장",
        "publishpage": "문서 게시",
-       "publishchanges": "변경 사항 게시",
+       "publishchanges": "변경사항 게시",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
        "blockedtitle": "사용자가 차단됨",
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: $2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
+       "systemblockedtext": "당신의 사용자 이름 또는 IP 주소가 자동으로 미디어위키에 의해 차단되었습니다.\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n* 차단 대상: $7\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
        "blockednoreason": "이유를 입력하지 않음",
        "whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "saveprefs": "저장",
        "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
        "prefs-editing": "편집",
-       "rows": "줄 수:",
-       "columns": "열 수:",
        "searchresultshead": "검색",
        "stub-threshold": "링크를 토막글 형식으로 보여줄 문서 크기 ($1):",
        "stub-threshold-sample-link": "샘플",
        "userrights-user-editname": "사용자 이름 입력:",
        "editusergroup": "사용자 그룹 불러오기",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 바꾸기",
+       "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한을 보는 중",
        "userrights-editusergroup": "사용자 그룹 편집",
+       "userrights-viewusergroup": "사용자 그룹 보기",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-groupsmember": "현재 권한:",
        "userrights-groupsmember-auto": "자동으로 부여된 권한:",
        "grant-editprotected": "보호된 문서 편집하기",
        "grant-highvolume": "대용량 편집",
        "grant-oversight": "사용자 숨기기와 판 억제",
-       "grant-patrol": "페이지 변경 사항 점검",
+       "grant-patrol": "문서의 변경사항 점검",
        "grant-privateinfo": "개인 정보 접근",
        "grant-protect": "문서 보호 및 보호 해제",
        "grant-rollback": "문서의 바뀜을 되돌리기",
        "grant-basic": "기본 권한",
        "grant-viewdeleted": "삭제된 파일과 문서 보기",
        "grant-viewmywatchlist": "내 주시문서 목록 보기",
+       "grant-viewrestrictedlogs": "제한된 로그 기록 보기",
        "newuserlogpage": "사용자 만들기 기록",
        "newuserlogpagetext": "사용자가 만들어진 기록입니다.",
        "rightslog": "사용자 권한 기록",
        "action-upload_by_url": "URL 주소를 통해 이 파일을 올리기",
        "action-writeapi": "API를 작성할",
        "action-delete": "이 문서 삭제하기",
-       "action-deleterevision": "이 판을 삭제",
-       "action-deletedhistory": "이 문서의 삭제된 기여의 역사 보기",
+       "action-deleterevision": "판을 삭제",
+       "action-deletelogentry": "로그 기록 삭제",
+       "action-deletedhistory": "문서의 삭제된 기여의 역사 보기",
+       "action-deletedtext": "삭제된 판의 문자열 보기",
        "action-browsearchive": "삭제된 문서 검색",
-       "action-undelete": "이 문서 되살리기",
-       "action-suppressrevision": "ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦´",
+       "action-undelete": "문서 되살리기",
+       "action-suppressrevision": "ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë³µêµ¬í\95\98기",
        "action-suppressionlog": "비공개 기록 보기",
        "action-block": "이 사용자가 편집하지 못하도록 차단",
        "action-protect": "이 문서의 보호 설정을 바꾸기",
        "action-userrights-interwiki": "다른 위키의 사용자 권한을 조정",
        "action-siteadmin": "데이터베이스를 잠그거나 잠금 해제하기",
        "action-sendemail": "이메일 보내기",
+       "action-editmyoptions": "자신의 환경 설정 편집",
        "action-editmywatchlist": "내 주시문서 목록 편집",
        "action-viewmywatchlist": "내 주시문서 목록 보기",
        "action-viewmyprivateinfo": "자신의 개인정보 보기",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
+       "rcfilters-activefilters": "사용 중인 필터",
+       "rcfilters-restore-default-filters": "기본 필터 복구",
+       "rcfilters-clear-all-filters": "필터 모두 지우기",
+       "rcfilters-search-placeholder": "필터 최근 바뀜 (찾아보거나 입력을 시작하십시오)",
+       "rcfilters-invalid-filter": "유효하지 않은 필터",
+       "rcfilters-empty-filter": "활발한 필터 없음. 모든 기여 내역을 보여줍니다.",
+       "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
+       "rcfilters-filtergroup-registration": "사용자 등록",
+       "rcfilters-filter-registered-label": "등록됨",
+       "rcfilters-filter-registered-description": "로그인된 편집자.",
+       "rcfilters-filter-unregistered-label": "등록 안됨",
+       "rcfilters-filter-unregistered-description": "로그인 하지 않은 편집자.",
+       "rcfilters-filtergroup-authorship": "원작자 편집",
+       "rcfilters-filter-editsbyself-label": "자신의 편집",
+       "rcfilters-filter-editsbyself-description": "당신의 편집.",
+       "rcfilters-filter-editsbyother-label": "다른 사용자의 편집",
+       "rcfilters-filter-editsbyother-description": "다른 사용자에 의한 편집 (당신의 편집이 아님).",
+       "rcfilters-filtergroup-userExpLevel": "경험 수준 (등록된 사용자 전용)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "신규 사용자",
+       "rcfilters-filter-userExpLevel-newcomer-description": "편집 10회 미만의 편집 및 4일 미만의 활동.",
+       "rcfilters-filter-userExpLevel-learner-label": "학습자",
+       "rcfilters-filter-userExpLevel-learner-description": "\"신규 사용자\" 보다 활동일 및 편집 수가 더 많지만 \"능숙한 사용자\" 보다는 적습니다.",
+       "rcfilters-filter-userExpLevel-experienced-label": "능숙한 사용자",
+       "rcfilters-filter-userExpLevel-experienced-description": "30일 이상의 활동 및 500개 이상의 편집.",
+       "rcfilters-filtergroup-automated": "자동으로 된 기여",
+       "rcfilters-filter-bots-label": "봇",
+       "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
+       "rcfilters-filter-humans-label": "사람 (봇이 아님)",
+       "rcfilters-filter-humans-description": "수동으로 한 편집.",
+       "rcfilters-filter-minor-label": "사소한 편집",
+       "rcfilters-filter-major-label": "사소하지 않은 편집",
+       "rcfilters-filter-major-description": "사소한 편집으로 표시되지 않은 편집.",
+       "rcfilters-filtergroup-changetype": "차이 종류",
+       "rcfilters-filter-pageedits-label": "문서 편집",
+       "rcfilters-filter-newpages-label": "문서 생성",
+       "rcfilters-filter-newpages-description": "새 문서를 만드는 편집.",
+       "rcfilters-filter-categorization-label": "분류 차이",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "proxyblockreason": "당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다.\n만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.",
        "sorbsreason": "당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.",
        "sorbs_create_account_reason": "당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.\n계정을 만들 수 없습니다.",
+       "softblockrangesreason": "익명 기여가 당신의 IP 주소($1)에서 허용되지 않습니다. 로그인해 주십시오.",
        "xffblockreason": "X-Forwarded-For 헤더에 현재 사용하고 있는 프록시 서버 중 당신이나 해당 IP 주소가 차단되었습니다. 차단 이유는 다음과 같습니다: $1",
        "cant-see-hidden-user": "차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.\n사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.",
        "ipbblocked": "자신이 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.",
        "cant-move-to-user-page": "문서를 사용자 문서로 이동할 권한이 없습니다 (하위 문서는 예외).",
        "cant-move-category-page": "분류 문서를 이동할 권한이 없습니다.",
        "cant-move-to-category-page": "문서를 분류 문서로 이동할 권한이 없습니다.",
+       "cant-move-subpages": "하위 문서를 이동할 권한이 없습니다.",
+       "namespace-nosubpages": "\"$1\" 이름공간은 하위 문서를 허용하지 않습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 이동",
        "pageinfo-length": "문서 길이 (바이트)",
        "pageinfo-article-id": "문서 ID",
        "pageinfo-language": "문서 내용 언어",
+       "pageinfo-language-change": "바꾸기",
        "pageinfo-content-model": "문서 내용 모델",
        "pageinfo-content-model-change": "변경",
        "pageinfo-robot-policy": "로봇에 의한 색인",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "지정한 값은 인식할 수 있는 날짜가 아닙니다. YYYY-MM-DD 형식을 사용하세요.",
+       "htmlform-time-invalid": "지정한 값은 인식할 수 있는 시간이 아닙니다. HH:MM:SS 형식을 사용하세요.",
+       "htmlform-datetime-invalid": "지정한 값은 인식할 수 있는 날짜 및 시간이 아닙니다. YYYY-MM-DD HH:MM:SS 형식을 사용하세요.",
        "htmlform-title-badnamespace": "[[:$1]] 문서는 \"{{ns:$2}}\" 이름공간에 없습니다.",
        "htmlform-title-not-creatable": "\"$1\"은 만들 수 없는 문서 제목입니다.",
        "htmlform-title-not-exists": "$1 문서는 존재하지 않습니다.",
        "feedback-subject": "제목:",
        "feedback-submit": "제출",
        "feedback-terms": "사용자 에이전트 정보가 나의 브라우저 정보, 운영 체제 버전을 포함하며 피드백과 함께 공개적으로 공유됨을 이해합니다.",
-       "feedback-termsofuse": "이용 약관을 준수하여 피드백을 제공할 것입니다.",
+       "feedback-termsofuse": "이용 약관을 준수하여 피드백 제공에 동의합니다.",
        "feedback-thanks": "감사합니다! \"[$2 $1]\" 문서에 의견을 남겼습니다.",
        "feedback-thanks-title": "감사합니다!",
        "feedback-useragent": "사용자 에이전트:",
        "searchsuggest-search": "{{SITENAME}} 검색",
        "searchsuggest-containing": "다음 문자열 포함...",
-       "api-error-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
-       "api-error-badaccess-groups": "이 위키에 파일을 올릴 권한이 없습니다.",
        "api-error-badtoken": "내부 오류: 토큰이 잘못되었습니다.",
-       "api-error-blocked": "편집에서 차단되어 있습니다.",
-       "api-error-copyuploaddisabled": "이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-duplicate": "이 위키에 내용이 똑같은 {{PLURAL:$1|다른 파일}}이 있습니다.",
-       "api-error-duplicate-archive": "같은 내용을 담고 있던 {{PLURAL:$1|다른 파일}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.",
-       "api-error-empty-file": "올리려는 파일이 비어 있습니다.",
        "api-error-emptypage": "새 문서로 빈 문서를 만들 수 없습니다.",
-       "api-error-fetchfileerror": "내부 오류: 파일을 불러오는 중 문제가 발생했습니다.",
-       "api-error-fileexists-forbidden": "\"$1\" 이름으로 된 파일은 이미 존재하고 덮어쓸 수 없습니다.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.",
-       "api-error-file-too-large": "올리려는 파일이 너무 큽니다.",
-       "api-error-filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "api-error-filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.",
-       "api-error-filetype-missing": "파일 이름에 확장자가 없습니다.",
-       "api-error-hookaborted": "수정하려고 한 것이 확장 기능에 의해 중지되었습니다.",
-       "api-error-http": "내부 오류: 서버에 연결할 수 없습니다.",
-       "api-error-illegal-filename": "이 파일 이름을 사용할 수 없습니다.",
-       "api-error-internal-error": "내부 오류: 올린 파일을 위키에서 처리하는 중 어떤 문제가 발생했습니다.",
-       "api-error-invalid-file-key": "내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.",
-       "api-error-missingparam": "내부 오류: 요청에 변수가 없습니다.",
-       "api-error-missingresult": "내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.",
-       "api-error-mustbeloggedin": "파일을 올리려면 로그인해야 합니다.",
-       "api-error-mustbeposted": "내부 오류: HTTP POST에 요청이 필요합니다.",
-       "api-error-noimageinfo": "파일 올리기는 성공했지만 서버가 파일에 대해 어떠한 정보도 주지 않았습니다.",
-       "api-error-nomodule": "내부 오류: 올리기 모듈이 설정되지 않았습니다.",
-       "api-error-ok-but-empty": "내부 오류: 서버에서 응답이 없습니다.",
-       "api-error-overwrite": "이미 있는 파일을 덮어쓸 수 없습니다.",
-       "api-error-ratelimited": "짧은 시간 안에 위키가 허용하는 것 보다 더 많은 파일을 업로드하려고 합니다.\n몇 분 뒤에 다시 시도해 주십시오.",
-       "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
        "api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
-       "api-error-stasherror": "파일을 미공개 위치로 업로드하는 동안 오류가 발생했습니다.",
-       "api-error-stashedfilenotfound": "임시 저장된 파일이 임시 저장소에서 올리려고 했을 때 찾을 수 없었습니다.",
-       "api-error-stashpathinvalid": "임시 저장된 파일이 존재해야 할 경로에 유효한 파일이 없습니다.",
-       "api-error-stashfilestorage": "파일을 임시 저장하는 동안 오류가 발생했습니다.",
-       "api-error-stashzerolength": "서버는 파일을 저장하지 못했는데, 파일의 용량이 0이기 때문입니다.",
-       "api-error-stashnotloggedin": "파일을 업로드하기 위해 로그인이 필요합니다.",
-       "api-error-stashwrongowner": "저장된 임시 저장소에 존재하는 파일에 접근할 권한이 없습니다.",
-       "api-error-stashnosuchfilekey": "미공개 위치에 접근을 시도한 파일 키는 존재하지 않습니다.",
-       "api-error-timeout": "서버가 제 시간 내에 응답하지 않았습니다.",
-       "api-error-unclassified": "알 수 없는 오류가 발생했습니다.",
-       "api-error-unknown-code": "알 수 없는 오류: \"$1\"",
-       "api-error-unknown-error": "내부 오류: 파일을 올리려 하는 도중에 무엇인가가 잘못되었습니다.",
-       "api-error-unknown-warning": "알 수 없는 경고: \"$1\"",
+       "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
+       "api-error-unknown-warning": "알 수 없는 경고: \"$1\".",
        "api-error-unknownerror": "알 수 없는 오류: \"$1\"",
-       "api-error-uploaddisabled": "이 위키에서 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-verification-error": "파일이 손상되었거나 잘못된 확장자를 사용하고 있습니다.",
-       "api-error-was-deleted": "이 이름으로 된 파일은 과거에 업로드된 이후 삭제된 적이 있습니다.",
        "duration-seconds": "$1{{PLURAL:$1|초}}",
        "duration-minutes": "$1{{PLURAL:$1|분}}",
        "duration-hours": "$1{{PLURAL:$1|시간}}",
        "pagelang-language": "언어",
        "pagelang-use-default": "기본 언어 사용",
        "pagelang-select-lang": "언어 선택",
+       "pagelang-reason": "이유",
        "pagelang-submit": "제출",
+       "pagelang-nonexistent-page": "$1 문서가 존재하지 않습니다.",
+       "pagelang-unchanged-language": "$1 문서는 이미 $2 언어로 설정되어 있습니다.",
+       "pagelang-unchanged-language-default": "$1 문서는 이미 위키의 기본 콘텐츠 언어로 설정되어 있습니다.",
+       "pagelang-db-failed": "데이터베이스가 문서 언어 변경에 실패했습니다.",
        "right-pagelang": "문서 언어 바꾸기",
        "action-pagelang": "문서 언어 바꾸기",
        "log-name-pagelang": "언어 바꾸기 기록",
        "sessionprovider-nocookies": "브라우저의 쿠키 기능이 꺼져 있는지 확인하십시오. 쿠키 기능을 켠 다음 다시 시작해야 합니다.",
        "randomrootpage": "임의 루트 페이지",
        "log-action-filter-block": "차단의 유형:",
-       "log-action-filter-contentmodel": "콘텐츠 모델 수정 분류:",
+       "log-action-filter-contentmodel": "콘텐츠 모델 변경 분류:",
        "log-action-filter-delete": "삭제 종류:",
        "log-action-filter-import": "가져오기 종류:",
        "log-action-filter-managetags": "태그 관리 동작 종류:",
        "log-action-filter-block-reblock": "차단 변경",
        "log-action-filter-block-unblock": "차단 해제",
        "log-action-filter-contentmodel-change": "콘텐츠 모델 변경",
-       "log-action-filter-contentmodel-new": "비표준 콘텐츠 모델 문서 생성",
+       "log-action-filter-contentmodel-new": "기본이 아닌 콘텐츠 모델 문서 생성",
        "log-action-filter-delete-delete": "문서 삭제",
+       "log-action-filter-delete-delete_redir": "넘겨주기 덮어쓰기",
        "log-action-filter-delete-restore": "문서 복구",
        "log-action-filter-delete-event": "로그 삭제",
        "log-action-filter-delete-revision": "판 삭제",
        "usercssispublic": "주목해 주십시오: CSS의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
-       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "$1 판",
+       "pageid": "페이지 ID $1"
 }
index dcc8529..16ddbcd 100644 (file)
@@ -47,7 +47,7 @@
        "tog-enotifrevealaddr": "Navnîşana enameya min di agahdariyên enameyan de nîşan bide",
        "tog-shownumberswatching": "Hejmara bikarhênerên dişopînin nîşan bide",
        "tog-oldsig": "Îmzeya heye:",
-       "tog-fancysig": "Di îmzeyê de girêdana otomatîk a bikarhêner betal bike",
+       "tog-fancysig": "Îmzeyê wek wîkîtekstê nîşan bide (bê girêdana otomatîk)",
        "tog-uselivepreview": "Pêşdîtina \"zindî\" bi kar bîne",
        "tog-forceeditsummary": "Hinga kurteyeke vala hate tomarkirin min agahdar bike",
        "tog-watchlisthideown": "Guherandinên min ji lîsteya şopandinê veşêre",
        "note": "<strong>Nîşe:</strong>",
        "previewnote": "'''Ji bîr neke ku ev tenê pêşdîtinek e.'''\nGuhertinên te hê nehatine tomarkirin!",
        "continue-editing": "Here qada sazandinê",
-       "editing": "$1 tê guherandin",
-       "creating": "$1 tê çêkirin",
+       "editing": "\"$1\" tê guherandin",
+       "creating": "\"$1\" tê çêkirin",
        "editingsection": "Tê guherandin: $1 (beş)",
        "editingcomment": "$1 (beşek nû) tê guherandin.",
        "editconflict": "Têkçûna guherandinan: $1",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) nîşan bide",
        "searchmenu-exists": "'''Rûpeleke bi navê \"[[:$1]]\" li ser vê wîkiyê heye.'''",
-       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong>{{PLURAL:$2|0=|See also the page found with your search.|Herwiha li encamên hatiye dîtin jî binêre.}}",
+       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong> {{PLURAL:$2|0=|Herwiha li encama hatiye dîtin jî binêre.|Herwiha li encamên hatine dîtin jî binêre.}}",
        "searchprofile-articles": "Rûpelên naverokê",
        "searchprofile-images": "Multîmedya",
        "searchprofile-everything": "Her tişt",
        "saveprefs": "Tomar bike",
        "restoreprefs": "Hemû eyarên berê ji nû ve ava bike (di hemû beşa da)",
        "prefs-editing": "Guherandin",
-       "rows": "Rêz:",
-       "columns": "Stûn:",
        "searchresultshead": "Lê bigere",
        "recentchangesdays-max": "Herî zêde $1 {{PLURAL:$1|roj|rojan}}",
        "savedprefs": "Tercîhên te qeyd kirî ne.",
        "unwatchthispage": "Êdî neşopîne",
        "notanarticle": "Ne gotar e",
        "watchlist-details": "{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.",
-       "wlheader-enotif": "Agahdariya E-nameyê pêk tê.",
+       "wlheader-enotif": "Agahdariya e-nameyan hate çalakkirin",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
        "wlnote": "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya  nîşan bide",
        "feedback-subject": "Mijar:",
        "feedback-submit": "Tomar bike",
        "feedback-thanks-title": "Spas!",
-       "searchsuggest-search": "Lêgerîn",
+       "searchsuggest-search": "Li ser {{SITENAME}} bigere",
        "searchsuggest-containing": "dihundirîne...",
-       "api-error-filename-tooshort": "Navê dosyeyê pir kurt e.",
-       "api-error-unclassified": "Çewtiyeke nenas pêk hat.",
-       "api-error-unknown-code": "Çewtiya nenas: \"$1\".",
        "api-error-unknownerror": "Çewtiya nenas: \"$1\".",
        "duration-years": "$1 {{PLURAL:$1|sal}}",
        "expand_templates_output": "Encam",
index b032e60..70ba002 100644 (file)
        "searcharticle": "Säit",
        "history": "Historique vun der Säit",
        "history_short": "Versiounen",
+       "history_small": "Versiounen",
        "updatedmarker": "geännert zanter ech d'Säit fir d'lescht gekuckt hunn",
        "printableversion": "Drockversioun",
        "permalink": "Zitéierfäege Link",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
        "passwordreset-emailsentemail": "Wann dës E-Mailadress mat Ärem Benotzerkont assoziéiert ass, da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
        "passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
+       "passwordreset-ignored": "D'Zrécksetze vum Passwuert gouf net verschafft. Vläicht war de Fournisseur net agestallt?",
        "passwordreset-invalidemail": "Net-valabel E-Mail-Adress",
        "passwordreset-nodata": "Et gouf weder e Benotzernumm nach e Passwuert uginn",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "saveprefs": "Späicheren",
        "restoreprefs": "All Standardastellungen zrécksetzen (an allen Abschnitter)",
        "prefs-editing": "Änneren",
-       "rows": "Zeilen",
-       "columns": "Kolonnen",
        "searchresultshead": "Sichen",
        "stub-threshold": "Maximum bei deem e Link nach ëmmer am Skizze-Format ($1) gewise gëtt:",
        "stub-threshold-sample-link": "Beispill",
        "editusergroup": "Benotzergruppe lueden",
        "editinguser": "Ännere vun de Rechter vum  {{GENDER:$1|Benotzer}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Benotzergruppen änneren",
+       "userrights-viewusergroup": "Benotzergruppe weisen",
        "saveusergroups": "{{GENDER:$1|Benotzer}}gruppe späicheren",
        "userrights-groupsmember": "Member vun:",
        "userrights-groupsmember-auto": "Implizit Member vun:",
        "action-upload_by_url": "Fichiere vun enger Internetadress (URL) eropzelueden",
        "action-writeapi": "d'API mat Schreifzougrëff ze benotzen",
        "action-delete": "dës Säit ze läschen",
-       "action-deleterevision": "dës Versioun ze läschen",
-       "action-deletedhistory": "d'Lëscht vun de geläschte Versiounen gesinn",
+       "action-deleterevision": "Versioune läschen",
+       "action-deletedhistory": "déi geläscht Versiounen vun enger Säit weisen",
+       "action-deletedtext": "geläschte Versiounstext weisen",
        "action-browsearchive": "no geläschte Säiten ze sichen",
-       "action-undelete": "dës Säit ze restauréieren",
-       "action-suppressrevision": "déi verstoppt Versioun kucken a restauréieren",
+       "action-undelete": "Säite restauréieren",
+       "action-suppressrevision": "verstoppt Versiounen nokucken a restauréieren",
        "action-suppressionlog": "dës privat Lëscht ze kucken",
        "action-block": "dëse Benotzer fir Ännerungen ze spären",
        "action-protect": "de Protektiounsstatus vun dëser Säit änneren",
        "action-userrights-interwiki": "d'Rechter vu Benotzer vun anere Wikien z'änneren",
        "action-siteadmin": "d'Datebank ze spären oder d'Spär opzehiewen",
        "action-sendemail": "Maile schécken",
+       "action-editmyoptions": "ännert Är Astellungen",
        "action-editmywatchlist": "ännert Är Iwwerwaachungslëscht",
        "action-viewmywatchlist": "kuckt Är Iwwerwaachungslëscht",
        "action-viewmyprivateinfo": "Är privat Informatioune kucken",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Weisen",
+       "rcfilters-activefilters": "Aktiv Filteren",
+       "rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
+       "rcfilters-invalid-filter": "Net valabele Filter",
+       "rcfilters-filterlist-title": "Filteren",
+       "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
+       "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
+       "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
+       "rcfilters-filter-editsbyother-label": "Ännerunge vun Aneren",
+       "rcfilters-filter-editsbyother-description": "Ännerunge vun anere Benotzer (net vun Iech).",
+       "rcfilters-filtergroup-userExpLevel": "Niveau vun der Erfahrung (just fir registréiert Benotzer)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Neier",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Manner wéi 10 Ännerungen a manner wéi 4 Deeg Aktivitéit.",
+       "rcfilters-filter-userExpLevel-learner-label": "Ufänger",
+       "rcfilters-filter-userExpLevel-learner-description": "Aktivitéit vu méi Deeg a méi Ännerunge wéi ''Nei Benotzer'' awer manner wéi ''Erfuere Benotzer''.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfuere Benotzer.",
+       "rcfilters-filter-userExpLevel-experienced-description": "Méi wéi 30 Deeg Aktivitéit a méi wéi 500 Ännerungen.",
+       "rcfilters-filter-minor-label": "Kleng Ännerungen",
+       "rcfilters-filter-major-label": "Keng kleng Ännerungen",
+       "rcfilters-filter-pageedits-label": "Säitenännerungen",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "uploadscripted": "An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.",
        "upload-scripted-pi-callback": "Et ass net méiglech XML-Fichieren eropzelueden an deenen XML-Stylesheet Instruktioune fir d'Verschaffen drastinn",
        "uploaded-hostile-svg": "Net sécheren CSS am Stilelement vum eropgeluedene SVG-Fichier fonnt.",
+       "uploaded-image-filter-svg": "Bildfilter mat der URL: <code>&lt;$1 $2=\"$3\"&gt;</code> am eropgeluedenen SVG-Fichier fonnt.",
        "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"$1\"",
        "uploadinvalidxml": "Den XML am eropgelueden Fichier konnt net verschafft ginn.",
        "uploadvirus": "An dësem Fichier ass ee Virus! Detailer: $1",
        "apisandbox": "API-Sandkëscht",
        "apisandbox-jsonly": "Fir d'API-Sandkëscht ze benotze braucht Dir JavaScript.",
        "apisandbox-api-disabled": "API ass op dësem Site ausgeschalt.",
+       "apisandbox-fullscreen": "Panel expandéieren",
        "apisandbox-unfullscreen": "Säit weisen",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
        "emailccsubject": "Kopie vun denger Noriicht un $1: $2",
        "emailsent": "E-Mail geschéckt",
        "emailsenttext": "Är E-Mail gouf fortgeschéckt.",
-       "emailuserfooter": "Dës E-Mail gouf  {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.",
+       "emailuserfooter": "Dës E-Mail gouf {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt. {{GENDER:$2|Är}} E-Mail gëtt direkt un den {{GENDER:$1|originalen Absender}} geschéckt do bäi gesäit  {{GENDER:$1|deen}} {{GENDER:$2|Är}} E-Mail-Adress.",
        "usermessage-summary": "Benoriichtegung hannerloossen.",
        "usermessage-editor": "Benoriichtegungs-System",
        "watchlist": "Iwwerwaachungslëscht",
        "changecontentmodel-nodirectediting": "Den Inhaltsmodell $1 ënnerstëtzt keng direkt Ännerungen",
        "changecontentmodel-emptymodels-title": "Keng Modeller fir Inhalter disponibel",
        "changecontentmodel-emptymodels-text": "Den Inhalt vu(n) [[:$1]] kann net op een aneren Typ ëmgewandelt ginn.",
-       "log-description-contentmodel": "Evenementer a Relatioun mat den Inhaltsmodeller vun enger Säit",
+       "log-description-contentmodel": "OP dëser Säit stinn Ännerunge vum Inhaltsmodell vu Säiten a Säiten déi mat engem anere Säitmodell wéi dem Standard ugeluecht goufen.",
        "logentry-contentmodel-change-revertlink": "zrécksetzen",
        "logentry-contentmodel-change-revert": "zrécksetzen",
        "protectlogpage": "Protektiounslogbuch",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
        "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
        "cant-move-to-category-page": "Dir hutt net déi néideg Rechter fir eng Säit op eng Kategoriesäit ze réckelen.",
+       "cant-move-subpages": "Dir hutt net d'Recht fir Ënnersäiten ze réckelen.",
        "newtitle": "Neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "pageinfo-length": "Gréisst vun der Säit (a Bytes)",
        "pageinfo-article-id": "ID (Nummer) vun der Säit",
        "pageinfo-language": "Sprooch vum Inhalt vun der Säit",
+       "pageinfo-language-change": "änneren",
        "pageinfo-content-model": "Modell vun enger Säit mat Inhalt",
        "pageinfo-content-model-change": "änneren",
        "pageinfo-robot-policy": "Indexéierung duerch Botten",
        "svg-long-error": "Ongëltegen SVG-Fichier: $1",
        "show-big-image": "Original Fichier",
        "show-big-image-preview": "Gréisst vun dësem Preview: $1.",
+       "show-big-image-preview-differ": "Gréisst vun dësem $3-Preview vun dësem $2-Fichier: $1.",
        "show-big-image-other": "Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "endlos Schleef",
        "bad_image_list": "Format:\n\nNëmmen Zeilen, déi mat engem * ufänken, ginn ausgewäert. Als éischt no dem * muss ee Link op een net gewënscht Bild stoen.\nDuerno sti Linken déi Ausnamen definéieren, an deenen hirem Kontext dat Bild awer opdauchen däerf.",
        "metadata": "Metadaten",
        "metadata-help": "An dësem Fichier si weider Informatiounen, déi normalerweis vun der Digitalkamera oder dem benotzte Scanner kommen. Wann de Fichier nodréiglech geännert gouf, kann et sinn datt eenzel Detailer net mat dem aktuelle Fichier iwwereneestëmmen.",
-       "metadata-expand": "Weis detailléiert Informatiounen",
-       "metadata-collapse": "Verstopp detailléiert Informatiounen",
+       "metadata-expand": "Detailléiert Informatioune weisen",
+       "metadata-collapse": "Detailléiert Informatioune verstoppen",
        "metadata-fields": "D'Bild-Meta-Felder aus dëser Lëscht ginn op Bildbeschreiwungssäite gewise wann d'Metadatentafel zesummegeklappt ass.\nDéi aner sinn am Standard verstoppt.\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": "Breet",
        "exif-imagelength": "Längt",
        "htmlform-user-not-exists": "<strong>$1</strong> gëtt et net.",
        "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+       "logentry-delete-delete_redir": "$1 huet d'Viruleedung $3 duerch Iwwerschreiwe {{GENDER:$2|geläscht}}.",
        "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
        "logentry-delete-event": "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-revision": "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Op {{SITENAME}} sichen",
        "searchsuggest-containing": "mat ...",
-       "api-error-autoblocked": "Är IP-Adress gouf automatesch gespaart wëll se vun engem gespaarte Benotzer  benotzt gouf",
-       "api-error-badaccess-groups": "Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.",
        "api-error-badtoken": "Interne Feeler: falschen Token.",
-       "api-error-blocked": "Dir gouft gespaart a  kënnt dofir keng Ännerunge maachen.",
-       "api-error-copyuploaddisabled": "D'Eroplueden iwwer eng URL ass op dësem Server desaktivéiert.",
-       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|en anere Fichier|e puer aner Fichiere}} mat dem selwechten Inhalt op dem Site",
-       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| een anere Fichier|e puer aner Fichieren}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf|se goufen}} awer geläscht.",
-       "api-error-empty-file": "De Fichier deen Dir geschéckt hutt war eidel.",
        "api-error-emptypage": "Et ass net erlaabt nei, eidel Säiten unzeleeën.",
-       "api-error-fetchfileerror": "Interne Feeler: beim Opruffe vum Fichier huet eppes net funktionéiert.",
-       "api-error-fileexists-forbidden": "E Fichier mam Numm \"$1\" gëtt et schonn an e kann net iwwerschriwwe ginn.",
-       "api-error-fileexists-shared-forbidden": "E Fichier mam Numm \"$1\" gëtt et schonn am gedeelte Repertoire an e kann net iwwerschriwwe ginn.",
-       "api-error-file-too-large": "De Fichier deen Dir geschéckt hutt war ze grouss.",
-       "api-error-filename-tooshort": "Den Numm vum Fichier ass ze kuerz.",
-       "api-error-filetype-banned": "Dësen Typ vu Fichier ass net zougelooss.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ass e Fichiersformat deen net erlaabt ass|si Fichiersformater déi net erlaabt sinn}}. Erlaabt {{PLURAL:$3|ass de Fichiersformat|sinn d'Fichiersformater}}: $2.",
-       "api-error-filetype-missing": "D'Erweiderung vum Fichier feelt.",
-       "api-error-hookaborted": "D'Ännerung déi Dir versicht hutt ze maachen ass duerch en 'extension-hook' ofgebrach ginn.",
-       "api-error-http": "Interne Feeler: net méiglech sech op de Server ze connectéieren.",
-       "api-error-illegal-filename": "Den Numm vum Fichier ass net erlaabt.",
-       "api-error-internal-error": "Interne Feeler: Et ass eppes schif gaang beim Verschaffe vum eropgeluedene Fichier op der Wiki.",
-       "api-error-invalid-file-key": "Interne Feeler: de Fichier gouf op der temporärer Späicherplaz net fonnt.",
-       "api-error-missingparam": "Interne Feeler: E vun de Parameter feelt an der Ufro.",
-       "api-error-missingresult": "Interne Feeler: et konnt net festgestallt ginn ob d'Kopie eppes ginn ass.",
-       "api-error-mustbeloggedin": "Dir musst ageloggt si fir Fichieren eropzelueden.",
-       "api-error-mustbeposted": "An dëser Software ass e Feeler; se benotzt net déi richteg HTTP-Method.",
-       "api-error-noimageinfo": "D'Eroplueden huet funktionéiert, awer de Server huet eis keng Informatiounen iwwer de Fichier ginn.",
-       "api-error-nomodule": "Interne Feeler: de Modul fir d'Eroplueden ass net agestallt.",
-       "api-error-ok-but-empty": "Interne Feeler: keng Äntwert vum Server.",
-       "api-error-overwrite": "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
-       "api-error-ratelimited": "Dir probéiert fir méi ££Fichieren a kuerzer Zäit eropzeluede wéi der op dëser Wiki erlaabt sinn. Probéiert w.e.g. an e puer Minutten nach eng Kéier.",
-       "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
        "api-error-publishfailed": "Interne Feeler: de Server konnt den temporäre Fichier net publizéieren.",
-       "api-error-stasherror": "Beim Eropluede vum Fichier ass e Feeler geschitt.",
-       "api-error-stashfilestorage": "Beim Späichere vum Fichier ass ee Feeler geschitt.",
-       "api-error-stashzerolength": "De Server konnt de Fichier net späicheren, well en eng Längt vun Null hat.",
-       "api-error-stashnotloggedin": "Dir musst ageloggt si fir Fichiere späicheren ze kënnen.",
-       "api-error-timeout": "De Server huet net bannen där Zäit geäntwert déi virgesinn ass.",
-       "api-error-unclassified": "En onbekannte Feeler ass geschitt",
-       "api-error-unknown-code": "Onbekannte Feeler: \"$1\"",
-       "api-error-unknown-error": "Interne Feeler: beim Versuch fir Äre Fichier eropzelueden ass eppes schif gaang",
-       "api-error-unknown-warning": "Onbekannte Warnung: $1",
+       "api-error-stashfailed": "Interne Feeler: de Server konnt den temporäre Fichier net späicheren.",
+       "api-error-unknown-warning": "Onbekannte Warnung: \"$1\".",
        "api-error-unknownerror": "Onbekannte Feeler: \"$1\".",
-       "api-error-uploaddisabled": "D'Eroplueden ass op dëser Wiki ausgeschalt.",
-       "api-error-verification-error": "Dëse Fichier kéint korrupt sinn, oder en huet eng falsch Erweiderung.",
-       "api-error-was-deleted": "E Fichier mat dësem Numm gouf virdrun eropgelueden an duerno geläscht.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekonn|Sekonnen}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minutt|Minutten}}",
        "duration-hours": "$1 {{PLURAL:$1|Stonn|Stonnen}}",
        "pagelang-language": "Sprooch",
        "pagelang-use-default": "Standard-Sprooch benotzen",
        "pagelang-select-lang": "Sprooch eraussichen",
+       "pagelang-reason": "Grond",
        "pagelang-submit": "Späicheren",
+       "pagelang-nonexistent-page": "D'Säit $1 gëtt et net.",
+       "pagelang-unchanged-language": "D'Säit $1 ass schonn op d'Sprooch $2 gesat.",
+       "pagelang-unchanged-language-default": "D'säit $1 ass schonn op d'Standardsprooch vun dëser Wiki agestallt.",
+       "pagelang-db-failed": "D'Datebank konnt d'Sprooch vun der Säit net änneren.",
        "right-pagelang": "Sprooch vun der Säit änneren",
        "action-pagelang": "d'Sprooch vun der Säit änneren",
        "log-name-pagelang": "Log vum Ännere vun der Sprooch",
        "sessionprovider-nocookies": "Cookië sinn eventuell desaktivéiert. Vergewëssert Iech datt Dir d'Cookien aktivéiert hutt a probéiert nach eng Kéier.",
        "randomrootpage": "Zoufalls-Stammsäit",
        "log-action-filter-block": "Typ vun der Spär:",
+       "log-action-filter-contentmodel": "Ännerung vum Typ vum Modell vum Inhalt:",
        "log-action-filter-delete": "Läschtyp:",
        "log-action-filter-import": "Importtyp:",
        "log-action-filter-move": "Réckeltyp:",
        "log-action-filter-block-block": "Spären",
        "log-action-filter-block-reblock": "Ännere vun enger Spär",
        "log-action-filter-block-unblock": "Spär ophiewen",
+       "log-action-filter-contentmodel-change": "Ännerung vum Modell vum Inhalt",
        "log-action-filter-delete-delete": "Säite läschen",
        "log-action-filter-delete-delete_redir": "Viruleedung iwwerschreiwen",
        "log-action-filter-delete-restore": "Säiterestauratioun",
        "authform-wrongtoken": "Falschen Token",
        "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
        "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
+       "authpage-cannot-create-continue": "Onméiglech fir mam Uleeë vum Benotzerkont virunzefueren. Är Sessioun hat wahrscheinlech en Timeout.",
+       "authpage-cannot-link": "D'Linke mam Benotzerkont konnt net ugefaange ginn.",
        "cannotauth-not-allowed-title": "Autorisatioun refuséiert",
        "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
        "changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
        "unlinkaccounts-success": "De Benotzerkont gouf getrennt.",
        "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:"
+       "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
+       "revid": "Versioun $1"
 }
index a497488..3bf5384 100644 (file)
        "actions": "Крар",
        "namespaces": "ТӀварарин генгвилер",
        "variants": "Жуьреяр",
+       "navigation-heading": "Навигация",
        "errorpagetitle": "ГъалатӀ",
        "returnto": "$1 ччиниз элкъвена хтун",
        "tagline": "{{SITENAME}} Cайтдихъай",
        "nstab-template": "Чешне",
        "nstab-help": "Куьмекдин ччин",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Кьилин чин",
        "nosuchaction": "Ихьтин кар авайд ттуш",
        "nosuchspecialpage": "Ихьтин куьмекчи ччин авайд ттуш",
        "error": "ГъалатӀ",
        "emailconfirmlink": "Куь электрон почтунин адрес тестикьун.",
        "accountcreated": "Аккаунт туькӀуьрнава",
        "loginlanguagelabel": "ЧӀал: $1",
+       "pt-login": "Гьахьун",
+       "pt-createaccount": "Аккаунт туькӀуьрун",
+       "pt-userlogout": "ЭкъечӀун",
        "changepassword": "Парол дегишарун",
        "resetpass_header": "Аккаунтдин парол дегишун",
        "oldpassword": "ЦӀуру парол:",
        "prevn": "Вилик фейи  {{PLURAL:$1|$1}}",
        "nextn": "Гуьгъуьнин {{PLURAL:$1|$1}}",
        "prevn-title": "Вилик фейи  $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
-       "nextn-title": "КЪведай $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
+       "nextn-title": "Къведай $1 {{PLURAL:$1|1=нетижа|нетижаяр}}",
        "shown-title": "Къалурин $1 {{PLURAL:$1|1=нетижа|нетижаяр}} чъина",
        "viewprevnext": "Килигун ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''И вики-проектда \"[[:$1]]\" тlвар алай ччин ава.'''",
        "saveprefs": "Хуьн",
        "restoreprefs": "Авайл хьиз кьунвай низамарунар туькIуьр хъувун",
        "prefs-editing": "Дуьзар хъувун",
-       "rows": "ЦIарар",
-       "columns": "Гулар:",
        "searchresultshead": "Ахтармишун",
        "stub-threshold-disabled": "Галуднава",
        "timezonelegend": "Вахтунин минзил",
        "newpageletter": "Цl",
        "boteditletter": "б",
        "rc_categories_any": "ГЬар са",
+       "rc-change-size-new": "Масакlа авунилай ахпа кьадар: $1 байт",
        "rc-enhanced-expand": "Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)",
        "rc-enhanced-hide": "Куьлуь-шуьлуьяр чуьнуьха",
        "recentchangeslinked": "Галкlанвай дуьзар хъувунар",
        "brokenredirects-edit": "дуьзар хъувун",
        "brokenredirects-delete": "алудун",
        "withoutinterwiki-submit": "Къалурун",
-       "nbytes": "$1 {{PLURAL:$1|1=байт|байтар}}",
+       "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
        "nmembers": "$1 {{PLURAL:$1|1=уьзви|уьзвияр}}",
        "lonelypages": "Eтим xъувун",
        "prefixindex": "Префикс галай вири ччинар",
        "suppress": "Чуьнуьхун",
        "booksources": "Ктабрин чешмеяр",
        "booksources-search-legend": "Ктабдикай малумат жугъурун",
+       "magiclink-tracking-isbn": "ISBN элячӀуникай менфят къачузвай чинар",
        "log": "Журналар",
        "allpages": "Вири ччинар",
        "prevpage": "Алатай чар ($1)",
        "namespace": "Тlварарин генгвал:",
        "invert": "Хкягънавайди элкъуьрун",
        "blanknamespace": "(Асул)",
-       "contributions": "Уртахди кутур крар",
+       "contributions": "{{GENDER:$1|Уртахдин}} кутур крар",
        "contributions-title": "$1 уртахди кутур крар",
        "mycontris": "Кутур кар",
+       "anoncontribs": "Кутур кар",
        "contribsub2": "($1)-ин кутур пай  ($2)",
        "uctop": "алай",
        "month": " Вацралай (ва адалай вилик)",
        "tooltip-pt-mycontris": "Куьне авунвай дуьзар хъувунрин сиягь",
        "tooltip-pt-login": "Квез гьахьиз теклифзава, анжах им мажбури туш",
        "tooltip-pt-logout": "ЭкъечIун",
+       "tooltip-pt-createaccount": "Им мажбури туштlани, чна квез учетдин кхьей затlар туькlуьриз ва системадиз гьахьиз теклифзава.",
        "tooltip-ca-talk": "Къене авайбурун ччин веревирд авун",
-       "tooltip-ca-edit": "Ð\9aвевай Ð¸ Ñ\87Ñ\87ин Ð¼Ð°Ñ\81акIа Ð¸Ð¹Ð¸Ð· Ð¶ÐµÐ´Ð°. Ð§Ñ\87ин Ñ\85Ñ\83Ñ\8cдалди Ð²Ð¸Ð»Ð¸Ðº, Ñ\81иÑ\84Ñ\82е ÐºÐ¸Ð»Ð¸Ð³Ñ\83ндиз Ð¸Ð»Ð¸Ñ\81.",
+       "tooltip-ca-edit": "Ð\98 Ñ\87Ñ\87ин Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83н",
        "tooltip-ca-addsection": "Гатlунив цlийи кьил",
        "tooltip-ca-viewsource": "И ччин хвенвайд я, амма квевай адан къене авайбуруз килигиз жеда.",
        "tooltip-ca-history": "И ччинин алатай масакIавилерин журнал",
        "tooltip-rollback": "«Кьулухъди чӀугун» и ччиндиз эхиримжи кар кутазвайди патай авунвай дуьзар хъувунар са тӀампуналди paxкурзава",
        "tooltip-undo": "«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва",
        "tooltip-summary": "Куьруь нетижа гьадрун",
+       "simpleantispam-label": "Анти-спам юхламишун.\nИнал ацlур <strong>мийир</strong>!",
        "pageinfo-header-edits": "Дуьзар хъувун",
        "pageinfo-edits": "Дьузар хъувунрин кьадар",
+       "pageinfo-toolboxlink": "Чиникай малумат",
        "previousdiff": "Вилик алатай дуьзар хъувун",
        "nextdiff": "ЦIийи масакIаяр",
        "file-info-size": "$1 × $2 пикселар, файлдин кьадар: $3, MIME жуьре: $4",
        "file-nohires": "Идалайни хъсан ери авайд туш",
        "svg-long-desc": "SVG файл, номилдаказ $1 $2 × пикселяр, файлдин кьадар: $3",
        "show-big-image": "ЦӀарафа хвена тунвай жергедай",
+       "show-big-image-size": "$1 × $2 пиксел",
        "bad_image_list": "Формат гьихьтинди хьана кlанда:\n\nCиягьда авай анжах (* лишандихъ галаз эгечIзавай цIарарин) элементар гьисабдиз къачуда.\nЦlарцIе авай сад лагьай элячIун ттун патал къадагъа алай шикилдиз элячIун хьана кlанзава.\nГьар са цlарцIе авай гьар са ахпагьан элячIунар кьетIендинбур хьиз кьабулда, мисал яз, суьрет тваз мумкинвал авай ччинар.",
        "metadata": "Метамалуматар",
        "metadata-help": "И файлдин къене гилигнавай адет яз камера ва я сканер куьмекдалди алава авунвай  малумат ава. Файл ахпа дуьзур хъувуначтlа, бязи параметрар алай суьретдив кьун тахьун мумкин я.",
        "logentry-move-move-noredirect": "$1 $3 макъаладин тӀвар, ракъурунин винелай $4 -диз масакӀа хъувуна",
        "logentry-move-move_redir": "$1 $3 макъаладин тӀвар, ракъурун тун тавуна $4 -диз масакӀа хъувуна",
        "logentry-move-move_redir-noredirect": "$1 $3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз масакӀа хъувуна",
+       "logentry-newusers-create": "$1 уртахди гьисаб туькlуьрнава.",
        "logentry-newusers-autocreate": "Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва",
        "rightsnone": "(садни)",
        "feedback-cancel": "Гьич авун",
        "feedback-close": "Авунва",
        "feedback-message": "Чар:",
        "feedback-subject": "Тема:",
+       "searchsuggest-search": "{{SITENAME}} къекъуьн",
        "expand_templates_xml_output": "XML акъудун",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Баянар алудун"
index 3a8e61b..1d786c2 100644 (file)
@@ -6,38 +6,62 @@
                        "Malafaya",
                        "Reedy",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Katxis",
+                       "Chabi"
                ]
        },
        "tog-underline": "Sulinia lias:",
        "tog-hideminor": "Asconda editas minor en cambias resente",
+       "tog-hidepatrolled": "Asconde editas patruliada de cambias resente",
+       "tog-newpageshidepatrolled": "Asconde pajes patruliada de lista de pajes nova",
+       "tog-hidecategorization": "Asconde categori de pajes",
        "tog-extendwatchlist": "Grandi la lista oservada per mostra tota cambias aplicable",
        "tog-usenewrc": "Aumenta cambias resente (JavaScript)",
        "tog-numberheadings": "Dona automatica numeros a titula",
        "tog-showtoolbar": "Mostra la bara de utiles per edita (JavaScript)",
        "tog-editondblclick": "Edita pajes a du clicas (JavaScript)",
        "tog-editsectiononrightclick": "Engrana la edita de sesion par clica a la destra a titulos de sesion (JavaScript)",
-       "tog-watchcreations": "Junta la pajes ce me ia creada a me lista de pajes oservada",
-       "tog-watchdefault": "Junta pajes ce me ia edita a me lista de pajes oservada",
-       "tog-watchmoves": "Junta pajes ce me ia moveda a me lista de pajes oservada",
-       "tog-watchdeletion": "Junta pajes ce me ia sutrae a me lista de pajes oservada",
+       "tog-watchcreations": "Junta la pajes cual me ia crea e fixes cual me ia carga  a mea lista de pajes oservada",
+       "tog-watchdefault": "Junta pajes e imajes cual me ia edita a mea lista de pajes oservada",
+       "tog-watchmoves": "Junta pajes e fixes cual me ia moveda a mea lista de pajes oservada",
+       "tog-watchdeletion": "Junta pajes cual me ia sutrae a mea lista de pajes oservada",
+       "tog-watchuploads": "Ajunta fixes nova cual me ia carga a mea lista de pajes oservada",
+       "tog-watchrollback": "Ajunta pajes a cual me ia reversa a mea lista de pajes oservada",
        "tog-minordefault": "Marca costumal tota editas como minor",
        "tog-previewontop": "Mostra la previde ante la caxa de editas",
        "tog-previewonfirst": "Mostra la previde a la edita prima",
-       "tog-enotifwatchlistpages": "Envia un eposta a me cuando un paje ce me oserva es cambiada",
+       "tog-enotifwatchlistpages": "Envia un eposta a me cuando un paje o fix cual me oserva es cambiada",
        "tog-enotifusertalkpages": "Envia me un eposta cuando me paje de discutes es cambiada",
-       "tog-enotifminoredits": "Ance envia un eposta a me con edita minor de pajes",
+       "tog-enotifminoredits": "Ance envia un eposta a me con editas minor de pajes e fixes",
        "tog-enotifrevealaddr": "Descovre la me adirije de eposta en postas de nota",
        "tog-shownumberswatching": "Mostra la numero de usores oservante",
-       "tog-fancysig": "Sinias simple (sin lia automatica)",
+       "tog-oldsig": "Tua suscrive presente",
+       "tog-fancysig": "Trata la suscrive como vicitesto (sin lia automatica)",
+       "tog-uselivepreview": "Usa un previde direta",
+       "tog-forceeditsummary": "Recorda me cuando entera un resoma vacua de edita",
        "tog-watchlisthideown": "Asconde me editas de la lista de pajes oservada",
        "tog-watchlisthidebots": "Asconde editas par bot de la lista de pajes oservada",
        "tog-watchlisthideminor": "Asconde editas minor de la lista de pajes oservada",
+       "tog-watchlisthideliu": "Asconde editas par usores identifiada de la lista de pajes oservada",
+       "tog-watchlistreloadautomatically": "Recarga automata la lista de pajes oservada cuando un filtre es cambiada (JavaScript nesesada)",
+       "tog-watchlisthideanons": "Asconde editas par usores anonim de la lista de pajes oservada",
+       "tog-watchlisthidepatrolled": "Asconde editas patruliada de la lista de pajes oservada",
+       "tog-watchlisthidecategorization": "Asconde la categori de pajes",
        "tog-ccmeonemails": "Envia copias de la epostas ce me envia a otras a me ance",
+       "tog-diffonly": "No mostra la conteni de paje su diffes",
        "tog-showhiddencats": "Mostra categorias ascondeda",
+       "tog-norollbackdiff": "No mostra diff pos un reversa",
+       "tog-useeditwarning": "Avisa me cuando me sorti un paje de edita con cambias nonsalvada",
+       "tog-prefershttps": "Sempre usa un lia secur cuando identifiada",
        "underline-always": "A tota tempo",
        "underline-never": "A no tempo",
-       "underline-default": "Surfador costumal",
+       "underline-default": "Inisial de pel o surfador",
+       "editfont-style": "Edita area de stilo de leteras",
+       "editfont-default": "Inisial de surfador",
+       "editfont-monospace": "Leteras monospasida",
+       "editfont-sansserif": "Leteras sin serifes",
+       "editfont-serif": "Leteras con serifes",
        "sunday": "soldi",
        "monday": "lundi",
        "tuesday": "martedi",
        "oct": "oto",
        "nov": "nov",
        "dec": "des",
+       "january-date": "$1 janero",
+       "february-date": "$1 febrero",
+       "march-date": "$1 marto",
+       "april-date": "$1 april",
+       "may-date": "$1 maio",
+       "june-date": "$1 junio",
+       "july-date": "$1 julio",
+       "august-date": "$1 agosto",
+       "september-date": "$1 setembre",
+       "october-date": "$1 otobre",
+       "november-date": "$1 novembre",
+       "december-date": "$1 desembre",
+       "period-am": "am",
+       "period-pm": "pm",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "category_header": "Articles en categoria \"$1\"",
        "subcategories": "Sucategorias",
        "category-empty": "''Aora, esta categoria no conteni pajes o medio.''",
        "hidden-categories": "{{PLURAL:$1|Categoria|Categorias}} ascondeda",
        "hidden-category-category": "Categorias ascondeda",
+       "category-subcat-count": "{{PLURAL:$2|Esta categoria ave sola la sucategoria seguente.|Esta categoria ave la {{PLURAL:$1|sucategoria|$1 sucategorias}} seguente, entre $2 tota.}}",
+       "category-subcat-count-limited": "Esta categoria ave la {{PLURAL:$1|sucategoria|$1sucategorias}} seguente.",
+       "category-article-count": "{{PLURAL:$2|Esta categoria conteni sola la paje seguente.|La {{PLURAL:$1|paje es|$1 pajes es}} seguente en esta categoria, estra $2 tota.}}",
+       "category-article-count-limited": "La {{PLURAL:$1|paje|$1pajes}} seguente es en la categoria presente.",
+       "category-file-count": "{{PLURAL:$2|Esta categoria conteni sola la fix seguente.|La {{PLURAL:$1|fix|$1 fixes}} seguente es en esta categoria, estra $2 tota.}}",
+       "category-file-count-limited": "The {{PLURAL:$1|fix|$1 fixes}} seguente es en la categoria presente.",
        "listingcontinuesabbrev": "cont.",
+       "index-category": "Pajes indiseda",
+       "noindex-category": "Pajes nonindiseda",
+       "broken-file-category": "Pajes con lias rompeda de fixes",
        "about": "Supra",
        "article": "Paje de contenis",
        "newwindow": "(va abri en fenetra nova)",
        "cancel": "Cansela",
        "moredotdotdot": "Plu...",
-       "mypage": "Me paje",
+       "morenotlisted": "Esta lista es posible noncompleta.",
+       "mypage": "Paje",
        "mytalk": "Discutes",
-       "anontalk": "Discutes per esta IP",
+       "anontalk": "Discute",
        "navigation": "Naviga",
        "and": "&#32;e",
        "qbfind": "Trova",
        "qbedit": "Edita",
        "qbpageoptions": "Esta paje",
        "qbmyoptions": "Me pajes",
+       "faq": "Demandas comun",
+       "faqpage": "Project: Demandas comun",
+       "actions": "Atas",
+       "namespaces": "Locas de nom",
+       "variants": "Varias",
+       "navigation-heading": "Menu per naviga",
        "errorpagetitle": "Era",
        "returnto": "Restora a $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Disionario",
        "search": "Xerca",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Titulos cual va es iniorada par xerca.\n# Cambias a esta va aveni pronto cuando la paje con la titulo es indiseda.\n# Tu pote forsa la reindise de un paje par fa un edita vacua.\n# La sintax es como la seguente:\n#   * Tota de la sinia \"#\" a la fini de la linia es un comenta.\n#   * Tota linia nonvacua es la titulo esata per iniora, incluinte caso etc.\nReferes\nLias esterna\nVide ance\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Xerca",
        "go": "Vade",
        "searcharticle": "Vade",
        "history": "Istoria de paje",
        "history_short": "Istoria",
+       "history_small": "istoria",
        "updatedmarker": "renovida de me visita presedente",
        "printableversion": "Varia primable",
        "permalink": "Lia permanente",
        "print": "Primi",
+       "view": "Vide",
+       "view-foreign": "Vide a $1",
        "edit": "Cambia",
+       "edit-local": "Edita descrive local",
        "create": "Crea",
+       "create-local": "Ajunta descrive local",
        "editthispage": "Cambia esta paje",
        "create-this-page": "Crea esta paje",
        "delete": "Sutrae",
        "deletethispage": "Sutrae esta paje",
+       "undeletethispage": "Desutrae esta paje",
        "undelete_short": "Desutrae {{PLURAL:$1|edita|editas}}",
+       "viewdeleted_short": "Vide {{PLURAL:$1|un edit desutraeda|$1 editas desutraeda}}",
        "protect": "Proteje",
        "protect_change": "cambia",
        "protectthispage": "Proteje esta paje",
-       "unprotect": "desproteje",
-       "unprotectthispage": "Desproteje esta paje",
+       "unprotect": "Cambia la proteje",
+       "unprotectthispage": "Cambia la proteje de esta paje",
        "newpage": "Paje nova",
        "talkpage": "Discute esta paje",
        "talkpagelinktext": "Parla",
        "talk": "Discutes",
        "views": "Vides",
        "toolbox": "Utiles",
+       "tool-link-userrights": "Cambia grupos de {{GENDER:$1|usor}}",
+       "tool-link-userrights-readonly": "Vide grupos de {{GENDER:$1|usor}}",
+       "tool-link-emailuser": "E-posta esta {{GENDER:$1|usor}}",
        "userpage": "Vide paje de usor",
        "projectpage": "Vide la paje de projeta",
        "imagepage": "Vide paje de fix",
        "otherlanguages": "En otra linguas",
        "redirectedfrom": "(Redirijeda de $1)",
        "redirectpagesub": "Redireta la paje",
+       "redirectto": "Redirije a:",
+       "lastmodifiedat": "Esta paje ia es cambiada a $1, a $2",
        "viewcount": "Esta paje es asesada a $1 {{PLURAL:$1|ves|veses}}.",
        "protectedpage": "Paje protejeda",
        "jumpto": "Salta a:",
        "jumptonavigation": "naviga",
        "jumptosearch": "xerca",
+       "view-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atenta vide esta paje.\nPer favore espeta ante cuanto tu atenta vide esta paje denova.\n\n$1",
+       "generic-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atentante vide esta recurso.\nPer favore espeta ante cuando tu atenta vide esta recurso denova.",
        "aboutsite": "Supra {{SITENAME}}",
        "aboutpage": "Project:Supra",
        "copyrightpage": "{{ns:project}}:Diretos de autor",
        "disclaimers": "Negas de respondablia",
        "disclaimerpage": "Project:Nega jeneral de respondablia",
        "edithelp": "Aida con edita",
+       "helppage-top-gethelp": "Aida",
        "mainpage": "Paje Prima",
        "mainpage-description": "Paje Prima",
        "policy-url": "Project:Politica",
        "toc": "Contenida",
        "showtoc": "mostra",
        "hidetoc": "asconde",
+       "collapsible-collapse": "Colasa",
+       "collapsible-expand": "Estende",
+       "confirmable-confirm": "Esce {{GENDER:$1|tu}} es serta?",
+       "confirmable-yes": "Si",
+       "confirmable-no": "No",
        "viewdeleted": "Vide $1?",
        "feedlinks": "Flue:",
        "site-rss-feed": "$1 RSS Flue",
        "site-atom-feed": "$1 Atom Flue",
        "page-rss-feed": "\"$1\" RSS Flue",
+       "page-atom-feed": "\"$1\" Enflue de atom",
        "red-link-title": "$1 (paje no esiste)",
        "nstab-main": "Paje",
        "nstab-user": "Paje de usor",
        "nstab-template": "Model",
        "nstab-help": "Paje de aida",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Paje Prima",
        "error": "Era",
        "databaseerror": "Era de base de datos",
        "missingarticle-diff": "(Difere: $1, $2)",
        "badtitletext": "La titulo de la paje tu ia desira ia es nonlegal, es vacua, o es un titulo intervici o interlingual no liada coreta. Es posable ce es un o plu simboles ce no pote es usada en titulos.",
        "viewsource": "Vide la orijin",
        "viewsourcetext": "Tu pote vide e copia la orijin de esta paje:",
+       "mycustomcssprotected": "Tu no ave permete per edita esta paje CSS.",
+       "mycustomjsprotected": "Tu no ave permete per edita esta paje JavaScript.",
+       "myprivateinfoprotected": "Tu no ave permete per edita tua informa privata.",
+       "mypreferencesprotected": "Tu no ave permete per edita tua preferes.",
+       "ns-specialprotected": "La pajes spesial no pote es editada.",
+       "welcomeuser": "Bonveni, $1!",
        "yourname": "Nom de usor:",
+       "userlogin-yourname": "Nom de usor",
+       "userlogin-yourname-ph": "Entra tua nom de usor",
        "yourpassword": "Sinia de entra:",
+       "userlogin-yourpassword": "Clave",
+       "userlogin-yourpassword-ph": "Entra tua sinia secreta",
+       "createacct-yourpassword-ph": "Entra un sinia secreta",
        "yourpasswordagain": "Retape la sinia:",
+       "createacct-yourpasswordagain": "Confirma la sinia secreta",
+       "createacct-yourpasswordagain-ph": "Entra un sinia secreta denova",
+       "userlogin-remembermypassword": "Reteni me como identifiada",
        "yourdomainname": "Tu domina:",
        "login": "Identifia",
        "nav-login-createaccount": "Sinia per entra",
        "userlogin": "Sinia per entra",
        "logout": "Retira",
        "userlogout": "Sinia per retira",
+       "userlogin-noaccount": "Tu no ave un conta?",
+       "userlogin-joinproject": "Crea un conta con {{SITENAME}}",
        "nologin": "Tu no ave un conta? '''$1'''.",
        "nologinlink": "Crea  un conta",
        "createaccount": "Crea un conta",
        "gotaccount": "Tu ave ja un conta? '''$1'''.",
        "gotaccountlink": "Sinia per entra",
+       "userlogin-resetpassword-link": "Tu ia oblida tua sinia secreta?",
+       "userlogin-helplink2": "Aida me per identifia me",
+       "createacct-emailrequired": "Adirije de e-posta",
+       "createacct-emailoptional": "Adirije de e-posta (elejable)",
+       "createacct-email-ph": "Entra tua adirije de e-posta",
+       "createacct-another-email-ph": "Entra tua adirije de e-posta",
+       "createaccountreason": "Razona:",
+       "createacct-reason": "Razona:",
+       "createacct-submit": "Crea tua conta",
+       "createacct-another-submit": "Crea un conta",
+       "createacct-benefit-heading": "{{SITENAME}} es fabricada par persones como tu.",
+       "createacct-benefit-body1": "{{PLURAL:$1|edita|editas}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|paje|pajes}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribuor|contribuores}}",
        "loginerror": "Era de entra",
-       "loginsuccesstitle": "Entra susedente",
+       "loginsuccesstitle": "Tu ia entra",
        "loginsuccess": "'''Tu ia entrada aora a {{SITENAME}} como \"$1\".'''",
-       "nosuchuser": "Es no usor con la nom \"$1\".\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
+       "nosuchuser": "On no ave un usor con la nom \"$1\".\nOn distingui entre leteras major e minor per nomes de usores.\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
        "nosuchusershort": "Es no usor con esta nom \"$1\". Esamina la spele.",
        "nouserspecified": "Tu debe indica un nom de usor.",
        "wrongpassword": "La sinia de entra no es coreta. Per favore, atenta ancora.",
        "wrongpasswordempty": "La sinia de entra es vacua. Per favore, atenta ancora.",
-       "passwordtooshort": "Tu sinia secreta no es legal o es tro corta.\nEl debe ave a min {{PLURAL:$1|1 simbol|$1 simboles}} e debe difere de tu nom de usor.",
-       "mailmypassword": "Envia la sinia secreta nova par eposta",
+       "passwordtooshort": "Sinias secreta debe ave minima {{PLURAL:$1|1 simbol|$1 simboles}}.",
+       "passwordtoolong": "Sinias secreta no pote ave plu ca {{PLURAL:$1|1 simbol|$1 simboles}}.",
+       "passwordtoopopular": "Sinias secreta comun debe no es usada. Per favore, eleje un sinia plu unica.",
+       "mailmypassword": "Cambia tua sinia secreta",
        "passwordremindertitle": "Sinia secreta temporer nova per {{SITENAME}}",
-       "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda ce nos envia a tu un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta per usor \"$2\" es aora \"$3\".\nTu debe sinia per entra e cambia tu sinia secreta aora.\n\nSi algun otra ce tu ia envia esta demanda a nos, o si tu ia recorda tu sinia secreta e no vole cambia el aora, tu pote iniora esta mesaje e continua usa tu sinia secreta vea.",
+       "passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta tempora per usor \"$2\" es aora \"$3\". Si esta ia es tua intende, tu debe identifia tu denova per entra e eleje tua sinia nova aora.\nTua sinia tempora va desvalidi en {{PLURAL:$5|un dia|$5 dias}}.\n\nSi algun otra ca tu ia envia esta demanda a nos, o si tu ia recorda tua sinia secreta e no vole cambia lo aora, tu pote iniora esta mesaje e continua usa tua sinia secreta vea.",
        "noemail": "No es un adirije de eposta per usor \"$1\".",
        "passwordsent": "Un sinia secreta ia es enviada a la adirije de eposta per \"$1\".\nPer favore, sinia per entra ancora pos tu ia reseta el.",
-       "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta proposada.\nAnte alga otra eposta es enviada a la conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera de tu.",
+       "eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta spesifada.\nAnte cualce otra epostas es enviada a tua conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera la tua.",
        "emailconfirmlink": "Aproba tu adirije de eposta",
+       "accountcreated": "Conta es creada",
        "loginlanguagelabel": "Lingua: $1",
+       "pt-login": "Identifia se",
+       "pt-login-button": "Identifia tua",
+       "pt-createaccount": "Crea un conta",
+       "pt-userlogout": "Desidentifia",
        "oldpassword": "Sinia secreta vea:",
        "newpassword": "Sinia secreta nova:",
        "retypenew": "Re-entra tu sinia secreta nova:",
        "resetpass-submit-loggedin": "Cambia la sinia secreta",
        "resetpass-temp-password": "Sinia secreta tempora:",
+       "passwordreset": "Reinisia sinia secreta",
+       "passwordreset-username": "Nom de usor:",
+       "passwordreset-domain": "Domina:",
+       "passwordreset-email": "Adirije de e-posta",
+       "passwordreset-invalidemail": "Adirije de e-posta no es valida",
+       "changeemail-submit": "Cambia e-posta",
        "bold_sample": "Testo en leteras forte",
        "bold_tip": "Testo en leteras forte",
        "italic_sample": "Testo en leteras italica",
        "sig_tip": "Tu sinia con la primi de la ora",
        "hr_tip": "Linia orizonal (usa nonfrecuente)",
        "summary": "Soma:",
-       "subject": "Sujeto/titulo:",
+       "subject": "Sujeto:",
        "minoredit": "Esta es un cambia minor",
        "watchthis": "Oserva esta paje",
        "savearticle": "Fisa paje",
+       "publishpage": "Publici paje",
+       "publishchanges": "Publica la cambias",
        "preview": "Previde",
        "showpreview": "Mostra previde",
        "showdiff": "Mostra diferes",
-       "anoneditwarning": "'''Avisa:''' Tu no ia sinia per entra.\nTu adirije de IP va es memorada en la istoria de revisas de esta paje.",
+       "anoneditwarning": "'''Avisa:''' Tu no ia identifia se.\nTu adirije de IP va es memorada en la istoria de revisas de esta paje. Si tu <strong>[$1 identifia se]</strong> o <strong>[$2 crea un conta]</strong>, tua editas va es atribuida a tua nom de usor, con otra benefias.",
        "summary-preview": "Previde soma:",
        "blockedtitle": "Usor es impedida",
        "blockedtext": "'''Tu nom de usor o adirije de IP ia es impedida.'''\n\nLa impedi ia es fada par $1.\nLa razon donada es ''$2''.\n\n* Comensa de impedi: $8\n* Fini de impedi: $6\n* Ci algun intende impedi: $7\n\nTu pote contata $1 o un otra [[{{MediaWiki:Grouppage-sysop}}|dirijor]] per discute esta impedi.\nTu no pote usa la 'envia un eposta a esta usor' sin un adirije de eposta legal es indicada en tu\n[[Special:Preferences|preferis de conta]] e tu no es impedida de usa el.\nTu adirije de IP es aora $3, e la identia de la impedi es #$5.\nPer favore inclui tota esta detales en tu demandas.",
+       "loginreqtitle": "Entra de identia nesesada",
+       "loginreqlink": "Identifia se",
        "newarticle": "(Nova)",
        "newarticletext": "Tu ia segue un lia a un paje ce no esista ja.\nPer crea la paje, comensa scrive en la caxa a su\n(vide la [$1 paje de aida] per plu).\nSi tu es asi par era, clica a la boton '''retro''' de tu surfador.",
-       "noarticletext": "Es aora no testo a esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per la titulo de esta paje]] en otra pajes,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca la arcivos relatada],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita esta paje]</span>.",
+       "noarticletext": "On ave aora no testo a esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per la titulo de esta paje]] en otra pajes,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca la arcivos relatada],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita esta paje]</span>.",
+       "noarticletext-nopermission": "On ave presente no testo en esta paje.\nTu pote [[Special:Search/{{PAGENAME}}|xerca per esta titulo de paje]] en otra pajes, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xerca arcivos relatada]</span>, ma tu no es permeteda per crea esta paje.",
        "previewnote": "'''Esta sola un previde; cambias no es fisada ja'''",
        "editing": "En la prosede de edita $1",
+       "creating": "Creante $1",
        "editingsection": "Edita $1 (sesion)",
        "editingcomment": "Edita $1 (sesion nova)",
        "yourdiff": "Diferes",
        "templatesusedpreview": "{{PLURAL:$1|Modele|Modeles}} usada en esta previde:",
        "template-protected": "(protejeda)",
        "template-semiprotected": "(proteje en parte)",
+       "hiddencategories": "Esta paje es un membro de {{PLURAL:$1|1 categoria ascondeda|$1 categorias ascondeda}}:",
        "nocreatetext": "{{SITENAME}} ave un restringe a la capas per crea pajes nova.\nTu pote vade a retro e edita un paje esistente, o  [[Special:UserLogin|sinia per entra o crea un conta]].",
-       "recreate-moveddeleted-warn": "'''Avisa: Tu es recrea un paje ce ia es sutraed en la pasada.'''\nTu debe pensa ce es bon continua edita esta paje.\nLa arcivo de sutraes per esta paje es asi per conveni:",
+       "permissionserrorstext-withaction": "Tua no es permeteda per $2, per la {{PLURAL:$1|razona|razonas}} seguente:",
+       "recreate-moveddeleted-warn": "<strong>Avisa: Tu es recreante un paje cual ia es sutraeda a ante.</strong>\nTu debe pensa si la continua de edita de esta paje conveni.\nLa arcivo de sutraes e moves per esta paje es asi per tua conveni:",
+       "moveddeleted-notice": "Esta paje ia es sutraeda.\nLa arcivo de sutraes e moves per la paje es furnida a su per refere.",
        "viewpagelogs": "Vide la arcivo de esta paje",
        "currentrev": "Cambia presente",
        "currentrev-asof": "Cambia presente a departi di $1",
        "page_last": "final",
        "histlegend": "Diferente eleje: Marca la caxas de radio de esta varias per compare e clica entra o la boton a la funda.<br />\n(presente) = difere de la varia presente,\n(presedente) = difere con varia presedente, M = edita minor.",
        "history-fieldset-title": "Surfa istoria",
-       "histfirst": "Prima",
-       "histlast": "Ultima",
+       "histfirst": "La plu vea",
+       "histlast": "La plu nova",
        "historysize": "({{PLURAL:$1|1 otuple|$1 otuples}})",
        "historyempty": "(vacua)",
        "history-feed-title": "Istoria de revises",
        "history-feed-item-nocomment": "$1 a $2",
        "rev-delundel": "mostra/asconde",
+       "rev-showdeleted": "mostra",
+       "revdelete-show-file-submit": "Si",
+       "revdelete-radio-set": "Ascondeda",
+       "revdelete-radio-unset": "Vidable",
+       "pagehist": "Istoria de paje",
+       "deletedhist": "Istoria sutraeda",
        "history-title": "Istoria de cambias de \"$1\"",
+       "difference-title": "Difere entre revisas de \"$1\"",
        "lineno": "Linia $1:",
        "compareselectedversions": "Compare varias elejeda",
        "editundo": "desfa",
+       "diff-multi-sameuser": "({{PLURAL:$1|Un revisa media|$1 revisas media}} par la mesma usor no mostrada)",
        "searchresults": "Resultas de xerca",
+       "searchresults-title": "Xerca la resultas per \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} presedente",
        "nextn": "{{PLURAL:$1|$1}} seguente",
+       "nextn-title": "Seguente $1 {{PLURAL:$1|resulta|resultas}}",
+       "shown-title": "Mostra $1 {{PLURAL:$1|resulta|resultas}} per paje",
        "viewprevnext": "Vide ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Crea la paje \"[[:$1]]\" a esta wiki!</strong> {{PLURAL:$2|0=|Vide ance la paje trovada con tua xerca.|Vide ance la resultas trovada par la xerca.}}",
+       "searchprofile-articles": "Pajes de contenis",
+       "searchprofile-images": "Multimedios",
+       "searchprofile-everything": "Tota",
+       "searchprofile-advanced": "Avansada",
+       "searchprofile-articles-tooltip": "Xerca en $1",
+       "searchprofile-images-tooltip": "Xerca per fixes",
+       "searchprofile-everything-tooltip": "Xerca tota contenidas (incluinte pajes de conversa)",
+       "searchprofile-advanced-tooltip": "Xerca en nomspasios unica",
        "search-result-size": "$1 ({{PLURAL:$2|1 parola|$2 parolas}})",
+       "search-redirect": "(redirije de $1)",
        "search-section": "(sesion $1)",
+       "search-suggest": "Tu ia intende: $1",
        "search-interwiki-default": "Resultas de $1:",
        "search-interwiki-more": "(plu)",
        "searchall": "tota",
+       "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> de <strong>$3</strong>|Resultas <strong>$1 - $2</strong> de <strong>$3</strong>}}",
+       "search-nonefound": "On ave no resultas cual conforma con la demanda.",
+       "powersearch-toggleall": "Tota",
+       "powersearch-togglenone": "Zero",
        "preferences": "Preferis",
        "mypreferences": "Preferis",
        "skin-preview": "Previde",
        "saveprefs": "Fisa",
-       "rows": "Linias:",
-       "columns": "Colonas:",
        "searchresultshead": "Xerca",
        "savedprefs": "Tu preferis es fisada",
        "timezoneregion-africa": "Africa",
        "timezoneregion-pacific": "Mar Pasifica",
        "prefs-files": "Fixes",
        "youremail": "Eposta:",
-       "username": "Nom de usor:",
-       "prefs-memberingroups": "Membro de la {{PLURAL:$1|grupo|grupos}}:",
+       "username": "{{GENDER:$1|Nom de usor}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} de {{PLURAL:$1|grupo|grupos}}:",
        "yourrealname": "Nom vera:",
        "yourlanguage": "Lingua:",
        "yournick": "Suscrive:",
-       "yourgender": "Seso:",
-       "gender-male": "Mas",
-       "gender-female": "Fema",
+       "yourgender": "Como tu prefere ce tu es descriveda?",
+       "gender-male": "El edita pajes de wiki",
+       "gender-female": "El edita pajes de wiki",
        "email": "Eposta",
-       "prefs-help-realname": "Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.",
+       "prefs-help-realname": "Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.\n\nTu no debe entra tua nom vera. Ma si tu entra tua noma vera, lo pote es usada per atribui tua laboras a tu.",
        "prefs-signature": "Suscrive",
        "userrights": "Dirije de la diretos de usores",
        "saveusergroups": "Fisa la grupo de usores",
        "group-user": "Usores",
        "group-sysop": "Dirijores",
        "group-all": "(tota)",
-       "group-user-member": "Usor",
+       "group-user-member": "{{GENDER:$1|usor}}",
        "grouppage-user": "{{ns:project}}:Usores",
        "grouppage-sysop": "{{ns:project}}:Dirijores",
+       "right-writeapi": "Usa de la API de scrive",
+       "newuserlogpage": "Arcivo de creas de usor",
        "rightslog": "Catalogo de diretos de usor",
        "action-edit": "edita esta paje",
        "nchanges": "$1 {{PLURAL:$1|cambia|cambias}}",
+       "enhancedrc-history": "istoria",
        "recentchanges": "Cambias resente",
+       "recentchanges-legend": "Elejes  per cambias resente",
        "recentchanges-summary": "Asi la lista de cambias resente en la vici.",
        "recentchanges-feed-description": "Seque la cambias plu resente a la vici en esta flue.",
+       "recentchanges-label-newpage": "Esta edita ia crea un paje nova",
+       "recentchanges-label-minor": "Esta es un edita minor",
+       "recentchanges-label-bot": "Esta edita ia es fada par un bot",
+       "recentchanges-label-unpatrolled": "Esta edita no ia es ja patruliada",
+       "recentchanges-label-plusminus": "La grandia de esta paje es cambiada par esta cuantia de baites",
+       "recentchanges-legend-heading": "<strong>Titulo:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide ance [[Special:NewPages|la lista de pajes nova]])",
        "rcnotefrom": "A su es la cambias de '''$2''' (asta '''$1''' es mostrada).",
        "rclistfrom": "Mostra cambias nova, comensante de $3 $2",
        "rcshowhideminor": "$1 editas minor",
+       "rcshowhideminor-show": "Mostra",
+       "rcshowhideminor-hide": "Asconde",
        "rcshowhidebots": "$1 botes",
-       "rcshowhideliu": "$1 usores ativa aora",
+       "rcshowhidebots-show": "Mostra",
+       "rcshowhidebots-hide": "Asconde",
+       "rcshowhideliu": "$1 usores identifiada aora",
+       "rcshowhideliu-hide": "Asconde",
        "rcshowhideanons": "$1 usores sin nom",
+       "rcshowhideanons-show": "Mostra",
+       "rcshowhideanons-hide": "Asconde",
        "rcshowhidepatr": "$1 editas patroliada",
        "rcshowhidemine": "$1 me editas",
+       "rcshowhidemine-show": "Mostra",
+       "rcshowhidemine-hide": "Asconde",
        "rclinks": "Mostra la $1 cambias presedente en la $2 dias presedente<br />$3",
        "diff": "dife",
        "hist": "isto",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc_categories_any": "Cualce",
+       "rc_categories_any": "Cualce de la elejeda",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bait|baites}}  pos cambia",
        "rc-enhanced-expand": "Mostra detalias",
        "rc-enhanced-hide": "Asconde detalias",
        "recentchangeslinked": "Cambias relateda",
        "recentchangeslinked-title": "Cambias relatada a \"$1\"",
        "recentchangeslinked-summary": "Esta lista conteni la cambias plu resente de la pajes liada a otra (o de la membros de un categoria).\nPajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'''.",
        "recentchangeslinked-page": "Nom de la paje:",
+       "recentchangeslinked-to": "En loca, mostra cambia a pajes liada a la paje presentada",
        "upload": "Envia fixes",
        "uploadbtn": "Envia la fix",
        "uploadlogpage": "Envia arcivo",
+       "filedesc": "Resoma",
        "savefile": "Fisa fix",
        "upload-file-error": "Era interna",
+       "license-header": "Lisensa",
        "imgfile": "fix",
        "listfiles": "Lista de imajes",
        "listfiles_name": "Nom",
        "filehist-help": "Clica a un data/tempo per vide la fix como el ia aperi alora.",
        "filehist-current": "aora",
        "filehist-datetime": "Date/Tempo",
+       "filehist-thumb": "Imajeta",
+       "filehist-thumbtext": "Imajeta per varia pos $1",
        "filehist-user": "Usor",
        "filehist-dimensions": "Mesuras",
        "filehist-filesize": "Grandia de fix",
        "linkstoimage": "Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:",
        "nolinkstoimage": "Es no pajes ce lia a esta fix.",
        "sharedupload": "Esta fix es parte de $1 e pote es usada par otra projetas.",
+       "sharedupload-desc-here": "Esta fix es de $1 e pote es usada par otra projetas.\nLa descrive su sua [$2 paje de descrive de fix] ala es mostra a su.",
        "uploadnewversion-linktext": "Envia un varia nova de esta fix",
+       "upload-disallowed-here": "Tu no pote suprascrive esta arcivo.",
        "mimesearch": "Xerca de MIME",
        "listredirects": "Lista redirijes",
        "unusedtemplates": "modeles no usada",
        "wantedpages": "Pajes desirada",
        "mostlinked": "Pajes la plu liada",
        "mostlinkedcategories": "Categorias a ce es la plu lias",
-       "mostlinkedtemplates": "Modeles a ce es la plu lias",
+       "mostlinkedtemplates": "Pajes la plu liada",
        "mostcategories": "Pajes con la plu categorias",
        "mostimages": "Fixes a ce es la plu lias",
        "mostrevisions": "Pajes con la plu revisas",
        "longpages": "Pajes longa",
        "deadendpages": "Pajes sin sorti",
        "protectedpages": "Pajes protejeda",
+       "protectedpages-page": "Paje",
+       "protectedpages-expiry": "Desvalidi",
        "listusers": "Lista de usores",
        "newpages": "Pajes nova",
        "ancientpages": "Pajes la plu vea",
        "pager-newer-n": "{{PLURAL:$1|1 plu resente|$1 plu resentes}}",
        "pager-older-n": "{{PLURAL:$1|1 plu vea|$1 plu veas}}",
        "booksources": "Orijines de libros",
+       "booksources-search-legend": "Xerca per fontes de libros",
+       "booksources-search": "Xerca",
        "specialloguserlabel": "Usor:",
        "speciallogtitlelabel": "Titulo:",
        "log": "Lista de atas",
        "listgrouprights-group": "Grupo",
        "listgrouprights-members": "(lista de membros)",
        "emailuser": "Envia un eposta a esta usor",
-       "emailfrom": "De",
-       "emailto": "Per",
-       "watchlist": "Pajes oservada",
+       "emailfrom": "De:",
+       "emailto": "A:",
+       "emailsubject": "Sujeto:",
+       "emailmessage": "Mesaje:",
+       "emailsend": "Envia",
+       "emailsent": "E-posta ia es enviada",
+       "watchlist": "Lista de pajes oservada",
        "mywatchlist": "Lista de pajes oservada",
+       "watchlistfor2": "Per $1 $2",
        "nowatchlist": "Tu ave no cosas en tu lista oservada",
        "addedwatchtext": "La paje \"[[:$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].\nCambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada.\n\nSi tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"no oserva\" en la bara a la lado.",
        "removedwatchtext": "La paje \"[[:$1]]\" ia es sutraeda de [[Special:Watchlist|tu lista de pajes oservada]].",
        "deleteotherreason": "Otra/plu razona:",
        "deletereasonotherlist": "Otra razona",
        "rollbacklink": "retro",
+       "rollbacklinkcount": "reversa $1 {{PLURAL:$1|edita|editas}}",
        "protectlogpage": "Catalogo de protejes",
        "protectedarticle": "\"[[$1]]\" protejeda",
        "unprotectedarticle": "''[[$1]]'' desprotejeda",
        "undelete-search-submit": "Xerca",
        "namespace": "Loca de nom:",
        "invert": "Reversa la eleje",
+       "tooltip-invert": "Marca esta caxa per asconde cambias a pajes en la nomspasio elejeda (e la nomspasio asosiada si marcada)",
+       "namespace_association": "Nomspasio asosiada",
+       "tooltip-namespace_association": "Marca esta caxa per inclui ance la nomspasio de discute o sujeto asosiada con la nomspasio elejeda",
        "blanknamespace": "(Prima)",
-       "contributions": "Contribuis de usor",
-       "mycontris": "Me contribuis",
+       "contributions": "Contribuis de {{GENDER:$1|usor}}",
+       "mycontris": "Mea contribuis",
+       "anoncontribs": "Contribuis",
        "contribsub2": "Per $1 ($2)",
        "uctop": "(culmine)",
        "month": "De mensa (e plu vea):",
        "nolinkshere": "No pajes lia a '''[[:$1]]'''.",
        "isredirect": "redirije paje",
        "istemplate": "inclui",
-       "isimage": "lia de imaje",
+       "isimage": "lia de fix",
        "whatlinkshere-prev": "{{PLURAL:$1|presesdente|$1 presedente}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguente|$1 seguente}}",
        "whatlinkshere-links": "← lias",
        "whatlinkshere-hideredirs": "$1 redirijes",
+       "whatlinkshere-hidetrans": "$1 transcluis",
        "whatlinkshere-hidelinks": "$1 lias",
        "whatlinkshere-filters": "Filtros",
        "blockip": "Impedi usor",
        "move-page-legend": "Move paje",
        "movepagetext": "Usa la forma a su va cambia la nom de un paje, e va move tota se istoria a la nom nova.\nLa titulo vea va deveni un paje de redirije a la titulo nova.\nLias a la titulo de la paje vea no va es cambiada;\nTu debe vide serta ce es redirijes duple o rompeda.\nTu es respondable per es serta ce la lias va continua vade a la locas intendeda.\n\nNota ce la paje '''no''' va es moveda si es ja un paje a la titulo nova, sin el es vacua o un redirije e no ave un istoria de editas presedente.\nEsta sinifia ce tu pote cambia la nom de un paje a la loca presedente si tu era, e tu no pote scrive supra un paje ce esiste ja.\n\n'''AVISA!'''\nEsta pote es un cambia dramos e nonespetada per un paje poplal;\nper favore, es serta ce tu comprende la resulta de esta ata ante tu continua.",
        "movepagetalktext": "La paje de discuta de esta paje va es moveda automatica con el '''eseta si:'''\n*Un paje de discuta ce no es vacua esiste ja su la nom nova, o\n*Tu cambia la indica en la caxa su.\n\nEn esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
-       "newtitle": "A titulo nova:",
+       "newtitle": "Titulo nova:",
        "move-watch": "Oserva esta paje",
        "movepagebtn": "Move paje",
        "pagemovedsub": "La move ia susede",
        "thumbnail_error": "Era en crea la imajeta: $1",
        "import": "Emporta pajes",
        "importlogpage": "Importa arcivo",
-       "tooltip-pt-userpage": "Tu paje de usor",
-       "tooltip-pt-mytalk": "Tu paje de discutes",
-       "tooltip-pt-preferences": "Me preferis",
+       "tooltip-pt-userpage": "{{GENDER:|Tua}} page de usor",
+       "tooltip-pt-mytalk": "{{GENDER:|Tua}} paje de discutes",
+       "tooltip-pt-preferences": "{{GENDER:|Tua}} preferes",
        "tooltip-pt-watchlist": "La lista de pajes ce tu oserva per cambias",
-       "tooltip-pt-mycontris": "Lista de tu contribuis",
+       "tooltip-pt-mycontris": "Lista de tua contribuis",
        "tooltip-pt-login": "Nos preferi si tu sinia per entra, ma tu es no obligada.",
        "tooltip-pt-logout": "Sinia per retira",
+       "tooltip-pt-createaccount": "Tu es corajida per crea un conta e identifia se; an si, esta no es obligante",
        "tooltip-ca-talk": "Discute de la paje de contenis",
-       "tooltip-ca-edit": "Tu pote edita esta paje. Per favore, usa la boton de previde ante fisa.",
+       "tooltip-ca-edit": "Edita esta paje",
        "tooltip-ca-addsection": "Inisia un sesion nova",
        "tooltip-ca-viewsource": "Esta paje es protejeda. Tu pote vide se orijin.",
+       "tooltip-ca-history": "Revisas pasada de esta paje",
        "tooltip-ca-protect": "Proteje esta paje",
        "tooltip-ca-delete": "Sutrae esta paje",
        "tooltip-ca-move": "Move esta paje",
        "tooltip-ca-watch": "Junta esta paje a tu lista de pajes oservada",
        "tooltip-ca-unwatch": "Sutrae esta paje de tu lista de pajes oservada",
        "tooltip-search": "Xerca {{SITENAME}}",
+       "tooltip-search-go": "Vade a un paje con esta nom esata, si lo esiste",
+       "tooltip-search-fulltext": "MediaWiki:Tooltip-xerca-testoplen/lfn",
        "tooltip-p-logo": "Visita la paje prima",
        "tooltip-n-mainpage": "Visita la paje prima",
        "tooltip-n-mainpage-description": "Visita la paje prima",
        "tooltip-n-randompage": "Carga un paje acaso",
        "tooltip-n-help": "La loca per descovre.",
        "tooltip-t-whatlinkshere": "Lista de tota pajes de vici ce lia a asi",
-       "tooltip-t-contributions": "Vide la lista de contribuis de esta usor",
+       "tooltip-t-recentchangeslinked": "Cambia resente en pajes liada de esta paje",
+       "tooltip-feed-atom": "Enflue de atom per esta paje",
+       "tooltip-t-contributions": "Vide la lista de contribuis de {{GENDER:$1|esta usor}}",
        "tooltip-t-emailuser": "Envia un eposta a esta usor",
        "tooltip-t-upload": "Envia fixes",
        "tooltip-t-specialpages": "Lista de tota pajes spesial",
+       "tooltip-t-print": "Varia primable de esta paje",
+       "tooltip-t-permalink": "Lias permanente a esta revisa de la paje",
+       "tooltip-ca-nstab-main": "Vide la paje de contenis",
        "tooltip-ca-nstab-user": "Vide la paje de usor",
+       "tooltip-ca-nstab-special": "Esta es un paje special, e no pote es editada.",
        "tooltip-ca-nstab-project": "Vide la paje de la projeta",
        "tooltip-ca-nstab-image": "Vide la paje de fix",
        "tooltip-ca-nstab-template": "Mostra la model",
        "tooltip-diff": "Mostra tu cambias de la testo.",
        "tooltip-compareselectedversions": "Vide la diferes entre la du varias elejeda de esta paje.",
        "tooltip-watch": "Junta esta paje a tu lista de pajes oservada",
+       "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click\n\n\"Reversa\" reversa la edita o editas a esta paje par la contribuor presedente con un clica",
+       "tooltip-undo": "\"Desfa\" reversa esta edita e abri la forma de edita en la modo de previde. Lo permete la ajunta de un razona en la resoma.",
+       "tooltip-summary": "Entra un resoma corta",
        "others": "otras",
+       "simpleantispam-label": "Proba anti-spam.\n<strong>No</strong> completa esta!",
+       "pageinfo-toolboxlink": "Informa de paje",
        "previousdiff": "← Difere plu vea",
        "nextdiff": "Difere plu nova →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|paje|pajes}}",
        "file-info-size": "$1 × $2 pixel, grandia de fix: $3, MIME tipo: $4",
        "file-nohires": "No plu densia posable.",
        "svg-long-desc": "SVG fix, per nom $1 × $2 pixeles, grandia de fix: $3",
-       "show-big-image": "Densia masima",
+       "show-big-image": "Arcivo orijinal",
+       "show-big-image-preview": "Grandia de esta previde: $1",
+       "show-big-image-other": "Otra {{PLURAL:$2|densia|densias}}: $1.",
+       "show-big-image-size": "$1 × $2 pixeles",
        "newimages": "Imajes nova",
        "ilsubmit": "Xerca",
        "bad_image_list": "La forma es la seguente:\n\nSola linias de un lista (ce comensa con *) es considerada.\nLa lia prima a la linia nesesa es un lia a un mal fix.\nCada lias seguente a la mesma linia es considerada es esetas, ce es, la pajes do la fix pote aveni enlinia.",
        "metadata-help": "Esta fix conteni plu informa, posable juntada de un camera dijital o un scanador usada per crea o dijiti el.\nSi la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en la fix cambiada.",
        "metadata-expand": "Mostra detalias estendente",
        "metadata-collapse": "Asconde detalias estendeda",
-       "metadata-fields": "Campos de EXIF metadata listada en esta mesaje va es inclui cuando la table de metadata es minimida.\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": "Campos de EXIF metadata listada en esta mesaje va es incluida cuando la table de metadata es minimida.\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-orientation": "Orienta",
+       "exif-xresolution": "Densia orizonal",
+       "exif-yresolution": "Densia vertical",
+       "exif-datetime": "Data e ora de cambia de fix",
+       "exif-make": "Fabricor de camera",
+       "exif-model": "Model de camera",
+       "exif-software": "Programas usada",
+       "exif-exifversion": "Varia de Exif",
+       "exif-colorspace": "Spasio de color",
+       "exif-datetimeoriginal": "Data e ora de jenera de datos",
+       "exif-datetimedigitized": "Data e ora de dijitali",
        "exif-exposuretime-format": "$1 sec. ($2)",
+       "exif-orientation-1": "Normal",
        "namespacesall": "tota",
        "monthsall": "tota",
        "confirm_purge_button": "Oce",
        "watchlisttools-view": "Vide cambias pertinente",
        "watchlisttools-edit": "Vide e edita la lista de pajes oservada",
        "watchlisttools-raw": "Edita la lista rua de pajes oservada",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discute]])",
        "version": "Varia",
        "version-version": "($1)",
        "fileduplicatesearch-submit": "Xerca",
        "specialpages": "Pajes spesial",
+       "tag-filter": "Filtre de [[Special:Tags|eticeta]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|sutraeda}} paje $3",
+       "logentry-move-move": "$1 {{GENDER:$2|moveda}} paje $3 a $4",
+       "logentry-newusers-create": "Conta de usor $1 ia es {{GENDER:$2|creada}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|cargada}} $3",
+       "searchsuggest-search": "Xerca {{SITENAME}}",
        "expand_templates_ok": "Oce"
 }
index 6c2409b..54bd07e 100644 (file)
        "sort-descending": "Ordine decrescente",
        "sort-ascending": "Ordine crescente",
        "nstab-main": "Pàgina",
-       "nstab-user": "Utente",
+       "nstab-user": "Paggina utente",
        "nstab-media": "File murtimediâ",
        "nstab-special": "Pàgina speçiâ",
        "nstab-project": "Paggina de servissio",
        "newarticle": "(Nêuvo)",
        "newarticletext": "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.\n\nSe se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.\n(amia e [$1 paggine d'agiûtto] pe ciû informaçioìn).\n\nSe t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
        "anontalkpagetext": "----\n<em>Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua.</em> Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonnimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .",
-       "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa pagina]</span>.",
+       "noarticletext": "Po-u momento a paggina çercâ a l'è voeua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa paggina]</span>.",
        "noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
        "missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
        "userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
        "tooltip-t-print": "Verscion stanpabbile de sta paggina",
        "tooltip-t-permalink": "Colegaménto fisso a sta revixión da pàgina",
        "tooltip-ca-nstab-main": "Véddi a vôxe",
-       "tooltip-ca-nstab-user": "Veddi a pàgina d'utente",
+       "tooltip-ca-nstab-user": "Amîa a paggina utente",
        "tooltip-ca-nstab-media": "Veddi a paggina do file murtimediâ",
        "tooltip-ca-nstab-special": "Sta chi l'è 'na pàgina speciâle e a no peu êse cangiâ",
        "tooltip-ca-nstab-project": "Veddi a paggina de servissio",
index c906996..453060c 100644 (file)
@@ -5,7 +5,8 @@
                        "Erdemaslancan",
                        "Ohpuu",
                        "Warbola",
-                       "아라"
+                       "아라",
+                       "Kengšepā"
                ]
        },
        "sunday": "pivāpǟva",
@@ -71,7 +72,7 @@
        "noindex-category": "Lēḑõd bäz indeksõ",
        "about": "Titõl-tīetõkst",
        "newwindow": "(lǟb vāldiž ūdsõ läbūs)",
-       "cancel": " Kitõgid jarā",
+       "cancel": "Tijālizõks",
        "mytalk": "Nõvpidāmi",
        "navigation": "Navigīerimi",
        "qbfind": "Vȯtšõgid",
@@ -90,6 +91,8 @@
        "history_short": "Istōrij",
        "printableversion": "Drukkimiz versij",
        "permalink": "Iggi siḑīm",
+       "view": "Vaņțõl",
+       "view-foreign": "Vaņțõl pāikas $1",
        "edit": "Redigīer",
        "create": "Lūo",
        "editthispage": "Redigīer siedā līedtõ",
        "otherlanguages": "Mūši kīelši",
        "redirectedfrom": "(Jeddõpēḑõn sōtõd līedstõ $1)",
        "redirectpagesub": "Jeddõpēḑõn sōtimiz lēḑ",
-       "lastmodifiedat": "Perri mõitiņtimi: $2 $1",
+       "lastmodifiedat": "Perri mȭitiztimi: $2 $1",
        "jumpto": "Li:",
        "jumptonavigation": "navigīerimiz kast",
-       "jumptosearch": "Vȯtšõgid",
+       "jumptosearch": "vȯtš",
        "aboutsite": "Iļ {{SITENAME}}",
        "aboutpage": "Project:Tītõl tieutõkst",
        "copyright": "Amā tekstõ um kȭlbatõmist litsents #$1 pierrõ",
        "editold": "redigīerõgid",
        "viewsourceold": "vaņ ovāt-tekstõ",
        "editlink": "redigīerõgid",
-       "viewsourcelink": "vaņ ovāt-tekstõ",
+       "viewsourcelink": "vaņțõl ovāt-tekstõ",
        "editsectionhint": "Redigīer jaggõ $1",
        "toc": "Sižāli",
        "showtoc": "nägţõgid",
-       "hidetoc": "vōrõgid jarā",
+       "hidetoc": "vaŗț",
        "site-rss-feed": "$1 RSS sīeţ",
        "site-atom-feed": "$1 Atom sīeţ",
        "page-rss-feed": "\"$1\" RSS sīeţ",
        "nstab-image": "Bīlda",
        "nstab-template": "Mall",
        "nstab-category": "Kategōrij",
+       "mainpage-nstab": "Eḑḑilēḑ",
        "missing-article": " Datubāz äb lieudõn kizdõd līed ''$1'' $2 tekstõ. Sīkõks võib vȱlda mõitõkst agā istōrij siḑīm jarā kištāntõd lēḑ pǟlõ.  Až ažād äb ūo nei,  võib vȱlda ka vigā sistēms. Siz um kītõmõst ka [[Special:ListUsers/sysop| administrātorõn]] ja tämmõn āndamizt ka sīe līed internet adres",
        "missingarticle-rev": "(redaktsij: $1)",
        "badtitle": "Vigāli pēļikēra",
        "badtitletext": "Tōdõd līed pēļikēra vȯļ vigāli, tijā agā tuoizõst kīel versiōnist agā vikist äbõigistiz sidtõd. Sīe sizzõl võib vȱlda ikš agā jemīņ simbōlõ, midā äb sō pēļikēris kȭlbatõ.",
-       "viewsource": "Vaņ ovāt tekstõ",
+       "viewsource": "Vaņțõl ovāt tekstõ",
        "yourname": "Kȭlbatijiznim:",
        "yourpassword": "Sallisõnä:",
+       "userlogin-yourpassword": "Sallisõnā",
+       "userlogin-yourpassword-ph": "Kērat sallisõnā",
        "yourpasswordagain": "Kēratigid sallisõnā ūtstõ:",
        "login": "Log sīezõ",
        "nav-login-createaccount": "Log sīezõ agā registrīer kȭlbatijizõks",
        "userlogout": "Log ulzõ",
        "nologin": "Až täddõn äb ūo eņtš konto, '''$1'''.",
        "nologinlink": "Registrīerõgid täs",
-       "createaccount": "Lūogid ūž konto",
+       "createaccount": "Lūo kont",
        "gotaccount": "Až täddõn jubā um eņtš konto, '''$1'''.",
        "gotaccountlink": "Log sīezõ",
        "userlogin-resetlink": "Kas tēg unīztõ jarā eņtš sizzõlkēratimiz tīetõkst?",
+       "createacct-submit": "Lūo kont",
        "mailmypassword": "Sōtõgid e-kēras ūž sallisõnā",
        "loginlanguagelabel": "Kēļ: $1",
+       "pt-login": "Log sizzõl",
+       "pt-createaccount": "Lūo kont",
+       "pt-userlogout": "Log ulzõ",
        "bold_sample": "Razzi kēra",
        "bold_tip": "Razzi kēra",
        "italic_sample": "Slīp kēra",
        "hr_tip": "Horizontāli krīpš (kȭlbatõgid bäz tērõmizt)",
        "summary": "Kubbõ võtāmi:",
        "subject": "Pēļikēra:",
-       "minoredit": "Se um ikš piški parāmtimi",
+       "minoredit": "Se um ikš piški parāntimi",
        "watchthis": "Vaņ iļ siedā līedpūoltõ",
-       "savearticle": "Sa-gläbbõmi",
+       "savearticle": "Sa-glōibimi",
        "preview": "Jedmõl-vaņtlimi",
        "showpreview": "Nägţ jeddõl vaņtlimizt",
        "showdiff": "Nägţ mõitõkši",
        "histfirst": "Ežmizt",
        "histlast": "Perrizt",
        "history-feed-item-nocomment": "$1 - $2",
-       "rev-delundel": "nägţ/vaŗ jarā",
+       "rev-delundel": "nägț/vaŗț",
        "revdel-restore": "Mõitiņt nǟdõbõzt",
        "revertmerge": "Kīeld jarā kubbõ vieddimi",
-       "history-title": "Līed mõitõkst istōrij \"$1\"",
+       "history-title": "Līed mȭitõkst istōrij \"$1\"",
        "lineno": "Rīnda $1:",
        "compareselectedversions": "Līdzinţ vēļdõt redaktsijḑi",
        "editundo": "kištānt jarā",
        "search-interwiki-more": " (vel)",
        "searchrelated": "sidtõd",
        "searchall": "tikkiž",
-       "search-nonefound": "Vȯtšimizõn vȯtšimi äb lieudtõd vastūkst.",
+       "search-nonefound": "Vȯtšimizõn äb ūo lieudtõd vastūkst.",
        "powersearch-legend": " Juo akurāt vȯtšimi",
        "powersearch-ns": "Vȯtšimi nim-rūimšti:",
        "preferences": "Mīeldõbõd ulzõ-vēļimizt",
        "rightslog": "Kȭlbatijiz õigõmt log",
        "action-edit": "siedā līedtõ mõitiņtõ",
        "nchanges": "$1 {{PLURAL:$1|mõitõks|mõitõkst}}",
-       "recentchanges": "Perrizt mõitõkst",
+       "enhancedrc-history": "Istōrij",
+       "recentchanges": "Perrizt mȭitõkst",
        "recentchanges-legend": "Perrizt mõitõkst",
-       "recentchanges-summary": "Vaņ sīe līed pǟl tīedõd perīži mõitõkši.",
+       "recentchanges-summary": "Vaņțõl sīe līed pǟl tīedõd perīži mȭitõkši.",
        "recentchanges-feed-description": "Vaņ iļ vikipēdijõz tīedõd perīži mõitõkši.",
        "recentchanges-label-newpage": "Se mõitõks luoi ūd līed",
        "recentchanges-label-minor": "Se um ikš piški parāmtimi",
        "recentchanges-label-bot": "Sīe mõitõks tei ikš robot",
-       "recentchanges-label-unpatrolled": "Se mõitõks tēji vȯļ ikš robot",
+       "recentchanges-label-unpatrolled": "Se mȭitõks tēji vȯļ ikš robot",
        "rcnotefrom": "Allõ-pūol um tūodõd mõitõkst  '''$2''' sōņõst: (nägţõbõd amā jemīņ '''$1''' mõitõkst)",
        "rclistfrom": "Nägţ mõitõkši sōņõst: $3 $2",
        "rcshowhideminor": "$1 piškizt parāmtimizt",
+       "rcshowhideminor-show": "Nägț",
+       "rcshowhideminor-hide": "vaŗț",
        "rcshowhidebots": "$1 robōtõd",
+       "rcshowhidebots-show": "Nägț",
+       "rcshowhidebots-hide": "Vaŗț",
        "rcshowhideliu": "$1 sīezõ loggõnd kȭlbatijizt",
+       "rcshowhideliu-hide": "vaŗț",
        "rcshowhideanons": "$1 bäz nimmõ kȭlbatijizt",
+       "rcshowhideanons-show": "Nägț",
+       "rcshowhideanons-hide": "vaŗț",
        "rcshowhidepatr": "$1 vaņtlõd mõitõkst",
        "rcshowhidemine": "$1 min parāmtimizt",
+       "rcshowhidemine-show": "Nägț",
+       "rcshowhidemine-hide": "vaŗț",
        "rclinks": "Nägţ perīži $1 mõitõkši lǟndz $2 pǟva āigal <br />$3",
        "diff": "vaiţ",
        "hist": "istōrij",
-       "hide": "Vaŗ jarā",
+       "hide": "vaŗț",
        "show": "Nägţ",
        "minoreditletter": "p",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-enhanced-expand": "Nägţ jo akurātidi ažḑi (Javascriptõ um vajāg)",
        "rc-enhanced-hide": "Vaŗ jarā",
-       "recentchangeslinked": "Sidtõd mõitõkst",
+       "recentchangeslinked": "Sidtõd mȭitõkst",
        "recentchangeslinked-toolbox": "Sidtõd mõitõkst",
-       "recentchangeslinked-title": "\"$1\" sidtõd mõitõkst",
+       "recentchangeslinked-title": "\"$1\" sidtõd mȭitõkst",
        "recentchangeslinked-summary": "Täs um lugdõd andtõd līedstõ sidtõd (agā andtõd kategōrij) lēḑis tīedõd perrizt mõitõkst. Sin [[Special:Watchlist|iļ-vaņtlimiz.nimkēra]] lēḑõd ātõ  ' ' ' razzistiz ' ' ' jeddõ tūodõd.",
        "recentchangeslinked-page": "Līed nim:",
-       "recentchangeslinked-to": "Nägţ sīe azmõl mõitõkši lēḑis, mis sīen līed pǟlõ sidābõd",
+       "recentchangeslinked-to": "Nägţ sīe azmõl mȭitõkši lēḑis, mis sīen līed pǟlõ sidābõd",
        "upload": "Fail ilzõ-lōţimi",
        "uploadlogpage": "Ilzõ-lōţimiz log",
        "filedesc": "Kubbõ võtāmi:",
        "pager-older-n": "{{PLURAL:$1|jo vaņīmi 1|jo vaņīmizt $1}}",
        "booksources": "Rōntõ vȯtšimi",
        "booksources-search-legend": "Rōntõ vȯtšimi",
+       "booksources-search": "Vȯtš",
        "log": "Logūd",
        "allpages": "Amād lēḑõd",
        "prevpage": "Jedmõli lēḑ ($1)",
        "allpagesto": " Nägţ līedidi sīe pēļikēra sōņõ:",
        "allarticles": "Amād lēḑõd",
        "allpagessubmit": "Li",
-       "categories": "Kategōrijõd",
+       "categories": "Kategōrijd",
        "linksearch": "Uļļizt siḑīmõd",
        "linksearch-line": "$1 um sidtõd līedst $2",
        "listgrouprights-members": "(nõtkõmd nimkēra)",
        "watchlistfor2": "Kȭlbatijiz $1 ($2) pierāst",
        "addedwatchtext": "Lēḑ \"[[:$1]]\" um sin [[Special:Watchlist|iļ-vaņtlimiz nimkērrõz]] jūrõ pandõd. Jeddõpēḑõn tulbõd mõitõkst sīe līed pǟl ja sīenkõks sidtõd nõvpidāmiz-līed pǟl sugõbõd iļ-vaņtlimiz nimkērrõz  āt [[Special:RecentChanges|perrizt mõitõkst līed pǟl]]  kēratõd  '''razīz''' kēraks.",
        "removedwatchtext": "Lēḑ \"[[:$1]]\" um [[Special:Watchlist|iļ-vaņtlimiz nimkērast]] jarā viedtõd.",
-       "watch": "Vaņtligid iļ sīe",
+       "watch": "Vaņțõl iļ sīe",
        "watchthispage": "Vaņ iļ siedā līedpūoltõ",
        "unwatch": "Lopta iļ-vaņtlimi",
        "watchlist-details": " {{PLURAL:$1|$1 lēḑ|$1 līedtõ}} ātõ iļ-vaņtlimiz nimkēras,  bäz luggõmõt nõvpidāmiz-līedidi.",
        "wlshowlast": "Nägţ perīzt $1 stuņdõ $2 päuvõ",
+       "watchlist-hide": "↓Vaŗț",
        "watchlist-options": "Iļ-vaņtlimiz nimkēra pie-lēmizt",
        "watching": "Vaņtlimi iļ sīe...",
        "unwatching": "Iļ-vaņtlimiz loptimi...",
        "blanknamespace": "(Kēratõkst)",
        "contributions": "{{GENDER:$1|Kȭlbatijiz}} kubsõtīe",
        "contributions-title": "Kȭlbatijiz $1 kubsõtīe",
-       "mycontris": "Min kubsõtīed",
+       "mycontris": "Īņõtīe",
+       "anoncontribs": "Īņõtīe",
        "contribsub2": "Kȭlbatiji $1 ($2) pierāst",
        "uctop": "(tutkāms)",
        "month": " Kūstõ sōņist (un jo vārald)",
        "blocklink": "blokīer",
        "unblocklink": "lopta blokīerimi",
        "change-blocklink": "mõitiņt blokīerimizt",
-       "contribslink": "kubsõtīe",
+       "contribslink": "īņõtīe",
        "blocklogpage": "Blokīerimiz log",
        "blocklogentry": "Blokīerimiz kȭlbatijiz [[$1]], jarā loppõmiz āiga um $2 $3",
        "unblocklogentry": "võtiz jarā kȭlbatijiz $1 blokīerimiz",
        "tooltip-pt-userpage": "Sin kȭlbatijiz lēḑ",
        "tooltip-pt-mytalk": "Täd nõvpidāmiz lēḑ",
        "tooltip-pt-preferences": "Min mīeldõbõd ulzõ-vēļimizt",
-       "tooltip-pt-watchlist": "Lēḑõd nimkēra, mis iļ vaņtlõd mõitõkši",
-       "tooltip-pt-mycontris": "Sin kubsõtīed nimkēra",
+       "tooltip-pt-watchlist": "Lēḑõd nimkēra, mis iļ vaņtlõd mȭitõkši",
+       "tooltip-pt-mycontris": "Sin īņõtīe nimkēra",
        "tooltip-pt-login": "Mēg panām jeddõl tēḑi sīezõ kēratõm, bet siedā äb ūo vajāg",
        "tooltip-pt-logout": "Log ulzõ",
        "tooltip-ca-talk": "Nõvpidāmi sīe kēratõks iļ",
        "tooltip-n-mainpage-description": "Li eḑīz līed pǟlõ",
        "tooltip-n-portal": "Iļ projekt, midā tīedõ sōd, kui um ažḑi lieudõmist",
        "tooltip-n-currentevents": "Līeda tieutõkst iļ paldīž suggõbõd ažād",
-       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mõitõkst nimkēra",
+       "tooltip-n-recentchanges": "Vikipēdijs tīedõd perrizt mȭitõkst nimkēra",
        "tooltip-n-randompage": "Li bäz tīedõmõt tulbõ līed pǟlõ",
        "tooltip-n-help": "Kūož laz lieudõg ilzõ",
        "tooltip-t-whatlinkshere": "Amād vikipēdij lēḑõd, kust um tǟnõ siḑīmḑi",
        "tooltip-ca-nstab-template": "Nägţ mallõ",
        "tooltip-ca-nstab-category": "Nägţ kategōrij līedtõ",
        "tooltip-minoredit": "Pangid tǟnõ merk ku se um ikš piški parāmtimi",
-       "tooltip-save": "Sa-gläbb mõitõkst",
-       "tooltip-preview": "Nägţ tīedõd mõitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-gläbbõmizt!",
-       "tooltip-diff": "Nägţ tīedõd mõitõkši.",
+       "tooltip-save": "Sa-glōib mȭitõkst",
+       "tooltip-preview": "Nägţ tīedõd mȭitõkši. Pōlaks kȭlbatigid siedā jedmõl sa-glōibimizt!",
+       "tooltip-diff": "Nägţ tīedõd mȭitõkši.",
        "tooltip-compareselectedversions": "Nägţ vaiţidi kōd sīe līed vēļdõt versijõ vail",
        "tooltip-watch": "Pan jūrõ se līedpūol eņtš iļ-vaņtlimiz nimkerrõ",
        "tooltip-rollback": "Kištāntõb jarā īd glõbžõks lǟndz kubsõtīe tējiz tīedõd mõitõkst",
        "tooltip-undo": "\"Viedāgid jarā\" tīeb tijāks/kīeldõbjarā sīe mõitõks ja ovātõb redigīerimiz läb tekstõ jedmõl-vaņtlimizõks. Neiīž tēg võigid sǟl kēratõ, mis vȯļ sīe jarā vīmiz sī.",
        "tooltip-summary": "Kēratigid lītõ kubbõ-võtāmi",
+       "pageinfo-toolboxlink": "Līed dattõd",
        "previousdiff": "← Jedmõli redaktsij",
        "nextdiff": "Jo ūd redigīerimizt",
        "file-info-size": " $1 × $2 piksõlt, bildā sūrit: $3, MIME tīp: $4",
index 369465c..b08935b 100644 (file)
@@ -8,14 +8,15 @@
                        "Macofe",
                        "Huji",
                        "Miladrahimi",
-                       "Ebraminio"
+                       "Ebraminio",
+                       "Process cq"
                ]
        },
-       "tog-underline": "کڕ(خط)کیشائن ژێر پیوندەل:",
+       "tog-underline": "خط کیشائن ژێر پیوندەل:",
        "tog-hideminor": "آشاردن دەسکاریەل گؤجەر  إژ گؤەڕیال(تغییرات) ایسە(اخیر)",
        "tog-hidepatrolled": "دسکاریۀل گه دیار بینۀ ئژ فئرست-رزگ تغییرات اخیر بشارا",
        "tog-newpageshidepatrolled": "وڵگۀل گه دیار بینۀ ئژ فئرست-رزگ ولگۀل تازۀ بشارا",
-       "tog-hidecategorization": "Hide categorization of pages",
+       "tog-hidecategorization": "فهرست بالا سی ئی صفحه",
        "tog-extendwatchlist": " کؤل رزگ-فئرست الؤن(آلشت)کریال-تغیرات نیشان دۀ،نۀ هر تنیا دؤمائنۀل",
        "tog-usenewrc": "تنیا آڵؤن(آلشتی)کریال تازۀ ؤ لیست پئگیریۀل رزگ بنی-گروه بندی کۀ",
        "tog-numberheadings": "شؤمارۀ  نئ خودکار سروڵگۀل-عناوین",
@@ -26,6 +27,7 @@
        "tog-watchdefault": "ولگۀل ؤ پرؤندۀلئ گه دسکاری مۀکم بنه نؤم فئرست سئرکردن",
        "tog-watchmoves": "ولگۀل ؤ پرؤندۀلئ گه هئزۀ مۀم-جابجا مۀکم بنه نؤم فئرست سئرکردن",
        "tog-watchdeletion": "ولگۀل ؤ پرؤندۀلئ گه پاکۀ مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-watchuploads": "بلگه‌های نو اضافه بکه که من به فهرست تماشام بار مه‌کم",
        "tog-watchrollback": "ولگۀل گه ماره ما-بازگردانی مۀکم بنه نؤم فئرست سئرکردن",
        "tog-minordefault": "کؤڵ دسکاری بیۀل به عنؤان پئش فرض عڵامت بۀرن",
        "tog-previewontop": "پیش نمایش وهِ رئ جعبۀ نمایش نیشؤن به",
@@ -35,7 +37,7 @@
        "tog-enotifminoredits": "ئۀر تغییرۀل-آڵؤنۀل(آلشتۀل)گؤجۀریجی ئۀر وڵگۀل ؤ پرؤندۀلم کریا نامه ئۀرا مه کِل کۀ",
        "tog-enotifrevealaddr": "نیشانی ایمیل مه ئۀر ایمیل‌ل حاوواڵ رۀسن نیشؤن دۀ",
        "tog-shownumberswatching": "گلۀ شؤماری-شؤمار کاربۀل پی‌گیر نیشان دۀ",
-       "tog-oldsig": ":امضاێ گإ ایسگە درینێ",
+       "tog-oldsig": ":امضاێ موجود ایوه",
        "tog-fancysig": "(امضا چؤی ویکی‌متن بوو(بدون پئؤن خودکار نیائن",
        "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
        "tog-forceeditsummary": "هۀنئ گه-وختئ که خؤلاصۀ دسکاریم نَنیؤیسائۀ خۀؤۀ رم کۀ",
@@ -50,9 +52,9 @@
        "tog-ccmeonemails": "کپی إژ ایمیلێ گإ أڕا کاربەرەل کِلە مەکەم أڕا ووژم کِل کە",
        "tog-diffonly": "نۆم جِک(محتوا)وەڵگە، أ ژێر تفاوت دیار ناوو(نمایش ندهد)",
        "tog-showhiddencats": "دسۀل-رزگۀل آشاریآ نیشؤن دۀ",
-       "tog-norollbackdiff": "دؤما واگردانی تفاوت نیشؤن نه",
+       "tog-norollbackdiff": "ژ واگردانی پاش فرقه‌ل نشون نده",
        "tog-useeditwarning": "هەنێ(زمانی که)گِستم إژ وەڵگە دەسکاری ذخیره نؤي بِچمإ دەر.دەسگیرم کە",
-       "tog-prefershttps": "همؤیشۀ ئۀرا ئۀ نؤم سیستم هۀتن ئژ اتصالۀل امن بهرۀ بگر-استفادۀ کۀ",
+       "tog-prefershttps": "همیشه اتصاله‌ل امن استفاده بکه سی داخل بوون",
        "underline-always": "همؤیشۀ",
        "underline-never": "هؤیچ وخت",
        "underline-default": "پوسته یا مِنِی کەر پیش‌فرض",
        "newwindow": "(واز کردن ئۀر دۀروۀچۀ جدید)",
        "cancel": "ئآهووسانن/لغو",
        "moredotdotdot": "...ویشتر/فرةتر",
-       "morenotlisted": "لیست کامل نیۀ",
+       "morenotlisted": "بلکه ئی لیست کامل نییه",
        "mypage": "وةڵگە(پەڕە)",
        "mytalk": "گەپ(قسە)",
        "anontalk": "گەپ(قسە)",
        "searcharticle": "بِچۆ",
        "history": "تاریخ وةڵگة",
        "history_short": "تاریخچه",
+       "history_small": "تاریخ",
        "updatedmarker": "به‌روزشده از آخرین باری که سرزده‌ام",
        "printableversion": "نؤسخۀ قاوول چاپ",
        "permalink": "پیوۀند دائمی",
        "talk": "گەپ قسە",
        "views": "دیین/سئرکردن",
        "toolbox": "ابزارەل",
+       "tool-link-userrights": "گروهه‌ل {{GENDER:$1|کاربر}} تغییر بکه",
+       "tool-link-userrights-readonly": "گروه {{GENDER:$1|کاربر}} نشون بده",
+       "tool-link-emailuser": "ای-میل {{GENDER:$1|کاربر}}ئه",
        "userpage": "وةڵگة کاربۀر بؤین",
        "projectpage": "وةڵگة پروژۀ بوین",
        "imagepage": "وةڵگة پرونده بؤین",
        "copyright": " محتوایۀل هانإ ژئرنظر اجازه‌نامهٔ $1 مۀگۀر یۀگإ خلاف یۀ بوشرئ/ذکر بو",
        "copyrightpage": "{{ns:project}}:حق تکثیر",
        "currentevents": "پێش هەتێەل ایسگە",
-       "currentevents-url": "پێش هەتێەل ایسگە(ایسە)",
+       "currentevents-url": "Project:واقعهٔ نهایی",
        "disclaimers": "دروو نامه -تکذیب نامه",
        "disclaimerpage": "Project:تکذیب‌نامهٔ عمومی",
        "edithelp": "راهنمای دۀسکاری کردن",
        "createacct-yourpasswordagain-ph": "گذرواژه را وارد کنید برای بار دوم",
        "userlogin-remembermypassword": "مإ وارد  بی بیل",
        "userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
+       "cannotlogin-title": "نتونه داخل نبئت",
+       "cannotlogin-text": "داخل بوون ممکن نییه",
        "cannotloginnow-title": "ایسه نمه‌تونین باینه نوم",
+       "cannotloginnow-text": "د زمان $1 استفاده مه‌که‌ی، ورود ممکن نبیه",
+       "cannotcreateaccount-title": "حسابان نتونه ایجاد نه‌که",
+       "cannotcreateaccount-text": "د ئی ویکی، بلا واسطه ایجاد حساب فعال نییه",
        "yourdomainname": ":دامنهٔ شما",
        "password-change-forbidden": ".شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید",
        "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
        "userlogin-resetpassword-link": "رۀمزۀتان  ویر/ یاد  چئۀ؟",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
+       "userlogin-reauth": "لازم تو دوباره داخل بئت سی حساب تو تأیید بکه {{GENDER:$1|$1}}",
        "userlogin-createanother": "حساووئ کاربةری تِر بِسازِن",
        "createacct-emailrequired": "نیشانی ایمیل",
        "createacct-emailoptional": ")نشانی ایمیل (اختیاری",
        "createacct-email-ph": "نیشانی ایمیل ووژت بنۆیس",
        "createacct-another-email-ph": "نیشانی ایمیل ووژتان بنؤیسِن",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
+       "createaccountmail-help": "تو مه‌تونی یک حساب ایجاد مه‌که‌ی سی کسی دیگر بدون شیفره نه‌زانی",
        "createacct-realname": "*نام راسکانی/واقعی *دل بخواهی",
        "createaccountreason": ":دةلیل",
        "createacct-reason": "دةلیل",
        "createacct-reason-ph": "ئةرا حساووێ  تر مةسازین؟",
+       "createacct-reason-help": "پیام د سیستم ایجاد خساب نمایش داده مه‌شوه",
        "createacct-submit": "حساووێ أڕا ووژت بِساز",
        "createacct-another-submit": "حساووئ أرا ووژتان بِسازِن",
+       "createacct-continue-submit": "ادامه سی ایحاد حساب",
+       "createacct-another-continue-submit": "ادامه سی ایجاد حساب",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "createacct-benefit-body1": "{{PLURAL:$1|دۀسکاری|دۀسکاریۀل}}",
        "createacct-benefit-body2": "{{PLURAL:$1|وەڵگە|وەڵگەل}}",
        "nocookiesnew": "حساوو کاربةری سازیا، اما هؤمة أ سیستم نهةتینة/نهاتینة.\n{{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید، و سپس با نام کاربری و گذرواژهٔ جدیدتان به سامانه وارد شوید.",
        "nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
        "nocookiesfornew": "حساوو کاربةری نةسازریا، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
+       "createacct-loginerror": "حساب با موفقيت ايجاد بوو، ليکن امکان ورود خودکارتان موجود نییه. لطفاً با [[Special:UserLogin|manual login]] ادامه بده.",
        "noname": ".هؤمة نام کاربةری معتبری دیاری نکردئة",
-       "loginsuccesstitle": "Ø¥Ù\86Û\86Ù\85 Ø³Û\8cستÙ\85 Ù\87Û\95تÙ\86 Ø§Ù\86جÛ\86Ù\85 Ú¯Ø±Øª",
+       "loginsuccesstitle": "بÙ\87 Ø³Û\8cستÙ\85 Ø¯Ø§Ø®Ù\84 Ø¨Ø¦",
        "loginsuccess": "هؤمة ایسة هةتیإ نؤم سیستم {{SITENAME}} وۀ نام\"$1\".'",
-       "nosuchuser": "کاربةرÛ\8c Ù\88Û\80 Ù\86اÙ\85 Â«$1» Ø¦Ø© Ø§Ø¦Ø±Ø© Ù\86Û\8cØ©.\nÙ\86اÙ\85 Ú©Ø§Ø±Ø¨Ø©Ø±Û\8c Ù\88Ø© Ú©Ø©ÚµÙ\86Ú¯Û\8c Ù\88 Ú¯Ø¤Ø¬Ø©Ø±Û\8c Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³Ø© .\nاÙ\85Ù\84اÛ\8c Ù\86اÙ\85 Ø±Ø§ Ø¨Ø±Ø±Ø³Û\8c Ú©Ù\86Û\8cدØ\8c Û\8cا [[Special:CreateAccount|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c ØªØ§Ø²Ù\87 Ø¨Ø³Ø§Ø²Û\8cد]].",
+       "nosuchuser": "کاربرÛ\8c Ø¨Ø§ Ù\86اÙ\88 \"$1\" Ù\86Û\8cÛ\8cÙ\87. \nÙ\86اÙ\88 Ú©Ø§Ø±Ø¨Ø± Ø¨Ù\87 Ø­Ø±Ù\88Ù\81 Ø­Ø³Ø§Ø³Ù\87. \nاÙ\85Ù\84اÛ\8c Ù\86اÙ\88Û\8c Ú©Ù\86ترÙ\84 Ø¨Ú©Ù\87Ø\8c Û\8cا\n[[Special:CreateAccount|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ù\86Ù\88 Ø§Û\8cجاد Ø¨Ú©Ù\87]].",
        "nosuchusershort": "هؤیچ کاربةری وة نام ''$1'' ئة ائرة نیة.\nاملایتان را وارسی کنید.",
        "nouserspecified": ".باید یإ گِلة  نام کاربةری دیاری کئین",
        "login-userblocked": ".ئی کاربرە بەسیائە. إنؤم هەتِن سیستم ڕاووآ(مجاز)نیە",
        "noemail": ".هؤیچ نیشانی ایمیلی ئةرا کاربةر «$1» ثبت نؤیة",
        "noemailcreate": "شما باید یک آدرس ایمیل درست فراهم کنید",
        "passwordsent": "گذرواژه‌ای جدید به آدرس ایمیل ثبت شده برای «$1» ارسال شد.\nلطفاً پس از دریافت آن، دوباره به سیستم وارد شوید.",
-       "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.",
+       "blocked-mailpassword": "نشانی آی‌پی‌تان اژ ویرایش بازداشته شده و اژ ای رو به منظور جلوگیری اژ سوءاستفاده اجازهٔ بهره‌گیری اژ قابلیت وازیابی شیفره را نداره.",
        "eauthentsent": "یک ایمیل تأیید برای آدرس ایمیل به نشانی مورد نظر ارسال شد.\nقبل از اینکه ایمیل دیگری قابل ارسال به این آدرس باشد، باید دستورهایی که در آن ایمیل آمده است را جهت تأیید این مساله که این آدرس متعلق به شماست، اجرا کنید.",
        "throttled-mailpassword": "یإ گِلة رمز عبور  {{PLURAL:$1| وۀ ساعت |$1 وۀساعتةل}}کِل/ارسال بیة/.\nسی نئهاگئری د أذیأت بییئن، فأقأط یئ گئل رازینە گوڤاردئن د أنجومانامە د نۊ زئنە بییە د هأر {{PLURAL:$1|ساعأت|$1 ساعأتیا}} کئل بییە.",
        "mailerror": "خطا در ارسال ایمیل: $1",
-       "acct_creation_throttle_hit": "بازدÛ\8cدکÙ\86Ù\86دگاÙ\86 Ø§Û\8cÙ\86 Ù\88Û\8cÚ©Û\8c Ú©Ù\87 Ø§Ø² Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø´Ù\85ا Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\86د Ø¯Ø± Ø±Ù\88ز Ú¯Ø°Ø´ØªÙ\87 {{PLURAL:$1|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c|$1 Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c}} Ø³Ø§Ø®ØªÙ\87â\80\8cاÙ\86دØ\8c Ú©Ù\87 Ø¨Û\8cشترÛ\8cÙ\86 ØªØ¹Ø¯Ø§Ø¯ Ù\85جاز Ø¯Ø± Ø¢Ù\86 Ø¨Ø§Ø²Ù\87Ù\94 Ø²Ù\85اÙ\86Û\8c Ø§Ø³Øª.\nبÙ\87 Ù\87Ù\85Û\8cÙ\86 Ø®Ø§Ø·Ø±Ø\8c Ø¨Ø§Ø²Ø¯Û\8cدکÙ\86Ù\86دگاÙ\86Û\8c Ú©Ù\87 Ø§Ø² Ø§Û\8cÙ\86 Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\86د Ù\86Ù\85Û\8câ\80\8cتÙ\88اÙ\86Ù\86د Ø¯Ø± Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø­Ø³Ø§Ø¨ Ø¬Ø¯Û\8cدÛ\8c Ø¨Ø³Ø§Ø²Ù\86د.",
+       "acct_creation_throttle_hit": "زÛ\8cارتÚ\86Û\8cÛ\8cÙ\87â\80\8cÙ\84 Ø¯ Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø§Ú\98 Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Û\8cÙ\88Ù\87 Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Ù\87â\80\8cÚ©Ù\87â\80\8cÙ\86 Ø¯ $2 Ú¯Ø°Ø´ØªÙ\87 {{PLURAL:$1|Û\8cÚ© Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c|$1 Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±Û\8c}} Ø³Ø§Ø®ØªÙ\87â\80\8cاÙ\86Ø\8c Ú©Ù\87 Ø¨Û\8cشترÛ\8cÙ\86 ØªØ¹Ø¯Ø§Ø¯ Ù\85جاز Ø¯ Ø§Ù\88Ù\86 Ù\88ازÙ\87Ù\94 Ø²Ù\85اÙ\86Û\8cÛ\8cÙ\87.\nبÙ\87 Ù\87Ù\85Û\8cÙ\86 Ø®Ø§Ø·Ø±Ø\8c Ø²Û\8cارتÚ\86Û\8cÛ\8cÙ\87â\80\8cÙ\84 Ú©Ù\87 Ø§Ú\98 Ø§Û\8c Ù\86شاÙ\86Û\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ù\85Ù\87â\80\8cÚ©Ù\87Ù\86 Ù\86Ù\87â\80\8cتÙ\88Ù\86Ù\86 Ø¯ Ø­Ø§Ù\84 Ø­Ø§Ø¶Ø± Ø­Ø³Ø§Ø¨ Ù\86Ù\88 Ø¨Ø³Ø§Ø²Ù\86.",
        "emailauthenticated": "نشانی ایمیل شما در $2 ساعت $3 تأیید شده است.",
        "emailnotauthenticated": "آدرس ایمیل شما هنوز تأیید نشده است.\nبرای هیچ‌یک از ویژگی‌های زیر، ایمیل ارسال نخواهد شد.",
        "noemailprefs": "برای راه‌اندازی این قابلیت‌ها یک آدرس ایمیل در ترجیحات خود مشخص کنید.",
        "createaccount-title": "ایجاد حساب کاربری در {{SITENAME}}",
        "createaccount-text": "یک نفر برای ایمیل شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3\nشما باید به سیستم وارد شوید تا گذرواژهٔ خود را تغییر بدهید.\n\nاگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.",
        "login-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
-       "login-abort-generic": "Ù\88رÙ\88د Ø´Ù\85ا Ù\86اÙ\85Ù\88Ù\81Ù\82 Ø¨Ù\88د - Ø®Ø§ØªÙ\85Ù\87Ù\94 Ù\86اگÙ\87اÙ\86Û\8c Ø¯Ø§Ø¯Ù\87 Ø´Ø¯",
+       "login-abort-generic": "Ù\88رÙ\88د Ø§Û\8cÙ\88Ù\87 Ù\86اÙ\85Ù\88Ù\81Ù\82 Ø¨Ù\88Ù\88 - Ø§Ø¨Ø¯Ø§Ù\84 Ø¨Ù\88Ù\88",
        "login-migrated-generic": "حساب کاربری شما منتقل شده‌است، و نام کاربری‌تان دیگر در این ویکی وجود ندارد.",
        "loginlanguagelabel": "$1:زوون",
        "suspicious-userlogout": "درخواست هؤمة ئةرا  دةرچئن إژ سیستم  رد بیة زیرا به نظر می‌رسد که این  .درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر کل/ارسال بیة",
        "createacct-another-realname-tip": "نام راسکانی/واقعی دڵ بخواهیة.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
        "pt-login": "إنۆم هەتِن.",
        "pt-login-button": "إ نۆم هەتن سیستم",
+       "pt-login-continue-button": "ادامه سی ورود سیستم",
        "pt-createaccount": "حساووئ أرا ووژتان بِسازِن",
        "pt-userlogout": "دەرچێن|خروج",
        "php-mail-error-unknown": "خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی",
        "newpassword": "گذرواژهٔ تازه:",
        "retypenew": "گذرواژهٔ تازه را دوباره وارد کنید",
        "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
-       "changepassword-success": "گذرواژهٔ شما با موفقیت تغییر داده شد!",
+       "changepassword-success": "شیفرهٔ تو تغییر بوو",
        "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "botpasswords": "شیفرهٔ بؤت",
+       "botpasswords-summary": "<em>شیفره‌یه‌ل بؤت</em> اجازه دسترسی به یک حساب کاربری با ای‌پی‌آی بدون استفاده اژ رمز اصلی حسابه مه‌دهه. دسترسییه‌ل کاربری موجود هنگامی که با شیفرهٔ بؤتبک وارد مه‌شوین ممکن ئه محدود باشن.\n\nاگر نه‌زانین که ممکن ئه با ئی چه مه‌که‌ین، احتمالاً نباید هیچ کاری مه‌که‌ین. هیچ‌کس نباید اژ ایوه خواسته باشه که یکی اژ ئه‌مان درست مه‌کهین به اوان بدهین.",
+       "botpasswords-disabled": "شیفرهٔ بؤت غیر فعال بوو.",
+       "botpasswords-no-central-id": "سی استفاده ژ شیفرهٔ بؤت ایوه ابتدا مه‌بایست به یک حساب متمرکز وارد بوپ.",
+       "botpasswords-existing": "موجود شیفرهٔ بؤت",
+       "botpasswords-createnew": "نو شیفرهٔ بؤت ایجاد بکه",
+       "botpasswords-editexisting": "موجود شیفرهٔ بؤت تغییر بکه",
+       "botpasswords-label-appid": "ناو بؤت",
+       "botpasswords-label-create": "ایجاد بکه",
+       "botpasswords-label-update": "آپدیت",
+       "botpasswords-label-cancel": "ابدال",
+       "botpasswords-label-delete": "پاک بکه",
+       "botpasswords-label-resetpassword": "شیفره ابدال بکه",
+       "botpasswords-label-grants": "یارمته‌ل مه‌تونه تطبیق مه‌که",
+       "botpasswords-help-grants": "هر اجازه به ربات اجازه دسترسی به اختیاراتی را که حساب ایوه داره مه‌دهه. فعال کردن یک اجازه د ایره/اینجا هیچ دسترسی نو که حساب ایوه همینک دارا نییه را به اون نه‌بخشه. [[Special:ListGrants|table of grants]] را سی اطلاعات بیشتر مشاهده مه‌که‌ین.",
+       "botpasswords-label-grants-column": "اعطا بوو",
+       "botpasswords-bad-appid": "ناو بؤت \"$1\" معتبر نییه.",
+       "botpasswords-insert-failed": "اضافهٔ ناو بؤت \"$1\" ناموفق بوو. اون ناو ذاتًا اضافه بوو.",
+       "botpasswords-update-failed": "به‌روژ ناو بؤت \"$1\" ناموفق بوو. آیا اون حذف بوو؟",
+       "botpasswords-created-title": "شیفرهٔ بؤت ایجاد بوو",
+       "botpasswords-created-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت ایجاد بوو.",
+       "botpasswords-updated-title": "شیفرهٔ بؤت به‌روژ بوو",
+       "botpasswords-updated-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت به‌روژ بوو.",
+       "botpasswords-deleted-title": "شیفرهٔ بؤت پاک بوو",
+       "botpasswords-deleted-body": "سی کاربر \"$2\" و سی ناو بؤت ئی کاربر \"$1\" یک شیفرهٔ بؤت حذف بوو.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider موجود نییه.",
+       "botpasswords-restriction-failed": "محدودیته‌ل شیفره بؤت، به ئی ورود مانع مه‌بئت",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
+       "resetpass_forbidden-reason": "شیفره نتونه تغییر نه‌که: $1",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییردائن رمز",
        "resetpass-submit-cancel": "ئآهووسانن/لغو",
        "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
        "passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده می‌شود.",
        "passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
+       "passwordreset-nocaller": "زنگ مجبور نییه به تأمین کردن",
+       "passwordreset-nosuchcaller": "زنگ موجود نییه: $1",
+       "passwordreset-invalidemail": "آدرس ایمیل نامعتبره",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
        "changeemail-no-info": ".برای دسترسی مستقیم به این صفحه شما باید به سیستم وارد شده باشید",
        "minoredit": "یۀ دۀسکاری جزئیکۀ",
        "watchthis": "پئ گیری اێ وەلگە",
        "savearticle": "وەڵگە بِیل(ذخیره کە)",
+       "savechanges": "تغییراتی قید بکه",
+       "publishpage": "صفحهٔ انتشار",
+       "publishchanges": "تغییرات انتشار",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "گؤەڕیال(تغییرات) بۆین",
        "invalid-content-data": "داده محتوای نامعتبر",
        "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[$2]] مجاز نیست",
        "editwarning-warning": "خروج از این برگه ممکن است باعث شود که شما هر شانسی که به وجود آورده‌اید را از دست بدهید.\nاگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.",
+       "editpage-invalidcontentmodel-title": "مودل محتوا دستک نبینه",
+       "editpage-invalidcontentmodel-text": "مودل محتوا \"$1\" دستک نبینه",
        "editpage-notsupportedcontentformat-title": "فرمت نۆم جِک(محتوا)پشتیبانی نشده",
        "editpage-notsupportedcontentformat-text": "فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.",
        "content-model-wikitext": "ویکی‌متن",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": ":دةلیل",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "'''پیدایی ورژن با موفقیت به روز شد.'''",
+       "revdelete-success": "نمایش رویزیون به‌روژ بوو",
        "revdelete-failure": "'''پیدایی ورژن ها قابل به روز کردن نیست:'''\n$1",
-       "logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
+       "logdelete-success": "ورود نمایش ست",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
        "revdel-restore": "گؤەڕانن/تغییر پیدایی",
        "pagehist": "تاریخ وةڵگة",
        "mergehistory-empty": "هیچ‌یک از ورژن ها قابل ادغام نیستند.",
        "mergehistory-done": "$3 نسخه از $1 در {{PLURAL:$3|ادغام شد}}به [[:$2]].",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-bad-timestamp": "برچسب زمانی معتبر نییه",
+       "mergehistory-fail-invalid-source": "صفحه منبع معتبر نییه",
+       "mergehistory-fail-invalid-dest": "صفحه مقصد معتبر نییه",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|1 واژۀ|$2 واژۀل}})",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})",
-       "search-redirect": "(تغییرمسیر $1)",
+       "search-redirect": "(تغییرمسیر اژ $1)",
        "search-section": "(بۀخش $1)",
        "search-category": "(ڕِزگ $1)",
        "search-file-match": "(تشابه محتوی پرونده)",
        "saveprefs": "هیشتن(ذخیره)",
        "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
        "prefs-editing": "دەسکاری کردن",
-       "rows": "تعداد سطرها:",
-       "columns": "تعداد ستون‌ها:",
        "searchresultshead": "مِنِی کِردِن(گێردین)",
        "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
        "stub-threshold-sample-link": "نمونه",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
        "userrights": "مدیریت اختیارات کاربر",
-       "userrights-lookup-user": "مدیریت گروه‌های کاربری",
+       "userrights-lookup-user": "یک کاربر انتخاب بکه",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
-       "editusergroup": "ویرایش گروه‌های کاربری",
+       "editusergroup": "گروهه‌ل کاربر بار مه‌بئ",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "ویرایش گروه‌های کاربری",
-       "saveusergroups": "هیشتِن(ذخیرە)گؤەڕیال(تغییرات)کوو(گروە)کاربەری",
+       "userrights-viewusergroup": "گروهه‌ل کاربری نشان بده",
+       "saveusergroups": "گروه {{GENDER:$1|کاربر}} قید بده",
        "userrights-groupsmember": "عضو:",
        "userrights-groupsmember-auto": "عضو ضمنی:",
        "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
        "right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
+       "right-deletechangetags": "[[Special:Tags|tags]] را اژ پایگاه پاک بکه",
+       "grant-generic": "حقوق \"$1\" بسته",
+       "grant-group-page-interaction": "تعاول با صفحه",
+       "grant-group-file-interaction": "تعامل با میدیا",
+       "grant-group-watchlist-interaction": "تعامل با لیست تماشای ایوه",
+       "grant-group-email": "ایمیل کل بکه",
+       "grant-group-high-volume": "انجام فعالیته‌ل حجم بالا",
        "grant-group-customization": "سفارشی‌سازی و تنظیمات",
+       "grant-group-administration": "انجام اقدامات اداری",
+       "grant-group-other": "فعالیته‌ل متفرقه",
+       "grant-blockusers": "کاربره‌ل بستن و واز کردن",
+       "grant-createaccount": "حسابه ایجاد بکه",
+       "grant-createeditmovepage": "صحفاته ایحاد بکه، تغییر بکه و انتقال بکه",
+       "grant-delete": "صفحاته، رویزیونه‌لی و ورود یومی را پاک بکه",
+       "grant-editinterface": "ناو میدیا-ویکی را و کربر CSS/JavaScript را تغییر بکه",
+       "grant-editmycssjs": "کاربر ایوه CSS/JavaScript را تغییر بکه",
+       "grant-editmyoptions": "ترجیحات کاربر ایوه را تغییر بکه",
+       "grant-editmywatchlist": "لیست تماشای ایوه را تغییر بکه",
+       "grant-editpage": "صفحات موجوده تغییر بکه",
+       "grant-editprotected": "صفحات محافظه را تغییر بکه",
+       "grant-highvolume": "تغییرات د سویه بالایه",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
        "rightslog": "سیاههٔ اختیارات کاربر",
        "feedback-useragent": "رابط کاربر:",
        "searchsuggest-search": "مِنِی کِردِن(گێردین)",
        "searchsuggest-containing": "وةڵگةل  دربردارنده...",
-       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
-       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد وةڵگةل خالی مجاز نیست.",
-       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
-       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
-       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
-       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
-       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
-       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
-       "api-error-filetype-missing": "پرونده فرمت ندارد.",
-       "api-error-hookaborted": "اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.",
-       "api-error-http": "خطای داخلی: قادر به اتصال به سرور نیست.",
-       "api-error-illegal-filename": "نام پرونده مجاز نیست.",
-       "api-error-internal-error": "خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رفت.",
-       "api-error-invalid-file-key": "خطای داخلی: پرونده در حافظهٔ موقت موجود نیست.",
-       "api-error-missingparam": "خطای داخلی: پارامترهای ناموجود در درخواست.",
-       "api-error-missingresult": "خطای داخلی: نمی‌توان فهمید کپی‌برداری موفق بوده‌است یا نه.",
-       "api-error-mustbeloggedin": "برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.",
-       "api-error-mustbeposted": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
-       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
-       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
-       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
-       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
-       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
-       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
-       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
-       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
-       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
-       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
-       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
-       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
-       "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
-       "api-error-unclassified": "یإگِلة خطا نادیاری/ناشناخته رخ داد.",
-       "api-error-unknown-code": "خطای نادیاری/ناشناخته: \" $1 \"",
-       "api-error-unknown-error": "خطای داخلی: در زمانی که شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رفت.",
+       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-unknown-warning": "هشدار نادیاری/ ناشناخته: $1",
        "api-error-unknownerror": "خطای نادیاری/ناشناخته: \" $1 \"",
-       "api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
-       "api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه ها}} قبل",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقةلئ}} دماتر",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتةلئ}} دماتر",
index 47791ce..15b6624 100644 (file)
@@ -9,7 +9,7 @@
                ]
        },
        "tog-underline": "ການຂີດເສັ້ນກ້ອງລິງກ໌:",
-       "tog-hideminor": "à»\80àº\8aືà»\88ອàº\87àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89ເລັກນ້ອຍໃນໜ້າປັບປຸງລ້າສຸດ",
+       "tog-hideminor": "à»\80àº\8aືà»\88ອàº\87àº\81າàº\99à»\81àº\81à»\89à»\84àº\82ເລັກນ້ອຍໃນໜ້າປັບປຸງລ້າສຸດ",
        "tog-hidepatrolled": "ເຊື່ອງການແກ້ໄຂທີ່ກວດສອບແລ້ວໃນໜ້າປັບປຸງລ້າສຸດ",
        "tog-newpageshidepatrolled": "ເຊື່ອງໜ້າທີ່ກວດສອບແລ້ວໃນລາຍການໜ້າໃໝ່",
        "tog-hidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
@@ -17,8 +17,8 @@
        "tog-usenewrc": "ຈັດກຸ່ມການປ່ຽນແປງແບ່ງຕາມໜ້າຢູ່ໃນລາຍການປັບປຸງລ້າສຸດແລະລາຍການຕິດຕາມ",
        "tog-numberheadings": "ກຳນົດເລກຫົວເລື່ອງອັດຕະໂນມັດ",
        "tog-showtoolbar": "ສະແດງແຖບເຄື່ອງມືແກ້ໄຂ",
-       "tog-editondblclick": "à»\81àº\81à»\89à»\84àº\82à»\9cà»\89າà»\80ມືà»\88ອàº\84ລິàº\81ສອງເທື່ອ",
-       "tog-editsectiononrightclick": "à»\80àº\9bີàº\94à»\83àº\8aà»\89àº\87າàº\99àº\81າàº\99à»\81àº\81à»\89à»\84àº\82ສà»\88ວàº\99à»\82àº\94àº\8dàº\84ລິàº\81ຂວາຢູ່ເທິງຊື່ເລື່ອງຂອງສ່ວນນັ້ນ",
+       "tog-editondblclick": "à»\81àº\81à»\89à»\84àº\82à»\9cà»\89າà»\80ມືà»\88ອàº\81ົàº\94ສອງເທື່ອ",
+       "tog-editsectiononrightclick": "à»\80àº\9bີàº\94à»\83àº\8aà»\89àº\87າàº\99àº\81າàº\99à»\81àº\81à»\89à»\84àº\82ສà»\88ວàº\99à»\82àº\94àº\8dàº\81ົàº\94à»\80ມົາສà»\8càº\94à»\89າàº\99ຂວາຢູ່ເທິງຊື່ເລື່ອງຂອງສ່ວນນັ້ນ",
        "tog-watchcreations": "ເພີ່ມໜ້າທີ່ຂ້ອຍສ້າງແລະໄຟລ໌ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
        "tog-watchdefault": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍແກ້ໄຂເຂົ້າໃນລາຍການຕິດຕາມ",
        "tog-watchmoves": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍຍ້າຍເຂົ້າໃນລາຍການຕິດຕາມ",
        "tog-minordefault": "ກຳນົດການແກ້ໄຂທຸກຄັ້ງເປັນການແກ້ໄຂເລັກນ້ອຍໂດຍປະລິຍາຍ",
        "tog-previewontop": "ສະແດງໂຕຢ່າງກ່ອນກ່ອງແກ້ໄຂ",
        "tog-previewonfirst": "ສະແດງໂຕຢ່າງໃນການແກ້ໄຂຄັ້ງທຳອິດ",
-       "tog-enotifwatchlistpages": "ອີà»\80ມລຫາà»\80ມືà»\88ອà»\9cà»\89າຫຼືà»\84àº\9fລà»\8cà»\83àº\99ລາàº\8dàº\81າàº\99àº\95ິàº\94àº\95າມປ່ຽນແປງ",
-       "tog-enotifusertalkpages": "ອີà»\80ມລຫາà»\80ມືà»\88ອມີàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87à»\9cà»\89າສົàº\99àº\97ະàº\99າàº\81ັàº\9aàº\9cູà»\89à»\83àº\8aà»\89àº\82ອàº\87àº\82à»\89ອàº\8d",
-       "tog-enotifminoredits": "ອີà»\80ມລຫາເຊັ່ນກັນສຳລັບການແກ້ໄຂໜ້າແລະໄຟລ໌ເລັກນ້ອຍ",
-       "tog-enotifrevealaddr": "à»\80àº\9bີàº\94à»\80àº\9cີàº\8dàº\97ີà»\88ຢູà»\88ອີà»\80ມລàº\82ອàº\87àº\82à»\89ອàº\8dà»\83àº\99ອີà»\80ມລແຈ້ງເຕືອນ",
+       "tog-enotifwatchlistpages": "ອີà»\80ມວàº\9aອàº\81àº\82à»\89ອàº\8dà»\80ມືà»\88ອà»\9cà»\89າຫຼືà»\84àº\9fລà»\8cà»\83àº\94à»\9cຶà»\88àº\87à»\83àº\99ລາàº\8dàº\81າàº\99àº\95ິàº\94àº\95າມມີàº\81າàº\99ປ່ຽນແປງ",
+       "tog-enotifusertalkpages": "ອີà»\80ມວàº\9aອàº\81àº\82à»\89ອàº\8dà»\80ມືà»\88ອà»\9cà»\89າສົàº\99àº\97ະàº\99າàº\81ັàº\9aàº\9cູà»\89à»\83àº\8aà»\89àº\82ອàº\87àº\82à»\89ອàº\8dມີàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87",
+       "tog-enotifminoredits": "ອີà»\80ມວàº\9aອàº\81àº\82à»\89ອàº\8dເຊັ່ນກັນສຳລັບການແກ້ໄຂໜ້າແລະໄຟລ໌ເລັກນ້ອຍ",
+       "tog-enotifrevealaddr": "à»\80àº\9bີàº\94à»\80àº\9cີàº\8dàº\97ີà»\88ຢູà»\88ອີà»\80ມວàº\82ອàº\87àº\82à»\89ອàº\8dà»\83àº\99ອີà»\80ມວແຈ້ງເຕືອນ",
        "tog-shownumberswatching": "ສະແດງຈຳນວນຜູ້ໃຊ້ທີ່ຕິດຕາມ",
-       "tog-fancysig": "ຖືລາຍເຊັນເປັນຂໍ້ຄວາມວິກິ (ໂດຍບໍ່ມີລິງຄ໌ອັດຕະໂນມັດ)",
+       "tog-oldsig": "ລາຍເຊັນຂອງທ່ານທີ່ມີຢູ່:",
+       "tog-fancysig": "ຖືລາຍເຊັນເປັນຂໍ້ຄວາມວິກິ (ໂດຍບໍ່ມີລິງກ໌ອັດຕະໂນມັດ)",
        "tog-uselivepreview": "ໃຊ້ການສະແດງໂຕຢ່າງແບບສົດ",
        "tog-forceeditsummary": "ເຕືອນເມື່ອຊ່ອງຄຳອະທິບາຍໂດຍຫຍໍ້ວ່າງເປົ່າ",
        "tog-watchlisthideown": "ເຊື່ອງການແກ້ໄຂຂອງຂ້ອຍຈາກລາຍການຕິດຕາມ",
-       "tog-watchlisthidebots": "ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchlisthideminor": "ເຊື່ອງ ການດັດແກ້ເລັກນ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchlisthideliu": "ເຊື່ອງການດັດແກ້ ໂດຍ ຜູ້ໃຊ້ໄດ້ເຊັນເຂົາ ໃນ ລາຍການຕິດຕາມ",
-       "tog-watchlisthideanons": "ເຊື່ອງ ການດັດແກ້ໂດຍຜູ້ໃຊ້ ບໍ່ສະແດງຊື່ ຈາກ ລາຍການຕິດຕາມ",
-       "tog-watchlisthidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ລາຍການຕິດຕາມ",
-       "tog-ccmeonemails": "ສົ່ງສຳເນົາ ອີເມລ ທີ່ ຂ້ອຍສົ່ງຫາຜູ້ອື່ນ ໃຫ້ ຂ້ອຍ",
-       "tog-diffonly": "ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມ ຢູ່ທາງລຸ່ມ ສ່ວນຕ່າງ",
-       "tog-showhiddencats": "ສະແດງໝວດເຊື່ອງ",
+       "tog-watchlisthidebots": "ເຊື່ອງການແກ້ໄຂໂດຍບັອດໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
+       "tog-watchlisthideminor": "ເຊື່ອງການແກ້ໄຂເລັກນ້ອຍໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
+       "tog-watchlisthideliu": "ເຊື່ອງການແກ້ໄຂໂດຍຜູ້ໃຊ້ທີ່ໄດ້ເຂົ້າສູ່ລະບົບແລ້ວໃນລາຍການຕິດຕາມ",
+       "tog-watchlistreloadautomatically": "ໂຫຼດລາຍການຕິດຕາມຄືນໃໝ່ເມື່ອໃດກໍຕາມທີ່ໂຕກັ່ນຕອງມີການປ່ຽນແປງ (ຕ້ອງໃຊ້ JavaScript)",
+       "tog-watchlisthideanons": "ເຊື່ອງການແກ້ໄຂໂດຍຜູ້ໃຊ້ທີ່ບໍ່ສະແດງຊື່ໃນລາຍການຕິດຕາມ",
+       "tog-watchlisthidepatrolled": "ເຊື່ອງການແກ້ໄຂແບບລາດຕະເວນໃນລາຍການຕິດຕາມ",
+       "tog-watchlisthidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
+       "tog-ccmeonemails": "ສົ່ງສຳເນົາອີເມວທີ່ຂ້ອຍໄດ້ສົ່ງຫາຜູ້ອື່ນໃຫ້ຂ້ອຍ",
+       "tog-diffonly": "ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມຢູ່ຂ້າງລຸ່ມ ສ່ວນຕ່າງ",
+       "tog-showhiddencats": "ສະແດງໝວດທີ່ເຊື່ອງຢູ່",
+       "tog-norollbackdiff": "ບໍ່ຕ້ອງສະແດງສ່ວນຕ່າງຫຼັງຈາກດຳເນີນການກັບຄືນຢ່າງສຸກເສີນ",
+       "tog-useeditwarning": "ເຕືອນຂ້ອຍເມື່ອຂ້ອຍຈະອອກຈາກໜ້າແກ້ໄຂໂດຍທີ່ຍັງບໍ່ໄດ້ບັນທຶກການປ່ຽນແປງ",
+       "tog-prefershttps": "ໃຊ້ການເຊື່ອມຕໍ່ແບບປອດໄພທຸກຄັ້ງທີ່ເຂົ້າສູ່ລະບົບແລ້ວ",
        "underline-always": "ທຸກຄັ້ງ",
-       "underline-never": "ບໍ່ຂີດ",
-       "underline-default": "ສະກິນຫຼືຄ່າທີ່ຖືກກຳນົດໄວ້ຂອງບຣາວເຊີ",
+       "underline-never": "ບໍ່ຕ້ອງ",
+       "underline-default": "ສະກິນຫຼືຄ່າເລີ່ມຕົ້ນຂອງບຣາວເຊີ",
+       "editfont-style": "ແກ້ໄຂຮູບແບບໂຕໜັງສືໃນພື້ນທີ່:",
+       "editfont-default": "ຄ່າເລີ່ມຕົ້ນຂອງບຣາວເຊີ",
+       "editfont-monospace": "ແບບໂຕໜັງສືທີ່ມີຄວາມກວ້າງຄົງທີ່",
+       "editfont-sansserif": "ແບບໂຕໜັງສືແບບບໍ່ມີເຊີງ",
+       "editfont-serif": "ແບບໂຕໜັງສືແບບມີເຊີງ",
        "sunday": "ວັນອາທິດ",
        "monday": "ວັນຈັນ",
        "tuesday": "ວັນອັງຄານ",
        "oct": "ຕຸລາ",
        "nov": "ພະຈິກ",
        "dec": "ທັນວາ",
+       "january-date": "$1 ມັງກອນ",
+       "february-date": "$1 ກຸມພາ",
+       "march-date": "$1 ມີນາ",
+       "april-date": "$1 ເມສາ",
+       "may-date": "$1 ພຶດສະພາ",
+       "june-date": "$1 ມິຖຸນາ",
+       "july-date": "$1 ກໍລະກົດ",
+       "august-date": "$1 ສິງຫາ",
+       "september-date": "$1 ກັນຍາ",
+       "october-date": "$1 ຕຸລາ",
+       "november-date": "$1 ພະຈິກ",
+       "december-date": "$1 ທັນວາ",
+       "period-am": "ກ່ອນທ່ຽງ",
+       "period-pm": "ຫຼັງທ່ຽງ",
        "pagecategories": "{{PLURAL:$1|ໝວດ|ໝວດ}}",
        "category_header": "ບົດຄວາມໃນໝວດ \"$1\"",
        "subcategories": "ໝວດຍ່ອຍ",
-       "category-media-header": "ໜ້າຕ່າງ າ ໃນ \"$1\"",
-       "category-empty": "''ບໍ່ມີໜ້າໃດຢູ່ໃນໝວດນີ້''",
-       "hidden-categories": "{{PLURAL:$1|ໜວດທີ່ຖືກເຊື່ອງ|ໜວດທີ່ຖືກເຊື່ອງ}}",
-       "hidden-category-category": "ບັນດາໜວດເຊື່ອງ",
-       "category-subcat-count-limited": "ໜວດນີ້ ມີ ໜວດຍ່ອຍ ດັ່ງຕໍ່ໄປນີ້ {{PLURAL:$1|ໜວດຍ່ອຍ|$1 ໜວດຍ່ອຍ}}.",
-       "category-article-count": "{{PLURAL:$2|ໝວດນີ້ມີໜ້າຢູ່ພຽງໜ້າດຽວ|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້ ເຕັມ $2}}",
+       "category-media-header": "ສື່ໃນໝວດ \"$1\"",
+       "category-empty": "<em>ປັດຈຸບັນໜ້ານີ້ບໍ່ມີໜ້າຫຼືສື່ໃດໆ.</em>",
+       "hidden-categories": "{{PLURAL:$1|ໝວດທີ່ຖືກເຊື່ອງ}}",
+       "hidden-category-category": "ໝວດທີ່ຖືກເຊື່ອງຢູ່",
+       "category-subcat-count": "{{PLURAL:$2|ໝວດນີ້ມີສະເພາະໝວດຍ່ອຍດັ່ງຕໍ່ໄປນີ້.|ໝວດນີ້ມີ {{PLURAL:$1|ໝວດຍ່ອຍ|$1 ໝວດຍ່ອຍ}}, ຈາກ $2 ທັງໝົດ.}}",
+       "category-subcat-count-limited": "ໝວດນີ້ມີ {{PLURAL:$1|ໜວດຍ່ອຍ|$1 ໜວດຍ່ອຍ}} ດັ່ງຕໍ່ໄປນີ້.",
+       "category-article-count": "{{PLURAL:$2|ໝວດນີ້ມີພຽງໜ້າດັ່ງຕໍ່ໄປນີ້.|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້, ຈາກທັງໝົດ $2.}}",
+       "category-article-count-limited": "ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້.",
+       "category-file-count": "{{PLURAL:$2|ໝວດນີ້ມີພຽງໄຟລ໌ດັ່ງຕໍ່ໄປນີ້.|ມີ {{PLURAL:$1|ໄຟລ໌ດຽວ|ໄຟລ໌ $1 ໄຟລ໌}} ໃນໝວດນີ້, ຈາກທັງໝົດ $2.}}",
+       "category-file-count-limited": "ມີ {{PLURAL:$1|ໄຟລ໌|ໄຟລ໌ $1 ໄຟລ໌}} ໃນໝວດນີ້.",
        "listingcontinuesabbrev": "ຕໍ່.",
+       "index-category": "ໜ້າທີ່ມີດັດຊະນີ",
+       "noindex-category": "ໜ້າທີ່ບໍ່ມີດັດຊະນີ",
+       "broken-file-category": "ໜ້າທີ່ມີລິງກ໌ໄຟລ໌ເສຍ",
        "about": "ກ່ຽວກັບ",
-       "article": "ບົດຄວາມ",
-       "newwindow": "(ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ )",
-       "cancel": "ລົບລ້າງ",
-       "moredotdotdot": "ຕື່ມ...",
+       "article": "ໜ້າເນື້ອໃນ",
+       "newwindow": "(ເປີດໃນວິນໂດໃໝ່)",
+       "cancel": "ຍົກເລີກ",
+       "moredotdotdot": "ເພີ່ມເຕີມ...",
+       "morenotlisted": "ລາຍການນີ້ອາດຈະບໍ່ສົມບູນ.",
        "mypage": "ໜ້າ",
        "mytalk": "ສົນທະນາ",
        "anontalk": "ສົນທະນາ",
-       "navigation": "àº\99ຳàº\97ິàº\94",
+       "navigation": "àº\9bà»\89າàº\8dàº\9aອàº\81àº\97າàº\87",
        "and": "&#32;ແລະ",
-       "qbfind": "ຊອກຫາ",
-       "qbedit": "ດັດແກ້",
+       "qbfind": "ຄົ້ນຫາ",
+       "qbbrowse": "ເອີ້ນເບິ່ງ",
+       "qbedit": "ແກ້ໄຂ",
        "qbpageoptions": "ໜ້ານີ້",
-       "qbmyoptions": "ໝ້າຂ້ອຍ",
-       "navigation-heading": "ເມນູນຳທາງ",
-       "errorpagetitle": "ຜິດພາດ",
-       "returnto": "ກັບໄປ  $1.",
+       "qbmyoptions": "ໜ້າຂອງຂ້ອຍ",
+       "faq": "ຄຳຖາມທີ່ພົບເລື້ອຍໆ",
+       "faqpage": "Project:ຄຳຖາມທີ່ພົບເລື້ອຍໆ",
+       "actions": "ການກະທຳ",
+       "namespaces": "ຊື່ຂອບເຂດ",
+       "variants": "ຄວາມແຕກຕ່າງ",
+       "navigation-heading": "ລາຍການການນຳທາງ",
+       "errorpagetitle": "ຂໍ້ຜິດພາດ",
+       "returnto": "ກັບໄປຫາ $1.",
        "tagline": "ຈາກ {{SITENAME}}",
        "help": "ຊ່ວຍເຫຼືອ",
        "search": "ຄົ້ນຫາ",
        "searcharticle": "ໄປ",
        "history": "ປະຫວັດ",
        "history_short": "ປະຫວັດການດັດແກ້",
+       "updatedmarker": "ອັບເດດຕັ້ງແຕ່ຄັ້ງທີ່ຂ້ອຍມາຢ້ຽມຊົມລ້າສຸດ",
        "printableversion": "ສະບັບພິມໄດ້",
-       "permalink": "ລິàº\87àº\84໌ຖາວອນ",
+       "permalink": "ລິàº\87àº\81໌ຖາວອນ",
        "print": "ພິມ",
+       "view": "ເບິ່ງ",
+       "view-foreign": "ເບິ່ງໃນ $1",
        "edit": "ແກ້ໄຂ",
+       "edit-local": "ແກ້ໄຂຄຳອະທິບາຍທ້ອງຖິ່ນ",
        "create": "ສ້າງ",
-       "editthispage": "ດັດແກ້ໜ້ານີ້",
+       "create-local": "ເພີ່ມຄຳອະທິບາຍທ້ອງຖິ່ນ",
+       "editthispage": "ແກ້ໄຂໜ້ານີ້",
        "create-this-page": "ສ້າງໜ້ານີ້",
        "delete": "ລຶບ",
        "deletethispage": "ລຶບໜ້ານີ້",
+       "undeletethispage": "ຍົກເລີກການລຶບໜ້ານີ້",
+       "undelete_short": "ຍົກເລີກການລຶບ {{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງ|ການແກ້ໄຂ $1 ຄັ້ງ}}",
+       "viewdeleted_short": "ເບິ່ງ {{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງທີ່ລຶບໄປແລ້ວ|ການແກ້ໄຂ $1 ຄັ້ງທີ່ລຶບໄປແລ້ວ}}",
        "protect": "ປົກປ້ອງ",
        "protect_change": "ການປ່ຽນແປງ",
-       "protectthispage": "ປ້ອງກັນໜ້ານີ້",
-       "unprotect": "ປ່ຽນແປງການປ້ອງກັນ",
+       "protectthispage": "ປົກປ້ອງໜ້ານີ້",
+       "unprotect": "ປ່ຽນແປງການປົກປ້ອງ",
+       "unprotectthispage": "ປ່ຽນແປງການປົກປ້ອງຂອງໜ້ານີ້",
        "newpage": "ໜ້າໃໝ່",
-       "talkpage": "ປຶກສາຫາລືໜ້ານີ້",
+       "talkpage": "àº\9bຶàº\81ສາຫາລືàº\81à»\88ຽວàº\81ັàº\9aà»\9cà»\89າàº\99ີà»\89",
        "talkpagelinktext": "ສົນທະນາ",
-       "specialpage": "à»\9d້າພິເສດ",
+       "specialpage": "à»\9c້າພິເສດ",
        "personaltools": "ເຄື່ອງມືສ່ວນບຸກຄົນ",
        "articlepage": "ເບິ່ງໜ້າເນື້ອໃນ",
        "talk": "ສົນທະນາ",
        "views": "ເທື່ອເບິ່ງ",
        "toolbox": "ເຄື່ອງມື",
-       "userpage": "ເບິ່ງໜ້າສົນທະນາຂອງຜູ້ໃຊ້",
-       "projectpage": "ເບິ່ງໝ້າໂຄງການ",
-       "mediawikipage": "ເບິ່ງ ໝ້າຂໍ້ຄວາມ",
+       "tool-link-userrights": "ປ່ຽນກຸ່ມ{{GENDER:$1|ຜູ້ໃຊ້}}",
+       "tool-link-userrights-readonly": "ເບິ່ງກຸ່ມ{{GENDER:$1|ຜູ້ໃຊ້}}",
+       "tool-link-emailuser": "ສົ່ງອີເມວຫາ{{GENDER:$1|ຜູ້ໃຊ້}}ຄົນນີ້",
+       "userpage": "ເບິ່ງໜ້າຜູ້ໃຊ້",
+       "projectpage": "ເບິ່ງໜ້າໂຄງການ",
+       "imagepage": "ເບິ່ງໜ້າໄຟລ໌",
+       "mediawikipage": "ເບິ່ງໜ້າຂໍ້ຄວາມ",
        "templatepage": "ເບິ່ງໜ້າແມ່ແບບ",
-       "viewhelppage": "ເບິ່ງ ໝ້າຊ່ອຍເຫຼືອ",
-       "categorypage": "ເບິ່ງ ໜ້າ ໝວດ",
+       "viewhelppage": "ເບິ່ງໜ້າວິທີໃຊ້",
+       "categorypage": "ເບິ່ງໜ້າໝວດ",
+       "viewtalkpage": "ເບິ່ງການປຶກສາຫາລື",
        "otherlanguages": "ເປັນພາສາອື່ນໆ",
-       "redirectedfrom": "(ໂອນມາຈາກ $1)",
-       "redirectpagesub": "ໜ້າໂອນ",
-       "lastmodifiedat": "ໜ້ານີ້ຖຶກດັດແກ້ຫຼ້າສຸດ $2, $1.",
-       "viewcount": "ໜ້ານີ້ຖືກເຂົ້າເບິ່ງ {{PLURAL:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.",
-       "protectedpage": "ໜ້າຖືກປົກປ້ອງ",
-       "jumpto": "ໄປຫາ:",
+       "redirectedfrom": "(ປ່ຽນເສັ້ນທາງມາຈາກ $1)",
+       "redirectpagesub": "ໜ້າປ່ຽນເສັ້ນທາງ",
+       "redirectto": "ປ່ຽນເສັ້ນທາງໄປຫາ:",
+       "lastmodifiedat": "ໜ້ານີ້ຖຶກແກ້ໄຂຄັ້ງລ້າສຸດເມື່ອວັນທີ່ $1, ເວລາ $2.",
+       "viewcount": "ໜ້ານີ້ຖືກເຂົ້າເບິ່ງແລ້ວ {{PLURAL:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.",
+       "protectedpage": "ໜ້າທີ່ຖືກປົກປ້ອງ",
+       "jumpto": "ຂ້າມໄປຫາ:",
        "jumptonavigation": "ປ້າຍບອກທາງ",
        "jumptosearch": "ຄົ້ນຫາ",
-       "aboutsite": "ກ່ຽວກັບ{{SITENAME}}",
+       "view-pool-error": "ຂໍອະໄພ, ເຊີເວີກຳລັງເຮັດວຽກໜັກເກີນໄປໃນຂະນະນີ້.\nຈຳນວນຜູ້ໃຊ້ທີ່ກຳລັງພະຍາຍາມເຂົ້າເບິ່ງໜ້ານີ້ມີຫຼາຍເກີນໄປ.\nກະລຸນາລໍຖ້າໄລຍະໜຶ່ງ ແລ້ວຈຶ່ງພະຍາຍາມເຂົ້າເບິ່ງໜ້ານີ້ໃໝ່.\n\n$1",
+       "generic-pool-error": "ຂໍອະໄພ, ເຊີເວີກຳລັງເຮັດວຽກໜັກເກີນໄປໃນຂະນະນີ້.\nຈຳນວນຜູ້ໃຊ້ທີ່ກຳລັງພະຍາຍາມເຂົ້າເບິ່ງຊັບພະຍາກອນນີ້ມີຫຼາຍເກີນໄປ.\nກະລຸນາລໍຖ້າໄລຍະໜຶ່ງ ແລ້ວຈຶ່ງພະຍາຍາມເຂົ້າເບິ່ງຊັບພະຍາກອນນີ້ໃໝ່.",
+       "pool-timeout": "ການລໍຖ້າການໝົດເວລາສຳລັບການລັອກ",
+       "pool-errorunknown": "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ຈັກ",
+       "poolcounter-usage-error": "ຂໍ້ຜິດພາດໃນການໃຊ້ງານ: $1",
+       "aboutsite": "ກ່ຽວກັບ {{SITENAME}}",
        "aboutpage": "Project:ກ່ຽວກັບ",
-       "copyright": "à»\80àº\99ືà»\89ອà»\83àº\99à»\81ມà»\88àº\99ສາມາàº\94à»\83àº\8aà»\89à»\84àº\94à»\89àº\9eາàº\8dà»\83àº\95à»\89 $1 àº\96à»\89າàº\9aà»\8dà»\88à»\81ມà»\88àº\99ຢà»\88າàº\87ອືà»\88àº\99à»\83àº\94àº\97ີà»\88ລະàº\9aຸà»\84ວà»\89.",
+       "copyright": "ເນື້ອໃນສາມາດໃຊ້ໄດ້ພາຍໃຕ້ $1 ຖ້າບໍ່ແມ່ນຢ່າງອື່ນໃດທີ່ລະບຸໄວ້.",
        "copyrightpage": "{{ns:project}}:ລິຂະສິດ",
        "currentevents": "ເຫດການປັດຈຸບັນ",
        "currentevents-url": "Project:ເຫດການປັດຈຸບັນ",
        "disclaimers": "ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "disclaimerpage": "Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
-       "edithelp": "ວິàº\97ີàº\94ັàº\94à»\81àº\81à»\89à»\9cà»\89າ",
-       "helppage-top-gethelp": "àº\8aà»\88ວàº\8dà»\80ຫຼືອ",
+       "edithelp": "ວິàº\97ີà»\81àº\81à»\89à»\84àº\82",
+       "helppage-top-gethelp": "ວິàº\97ີà»\83àº\8aà»\89",
        "mainpage": "ໜ້າຫຼັກ",
        "mainpage-description": "ໜ້າຫຼັກ",
-       "policy-url": "Project:àº\9bະàº\95ູສູà»\88àº\8aຸມàº\8aົàº\99",
-       "portal": "ປະຕູຊຸມຊົນ",
+       "policy-url": "Project:àº\99ະà»\82àº\8dàº\9aາàº\8d",
+       "portal": "àº\9bະàº\95ູສູà»\88àº\8aຸມàº\8aົàº\99",
        "portal-url": "Project:ປະຕູສູ່ຊຸມຊົນ",
        "privacy": "ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ",
        "privacypage": "Project:ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ",
        "badaccess": "ການອະນຸມັດບໍ່ຖືກຕ້ອງ",
-       "badaccess-group0": "ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ.",
-       "versionrequired": "ຕ້ອງການເວີຣ໌ຊັ່ນ $1 ຂອງມີເດຍວິກິ",
+       "badaccess-group0": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ປະຕິບັດການຕາມທີ່ທ່ານຮ້ອງຂໍໄວ້.",
+       "badaccess-groups": "ການກະທຳທີ່ທ່ານຮ້ອງຂໍຖືກຈຳກັດໃຫ້ກັບຜູ້ໃຊ້ໃນ{{PLURAL:$2|ກຸ່ມ}}ດັ່ງຕໍ່ໄປນີ້: $1.",
+       "versionrequired": "ຕ້ອງໃຊ້ມີເດຍວິກິເວີຊັນ $1",
+       "versionrequiredtext": "ຕ້ອງໃຊ້ມີເດຍວິກິເວີຊັນ $1 ເພື່ອເຂົ້າເບິ່ງໜ້ານີ້.\nເບິ່ງ [[Special:Version|ໜ້າເວີຊັນ]].",
        "ok": "ຕົກລົງ",
        "retrievedfrom": "ດຶງຂໍ້ມູນຈາກ \"$1\"",
-       "youhavenewmessages": "ທ່ານ ມີ $1 ($2).",
-       "youhavenewmessagesmulti": "ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1",
+       "youhavenewmessages": "{{PLURAL:$3|ທ່ານມີ}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ທ່ານມີ}} $1 ຈາກ {{PLURAL:$3|ຜູ້ໃຊ້ຄົນອື່ນ|ຜູ້ໃຊ້ຄົນອື່ນ $3 ຄົນ}} ($2).",
+       "youhavenewmessagesmanyusers": "ທ່ານມີ $1 ຈາກຜູ້ໃຊ້ຫຼາຍຄົນ ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|ຂໍ້ຄວາມໃໝ່ໜຶ່ງຂໍ້ຄວາມ|999=ຂໍ້ຄວາມໃໝ່}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ການປ່ຽນແປງ|999=ການປ່ຽນແປງ}}ລ້າສຸດ",
+       "youhavenewmessagesmulti": "ທ່ານມີຂໍ້ຄວາມໃໝ່ຢູ່ $1",
        "editsection": "ແກ້ໄຂ",
-       "editold": "ດັດແກ້",
-       "viewsourceold": "ເບິ່ງ ຊອສ",
-       "editlink": "ດັດແກ້",
+       "editold": "ແກ້ໄຂ",
+       "viewsourceold": "ເບິ່ງຊອຣ໌ສ",
+       "editlink": "ແກ້ໄຂ",
+       "viewsourcelink": "ເບິ່ງຊອຣ໌ສ",
        "editsectionhint": "ແກ້ໄຂພາກ: $1",
        "toc": "ເນື້ອໃນ",
        "showtoc": "ສະແດງ",
        "hidetoc": "ເຊື່ອງ",
-       "viewdeleted": "ເບິ່ງ $1 ບໍ?",
+       "collapsible-collapse": "ຍຸບ",
+       "collapsible-expand": "ຂະຫຍາຍ",
+       "confirmable-confirm": "{{GENDER:$1|ທ່ານ}}ແນ່ໃຈບໍ່?",
+       "confirmable-yes": "ແມ່ນ",
+       "confirmable-no": "ບໍ່",
+       "thisisdeleted": "ຕ້ອງການເບິ່ງຫຼືຄືນຄ່າ $1 ບໍ່?",
+       "viewdeleted": "ຕ້ອງການເບິ່ງ $1 ບໍ່?",
+       "restorelink": "{{PLURAL:$1|ການແກ້ໄຂໜຶ່ງຄັ້ງທີ່ຖືກລຶບໄປແລ້ວ|ການແກ້ໄຂ $1 ຄັ້ງທີ່ຖືກລຶບໄປແລ້ວ}}",
+       "feedlinks": "ຟີດ:",
+       "feed-invalid": "ປະເພດຂອງຟີດການຕິດຕາມບໍ່ຖືກຕ້ອງ.",
        "site-rss-feed": "$1 RSS ຟີດ",
        "site-atom-feed": "ອະຕອມຟີດ $1",
        "page-rss-feed": "\"$1\" RSS ຟີດ",
+       "page-atom-feed": "\"$1\" Atom feed",
        "red-link-title": "$1 (ບໍ່ມີໜ້ານີ້)",
        "nstab-main": "ໜ້າ",
        "nstab-user": "ໜ້າຜູ້ໃຊ້",
+       "nstab-media": "ໜ້າສື່",
        "nstab-special": "ໜ້າພິເສດ",
        "nstab-project": "ໜ້າໂຄງການ",
        "nstab-image": "ໄຟລ໌",
        "nstab-mediawiki": "ຂໍ້ຄວາມ",
        "nstab-template": "ແມ່ແບບ",
-       "nstab-help": "à»\9cà»\89າàº\8aà»\88ອàº\8dà»\80ຫຼືອ",
+       "nstab-help": "à»\9cà»\89າວິàº\97ີà»\83àº\8aà»\89",
        "nstab-category": "ໝວດ",
        "mainpage-nstab": "ໜ້າຫຼັກ",
-       "nosuchspecialpage": "ບໍ່ມີໝ້າພິເສດຊື່ນັ້ນ",
-       "databaseerror": "ມີຄວາມຜິດພາດ ດ້ານ ຖານຂໍ້ມູນ",
-       "readonly": "ຖານຂໍ້ມູນຖືກລອັກ",
-       "enterlockreason": "ກະລຸນາຂຽນເຫດຜົນໃນການລອັກ, ລວມທັງ ປະມານເວລາທີ່ຈະປົດລອັກ",
+       "nosuchaction": "ບໍ່ມີການກະທຳດັ່ງກ່າວ",
+       "nosuchspecialpage": "ບໍ່ມີໝ້າພິເສດດັ່ງກ່າວ",
+       "error": "ຂໍ້ຜິດພາດ",
+       "databaseerror": "ມີຂໍ້ຜິດພາດກ່ຽວກັບຖານຂໍ້ມູນ",
+       "databaseerror-error": "ຂໍ້ຜິດພາດ: $1",
+       "laggedslavemode": "<strong>ຄຳເຕືອນ:</strong> ໜ້ານີ້ອາດຈະບໍ່ລວມຂໍ້ມູນລ້າສຸດ.",
+       "readonly": "ຖານຂໍ້ມູນຖືກລັອກ",
+       "enterlockreason": "ກະລຸນາຂຽນເຫດຜົນໃນການລັອກ, ລວມທັງປະມານເວລາທີ່ຈະປົດລັອກ",
        "missingarticle-diff": "(ສ່ວນຕ່າງ: $1, $2)",
-       "internalerror": "ມີຄວາມຜິດພາດພາຍໃນ",
-       "filerenameerror": "ບໍ່ສາມາດ ປ່ຽນ ຊື່ໄຟລ໌  \"$1\" ໄປເປັນ  \"$2\" ໄດ້.",
+       "readonly_lag": "ຖານຂໍ້ມຸນໄດ້ຖືກລັອກແລ້ວໂດຍອັດຕະໂນມັດຂະນະທີ່ເຊີເວີ slave database ຖືກຈັບໃຫ້ອັນຫຼັກ",
+       "internalerror": "ມີຂໍ້ຜິດພາດພາຍໃນ",
+       "internalerror_info": "ມີຂໍ້ຜິດພາດພາຍໃນ: $1",
+       "filecopyerror": "ບໍ່ສາມາດເຮັດສຳເນົາໄຟລ໌ \"$1\" ໄປເປັນ \"$2\" ໄດ້.",
+       "filerenameerror": "ບໍ່ສາມາດປ່ຽນຊື່ໄຟລ໌  \"$1\" ໄປເປັນ  \"$2\" ໄດ້.",
+       "filedeleteerror": "ບໍ່ສາມາດລຶບໄຟລ໌ \"$1\" ໄດ້.",
+       "directorycreateerror": "ບໍ່ສາມາດສ້າງໄດເຣກທໍຣີ \"$1\" ໄດ້.",
+       "directoryreadonlyerror": "ໄດເຣກທໍຣີ \"$1\" ສາມາດອ່ານໄດ້ເທົ່ານັ້ນ.",
+       "directorynotreadableerror": "ໄດເຣກທໍຣີ \"$1\" ບໍ່ສາມາດອ່ານໄດ້.",
+       "filenotfound": "ບໍ່ພົບໄຟລ໌ \"$1\".",
+       "formerror": "ຂໍ້ຜິດພາດ: ບໍ່ສາມາດສົ່ງແບບຟອມໄດ້.",
+       "badarticleerror": "ບໍ່ສາມາດດຳເນີນການນີ້ຢູ່ເທິງໜ້ານີ້ໄດ້.",
        "cannotdelete": "ບໍ່ສາມາດລຶບໜ້າຫຼືໄຟລ໌ \"$1\" ໄດ້.\nມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.",
+       "cannotdelete-title": "ບໍ່ສາມາດລຶບໜ້າ \"$1\" ໄດ້",
        "badtitle": "ຫົວຂໍ້ບໍ່ຖືກຕ້ອງ",
-       "viewsource": "ເບິ່ງຊອສ໌",
-       "namespaceprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ ດັດແກ້ ໜ້າ ໃນ  '''$1'''.",
+       "viewsource": "ເບິ່ງຊອຣ໌ສ",
+       "viewsource-title": "ເບິ່ງຊອຣ໌ສສຳລັບ $1",
+       "viewsourcetext": "ທ່ານສາມາດເບິ່ງແລະເຮັດສຳເນົາຊອຣ໌ສຂອງໜ້ານີ້ໄດ້.",
+       "viewyourtext": "ທ່ານສາມາດເບິ່ງແລະເຮັດສຳເນົາຊອຣ໌ສ<strong>ການແກ້ໄຂຂອງທ່ານ</strong>ຂອງໜ້ານີ້ໄດ້.",
+       "namespaceprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າທີ່ມີເນມສະເປດ <strong>$1</strong>.",
+       "customcssprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ CSS ນີ້ເນື່ອງຈາກມີຂໍ້ມູນການຕັ້ງຄ່າສ່ວນບຸກຄົນຂອງຜູ້ໃຊ້ລວມມີຢູ່.",
+       "customjsprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ JavaScript ນີ້ເນື່ອງຈາກມີຂໍ້ມູນການຕັ້ງຄ່າສ່ວນບຸກຄົນຂອງຜູ້ໃຊ້ລວມຢູ່ໃນໜ້ານີ້.",
+       "mycustomcssprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ CSS ນີ້.",
+       "mycustomjsprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າ JavaScript ນີ້.",
+       "myprivateinfoprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໜ້າຂໍ້ມູນສ່ວນບຸກຄົນຂອງທ່ານ.",
+       "mypreferencesprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂການຕັ້ງຄ່າຂອງທ່ານ.",
+       "ns-specialprotected": "ບໍ່ສາມາດແກ້ໄຂໜ້າພິເສດໄດ້.",
+       "invalidtitle-knownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ \"$2\" ແລະຂໍ້ຄວາມ \"$3\" ບໍ່ຖືກຕ້ອງ",
+       "invalidtitle-unknownnamespace": "ຊື່ເລື່ອງທີ່ມີຂອບເຂດຊື່ໝາຍເລກ $1 ແລະຂໍ້ຄວາມ \"$2\"",
+       "exception-nologin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
+       "exception-nologin-text": "ກະລຸນາເຂົ້າສູ່ລະບົບເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
+       "exception-nologin-text-manual": "ກະລຸນາ $1 ເພື່ອໃຫ້ສາມາດເຂົ້າເບິ່ງ ຫຼື ດຳເນີນການໃດໆກັບໜ້ານີ້ໄດ້.",
        "logouttext": "<strong>ທ່່ານໄດ້ອອກຈາກລະບົບແລ້ວ.<strong>\n\nກະລຸນາຮັບຊາບວ່າບາງໜ້າຈະຍັງຄົງສະແດງຜົນຕໍ່ໄປເຖິງແມ້ວ່າທ່ານຈະເຂົ້າສູ່ລະບົບແລ້ວ, ຈົນກວ່າທ່ານຈະລ້າງແຄຊໃນບຣາວເຊີຂອງທ່ານທັງໝົດ.",
-       "yourname": "ຊື່ຜູ້ໃຊ້",
-       "yourpassword": "ລະຫັດຜ່ານ",
-       "yourpasswordagain": "ພິມລະຫັດຜ່ານອີກ",
-       "yourdomainname": "ໂດເມນ ຂອງ ທ່ານ",
-       "login": "ເຊັນເຂົ້າ",
-       "nav-login-createaccount": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
-       "userlogin": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
-       "logout": "ເຊັນອອກ",
-       "userlogout": "ເຊັນອອກ",
+       "cannotlogoutnow-title": "ບໍ່ສາມາດອອກຈາກລະບົບໄດ້ໃນຂະນະນີ້",
+       "welcomeuser": "ຍິນດີຕ້ອນຮັບ, $1!",
+       "welcomecreation-msg": "ບັນຊີຜູ້ໃຊ້ຂອງທ່ານໄດ້ຖືກສ້າງຂຶ້ນແລ້ວ.\nທ່ານສາມາດປ່ຽນແປງ[[Special:Preferences|ການຕັ້ງຄ່າ]]ຂອງທ່ານໃນ {{SITENAME}} ຖ້າທ່ານຕ້ອງການ.",
+       "yourname": "ຊື່ຜູ້ໃຊ້:",
+       "userlogin-yourname": "ຊື່ຜູ້ໃຊ້",
+       "userlogin-yourname-ph": "ປ້ອນຊື່ຜູ້ໃຊ້ຂອງທ່ານ",
+       "createacct-another-username-ph": "ປ້ອນຊື່ຜູ້ໃຊ້",
+       "yourpassword": "ລະຫັດຜ່ານ:",
+       "userlogin-yourpassword": "ລະຫັດຜ່ານ",
+       "userlogin-yourpassword-ph": "ປ້ອນລະຫັດຜ່ານຂອງທ່ານ",
+       "createacct-yourpassword-ph": "ປ້ອນລະຫັດຜ່ານ",
+       "yourpasswordagain": "ພິມລະຫັດຜ່ານໃໝ່ອີກ:",
+       "createacct-yourpasswordagain": "ຢືນຢັນລະຫັດຜ່ານ",
+       "createacct-yourpasswordagain-ph": "ປ້ອນລະຫັດຜ່ານໃໝ່ອີກ",
+       "userlogin-remembermypassword": "ໃຫ້ຂ້ອຍຢູ່ໃນລະບົບຕໍ່ໄປ",
+       "userlogin-signwithsecure": "ໃຊ້ການເຊື່ອມຕໍ່ແບບປອດໄພ",
+       "cannotlogin-title": "ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້",
+       "cannotlogin-text": "ບໍ່ສາມາດດຳເນີນການເຂົ້າສູ່ລະບົບໄດ້.",
+       "cannotloginnow-title": "ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້ໃນຂະນະນີ້",
+       "cannotloginnow-text": "ບໍ່ສາມາດດຳເນີນການເຂົ້າສູ່ລະບົບໄດ້ເມື່ອກຳລັງໃຊ້ $1 ຢູ່.",
+       "cannotcreateaccount-title": "ບໍ່ສາມາດສ້າງບັນຊີໄດ້",
+       "cannotcreateaccount-text": "ການສ້າງບັນຊີໂດຍກົງບໍ່ໄດ້ຖືກເປີດໃຊ້ໃນວິກິນີ້.",
+       "yourdomainname": "ໂດເມນຂອງທ່ານ:",
+       "password-change-forbidden": "ທ່ານບໍ່ສາມາດປ່ຽນລະຫັດຜ່ານໃນວິກິນີ້ໄດ້.",
+       "login": "ເຂົ້າສູ່ລະບົບ",
+       "login-security": "ຢືນຢັນຕົວຕົນຂອງທ່ານ",
+       "nav-login-createaccount": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
+       "userlogin": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
+       "userloginnocreate": "ເຂົ້າສູ່ລະບົບ",
+       "logout": "ອອກຈາກລະບົບ",
+       "userlogout": "ອອກຈາກລະບົບ",
+       "notloggedin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
+       "userlogin-noaccount": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່?",
+       "userlogin-joinproject": "ເຂົ້າຮ່ວມກັບ {{SITENAME}}",
        "nologin": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່? $1.",
        "nologinlink": "ສ້າງບັນຊີໃໝ່",
        "createaccount": "ສ້າງບັນຊີ",
-       "gotaccount": "ມີ ບັນຊີແລ້ວບໍ? '''$1'''.",
-       "gotaccountlink": "ເຊັນເຂົ້າ",
+       "gotaccount": "ມີບັນຊີແລ້ວບໍ? $1.",
+       "gotaccountlink": "ເຂົ້າສູ່ລະບົບ",
+       "userlogin-resetlink": "ລືມຂໍ້ມູນການເຂົ້າສູ່ລະບົບຂອງທ່ານບໍ່?",
+       "userlogin-resetpassword-link": "ລືມລະຫັດຜ່ານຂອງທ່ານບໍ່?",
+       "userlogin-helplink2": "ວິທີໃຊ້ການເຂົ້າສູ່ລະບົບ",
+       "userlogin-loggedin": "ທ່ານໄດ້ເຂົ້າສູ່ລະບົບໃນຊື່ {{GENDER:$1|$1}} ແລ້ວ.\nກະລຸນາໃຊ້ແບບຟອມຂ້າງລຸ່ມເພື່ອເຂົ້າສູ່ລະບົບໃນຊື່ອື່ນໆ.",
        "createaccountmail": "ໃຊ້ລະຫັດຜ່ານແບບສຸ່ມຊົ່ວຄາວແລະສົ່ງມັນໄປໃຫ້ທີ່ຢູ່ອີເມວທີ່ລະບຸ",
-       "badretype": "ລະຫັດຜ່ານ ທີ່ ທ່ານພິມຄືນ ບໍ່ຖືກກັບ ທີ່ພິມກ່ອນ.",
-       "loginerror": "ມີບັນຫາໃນການເຊັນເຂົ້າ",
+       "badretype": "ລະຫັດຜ່ານທີ່ທ່ານໄດ້ພິມຄືນບໍ່ກົງກັບທີ່ພິມກ່ອນ.",
+       "loginerror": "ຂໍ້ຜິດພາດໃນການເຂົ້າສູ່ລະບົບ",
+       "createacct-error": "ຂໍ້ຜິດພາດໃນການສ້າງບັນຊີ",
+       "createaccounterror": "ບໍ່ສາມາດສ້າງບັນຊີໄດ້: $1",
        "loginsuccesstitle": "ເຂົ້າສູ່ລະບົບແລ້ວ",
        "loginsuccess": "'''ທ່ານ ເຊັນເຂົ້າ  {{SITENAME}} ໃນນາມ \"$1\".'''",
        "wrongpassword": "ລະຫັດຜ່ານບໍ່ຖືກ. ກະລຸນາເຮັດຄືນໃໝ່.",
        "wrongpasswordempty": "ບໍ່ມີລະຫັດຜ່ານຖືກພິມເຂົ້າ. ກະລຸນາເຮັດຄືນໃໝ່.",
        "mailmypassword": "ຕັ້ງຄ່າລະຫັດຜ່ານໃໝ່",
+       "blocked-mailpassword": "ທີ່ຢູ່ IP ຂອງທ່ານໄດ້ຖືກບລັອກບໍ່ໃຫ້ແກ້ໄຂ. ເພື່ອເປັນການປ້ອງກັນການໃຊ້ງານໃນທາງທີ່ຜິດ, ຈຶ່ງບໍ່ອະນຸຍາດໃຫ້ໃຊ້ການກູ້ຄືນລະຫັດຜ່ານໂດຍໃຊ້ທີ່ຢູ່ IP ນີ້.",
        "acct_creation_throttle_hit": "ຂໍໂທດຫຼາຍໆ, ທ່ານ ໄດ້ສ້າງ $1 ບັນຊີແລ້ວ. ທ່ານ ບໍ່ສາມາດ ສ້ງບັນຊີໄດ້ອີກ.",
        "emailauthenticated": "ອີເມລຂອງທ່ານໄດ້ຖືກຢືນຢັນແລ້ວເມື່ອວັນທີ່ $2 ເວລາ $3.",
        "emailconfirmlink": "ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ",
        "accountcreated": "ບັນຊີ ໄດ້ຖືກສ້າງ ແລ້ວ",
-       "accountcreatedtext": "ບັນຊີ ຂອງ  $1 ໄດ້ ຖືກສ້າງແລ້ວ.",
+       "accountcreatedtext": "ບັນຊີຜູ້ໃຊ້ຂອງ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ໄດ້ຖືກສ້າງຂຶ້ນແລ້ວ.",
        "pt-login": "ເຂົ້າສູ່ລະບົບ",
        "pt-createaccount": "ສ້າງບັນຊີ",
        "changepassword": "ປ່ຽນລະຫັດຜ່ານ",
        "newpassword": "ລະຫັດຜ່ານໃໝ່:",
        "retypenew": "ພິມລະຫັດຜ່ານໃໝ່ອີກ:",
        "resetpass_submit": "ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ",
-       "changepassword-success": "ສຳà»\80ລັàº\94àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87 àº¥àº°àº«àº±àº\94àº\9cà»\88າàº\99àº\82ອàº\87àº\97à»\88າàº\99à»\81ລà»\89ວ! àº\94ຽວàº\99ີà»\89 àº\97à»\88າàº\99 à»\80àº\8aັà»\88àº\99à»\80àº\82ົà»\89າ à»\83àº\99 ...",
+       "changepassword-success": "ລະຫັàº\94àº\9cà»\88າàº\99àº\82ອàº\87àº\97à»\88າàº\99àº\96ືàº\81àº\9bà»\88ຽàº\99à»\81ລà»\89ວ!",
        "passwordreset-invalidemail": "ທີ່ຢູ່ອີເມລບໍ່ຖືກຕ້ອງ",
        "bold_sample": "ໂຕໜັງສືເຂັ້ມ",
        "bold_tip": "ໂຕໜັງສືເຂັ້ມ",
        "preview": "ລອງເບິ່ງຜົນ",
        "showpreview": "ລອງເບິ່ງຜົນ",
        "showdiff": "ສະແດງສ່ວນຕ່າງ",
-       "anoneditwarning": "'''ເຕືອນ:''' ທ່ານ ບໍ່ໄດ້ເຊັນເຂົ້າ. ທີ່ຢູ່ IP ຂອງ ທ່ານ ຈະຖືກບັນທຶກໄວ້ ໃນ ປະຫວັດການດັດແກ້ ຂອງ ໜ້ານີ້.",
+       "anoneditwarning": "<strong>ເຕືອນ:</strong> ທ່ານບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ. ທຸກໆຄົນຈະເຫັນທີ່ຢູ່ IP ຂອງທ່ານ ຖ້າທ່ານເຮັດການແກ້ໄຂໃດໆ. ຖ້າທ່ານ<strong>[$1 ເຂົ້າສູ່ລະບົບ]</strong> ຫຼື <strong>[$2 ສ້າງບັນຊີ]</strong>, ການແກ້ໄຂຂອງທ່ານຈະຖືວ່າແມ່ນຂອງຜູ້ໃຊ້ຄົນນັ້ນແທນ, ນອກຈາກນີ້ ຍັງມີປະໂຫຍດອື່ນໆອີກຫຼາຍຢ່າງນຳກັນ.",
        "blockedtitle": "ຜູ້ໃຊ້ຖືກຫ້າມ",
        "whitelistedittext": "ທ່ານ ຈະຕ້ອງ  $1 ເພື່ອ ຈະດັດແກ້.",
        "loginreqtitle": "ຈຳເປັນຕ້ອງ ເຊັນເຂົ້າ",
-       "loginreqlink": "ເຊັນເຂົ້າ",
+       "loginreqlink": "ເຂົ້າສູ່ລະບົບ",
+       "loginreqpagetext": "ກະລຸນາ $1 ເພື່ອເຂົ້າເບິ່ງໜ້າອື່ນໆ.",
        "accmailtitle": "ໄດ້ສົ່ງ ລະຫັດຜ່ານ ໄປແລ້ວ.",
        "accmailtext": "ລະຫັດຜ່ານ ຂອງ \"$1\" ໄດ້ຖືກສົ່ງໄປ  $2 ແລ້ວ.",
        "newarticle": "(ໃໝ່)",
        "newarticletext": "ທ່ານ ໄດ້ມາຮອດ ໜ້າທີ່ຍັງບໍ່ໄດ້ຖືກສ້າງຂຶ້ນເທື່ອ. ທ່ານ ສາມາດເລີ່ມ ສ້າງໜ້າ ໂດຍ ພິມໃສ່ ກັບ ຂ້າງລຸ່ມ.(ເບິ່ງລາຍລະອຽດຕື່ມ ທີ່ [$1 ໜ້າຊ່ວຍເຫຼືອ]).\nຖ້າ ທ່ານ ມາຮອດນີ້ ໂດຍຄວາມຜິດພາດ, ກະລຸນາ ກົດ ປຸ່ມ '''ກັບຄືນ''', ຢູ່ ໂປຣແກຣມ ທ່ອງເວັບ ຂອງທ່ານ.",
-       "noarticletext": "àº\8dັàº\87àº\9aà»\8dà»\88ມີà»\80àº\99ືà»\89ອà»\83àº\99 àº¢àº¹à»\88 à»\9cà»\89າàº\99ີà»\89, àº\97à»\88າàº\99ສາມາàº\94 [[Special:Search/{{PAGENAME}}|àº\84ົà»\89àº\99ຫາà»\9cà»\89າຫົວàº\82à»\8dà»\89àº\99ີà»\89]] àº«àº¼àº· [{{fullurl:{{FULLPAGENAME}}|action=edit}} àº\94ັàº\94à»\81àº\81à»\89ໜ້ານີ້].",
-       "previewnote": "'''ນີ້ ແມ່ນ ການລອງເບິ່ງຜົນເທົ່ານັ້ນ; ການດັດແກ້ຍັງບໍ່ທັນຖືກບັນທຶກ!'''",
+       "noarticletext": "àº\95ອàº\99àº\99ີà»\89à»\9cà»\89າàº\99ີà»\89àº\8dັàº\87àº\9aà»\8dà»\88ມີà»\80àº\99ືà»\89ອà»\83àº\99à»\83àº\94à»\86, àº\97à»\88າàº\99ສາມາàº\94[[Special:Search/{{PAGENAME}}|àº\84ົà»\89àº\99ຫາà»\9cà»\89າຫົວàº\82à»\8dà»\89àº\99ີà»\89]]à»\83àº\99à»\9cà»\89າອືà»\88àº\99à»\86, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} àº\84ົà»\89àº\99ຫາàº\9aັàº\99àº\97ຶàº\81ອືà»\88àº\99à»\86àº\97ີà»\88àº\81à»\88ຽວàº\82à»\89ອàº\87], àº«àº¼àº· [{{fullurl:{{FULLPAGENAME}}|action=edit}} àºªà»\89າàº\87ໜ້ານີ້].",
+       "previewnote": "<strong>ຈຳໄວ້ວ່ານີ້ແມ່ນພຽງການສະແດງໂຕຢ່າງເທົ່ານັ້ນ.</strong>\nການແກ້ໄຂຂອງທ່ານຍັງບໍ່ທັນຖືກບັນທຶກ!",
        "editing": "ພວມດັດແກ້ $1",
        "editingsection": "ພວມດັດແກ້ $1 (ພາກ)",
        "yourtext": "ເນື້ອໃນ",
        "page_first": "ທຳອິດ",
        "page_last": "ສຸດທ້າຍ",
        "histlegend": "ເລືອກສ່ວນຕ່າງ: ເລືອກກັບວົງມົນ ລະຫວ່າງສະບັບ ຢາກສົມທຽບ ແລ້ວ ກົດເອັນເຕີ ຫຼື ປຸ່ນຢູ່ທາງລຸ່ມ.<br />\nຄວາມໝາຍ: (ດຽວນີ້) = ສ່ວນຕ່າງສົມທຽບໃສ່ສະບັບດຽວນີ້,\n(ຫຼ້າສຸດ) = ສ່ວນຕ່າງສົມທຽບໃສ່ສະບັບກ່ອນໜ້ານີ້, M = ດັດແກ້ເລັກນ້ອຍ.",
-       "histfirst": "àº\97ຳອິດ",
-       "histlast": "ຫຼà»\89າສຸດ",
+       "histfirst": "à»\80àº\81ົà»\88າສຸດ",
+       "histlast": "à»\83à»\9dà»\88ສຸດ",
        "rev-delundel": "ສະແດງ/ເຊື່ອງ",
-       "history-title": "àº\9bະຫວັàº\94àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89 ຂອງ \"$1\"",
+       "history-title": "àº\9bະຫວັàº\94àº\81າàº\99à»\81àº\81à»\89à»\84àº\82ຂອງ \"$1\"",
        "lineno": "ແຖວ $1:",
        "compareselectedversions": "ສົມທຽບ ລະຫວ່າງ ສະບັບເລືອກ",
        "editundo": "ກັບຄືນ",
+       "searchresults": "ຜົນການຄົ້ນຫາ",
+       "searchresults-title": "ຜົນການຄົ້ນຫາສຳລັບ \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} ກ່ອນໜ້າ",
        "nextn": "{{PLURAL:$1|$1}} ຕໍ່ໄປ",
+       "shown-title": "ສະແດງ{{PLURAL:$1|ຜົນທີ່ໄດ້ຮັບ}} $1 ລາຍການຕໍ່ໜຶ່ງໜ້າ",
        "viewprevnext": "ເບິ່ງ ($1 {{int:pipe-separator}} $2) ($3).",
        "search-result-size": "$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})",
-       "search-redirect": "(à»\82ອàº\99 $1)",
+       "search-redirect": "(àº\9bà»\88ຽàº\99à»\80ສັà»\89àº\99àº\97າàº\87ມາàº\88າàº\81 $1)",
        "search-relatedarticle": "ກ່ຽວຂ້ອງ",
        "searchrelated": "ກ່ຽວຂ້ອງ",
        "searchall": "ທັງໜົດ",
        "showingresults": "ສະແດງທາງລຸ່ມ ຮອດ {{PLURAL:$1|'''1''' ຜົນ|'''$1''' ຜົນ}} ເລີ່ມຈາກ  #'''$2'''.",
        "preferences": "ການຕັ້ງຄ່າ",
-       "mypreferences": "ຕັ້ງຄ່າ",
+       "mypreferences": "àº\81າàº\99àº\95ັà»\89àº\87àº\84à»\88າ",
        "prefs-edits": "ຈຳນວນການດັດແກ້:",
        "prefs-skin": "ລວດລາຍ",
        "skin-preview": "ລອງເບິ່ງ",
        "prefs-misc": "ແລະອື່ນໆ",
        "saveprefs": "ບັນທຶກ",
        "prefs-editing": "ການດັດແກ້",
-       "rows": "ແຖວ:",
-       "columns": "ຖັນ:",
        "searchresultshead": "ຊອກຫາ",
        "recentchangesdays": "ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:",
-       "recentchangescount": "àº\88ຳàº\99ວàº\99àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89ສະà»\81àº\94àº\87à»\83àº\99àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87ຫຼà»\89າສຸàº\94:",
+       "recentchangescount": "àº\88ຳàº\99ວàº\99àº\81າàº\99à»\81àº\81à»\89à»\84àº\82àº\97ີà»\88àº\95à»\89ອàº\87àº\81າàº\99ສະà»\81àº\94àº\87à»\82àº\94àº\8dàº\9bະລິàº\8dາàº\8d:",
        "savedprefs": "ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຖືກບັນທຶກແລ້ວ.",
-       "timezonelegend": "ເຂດເວລາ",
-       "localtime": "ເວລາທ້ອງຖິ່ນ",
-       "servertime": "ເວລາເຊີເວີ",
+       "timezonelegend": "ເຂດເວລາ:",
+       "localtime": "ເວລາທ້ອງຖິ່ນ:",
+       "servertime": "ເວລາເຊີເວີ:",
        "guesstimezone": "ເອົາເວລາຈາກໂປຣແກຣມທ່ອງເວັບ",
        "allowemail": "ອະນຸຍາດ ໃຫ້ຜູ້ໃຊ້ອື່ນ ສົ່ງອີເມລຫາຂ້ອຍ",
        "prefs-files": "ໄຟລ໌",
        "youremail": "ອີເມລ *:",
-       "username": "ຊື່ຜູ້ໃຊ້:",
+       "username": "{{GENDER:$1|ຊື່ຜູ້ໃຊ້}}:",
        "yourrealname": "ຊື່ແທ້ *:",
        "yourlanguage": "ພາສາ:",
        "yournick": "ຊື່ຫຼິ້ນ:",
        "show": "ສະແດງ",
        "minoreditletter": "ລ",
        "newpageletter": "ມ",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ຫຼັງການປ່ຽນແປງ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|ໄບຕ໌}}ຫຼັງຈາກການປ່ຽນແປງ",
        "recentchangeslinked": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-feed": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-toolbox": "ການປ່ຽນແປງທີ່ກ່ຽວຂ້ອງ",
        "filehist-dimensions": "ມິຕິ",
        "filehist-filesize": "ຂະໜາດໄຟລ໌",
        "filehist-comment": "ຄຳເຫັນ",
-       "imagelinks": "ລິà»\89àº\87àº\84໌",
-       "linkstoimage": "ລິ້ງຄ໌ຕໍ່ໄປນີ້ເຊື່ອມຕໍ່ຫາໄຟລ໌:",
+       "imagelinks": "àº\81າàº\99à»\83àº\8aà»\89à»\84àº\9fລ໌",
+       "linkstoimage": "{{PLURAL:$1|ໜ້າຕໍ່ໄປນີ້ເຊື່ອມໂຍງ|$1 ໜ້າຕໍ່ໄປນີ້ເຊື່ອມໂຍງ}}ຫາໄຟລ໌ນີ້:",
        "nolinkstoimage": "ບໍ່ມີໜ້າໃດ ລິ້ງຄ໌ ຫາ ໄຟລ໌ນີ້.",
        "sharedupload": "ໄຟລ໌ນີ້ແມ່ນການອັບໂຫຼດຣ່ວມ ແລະ ອາດຖືກໃຊ້ໂດຍໂຄງການອື່ນໆ.",
        "listredirects": "ລາຍການການໂອນໜ້າ",
        "undeletepagetext": "ໜ້າຕ່ອໄປນີ້ຖຶກລຶບໄປແຕ່ຍັງຄົງຢູ່ໃນກຸທີ່ສາມາດຮຽກຄືນໄດ້ (ກຸຂໍ້ມູນອາດຖຶກລຶບເປັນລະຍະ)",
        "cannotundelete": "ບໍ່ສາມາດ ກັບຄືນ ຫາສະບັບກ່ອນການລຶບ; ບາງຄົນອາດເຮັດກ່ອນແລ້ວ.",
        "undelete-search-submit": "ຊອກຫາ",
-       "namespace": "àº\82ອàº\9aà»\80àº\82àº\94àº\8aືà»\88:",
+       "namespace": "àº\8aືà»\88àº\82ອàº\9aà»\80àº\82àº\94:",
        "blanknamespace": "(ຫຼັກ)",
        "contributions": "ການປະກອບສ່ວນ",
        "mycontris": "ປະກອບສ່ວນ",
        "ipblocklist": "ລາຍການ ທີ່ຢູ່ IP ແລະ ຊື່ຜູ້ໃຊ້ ທີ່ຖືກຫ້າມ",
        "blocklink": "ຫ້າມ",
        "contribslink": "ເລື່ອງທີ່ຂຽນ",
-       "autoblocker": "ຫà»\89າມà»\82àº\94àº\8dອັàº\94àº\95າà»\82àº\99ມັàº\94 àº\8dà»\89ອàº\99 àº\97ີà»\88ຢູà»\88 IP àº\82ອàº\87àº\97à»\88າàº\99 àº\96ືàº\81à»\83àº\8aà»\89à»\82àº\94àº\8d \"[[User:$1|$1]]\" à»\83àº\99à»\84ລàº\8dະຫຼັàº\87. à»\80ຫàº\94àº\9cົàº\99à»\83àº\99àº\81າàº\99ຫà»\89າມ  $1 à»\81ມà»\88àº\99 : \"$2\"",
+       "autoblocker": "àº\96ືàº\81àº\9aລັອàº\81à»\82àº\94àº\8dອັàº\94àº\95ະà»\82àº\99ມັàº\94àº\8dà»\89ອàº\99àº\97ີà»\88ຢູà»\88 IP àº\82ອàº\87àº\97à»\88າàº\99àº\96ືàº\81à»\83àº\8aà»\89à»\82àº\94àº\8d \"[[User:$1|$1]]\" à»\80ມືà»\88ອà»\84ວà»\86àº\99ີà»\89.\nà»\80ຫàº\94àº\9cົàº\99à»\83àº\99àº\81າàº\99àº\9aລັອàº\81 $1 à»\81ມà»\88àº\99 \"$2\"",
        "blocklogpage": "ບັນທຶກການຫ້າມ",
        "blocklogentry": "ໄດ້ຫ້າມ \"[[$1]]\" ຈົນຮອດ $2 $3",
        "move-page-legend": "ຍ້າຍໜ້າ",
        "tooltip-pt-mycontris": "ລາຍການປະກອບສ່ວນຂອງຂ້ອຍ",
        "tooltip-pt-login": "ນີ້ບໍ່ແມ່ນການບັງຄັບ. ແຕ່ຢ່າງໃດກໍຕາມ, ທ່ານຄວນທີ່ຈະເຂົ້າສູ່ລະບົບ.",
        "tooltip-pt-logout": "ເຊັນອອກ",
-       "tooltip-pt-createaccount": "àº\99ີà»\89ິàº\9aà»\8dà»\88à»\81ມà»\88àº\99àº\81າàº\99àº\9aັàº\87àº\84ັàº\9a. à»\81àº\95à»\88ຢà»\88າàº\87à»\83àº\94àº\81à»\8dàº\95າມ, àº\97à»\88າàº\99àº\84ວàº\99àº\97ີà»\88àº\88ະສà»\89າàº\87àº\9aັàº\99àº\8aີà»\81ລະà»\80àº\82ົà»\89າສູà»\88ລະàº\9aົàº\9a.",
+       "tooltip-pt-createaccount": "ນີ້ບໍ່ແມ່ນການບັງຄັບ. ແຕ່ຢ່າງໃດກໍຕາມ, ທ່ານຄວນທີ່ຈະສ້າງບັນຊີແລະເຂົ້າສູ່ລະບົບ.",
        "tooltip-ca-talk": "ສົນທະນາກ່ຽວກັບເນື້ອໃນຂອງໜ້າ",
        "tooltip-ca-edit": "ແກ້ໄຂໜ້ານີ້",
-       "tooltip-ca-addsection": "à»\80àº\9eີà»\88ມ àº\84ຳà»\80ຫັàº\99 à»\83ສà»\88 àº\81າàº\99ສົàº\99àº\97ະàº\99າàº\99ີà»\89.",
+       "tooltip-ca-addsection": "à»\80ລີà»\88ມàº\9eາàº\81à»\83à»\9dà»\88",
        "tooltip-ca-viewsource": "ໜ້ານີ້ຖືກປົກປ້ອງ. ທ່ານສາມາດເບິ່ງຊອສ.",
        "tooltip-ca-history": "ລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
        "tooltip-ca-protect": "ປົກປ້ອງໜ້ານີ້",
        "tooltip-search": "ຄົ້ນຫາ {{SITENAME}}",
        "tooltip-search-go": "ໄປຫາໜ້າທີ່ມີຊື່ທີ່ແນ່ນອນນີ້ຖ້າມັນມີຢູ່",
        "tooltip-search-fulltext": "ຄົ້ນຫາຂໍ້ຄວາມນີ້ໃນໜ້າ",
-       "tooltip-p-logo": "à»\80àº\82ົà»\89າສູà»\88ໜ້າຫຼັກ",
+       "tooltip-p-logo": "ຢà»\89ຽມàº\8aົມໜ້າຫຼັກ",
        "tooltip-n-mainpage": "ໄປເບິ່ງໜ້າຫຼັກ",
-       "tooltip-n-mainpage-description": "à»\80àº\82ົà»\89າສູà»\88ໜ້າຫຼັກ",
+       "tooltip-n-mainpage-description": "à»\80àº\82ົà»\89າຢà»\89ຽມàº\8aົມໜ້າຫຼັກ",
        "tooltip-n-portal": "ກ່ຽວກັບໂຄງການ, ສິ່ງທີ່ທ່ານເຮັດໄດ້, ແລະບ່ອນທີ່ສາມາດຫາສິ່ງຕ່າງໆໄດ້",
        "tooltip-n-currentevents": "ຄົ້ນຫາມູນກ່ຽວກັບກິດຈະກຳທີ່ກຳລັງດຳເນີນ",
        "tooltip-n-recentchanges": "ລາຍການການປ່ຽນແປງລ້າສຸດໃນວິກິ",
        "tooltip-t-permalink": "ລິງຄ໌ຖາວອນມາລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
        "tooltip-ca-nstab-main": "ເບິ່ງໜ້າເນື້ອໃນ",
        "tooltip-ca-nstab-user": "ເບິ່ງໜ້າຜູ້ໃຊ້",
+       "tooltip-ca-nstab-special": "ໜ້ານີ້ແມ່ນໜ້າພິເສດ, ແລະບໍ່ສາມາດແກ້ໄຂໄດ້",
        "tooltip-ca-nstab-project": "ເບິ່ງໜ້າໂຄງການ",
-       "tooltip-ca-nstab-image": "ເບິງໜ້າໄຟລ໌",
+       "tooltip-ca-nstab-image": "à»\80àº\9aິà»\88àº\87à»\9cà»\89າà»\84àº\9fລà»\8c",
        "tooltip-ca-nstab-template": "ເບິ່ງແມ່ແບບ",
        "tooltip-ca-nstab-category": "ເບິ່ງ ໜ້າໝວດ",
        "tooltip-minoredit": "ໝາຍວ່າແມ່ນການດັດແກ້ເລັກນ້ອຍ",
        "thumbsize": "ຂະໜາດສະແດງ:",
        "file-info-size": "$1 × $2  ປິກເຊລ, ຂະໜາດໄຟລ໌: $3, MIME type: $4",
        "file-nohires": "ບໍ່ມີຂະໜາດລະອຽດກວ່າ",
-       "show-big-image": "à»\80àº\95ັມàº\82ະà»\9cາàº\94",
+       "show-big-image": "à»\84àº\9fລà»\8càº\95ົà»\89àº\99ສະàº\9aັàº\9a",
        "show-big-image-size": "$1 × $2 ພິກເຊວ",
        "newimages": "ໄຟລ໌ຮູບໃໝ່",
        "newimages-summary": "ໜ້າພິເສດນີ້ສະແດງໄຟລ໌ທີ່ຖຶກອັປໂຫຼດຫຼ້າສຸດ",
index d9b5e3a..905d05e 100644 (file)
        "views": "Peržiūros",
        "toolbox": "Įrankiai",
        "tool-link-userrights": "Keisti {{GENDER:$1|naudotojo|naudotojos}} grupes",
+       "tool-link-userrights-readonly": "Žiūrėti {{GENDER:$1|vartotojo|vartotojos}} grupes",
        "tool-link-emailuser": "Siųsti {{GENDER:$1|šiam naudotojui|šiai naudotojai}} el. laišką",
        "userpage": "Rodyti naudotojo puslapį",
        "projectpage": "Rodyti projekto puslapį",
        "ok": "Gerai",
        "retrievedfrom": "Gauta iš „$1“",
        "youhavenewmessages": "Jūs turite $1 ($2).",
-       "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito naudotojo|$3 naudotojų}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jūs gavote}} $1 iš {{PLURAL:$3|kito naudotojo|$3 naudotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
        "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}",
        "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}",
        "saveprefs": "Išsaugoti",
        "restoreprefs": "Grąžinti visus numatytuosius nustatymus (visose skiltyse)",
        "prefs-editing": "Redagavimas",
-       "rows": "Eilutės:",
-       "columns": "Stulpeliai:",
        "searchresultshead": "Paieškos nustatymai",
        "stub-threshold": "Ribinė reikšmė nepilnų puslapių nuorodų formatavimui ($1):",
        "stub-threshold-sample-link": "pavyzdys",
        "editusergroup": "Redaguoti {{GENDER:$1|naudotojo}} grupes",
        "editinguser": "Redaguojamos {{GENDER:$1|naudotojo}} <strong>[[User:$1|$1]]</strong> $2 teisės",
        "userrights-editusergroup": "Redaguoti naudotojų grupes",
+       "userrights-viewusergroup": "Žiūrėti naudotojo grupes",
        "saveusergroups": "Saugoti {{GENDER:$1|naudotojo}} grupes",
        "userrights-groupsmember": "Narys:",
        "userrights-groupsmember-auto": "Narys automatiškai:",
        "action-upload_by_url": "įkelti šią rinkmeną iš URL adreso",
        "action-writeapi": "naudotis rašymo API",
        "action-delete": "ištrinti šį puslapį",
-       "action-deleterevision": "ištrinti šią reviziją",
-       "action-deletedhistory": "žiūrėti šio ištrinto puslapio istoriją",
+       "action-deleterevision": "ištrinti revizijas",
+       "action-deletelogentry": "trinti žurnalo įrašus",
+       "action-deletedhistory": "žiūrėti puslapio ištrintą istoriją",
        "action-browsearchive": "ieškoti ištrintų puslapių",
-       "action-undelete": "atkurti šį puslapį",
+       "action-undelete": "atkurti puslapius",
        "action-suppressrevision": "peržiūrėti ir atkurti šią paslėptą versiją",
        "action-suppressionlog": "peržiūrėti šį privatų registrą",
        "action-block": "neleisti šiam naudotojui redaguoti",
        "action-userrights-interwiki": "keisti naudotojų teises kitose wiki svetainėse",
        "action-siteadmin": "užrakinti ar atrakinti duomenų bazę",
        "action-sendemail": "siųsti e-mail laiškus",
+       "action-editmyoptions": "keisti savo nustatymus",
        "action-editmywatchlist": "redaguoti savo stebėjimų sąrašą",
        "action-viewmywatchlist": "rodyti savo stebėjimų sąrašą",
        "action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
        "recentchanges-legend-heading": "<strong>Paaiškinimai:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
        "recentchanges-submit": "Rodyti",
+       "rcfilters-activefilters": "Aktyvūs filtrai",
+       "rcfilters-invalid-filter": "Negalimas filtras",
+       "rcfilters-filterlist-title": "Filtrai",
+       "rcfilters-filterlist-noresults": "Nerastas toks filtras",
+       "rcfilters-filtergroup-registration": "Vartotojo registracija",
+       "rcfilters-filter-registered-label": "Registruoti",
+       "rcfilters-filter-unregistered-label": "Neregistruoti",
+       "rcfilters-filter-editsbyself-label": "Jūsų keitimai",
+       "rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
+       "rcfilters-filter-editsbyother-label": "Kitų keitimai",
+       "rcfilters-filter-editsbyother-description": "Kaitimai sukurti kitų vartotojų (ne jūsų).",
+       "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Naujokai",
+       "rcfilters-filter-userExpLevel-learner-label": "Mokiniai",
+       "rcfilters-filter-userExpLevel-experienced-label": "Patyrę vartotojai",
+       "rcfilters-filter-userExpLevel-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+       "rcfilters-filter-bots-label": "Robotas",
+       "rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
+       "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
+       "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
+       "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-major-label": "Nesmulkūs pakeitimai",
+       "rcfilters-filter-major-description": "Keitimai, nepažymėti kaip smulkūs.",
+       "rcfilters-filtergroup-changetype": "Pakeitimo tipas",
+       "rcfilters-filter-pageedits-label": "Puslapių keitimai",
+       "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ų.",
        "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "rcshowhideminor": "$1 smulkius keitimus",
        "apisandbox-alert-field": "Šio lauko reikšmė yra neteisinga.",
        "apisandbox-continue": "Tęsti",
        "apisandbox-continue-clear": "Išvalyti",
+       "apisandbox-multivalue-all-values": "$1 (Visos reikšmės)",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
        "booksources-search": "Ieškoti",
        "proxyblockreason": "Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.",
        "sorbsreason": "Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.",
        "sorbs_create_account_reason": "Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros",
+       "softblockrangesreason": "Anoniminiai įnašai nėra leidžiami iš jūsų IP adreso ($1). Prašome prisijungti.",
        "xffblockreason": "IP adresas esantys X-Forwarded-For antraštėje, jūsų ar tarpinio serverio, kuriuo jūs naudojatės, buvo užblokuotas. Originali bloko priežastis buvo: $1",
        "cant-see-hidden-user": "Naudotojas, kurį bandote užblokuoti, jau yra užblokuotas arba paslėptas.\nKadangi jūs neturi hideuser teisės, jūs negalite pamatyti arba pakeisti naudotojo blokavimo.",
        "ipbblocked": "Jūs negalite blokuoti ar atblokuoti kitų naudotojų, nes pats esate užblokuotas",
        "pageinfo-length": "Puslapio ilgis (baitais)",
        "pageinfo-article-id": "Puslapio ID",
        "pageinfo-language": "Puslapio turinio kalba",
+       "pageinfo-language-change": "keisti",
        "pageinfo-content-model": "Puslapio turinio modelis",
        "pageinfo-content-model-change": "keisti",
        "pageinfo-robot-policy": "Robotų indeksavimas",
        "htmlform-user-not-exists": "<strong>$1</strong> neegzistuoja.",
        "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
+       "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|ištrynė}} buvusį nukreipimą $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|atkūrė}} puslapį $3",
        "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4",
        "feedback-useragent": "Vartotojo veiksnys:",
        "searchsuggest-search": "Ieškoti",
        "searchsuggest-containing": "turintys",
-       "api-error-autoblocked": "Jūsų IP adresas buvo automatiškai užblokuotas, nes jį naudojo užblokuotas naudotojas.",
-       "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
-       "api-error-blocked": "Jus buvote užblokuotas, kad negalėtumėte redaguoti.",
-       "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
-       "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu.",
-       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo ištrintas|buvo ištrinti}}.",
-       "api-error-empty-file": "Pateikta failas buvo tuščias.",
        "api-error-emptypage": "Kurti naujus, tuščius puslapius neleidžiama.",
-       "api-error-fetchfileerror": "Vidinė klaida: Kažkas nutiko gaunant failą.",
-       "api-error-fileexists-forbidden": "Failas, kurio pavadinimas \"$1\" jau egzistuoja, ir negali būti perrašytas.",
-       "api-error-fileexists-shared-forbidden": "Failas, kurio pavadinimas \"$1\" jau egzistuoja bendro naudojimo failų saugykloje, ir negali būti perrašytas.",
-       "api-error-file-too-large": "Failą, kurį pateikėte buvo per didelis.",
-       "api-error-filename-tooshort": "Failo vardas yra per trumpas.",
-       "api-error-filetype-banned": "Šis failų tipas yra uždraustas.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nėra leistinas failo tipas|nėra leistini failo tipai}}.{{PLURAL:$3|Leistinas failo tipas yra|Leistini failo tipai yra}} $2.",
-       "api-error-filetype-missing": "Failas neturi galūnės.",
-       "api-error-hookaborted": "Pakeitimą, kurį bandėte atlikti, nutraukė priedas.",
-       "api-error-http": "Vidinė klaida: nepavyko prisijungti prie serverio.",
-       "api-error-illegal-filename": "Failo vardas neleidžiamas.",
-       "api-error-internal-error": "Vidinė klaida: Kažkas ne taip su jūsų įkėlimo apdorojimu wiki.",
-       "api-error-invalid-file-key": "Vidinė klaida: failas nerastas saugykloje.",
-       "api-error-missingparam": "Vidinė klaida: Trūksta reikalingų parametrų.",
-       "api-error-missingresult": "Vidinė klaida: nepavyko nustatyti, ar pavyko nukopijuoti.",
-       "api-error-mustbeloggedin": "Jūs turite būti prisijungęs kad galėtumėte įkelti failus.",
-       "api-error-mustbeposted": "Vidinė klaida: prašymas reikalauja HTTP POST.",
-       "api-error-noimageinfo": "Įkelti pavyko, bet serveris nepateikė mums jokios informacijos apie failą.",
-       "api-error-nomodule": "Vidinė klaida: nėra nustatytas įkėlimų modulis.",
-       "api-error-ok-but-empty": "Vidinė klaida: nėra atsakymo iš serverio.",
-       "api-error-overwrite": "Perrašymas esamą failą neleidžiamas.",
-       "api-error-ratelimited": "Jūs per trumpą laiko tarpą bandote įkelti daugiau failų, nei leidžiama šiame projekte.\nPabandykite dar kartą po keleto minučių.",
-       "api-error-stashfailed": "Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.",
        "api-error-publishfailed": "Vidinė klaida: serveriui nepavyko paskelbti laikino failo.",
-       "api-error-stasherror": "Įvyko klaida keliant failą į laikyklą.",
-       "api-error-stashedfilenotfound": "Saugomas failas nebuvo rastas bandant įkelti jį iš saugyklos.",
-       "api-error-stashpathinvalid": "Kelias, kuriuo saugomas failas būtų surastas yra negalimas.",
-       "api-error-stashfilestorage": "Įvyko klaida saugant failą saugykloje.",
-       "api-error-stashzerolength": "Serveris negalėjo išsaugoti failo, nes jo ilgis yra nulinis.",
-       "api-error-stashnotloggedin": "Jūs turite būti prisijungęs jei norite išsaugoti failus įkėlimų saugykloje.",
-       "api-error-stashwrongowner": "Failas, kuri bandėte pasiekti saugykloje jums nepriklauso.",
-       "api-error-stashnosuchfilekey": "Failo raktas, kurį bandėte pasiekti saugykloje neegzistuoja.",
-       "api-error-timeout": "Serveris neatsakė per numatytą laiką.",
-       "api-error-unclassified": "Įvyko nežinoma klaida",
-       "api-error-unknown-code": "Nežinoma klaida: \" $1 \"",
-       "api-error-unknown-error": "Vidinė klaida: kažkas nutiko bandant įkelti failą.",
+       "api-error-stashfailed": "Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.",
        "api-error-unknown-warning": "Nežinomas įspėjimas: $1",
        "api-error-unknownerror": "Nežinoma klaida: \"$1\"",
-       "api-error-uploaddisabled": "Įkėlimas išjungtas šioje wiki.",
-       "api-error-verification-error": "Šis failas gali būti sugadintas arba turi neteisingą papildinį.",
-       "api-error-was-deleted": "Failas tokiu pavadinimu anksčiau jau yra buvęs įkeltas, o paskui ištrintas.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutė|minutės|minučių}}",
        "duration-hours": "$1 {{PLURAL:$1|valanda|valandos|valandų}}",
        "pagelang-language": "Kalba",
        "pagelang-use-default": "Naudoti numatytąją kalbą",
        "pagelang-select-lang": "Pasirinkite kalbą",
+       "pagelang-reason": "Priežastis",
        "pagelang-submit": "Pateikti",
+       "pagelang-nonexistent-page": "Puslapis $1 neegzistuoja.",
+       "pagelang-db-failed": "Duomenų bazei nepavyko pakeisti puslapio kalbos.",
        "right-pagelang": "Keisti puslapio kalbą",
        "action-pagelang": "keisti puslapio kalbą",
        "log-name-pagelang": "Kalbos keitimų žurnalas",
        "special-characters-title-emdash": "em brūkšnys",
        "special-characters-title-minus": "minuso ženklas",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
+       "mw-widgets-mediasearch-input-placeholder": "Ieškoti medijų",
+       "mw-widgets-mediasearch-noresults": "Rezultatų nerasta.",
        "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
        "mw-widgets-titleinput-description-redirect": "nukreipti į $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Pridėti kategoriją...",
        "sessionmanager-tie": "Negalima kombinuoti kelių užklausų autentikacijos tipų: $1.",
        "sessionprovider-generic": "$1 sesijos",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesijos su slapukais",
        "authprovider-resetpass-skip-help": "Praleisti slaptažodžio perstatymą.",
        "specialpage-securitylevel-not-allowed-title": "Neleidžiama",
        "specialpage-securitylevel-not-allowed": "Apgailestaujame, tačiau jūs negalite naudotis šiuo puslapiu, nes nepavyko patvirtinti jūsų tapatybės.",
+       "authpage-cannot-login": "Negalima pradėti prisijungimo.",
+       "authpage-cannot-login-continue": "Negalima tęsti prisijungimo. Greičiausiai baigėsi jūsų sesijos laikas.",
+       "authpage-cannot-create": "Nepavyko pradėti paskyros kūrimo.",
+       "authpage-cannot-create-continue": "Negalima tęsti paskyros kūrimo. Greičiausiai baigėsi jūsų sesijos laikas.",
+       "authpage-cannot-link": "Nepavyko pradėti paskyros susiejimo.",
+       "authpage-cannot-link-continue": "Negalima tęsti paskyros susiejimo. Greičiausiai baigėsi jūsų sesijos laikas.",
        "cannotauth-not-allowed-title": "Teisė nesuteikta",
        "cannotauth-not-allowed": "Jūs negalite naudotis šiuo puslapiu",
        "credentialsform-account": "Paskyros vardas:",
        "linkaccounts-success-text": "Paskyra buvo susieta.",
        "linkaccounts-submit": "Susieti paskyras",
        "unlinkaccounts": "Atsieti paskyras",
-       "unlinkaccounts-success": "Paskyra buvo atsieta."
+       "unlinkaccounts-success": "Paskyra buvo atsieta.",
+       "revid": "apžvalga $1",
+       "pageid": "puslapio ID $1"
 }
index 0adbac6..ee597e7 100644 (file)
@@ -4,7 +4,8 @@
                        "Bonevarluri",
                        "علی ساکی لرستانی",
                        "Mjbmr",
-                       "Hosseinblue"
+                       "Hosseinblue",
+                       "MtDu"
                ]
        },
        "tog-underline": "لینکیا خط وه دومن",
        "pool-queuefull": "صف استخر پر هسی",
        "pool-errorunknown": "خطا ناشناخته",
        "pool-servererror": "شمارنده سرویس استخر ور تیه نی ($1).",
-       "aboutsite": "پۉرۉجھ : دأربارھ",
+       "aboutsite": "پۉرۉجھ : دأربارھ{{SITENAME}}",
        "aboutpage": "Project:دأربارھ",
        "copyright": "مطلب دومن $ 1 هس نکه خلاف هونو ذکر وابی.",
        "copyrightpage": "{{ns:project}}:کۉپی رایت",
index 233b95f..64d015a 100644 (file)
@@ -42,6 +42,7 @@
        "tog-watchdefault": "Pievienot manis izmainītās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchmoves": "Pievienot manis pārvietotās lapas un failus uzraugāmo lapu sarakstam",
        "tog-watchdeletion": "Pievienot manis izdzēstās lapas un failus uzraugāmo lapu sarakstam",
+       "tog-watchuploads": "Pievienot manis augšuplādētos failus uzraugāmo lapu sarakstam",
        "tog-watchrollback": "Pievienot lapas, kurās es novērsu izmaiņas, manam uzraugāmo rakstu sarakstam",
        "tog-minordefault": "Atzīmēt visus labojumus jau sākotnēji par maznozīmīgiem",
        "tog-previewontop": "Parādīt priekšskatījumu virs labošanas lauka, nevis zem",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
-       "anoneditwarning": "'''Uzmanību:''' tu neesi iegājis. Lapas hronoloģijā tiks ierakstīta tava IP adrese.",
+       "anoneditwarning": "<strong>Uzmanību:</strong> tu neesi pieslēdzies. Ja veiksi labojumus, publiski būs redzama tava IP adrese. Ja tu <strong>[$1 pieslēgsies]</strong> vai <strong>[$2 izveidosi kontu]</strong>, visi labojumi tiks piesaistīti tavam kontam; būs arī citi ieguvumi.",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "missingsummary": "'''Atgādinājums''': Tu neesi norādījis izmaiņu kopsavilkumu. Vēlreiz klikšķinot uz \"Saglabāt lapu\", Tavas izmaiņas tiks saglabātas bez kopsavilkuma.",
        "missingcommenttext": "Lūdzu, ievadi tekstu zemāk redzamajā logā!",
        "preferences": "Izvēles",
        "mypreferences": "Izvēles",
        "prefs-edits": "Izmaiņu skaits:",
+       "prefsnologintext2": "Lūdzu pieslēdzies, lai mainītu savas izvēles.",
        "prefs-skin": "Apdare",
        "skin-preview": "Priekšskats",
        "datedefault": "Vienalga",
        "saveprefs": "Saglabāt",
        "restoreprefs": "Atjaunot noklusētos uzstādījumus (visās sadaļās)",
        "prefs-editing": "Labošana",
-       "rows": "Rindiņu skaits:",
-       "columns": "Simbolu skaits rindiņā:",
        "searchresultshead": "Meklēšana",
        "stub-threshold": "Slieksnis <a href=\"#\" class=\"stub\">aizmetņa saites</a> formatēšanai (baiti):",
        "stub-threshold-sample-link": "piemērs",
        "gender-unknown": "Es nevēlos norādīt",
        "gender-male": "Viņš labo viki lapas",
        "gender-female": "Viņa labo viki lapas",
-       "prefs-help-gender": "Dzimums nav obligāti jānorāda (šo parametru programmatūra izmanto, lai ģenerētu paziņojumus, kas atkarīgi no lietotāja dzimuma). Šī informācija būs publiski pieejama.",
+       "prefs-help-gender": "Dzimums nav obligāti jānorāda (šo parametru programmatūra izmanto, lai ģenerētu paziņojumus, kas atkarīgi no dalībnieka dzimuma). Šī informācija būs publiski pieejama.",
        "email": "E-pasts",
        "prefs-help-realname": "Īstais vārds nav obligāti jānorāda.\nJa tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (ieguldījumu {{grammar:lokatīvs|{{SITENAME}}}}).",
        "prefs-help-email": "E-pasta adrese nav obligāta, bet ir nepieciešama nozaudētas paroles atjaunošanai.",
-       "prefs-help-email-others": "Tu arī vari izvēlēties, ka citi var sazināties ar tevi ar saites tavā lietotāja lapā vai lietotāja diskusijas lapā palīdzību. Citiem lietotājiem netiek atklāta tava e-pasta adrese, kad viņi sazinās ar tevi.",
+       "prefs-help-email-others": "Tu arī vari izvēlēties, ka citi var sazināties ar tevi ar saites tavā dalībnieka lapā vai dalībnieka diskusijas lapā palīdzību. Citiem dalībniekiem netiek atklāta tava e-pasta adrese, kad viņi sazinās ar tevi.",
        "prefs-help-email-required": "E-pasta adrese ir obligāta.",
        "prefs-info": "Pamatinformācija",
        "prefs-i18n": "Internacionalizācija",
        "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
        "watchlist-hide": "Slēpt",
        "watchlist-submit": "Rādīt",
+       "wlshowhideminor": "maznozīmīgos labojumus",
        "wlshowhidebots": "boti",
        "wlshowhideliu": "reģistrēti lietotāji",
        "wlshowhideanons": "anonīmi lietotāji",
        "tooltip-pt-anoncontribs": "Labojumi, kas veikti no šīs IP adreses",
        "tooltip-pt-login": "Aicinām tevi ieiet {{grammar:lokatīvs|{{SITENAME}}}}, tomēr tas nav obligāti.",
        "tooltip-pt-logout": "Iziet",
+       "tooltip-pt-createaccount": "Ieteicams izveidot kontu un pieslēgties; tomēr tas nav obligāti.",
        "tooltip-ca-talk": "Diskusija par šī raksta lapu",
        "tooltip-ca-edit": "Labot šo lapu",
        "tooltip-ca-addsection": "Sākt jaunu sadaļu",
        "specialpages-group-login": "Pieslēgties / izveidot kontu",
        "specialpages-group-changes": "Pēdējās izmaiņas un reģistri",
        "specialpages-group-media": "Failu atskaites un augšuplāde",
-       "specialpages-group-users": "Lietotāji un piekļuves tiesības",
+       "specialpages-group-users": "Dalībnieki un piekļuves tiesības",
        "specialpages-group-highuse": "Bieži izmantotās lapas",
        "specialpages-group-pages": "Lapu saraksti",
        "specialpages-group-pagetools": "Lapu rīki",
        "feedback-thanks-title": "Paldies!",
        "searchsuggest-search": "Meklēt {{SITENAME}}",
        "searchsuggest-containing": "Meklējamā frāze:",
-       "api-error-badaccess-groups": "Jums nav atļauts augšupielādēt failus šajā wiki.",
-       "api-error-copyuploaddisabled": "Augšupielāde no URL šajā serverī ir atspējota.",
-       "api-error-filename-tooshort": "Faila nosaukums ir pārāk īss.",
-       "api-error-filetype-banned": "Šis failu veids ir aizliegts.",
-       "api-error-http": "Iekšēja kļūda: Nevar izveidot savienojumu ar serveri.",
-       "api-error-mustbeloggedin": "Tev jāpieslēdzas, lai augšupielādētu failus.",
-       "api-error-ok-but-empty": "Iekšēja kļūda: Nav atbildes no servera.",
-       "api-error-timeout": "Serveris neatbildēja paredzētajā laikā.",
-       "api-error-unclassified": "Nezināma kļūda.",
-       "api-error-unknown-code": "Nezināma kļūda: \" $1 \"",
        "api-error-unknown-warning": "Nezināms brīdinājums: $1",
        "api-error-unknownerror": "Nezināma kļūda: \"$1\"",
-       "api-error-uploaddisabled": "Augšupielāde šajā wiki  ir atslēgta.",
        "limitreport-title": "Parsētāja profilēšanas dati:",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "limitreport-templateargumentsize": "Veidnes argumenta izmērs",
index 1ecf683..3e1e0dc 100644 (file)
        "searcharticle": "Дај",
        "history": "историја",
        "history_short": "Историја",
+       "history_small": "историја",
        "updatedmarker": "подновено од мојата последна посета",
        "printableversion": "Верзија за печатење",
        "permalink": "Постојана врска",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иÑ\82ели Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸ÐºÐ¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\98Ñ\9cи Ñ\98а Ð²Ð°Ñ\88аÑ\82а IP-адÑ\80еÑ\81а Ñ\81оздале {{PLURAL:$1|1 Ñ\81меÑ\82ка|$1 Ñ\81меÑ\82ки}} Ð²Ð¾ Ð¿Ð¾Ñ\81ледниве $2, Ð¿Ñ\80и Ñ\88Ñ\82о Ðµ Ð´Ð¾Ñ\81Ñ\82игнаÑ\82 Ð¼Ð°ÐºÑ\81ималниоÑ\82 број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Ð\9fоÑ\81еÑ\82иÑ\82ели Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸ÐºÐ¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\98Ñ\9cи Ñ\98а Ð²Ð°Ñ\88аÑ\82а IP-адÑ\80еÑ\81а Ñ\81оздале {{PLURAL:$1|1 Ñ\81меÑ\82ка|$1 Ñ\81меÑ\82ки}} Ð²Ð¾ Ð¿Ð¾Ñ\81ледниве $2, Ð¿Ñ\80и Ñ\88Ñ\82о Ðµ Ð´Ð¾Ñ\81Ñ\82игнаÑ\82 Ð½Ð°Ñ\98големиоÑ\82 Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "blockedtitle": "Корисникот е блокиран",
        "blockedtext": "'''Вашето корисничко име или IP-адреса е блокирано.'''\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е ''$2''.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „Е-пошта до овој корисник“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
        "autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:''$2''\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „Е-пошта до овој корисник“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користитење на истата.\n\nВашата IP-адреса е $3, a ID на блокирањеto е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
+       "systemblockedtext": "Вашето корисничко име или IP-адреса е автоматски блокирано од МедијаВики.\nПонудена причина:\n\n:<em>$2</em>\n\n* Почеток на блокот: $8\n* Истек на блокот: $6\n* Блокот е наменет за: $7\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
        "blockednoreason": "не е наведена причина",
        "whitelistedittext": "Мора да сте $1 за да уредувате страници.",
        "confirmedittext": "Морате да ја потврдите вашата е-поштенска адреса пред да уредувате страници.\nПоставете ја и валидирајте ја вашата е-поштенска адреса преку вашите [[Special:Preferences|нагодувања]].",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
-       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð³Ð¾ Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð¼Ð°ÐºÑ\81ималниот број на јазли.",
+       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð³Ð¾ Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82ениот број на јазли.",
        "node-count-exceeded-warning": "Страницата го надмина бројот на јазли",
        "expansion-depth-exceeded-category": "Страници каде е пречекорена длабочината на проширувањето",
-       "expansion-depth-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\98а Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð¼Ð°ÐºÑ\81ималнаÑ\82а Ð´Ð»Ð°Ð±Ð¾Ñ\87ина Ð½Ð° Ð¿Ñ\80оÑ\88иÑ\80Ñ\83ваÑ\9aе.",
+       "expansion-depth-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\98а Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð½Ð°Ñ\98големаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 Ð½Ð° Ð¿Ñ\80оÑ\88иÑ\80Ñ\83ваÑ\9aеÑ\82о.",
        "expansion-depth-exceeded-warning": "Страницата ја надмина длабочината на проширувањето",
        "parser-unstrip-loop-warning": "Утврдена е јамка",
        "parser-unstrip-recursion-limit": "Пречекорена е границата на рекурзија ($1)",
        "prefs-editwatchlist-clear": "Исчисти набљудувани",
        "prefs-watchlist-days": "Број на денови за приказ во набљудуваните",
        "prefs-watchlist-days-max": "Највеќе $1 {{PLURAL:$1|ден|дена}}",
-       "prefs-watchlist-edits": "Ð\9cакÑ\81имален Ð±Ñ\80оÑ\98 Ð½Ð° прикажани промени во проширениот список на набљудувања:",
+       "prefs-watchlist-edits": "Ð\9dаÑ\98веÑ\9cе прикажани промени во проширениот список на набљудувања:",
        "prefs-watchlist-edits-max": "Највеќе: 1000",
        "prefs-watchlist-token": "Шифра на набљудувањата:",
        "prefs-misc": "Други нагодувања",
        "saveprefs": "Зачувај",
        "restoreprefs": "Врати сè по основно (во сите делови)",
        "prefs-editing": "Уредување",
-       "rows": "Редови:",
-       "columns": "Колони:",
        "searchresultshead": "Пребарување",
        "stub-threshold": "Праг за форматирање на врска за никулци ($1):",
        "stub-threshold-sample-link": "примерок",
        "userrights-user-editname": "Внесете корисничко име:",
        "editusergroup": "Вчитај кориснички групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Поглед на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Уреди ги корисничките групи",
+       "userrights-viewusergroup": "Преглед на корисничките групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбран член на:",
        "right-userrights": "Уредување на сите кориснички права",
        "right-userrights-interwiki": "Уредување на кориснички права на корисници на други викија",
        "right-siteadmin": "Заклучување и отклучување на базата на податоци",
-       "right-override-export-depth": "Ð\98звезÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð´Ð»Ð°Ð±Ð¾Ñ\87ина до 5",
+       "right-override-export-depth": "Ð\98звезÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²ÐºÐ»Ñ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 до 5",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
        "right-managechangetags": "Создавање и (де)активирање на [[Special:Tags|ознаки]]",
        "right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
        "grant-editprotected": "Уредување на заштитени страници",
        "grant-highvolume": "Високообемно уредување",
        "grant-oversight": "Скривање на корисници и преработки",
-       "grant-patrol": "Ð\9fаÑ\82Ñ\80ола Ð½Ð° Ð¸Ð·мени во страници",
+       "grant-patrol": "Ð\9fаÑ\82Ñ\80ола Ð½Ð° Ð¿Ñ\80омени во страници",
        "grant-privateinfo": "Пристап до лични информации",
        "grant-protect": "Заштита на незаштитени страници",
-       "grant-rollback": "Ð\9eÑ\82повикÑ\83ваÑ\9aе Ð½Ð° Ð¸Ð·мени во страници",
+       "grant-rollback": "Ð\9eÑ\82повикÑ\83ваÑ\9aе Ð½Ð° Ð¿Ñ\80омени во страници",
        "grant-sendemail": "Испраќање на е-пошта до други корисници",
        "grant-uploadeditmovefile": "Подигање, замена и преместување на податотеки",
        "grant-uploadfile": "Подигање нови податотеки",
        "action-upload_by_url": "подигни ја податотекава од URL-адреса",
        "action-writeapi": "употребете запишување во извршникот",
        "action-delete": "избриши ја страницава",
-       "action-deleterevision": "избриши ја ревизијава",
-       "action-deletedhistory": "прегледај ја историјата на бришења за оваа страница",
+       "action-deleterevision": "бришење преработки",
+       "action-deletelogentry": "бришење на дневнички записи",
+       "action-deletedhistory": "преглед на историјата на бришења на оваа страница",
+       "action-deletedtext": "преглед на текст на избришани преработки",
        "action-browsearchive": "барање на избришани страници",
-       "action-undelete": "обнови Ñ\98а Ñ\81Ñ\82Ñ\80аниÑ\86ава",
-       "action-suppressrevision": "прегледај ја и обнови ја оваа скриена преработка",
+       "action-undelete": "обнова Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "action-suppressrevision": "преглед ја и обнова на скриени преработки",
        "action-suppressionlog": "преглед на овој li;en дневник",
        "action-block": "оневозможување на уредувањето на корисников",
        "action-protect": "измени го степенот на заштита на оваа страница",
        "action-userrights-interwiki": "уредување на кориснички права на корисници на други викија",
        "action-siteadmin": "заклучување или отклучување на базата на податоци",
        "action-sendemail": "испраќање на е-пошта",
+       "action-editmyoptions": "уредување на вашите нагодувања",
        "action-editmywatchlist": "уредување на мои набљудувани",
        "action-viewmywatchlist": "преглед на вашиот список на набљудувања",
        "action-viewmyprivateinfo": "преглед на вашите лични податоци",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Прикажи",
+       "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-restore-default-filters": "Поврати основни филтри",
+       "rcfilters-clear-all-filters": "Тргни ги сите филтри",
+       "rcfilters-search-placeholder": "Филтрирај скорешни промени (прелстајте или почнете да пишувате)",
+       "rcfilters-invalid-filter": "Неважечки филтер",
+       "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
+       "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
+       "rcfilters-filtergroup-registration": "Регистрација на корисници",
+       "rcfilters-filter-registered-label": "Регистрирани",
+       "rcfilters-filter-registered-description": "Најавени уредници.",
+       "rcfilters-filter-unregistered-label": "Нерегистрирани",
+       "rcfilters-filter-unregistered-description": "Уредници кои не се најавени.",
+       "rcfilters-filtergroup-authorship": "Уреди авторство",
+       "rcfilters-filter-editsbyself-label": "Ваши сопствени уредувања",
+       "rcfilters-filter-editsbyself-description": "Ваши уредувања.",
+       "rcfilters-filter-editsbyother-label": "Туѓи уредувања",
+       "rcfilters-filter-editsbyother-description": "Уредувања направени од други корисници (не од вас).",
+       "rcfilters-filtergroup-userExpLevel": "Корисничка искусност (само за регистрирани)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новодојденци",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Помалку од 10 уредувања и 4 дена активност.",
+       "rcfilters-filter-userExpLevel-learner-label": "Ученици",
+       "rcfilters-filter-userExpLevel-learner-description": "Повеќе денови активност од „новодојденците“, но помалку од „искусните корисници“.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Искусни корисници",
+       "rcfilters-filter-userExpLevel-experienced-description": "Повеќе од 30 дена активност и 500 уредувања.",
+       "rcfilters-filtergroup-automated": "Автоматизирани придонеси",
+       "rcfilters-filter-bots-label": "Ботовски",
+       "rcfilters-filter-bots-description": "Уредувања со автоматизирани алатки.",
+       "rcfilters-filter-humans-label": "Човечки (неботовски)",
+       "rcfilters-filter-humans-description": "Уредувања направени од човечки уредници.",
+       "rcfilters-filtergroup-significance": "Значајност",
+       "rcfilters-filter-minor-label": "Ситни уредувања",
+       "rcfilters-filter-minor-description": "Уредувања кои авторот ги означил како ситни.",
+       "rcfilters-filter-major-label": "Неситни уредувања",
+       "rcfilters-filter-major-description": "Уредувања кои не се означени како ситни.",
+       "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-categorization-description": "Записи од ставање на страници во категории или нивно отстранување од нив.",
+       "rcfilters-filter-logactions-label": "Заведени дејства",
+       "rcfilters-filter-logactions-description": "Административни постапки, создавања на сметки, бришења на страници, подигања...",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "filename": "Име на податотеката",
        "filedesc": "Опис",
        "fileuploadsummary": "Опис:",
-       "filereuploadsummary": "Ð\98змени во податотеката:",
+       "filereuploadsummary": "Ð\9fÑ\80омени во податотеката:",
        "filestatus": "Авторскоправен статус:",
        "filesource": "Извор:",
        "ignorewarning": "Занемари ги предупредувањата и зачувај ја податотеката",
        "tmp-create-error": "Не можев да создадам привремена податотека.",
        "tmp-write-error": "Грешка при запис на привремената податотека.",
        "large-file": "Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.",
-       "largefileserver": "Ð\93олеминаÑ\82а Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð¾Ð´ Ñ\81еÑ\80веÑ\80от.",
+       "largefileserver": "Ð\9fодаÑ\82оÑ\82екава Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð´Ð¾Ð¿Ñ\83Ñ\88Ñ\82еноÑ\82о Ð¾Ð´ Ð¾Ð¿Ñ\81лÑ\83жÑ\83ваÑ\87от.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
        "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со псоебни знаци.",
        "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
        "sourcefilename": "Изворно име на податотеката:",
        "sourceurl": "Изворен URL:",
        "destfilename": "Целно име на податотеката:",
-       "upload-maxfilesize": "Ð\9cакÑ\81имална големина на податотеката: $1",
+       "upload-maxfilesize": "Ð\94опÑ\83Ñ\88Ñ\82ена големина на податотеката: $1",
        "upload-description": "Опис на податотека",
        "upload-options": "Нагодувања на подигањето",
        "watchthisupload": "Набљудувај ја податотекава",
        "uncategorizedcategories": "Некатегоризирани категории",
        "uncategorizedimages": "Некатегоризирани податотеки",
        "uncategorizedtemplates": "Некатегоризирани преуредувања",
+       "uncategorized-categories-exceptionlist": " # Содржи список на категории кои не треба да се споменуваат во Special:UncategorizedCategories. По една во секој нов ред што почнува со „*“. Редовите што почнуваат со друг знак (заклучно со празни места) ќе се занемарат. Користете „#“ за прибелешки.",
        "unusedcategories": "Неискористени категории",
        "unusedimages": "Неискористени слики",
        "wantedcategories": "Потребни категории",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}. {{GENDER:$2|Вашата}} е-пошта ќе му биде испратена право на {{GENDER:$1|изворниот испраќач}}, откривајќи {{GENDER:$1|му}} ја {{GENDER:$2|вашата}} адреса.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "usermessage-template": "MediaWiki:КорисникПорака",
        "changecontentmodel-emptymodels-title": "Нема содржински модели на располагање",
        "changecontentmodel-emptymodels-text": "Содржината на [[:$1]] не може да се претвори во ниеден тип.",
        "log-name-contentmodel": "Дневник на измени во содржинските модели",
-       "log-description-contentmodel": "Настани поврзани со содржинските модели на една страница",
+       "log-description-contentmodel": "На страницава се наведени промените во содржинскиот модел на страниците, како и страници создадени со содржински модел поинаков од основно зададениот.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ја создаде}} страницата $3 користејќи го нестандардниот содржински модел „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|го смени}} содржиснкиот модел на страницата $3 од „$4“ на „$5“",
        "logentry-contentmodel-change-revertlink": "отповикај",
        "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",
        "restriction-type": "Дозвола:",
        "restriction-level": "Степен на заштита:",
-       "minimum-size": "Ð\9cинимална големина",
-       "maximum-size": "Ð\9cакÑ\81имална големина",
+       "minimum-size": "Ð\9dаÑ\98мала големина",
+       "maximum-size": "Ð\94опÑ\83Ñ\88Ñ\82ена големина",
        "pagesize": "(бајти)",
        "restriction-edit": "Уредување",
        "restriction-move": "Преместување",
        "sorbs": "DNSBL",
        "sorbsreason": "Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..",
        "sorbs_create_account_reason": "Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.\nНе можете да создадете корисничка сметка.",
+       "softblockrangesreason": "Анонимните придонеси не се дозволени од вашата IP-адреса ($1). Најавете се.",
        "xffblockreason": "Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1",
        "cant-see-hidden-user": "Корисникот кој се обидувате да го блокирате е веќе блокиран и сокриен. Бидејќи вие немате права за сокривање на корисник, не можете да ги видите или уредувате корисничките блокирања.",
        "ipbblocked": "Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
        "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
        "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
+       "cant-move-subpages": "Немате дозвола за преместување на потстраници.",
+       "namespace-nosubpages": "Именскиот простор „$1“ не дозволува потстраници.",
        "newtitle": "Нов наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "movepage-page-exists": "Страницата $1 веќе постои и не може автоматски да биде заменета.",
        "movepage-page-moved": "Страницата $1 е преместена на $2.",
        "movepage-page-unmoved": "Страницата $1 не може да биде преместена во $2.",
-       "movepage-max-pages": "Максимално $1 {{PLURAL:$1|страница|страници}} беа преместени, повеќе не може да бидат автоматски преместени.",
+       "movepage-max-pages": "{{PLURAL:$1|Преместен е највеќе $1 страница|Преместени се највеќе $1 страници}}. Повеќе од тоа не може да се преместува автоматски.",
        "movelogpage": "Дневник на преместувања",
        "movelogpagetext": "Подолу е наведен список на преместени страници.",
        "movesubpage": "{{PLURAL:$1|Потстраница|Потстраници}}",
        "export-addns": "Додај",
        "export-download": "Зачувај како податотека",
        "export-templates": "Вклучи и шаблони",
-       "export-pagelinks": "Ð\92клÑ\83Ñ\87и Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ð´Ð¾ Ð´Ð»Ð°Ð±Ð¾Ñ\87ина од:",
+       "export-pagelinks": "Ð\92клÑ\83Ñ\87и Ð¿Ð¾Ð²Ñ\80зани Ñ\81Ñ\82Ñ\80аниÑ\86и Ð´Ð¾ Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 од:",
        "export-manual": "Додајте страници рачно:",
        "allmessages": "Системски пораки",
        "allmessagesname": "Име",
        "pageinfo-length": "Големина на страницата (во бајти)",
        "pageinfo-article-id": "Назнака на страницата",
        "pageinfo-language": "Јазик на содржината на страницата",
+       "pageinfo-language-change": "смени",
        "pageinfo-content-model": "Модел на содржината на страницата",
        "pageinfo-content-model-change": "смени",
        "pageinfo-robot-policy": "Индексирање со роботи",
        "file-info": "големина: $1, MIME-тип: $2",
        "file-info-size": "$1 × $2 пиксели, големина: $3, MIME-тип: $4",
        "file-info-size-pages": "$1 × $2 пиксели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страници}}",
-       "file-nohires": "Ð\9dема Ð²ÐµÑ\80зиÑ\98а Ñ\81о Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ñ\80азделеноÑ\81Ñ\82.",
+       "file-nohires": "Нема верзија со поголема разделност.",
        "svg-long-desc": "SVG податотека, номинално $1 × $2 пиксели, големина: $3",
        "svg-long-desc-animated": "Анимирана SVG-податотека, номинално: $1 × $2 пиксели, големина: $3",
        "svg-long-error": "Неважечка SVG-податотека: $1",
        "show-big-image": "Изворна податотека",
        "show-big-image-preview": "Големина на овој преглед: $1.",
        "show-big-image-preview-differ": "Големина на овој $3-преглед на оваа $2-податотека: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азделеноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азделености}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ð\94Ñ\80Ñ\83га Ñ\80азделноÑ\81Ñ\82\94Ñ\80Ñ\83ги Ñ\80азделности}}: $1.",
        "show-big-image-size": "$1 × $2 пиксели",
        "file-info-gif-looped": "кружно",
        "file-info-gif-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-info-png-repeat": "пуштено {{PLURAL:$1|еднаш|$1 пати}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадар|кадри}}",
        "file-no-thumb-animation": "'''Напомена: Поради технички ограничувања, минијатурите на оваа податотека нема да се анимираат.'''",
-       "file-no-thumb-animation-gif": "'''Ð\9dапомена: Ð\9fоÑ\80ади Ñ\82еÑ\85ниÑ\87ки Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aа, Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80иÑ\82е Ð½Ð° GIF-Ñ\81лики Ñ\81о Ð²Ð¸Ñ\81ока Ñ\80азделеноÑ\81Ñ\82 ÐºÐ°ÐºÐ¾ Ð¾Ð²Ð°Ð° Ð½ÐµÐ¼Ð° Ð´Ð° Ñ\81е Ð°Ð½Ð¸Ð¼Ð¸Ñ\80ааÑ\82.'''",
+       "file-no-thumb-animation-gif": "'''Напомена: Поради технички ограничувања, минијатурите на GIF-слики со висока разделност како оваа нема да се анимираат.'''",
        "newimages": "Галерија на нови податотеки",
        "imagelisttext": "Следи список на '''$1''' {{PLURAL:$1|податотека|податотеки}} подредени $2.",
        "newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
        "exif-planarconfiguration": "Распоред на податоците",
        "exif-ycbcrsubsampling": "Однос на величината на Y спрема C",
        "exif-ycbcrpositioning": "Положби на Y и C",
-       "exif-xresolution": "ХоÑ\80изонÑ\82ална Ñ\80азделеноÑ\81Ñ\82",
-       "exif-yresolution": "Ð\92еÑ\80Ñ\82икална Ñ\80азделеноÑ\81Ñ\82",
+       "exif-xresolution": "Хоризонтална разделност",
+       "exif-yresolution": "Вертикална разделност",
        "exif-stripoffsets": "Положба на податоците",
        "exif-rowsperstrip": "Број на редови по блок",
        "exif-stripbytecounts": "Бајти по набиен блок",
        "exif-aperturevalue": "APEX-oтвор",
        "exif-brightnessvalue": "APEX-светлост",
        "exif-exposurebiasvalue": "Надоместок на изложувањето",
-       "exif-maxaperturevalue": "Ð\9cакÑ\81. отвореност на блендата",
+       "exif-maxaperturevalue": "Ð\9dаÑ\98г. отвореност на блендата",
        "exif-subjectdistance": "Оддалеченост до објектот",
        "exif-meteringmode": "Режим на мерачот",
        "exif-lightsource": "Светлосен извор",
        "exif-focallength-format": "$1 мм",
        "exif-subjectarea": "Положба и површина на објектот",
        "exif-flashenergy": "Енергија на блицот",
-       "exif-focalplanexresolution": "РазделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина X",
-       "exif-focalplaneyresolution": "РазделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина Y",
-       "exif-focalplaneresolutionunit": "Ð\95диниÑ\86а Ð·Ð° Ñ\80азделеноÑ\81Ñ\82 Ð½Ð° Ð¶Ð°Ñ\80иÑ\88наÑ\82а Ñ\80амнина",
+       "exif-focalplanexresolution": "Разделност на жаришната рамнина X",
+       "exif-focalplaneyresolution": "Разделност на жаришната рамнина Y",
+       "exif-focalplaneresolutionunit": "Единица за разделност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
        "exif-exposureindex": "Показател на изложувањето",
        "exif-sensingmethod": "Метод на сензорот",
        "exif-exposureprogram-2": "Нормален режим",
        "exif-exposureprogram-3": "Приоритет на блендата",
        "exif-exposureprogram-4": "Приоритет на затворачот",
-       "exif-exposureprogram-5": "Креативен режим (врз основа на потребната длабочина на острина)",
+       "exif-exposureprogram-5": "Креативен режим (врз основа на потребната длабочина на острината)",
        "exif-exposureprogram-6": "Спортски режим (на основа на што побрз затворач)",
        "exif-exposureprogram-7": "Портретен режим (за фотографии одблизу со заматена позадина)",
        "exif-exposureprogram-8": "Пејзажен режим (за фотографии на пејзажи со остра позадина)",
        "table_pager_limit": "Прикажи $1 записи по страница",
        "table_pager_limit_label": "Ставки по страница:",
        "table_pager_limit_submit": "Дај",
-       "table_pager_empty": "Нема резултати",
+       "table_pager_empty": "Нема исход",
        "autosumm-blank": "Целосно избришана страница",
        "autosumm-replace": "Ја заменувам страницата со '$1'",
        "autoredircomment": "Пренасочување кон [[$1]]",
        "feedback-useragent": "Кориснички вршител:",
        "searchsuggest-search": "Пребарајте по {{SITENAME}}",
        "searchsuggest-containing": "содржи...",
-       "api-error-autoblocked": "Вашата IP-адреса е автоматски блокирана бидејќи ја има користено блокиран корисник.",
-       "api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
        "api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
-       "api-error-blocked": "Блокирани сте од уредување.",
-       "api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
-       "api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
-       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
-       "api-error-empty-file": "Поднесената податотека е празна.",
        "api-error-emptypage": "Создавањето на нови празни страници не е дозволено.",
-       "api-error-fetchfileerror": "Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.",
-       "api-error-fileexists-forbidden": "Веќе постои податотека наречена „$1“ и не може да се презапише.",
-       "api-error-fileexists-shared-forbidden": "Веќе постои податотека наречена „$1“ во заедничкото складиште и не може да се презапише.",
-       "api-error-file-too-large": "Поднесената податотека е преголема.",
-       "api-error-filename-tooshort": "Името на податотеката е прекратко.",
-       "api-error-filetype-banned": "Овој тип на податотека е забранет.",
-       "api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е допуштен тип на податотека|се допуштени типови на податотека}}. {{PLURAL:$3|Допуштен е|Допуштени се}} $2.",
-       "api-error-filetype-missing": "На податотеката ѝ недостасува наставка.",
-       "api-error-hookaborted": "Измената што се обидовте да ја направите е откажана од пресретник за наставки.",
-       "api-error-http": "Внатрешна грешка: не можам да се поврзам со опслужувачот.",
-       "api-error-illegal-filename": "Податотеката има недозволено име.",
-       "api-error-internal-error": "Внатрешна грешка: нешто тргна наопаку при обработката на она што го подигате на викито.",
-       "api-error-invalid-file-key": "Внатрешна грешка: не ја пронајдов податотеката во привременото складиште.",
-       "api-error-missingparam": "Внатрешна грешка: недостасуваат параметри за барањето.",
-       "api-error-missingresult": "Внатрешна грешка: не можев да одредам дали копирањето заврши успешно.",
-       "api-error-mustbeloggedin": "Мора да сте најавени за да подигате податотеки.",
-       "api-error-mustbeposted": "Во програмов има грешка. Не користи исправен HTTP-метод.",
-       "api-error-noimageinfo": "Погидањето успеа, но опслужувачот не понуди никакви информации за податотеката.",
-       "api-error-nomodule": "Внатрешна грешка: нема зададено модул за подигање.",
-       "api-error-ok-but-empty": "Внатрешна грешка: опслужувачот не одговара.",
-       "api-error-overwrite": "Презапишувањето врз постоечки податотеки не е дозволено.",
-       "api-error-ratelimited": "Се обидувате да подигнете повеќе податотеки отколку што викито допушта за дадено време.\nОбидете се повторно за неколку минути.",
-       "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
        "api-error-publishfailed": "Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.",
-       "api-error-stasherror": "Се јави грешка при подигањето на податотеката во складот.",
-       "api-error-stashedfilenotfound": "Не ја најдов наплстената податотека при обидот да ја подигнам од пластот.",
-       "api-error-stashpathinvalid": "Патеката кајшто требаше да се најде складираната податотека е неважечка.",
-       "api-error-stashfilestorage": "Се јави грешка при ставањето на податотеката во складот.",
-       "api-error-stashzerolength": "Опслужувачот не можеше да ја складира податотеката бидејќи има нулта должина.",
-       "api-error-stashnotloggedin": "Мора да се најавени за да зачувувате податотеки во складот на подигнати.",
-       "api-error-stashwrongowner": "Податотеката во складот до која сакате да дојдете не ви припаѓа вам.",
-       "api-error-stashnosuchfilekey": "Клучот на податотеката во складот до кој сакате да дојдете не постои.",
-       "api-error-timeout": "Опслужувачот не одговори во очекуваното време.",
-       "api-error-unclassified": "Се појави непозната грешка.",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Внатрешна грешка: нешто тргна наопаку при обидот да ја подигнете податотеката.",
-       "api-error-unknown-warning": "Непознато предупредување: $1",
+       "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
+       "api-error-unknown-warning": "Непознато предупредување: „$1“",
        "api-error-unknownerror": "Непозната грешка: „$1“.",
-       "api-error-uploaddisabled": "Подигањето е оневозможено на ова вики.",
-       "api-error-verification-error": "Податотеката е оштетена или има погрешна наставка.",
-       "api-error-was-deleted": "Податотека со ова име веќе е подигана и потоа избришана.",
        "duration-seconds": "{{PLURAL:$1|една секунда|$1 секунди}}",
        "duration-minutes": "{{PLURAL:$1|една минута|$1 минути}}",
        "duration-hours": "{{PLURAL:$1|еден час|$1 часа}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајти}}",
        "limitreport-templateargumentsize": "Големина на аргументот во шаблонот",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајти}}",
-       "limitreport-expansiondepth": "Ð\9dаÑ\98голема Ð´Ð»Ð°Ð±Ð¾Ñ\87ина на проширувањето",
+       "limitreport-expansiondepth": "Ð\9dаÑ\98голема Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 на проширувањето",
        "limitreport-expensivefunctioncount": "Бр. на сложени расчленувачки функции",
        "expandtemplates": "Прошири шаблони",
        "expand_templates_intro": "Оваа службена страница зема еден текст и рекурзивно ги проширува сите шаблони во него.\nИсто така проширува и расчленувачки функции како\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи како\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nВсушност, го проширува сето она што стои во двојни аглести загради.",
        "pagelang-language": "Јазик",
        "pagelang-use-default": "Користи стандарден јазик",
        "pagelang-select-lang": "Одберете јазик",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Поднеси",
+       "pagelang-nonexistent-page": "Страницата $1 не постои.",
+       "pagelang-unchanged-language": "Страницата $1 е веќе наместена на јазикот $2.",
+       "pagelang-unchanged-language-default": "Страницата $1 е веќе наместена на матичниот содржински јазик на викито.",
+       "pagelang-db-failed": "Базата не успеа да го смени содржинскиот јазик.",
        "right-pagelang": "Менување јазик на страница",
        "action-pagelang": "менување јазик на страница",
        "log-name-pagelang": "Дневник на менување на јазикот",
        "mediastatistics-header-total": "Сите податотеки",
        "json-warn-trailing-comma": "{{PLURAL:$1|Отстранета е една завршна запирка|Отстранети се $1 завршни запирки}} од JSON",
        "json-error-unknown": "Се јави проблем со JSON. Грешка: $1.",
-       "json-error-depth": "Ð\9dадминаÑ\82а Ðµ Ð¼Ð°ÐºÑ\81ималнаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð´Ð»Ð°Ð±Ð¾Ñ\87ина на пластот",
+       "json-error-depth": "Ð\9dадминаÑ\82а Ðµ Ð½Ð°Ñ\98големаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð¿Ñ\80одоÑ\80ноÑ\81Ñ\82 на пластот",
        "json-error-state-mismatch": "Неважечки или погрешно срочен JSON",
        "json-error-ctrl-char": "Грешка во контролниот знак. Можеби е неисправно кодиран",
        "json-error-syntax": "Синтаксна грешка",
        "sessionprovider-nocookies": "Колачињата може да се оневозможени. Ако е така, овозможете ги, и почнете одново.",
        "randomrootpage": "Случајна основна страница",
        "log-action-filter-block": "Тип на блок:",
-       "log-action-filter-contentmodel": "Тип Ð½Ð° Ð·мена на содржинскиот модел:",
+       "log-action-filter-contentmodel": "Тип Ð½Ð° Ð¿Ñ\80омена на содржинскиот модел:",
        "log-action-filter-delete": "Тип на бришење:",
        "log-action-filter-import": "Тип на увоз:",
        "log-action-filter-managetags": "Тип на дејство за управување со ознаки:",
        "usercssispublic": "Напомена: потстраниците со CSS не треба да содржат дсоверливи податоци бидејќи истите се видливи и за други корисници.",
        "restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
        "restrictionsfield-label": "Допуштени IP-опсези:",
-       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "преработка $1",
+       "pageid": "назнака на страницата $1"
 }
index cbb7d06..887d754 100644 (file)
        "passwordreset-emaildisabled": "ഈ വിക്കിയിൽ ഇമെയിൽ സൗകര്യങ്ങൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
        "passwordreset-username": "ഉപയോക്തൃനാമം:",
        "passwordreset-domain": "ഡൊമൈൻ:",
-       "passwordreset-capture": "ഫലമായുണ്ടാകുന്ന ഇമെയിൽ കാണണോ?",
-       "passwordreset-capture-help": "ഈ പെട്ടിയിൽ ശരി ചേർത്താൽ, ഉപയോക്താവിന് അയയ്ക്കുന്നതോടൊപ്പം ഇമെയിൽ (താത്കാലിക രഹസ്യവാക്കിനൊപ്പം) പ്രദർശിപ്പിക്കപ്പെടുന്നതാണ്.",
        "passwordreset-email": "ഇമെയിൽ വിലാസം:",
        "passwordreset-emailtitle": "{{SITENAME}} സംരംഭത്തിലെ അംഗത്വവിവരങ്ങൾ",
        "passwordreset-emailtext-ip": "ആരോ ഒരാൾ (മിക്കവാറും താങ്കളായിരിക്കും, $1 എന്ന ഐ.പി. വിലാസത്തിൽ നിന്നും) {{SITENAME}} സംരംഭത്തിലെ ($4) താങ്കളുടെ രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "saveprefs": "സേവ് ചെയ്യുക",
        "restoreprefs": "സ്വതേയുള്ള ക്രമീകരണങ്ങൾ പുനഃസ്ഥാപിക്കുക (എല്ലാ ഭാഗങ്ങളിലേയും)",
        "prefs-editing": "തിരുത്തൽ",
-       "rows": "വരി:",
-       "columns": "നിര:",
        "searchresultshead": "തിരയൂ",
        "stub-threshold": "അപൂർണ്ണമായ കണ്ണിയെന്നു സ്ഥാപിക്കാനുള്ള ത്വരകം ($1):",
        "stub-threshold-sample-link": "സാമ്പിൾ",
        "userrights-reason": "കാരണം:",
        "userrights-no-interwiki": "മറ്റ് വിക്കികളിലെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുവാൻ താങ്കൾക്ക് അനുമതിയില്ല.",
        "userrights-nodatabase": "$1 എന്ന ഡാറ്റാബേസ് നിലവിലില്ല അല്ലെങ്കിൽ പ്രാദേശികമല്ല.",
-       "userrights-nologin": "ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കണമെങ്കിൽ താങ്കൾ കാര്യനിർവാഹക അംഗത്വം ഉപയോഗിച്ച് [[Special:UserLogin|പ്രവേശിച്ചിരിക്കണം]].",
-       "userrights-notallowed": "ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കാനും എടുത്തുകളയാനുമുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "userrights-changeable-col": "താങ്കൾക്ക് മാറ്റാവുന്ന സംഘങ്ങൾ",
        "userrights-unchangeable-col": "താങ്കൾക്ക് മാറ്റാനാവാത്ത സംഘങ്ങൾ",
        "userrights-conflict": "ഉപയോക്തൃ അവകാശങ്ങളുടെ മാറ്റം സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും സംശോധനം ചെയ്ത് സ്ഥിരീകരിച്ച് നടപ്പിലാക്കുക.",
-       "userrights-removed-self": "താങ്കൾ സ്വന്തം അവകാശങ്ങൾ സ്വയം ഒഴിവാക്കിയിരിക്കുന്നു. അതിനാൽ ഈ താൾ ഇനി താങ്കൾക്ക് ലഭ്യമായിരിക്കില്ല.",
        "group": "സംഘം:",
        "group-user": "ഉപയോക്താക്കൾ",
        "group-autoconfirmed": "യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "right-siteadmin": "ഡേറ്റാബേസ് തുറക്കുക, പൂട്ടുക",
        "right-override-export-depth": "കണ്ണിവത്കരിക്കപ്പെട്ട താളുകളുടെ ആഴം 5 വരെയുള്ള താളുകൾ കയറ്റുമതി ചെയ്യുക",
        "right-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
-       "right-passwordreset": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കാനുള്ള ഇമെയിലുകൾ കാണുക",
        "right-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള [[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
        "right-applychangetags": "മാറ്റങ്ങളോടൊപ്പം [[Special:Tags|ടാഗുകളും]] ബാധകമാക്കുക",
        "right-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക [[Special:Tags|ടാഗുകൾ]] ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "revdelete-restricted": "കാര്യനിർവാഹകർക്ക് പ്രവർത്തന അതിരുകൾ ഏർപ്പെടുത്തിയിരിക്കുന്നു",
        "revdelete-unrestricted": "കാര്യനിർവാഹകർക്ക് ഏർപ്പെടുത്തിയ പ്രവർത്തന അതിരുകൾ നീക്കം ചെയ്തിരിക്കുന്നു",
        "logentry-block-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
-       "logentry-block-unblock": "{{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
+       "logentry-block-unblock": "{{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ തടഞ്ഞത് $1 {{GENDER:$2|ഒഴിവാക്കിയിരിക്കുന്നു}}",
        "logentry-block-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-suppress-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
        "logentry-suppress-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
index 1596eb6..66b2190 100644 (file)
@@ -92,7 +92,7 @@
        "tog-ccmeonemails": "मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा",
        "tog-diffonly": "निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.",
        "tog-showhiddencats": "लपविलेले वर्ग दाखवा",
-       "tog-norollbackdiff": "दà¥\8dरà¥\81तमाà¤\98ार à¤\98à¥\87तलà¥\8dयास à¤¬à¤¦à¤² à¤µà¤\97ळा",
+       "tog-norollbackdiff": "दà¥\8dरà¥\81तमाà¤\98ार à¤\98à¥\87तलà¥\8dयास à¤«à¤°à¤\95 à¤¦à¤¾à¤\96वà¥\82 à¤¨à¤\95ा",
        "tog-useeditwarning": "जर मी संपादित करीत असलेल्या पानावरील माझे संपादिलेले बदल जतन न केल्यास मला इशारा द्या",
        "tog-prefershttps": "सनोंद प्रवेशित असतांना प्रत्येक वेळी  सुरक्षित अनुबंध वापरा",
        "underline-always": "नेहमी",
        "tagline": "{{SITENAME}} कडून",
        "help": "साहाय्य",
        "search": "शोधा",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "शोधा",
        "go": "चला",
        "searcharticle": "जा",
        "history": "पानाचा इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "माझ्या शेवटच्या भेटीनंतर अद्यतन केले",
        "printableversion": "छापण्यायोग्य आवृत्ती",
        "permalink": "शाश्वत दुवा",
        "talk": "चर्चा",
        "views": "दृष्ये",
        "toolbox": "साधने",
+       "tool-link-userrights": "{{GENDER:$1|वापरकर्ता}} गट बदला",
        "tool-link-emailuser": "{{GENDER:$1|सदस्याला}} विपत्र पाठवा",
        "userpage": "सदस्य पृष्ठ",
        "projectpage": "प्रकल्प पान पहा",
        "password-change-forbidden": "तुम्ही या विकिवर तुमचा परवलीचा शब्द बदलू शकत नाही.",
        "externaldberror": "विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.",
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
+       "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
        "userlogin": "सनोंद-प्रवेश करा /सदस्यखाते उघडा",
        "userloginnocreate": "सनोंद-प्रवेश",
        "nocookieslogin": "{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना, त्यांच्या स्मृतिशेष (cookies) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा आणि सनोंद-प्रवेशासाठी पुन्हा प्रयत्न करा.",
        "nocookiesfornew": "हे सदस्य खाते अस्तित्वात नाही, त्यामुळे आम्ही त्याच्या स्रोताची खात्री करू शकलो नाही.\nतुमचे स्मृतिशेष उपलब्ध असण्याची खात्री करा,या पानास पुनर्भारण(रिलोड) करा  किंवा पुन्हा प्रयत्न करा.",
        "noname": "आपण वैध सदस्यनाम नमूद केले नाही.",
-       "loginsuccesstitle": "à¤\86पलà¥\8dया à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80तà¥\8dया à¤ªà¥\82रà¥\8dण à¤\9dालà¥\80",
+       "loginsuccesstitle": "सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित",
        "loginsuccess": "'''तुम्ही {{SITENAME}} वर \"$1\" नावाने सनोंद प्रवेशित आहात.'''",
        "nosuchuser": "\"$1\" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:CreateAccount|नवीन खाते]] तयार करा.",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "newpassword": "नवीन परवलीचा शब्द:",
        "retypenew": "पुन्हा एकदा परवलीचा शब्द टंका:",
        "resetpass_submit": "परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा",
-       "changepassword-success": "तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¯à¤¶à¤¸à¥\8dवà¥\80रितà¥\8dया à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87!",
+       "changepassword-success": "तुमचा परवलीचा शब्द बदललेला आहे!",
        "changepassword-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "botpasswords": "सांगकाम्याचे परवलीचे शब्द",
        "botpasswords-summary": "<em>सांगकाम्याचे परवलीचे शब्द</em>हे त्या खात्याची मुख्य सनोंद-प्रवेश अधिकारपत्रे न वापरता, एपीआय मार्फत, सदस्य खात्याच्या प्रवेशास पोहोच देतात.सांगकाम्याचा परवलीचा शब्द वापरुन सनोंद प्रवेश केलेल्यांचे उपलब्ध सदस्य अधिकार प्रतिबंधित असू शकतात.\n\nजर आपणास कळत नसेल आपण हे कां करीत आहोत,तर आपण ते बहुतेक करावयास नको.कोणीही आपणास असे कधीही सांगु नये कि यापैकी एखादे उत्पादित करा व त्यांना द्या.",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
        "savechanges": "बदल जतन करा",
+       "publishpage": "पानाचे प्रकाशन करा",
        "publishchanges": "बदल प्रकाशित करा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "saveprefs": "जतन करा",
        "restoreprefs": "सर्व अविचल(डिफॉल्ट) मांडणी पूर्ववत करा (सर्व विभागात)",
        "prefs-editing": "संपादन",
-       "rows": "ओळी:",
-       "columns": "स्तंभ:",
        "searchresultshead": "शोध",
        "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
        "stub-threshold-sample-link": "नमुना",
        "right-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) [[Special:Tags|खूणपताका]] जोडा अथवा हटवा",
        "grant-generic": "\"$1\" अधिकार गठ्ठा",
        "grant-group-email": "विपत्र पाठवा",
-       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धन/अप्रतिबंधित करा",
+       "grant-blockusers": "सदसà¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धित/अप्रतिबंधित करा",
        "grant-createaccount": "खाते तयार करा",
        "grant-createeditmovepage": "पाने बनवा,संपादा व स्थानांतरण करा",
        "grant-delete": "पाने, आवृत्त्या व नोंदी वगळा",
        "grant-editinterface": "मिडियाविकि नामविश्व व सदस्यांची CSS/JS संपादा",
-       "grant-editmycssjs": "à¤\86पलà¥\87 सदस्य CSS/JavaScript संपादित करा",
+       "grant-editmycssjs": "à¤\86पलà¥\80 सदस्य CSS/JavaScript संपादित करा",
        "grant-editmyoptions": "आपला सदस्य पसंतीक्रम संपादा",
        "grant-editmywatchlist": "आपली निरीक्षणयादी संपादित करा",
        "grant-editpage": "अस्तित्वात असलेली पाने संपादा",
        "grant-highvolume": "अत्त्युच्च-जागा घेणारे संपादन",
        "grant-oversight": "सदस्य लपवा व आवृत्त्या दाबा",
        "grant-patrol": "पानांच्या बदलांवर गस्त घाला",
+       "grant-privateinfo": "वैयक्तिक माहिती बघा",
        "grant-protect": "पाने सुरक्षित किंवा असुरक्षित करा",
-       "grant-rollback": "पानाचे बदल परतवा",
+       "grant-rollback": "पानाà¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤ªà¤°à¤¤à¤µà¤¾",
        "grant-sendemail": "इतर सदस्यांना विपत्र पाठवा",
+       "grant-uploadeditmovefile": "संचिकांचे अपभारण, बदल व स्थानांतरण करा",
+       "grant-uploadfile": "नविन संचिका चढवा",
        "grant-basic": "मूळ अधिकार",
        "grant-viewdeleted": "वगळलेल्या संचिका व पाने बघा",
        "grant-viewmywatchlist": "आपली निरीक्षणसूची बघा",
+       "grant-viewrestrictedlogs": "प्रतिबंधित लॉग नोंदी बघा",
        "newuserlogpage": "नवीन सदस्यांची नोंद",
        "newuserlogpagetext": "ही नवीन सदस्यांची नोंद यादी आहे.",
        "rightslog": "सदस्य आधिकार नोंद",
        "action-upload_by_url": "यूआरएल वरुन संचिकेचे अपभारण करा",
        "action-writeapi": "लेखन एपीआय वापरा",
        "action-delete": "हे पान वगळा",
-       "action-deleterevision": "हे आवर्तन वगळा",
-       "action-deletedhistory": "या पानाचा वगळलेला इतिहास पहा",
+       "action-deleterevision": "आवर्तने वगळा",
+       "action-deletelogentry": "लॉग प्रविष्ट्या वगळा",
+       "action-deletedhistory": "एखाद्या पानाचा वगळलेला इतिहास पहा",
+       "action-deletedtext": "वगळलेल्या आवृत्तीतील मजकूर बघा",
        "action-browsearchive": "वगळलेली पाने शोधा",
-       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\87 à¤ªà¥\83षà¥\8dठ पुनर्स्थापित करा",
-       "action-suppressrevision": "लपलà¥\87लà¥\87 à¤ªà¥\81नरावरà¥\8dतन à¤ªà¤¹à¤¾ à¤µ à¤¸à¤¦à¥\8dयसà¥\8dथितà¥\80त à¤\86णा",
+       "action-undelete": "वà¤\97ळà¥\8dलà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 पुनर्स्थापित करा",
+       "action-suppressrevision": "लपविलà¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤ªà¤¹à¤¾ à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा",
        "action-suppressionlog": "ही खासगी नोंद पहा",
        "action-block": "या सदस्यास संपादन करण्यापासून प्रतिबंधित करा",
        "action-protect": "या पानाचा सुरक्षास्तर बदला",
        "action-userrights-interwiki": "इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा",
        "action-siteadmin": "माहितीसाठ्याला कुलूप लावा अथवा काढा",
        "action-sendemail": "विपत्रे (ई-मेल्स) पाठवा.",
+       "action-editmyoptions": "आपल्या स्वत:चा 'पसंतीक्रम' संपादा",
        "action-editmywatchlist": "'माझी निरीक्षणसूची' संपादा",
        "action-viewmywatchlist": "'माझी निरीक्षणसूची' बघा",
        "action-viewmyprivateinfo": "आपली वैयक्तिक माहिती बघा",
        "action-editmyprivateinfo": "आपली वैयक्तिक माहिती संपादा",
        "action-editcontentmodel": "पानाचा आशय नमूना संपादा",
-       "action-managechangetags": "डाà¤\9fाबà¥\87समधà¥\8dयà¥\87 à¤\96à¥\82णपतà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा à¤µà¤\97ळा",
+       "action-managechangetags": "à¤\96à¥\82णपताà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रा à¤\95िà¤\82वा (à¤\85)सà¤\95à¥\8dरिय à¤\95रा",
        "action-applychangetags": "आपल्या बदलांसोबतच खूणपताका जोडा",
        "action-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) खूणपताका जोडा अथवा हटवा",
+       "action-deletechangetags": "डाटाबेसमधून खूणपताका वगळा",
+       "action-purge": "या पानास तरोताजे (पर्ज) करा",
        "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|मागील भेटीनंतर}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "दाखवा",
+       "rcfilters-activefilters": "सक्रिय गाळण्या",
+       "rcfilters-search-placeholder": "अलीकडील बदल गाळा (न्याहाळा किंवा टंकन सुरू करा)",
+       "rcfilters-invalid-filter": "अवैध गाळणी",
+       "rcfilters-filterlist-title": "गाळण्या",
+       "rcfilters-filterlist-noresults": "कोणतीच गाळणी सापडली नाही",
+       "rcfilters-filtergroup-registration": "सदस्य नोंदणी",
+       "rcfilters-filter-registered-label": "नोंदणीकृत",
+       "rcfilters-filter-registered-description": "प्रवेशलेले सदस्य",
+       "rcfilters-filter-unregistered-label": "अ-नोंदणीकृत",
+       "rcfilters-filter-unregistered-description": "संपादक जे प्रवेशित नाहीत.",
+       "rcfilters-filtergroup-authorship": "संपादनाचा लेखक",
+       "rcfilters-filter-editsbyself-label": "आपली स्वत:ची संपादने",
+       "rcfilters-filter-editsbyself-description": "आपली संपादने",
+       "rcfilters-filter-editsbyother-label": "इतरांची संपादने",
+       "rcfilters-filter-editsbyother-description": "इतर सदस्यांनी तयार केलेली संपादने (आपण नाही).",
+       "rcfilters-filtergroup-userExpLevel": "अनुभवाचा स्तर (फक्त नोंदणीकृत सदस्यांसाठीच)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "नवागत",
+       "rcfilters-filter-userExpLevel-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
+       "rcfilters-filter-userExpLevel-learner-label": "शिकाऊ",
        "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
        "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "apisandbox-intro": "<strong>मिडियाविकि वेब सर्व्हीस एपीआय</strong> वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी  [[mw:API:Main page| एपीआय दस्ताऐवजीकरण]] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\nयाची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.",
        "apisandbox-submit": "विनंती करा",
        "apisandbox-reset": "हटवा",
-       "apisandbox-examples": "उदाहरण",
+       "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "निकाल",
        "apisandbox-request-url-label": "'यूआरएल'ची विनंती करा:",
-       "apisandbox-request-time": "विनंती वेळ:$1",
+       "apisandbox-request-time": "विनंती वेळ:{{PLURAL:$1|$1 मिलीसेकंद}}",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
        "booksources-search": "शोधा",
        "listgrants-grant": "अनुदान",
        "listgrants-rights": "अधिकार",
        "trackingcategories": "मागोवा घेणारे वर्ग",
-       "trackingcategories-summary": "या à¤ªà¤¾à¤¨à¤¾à¤¤ à¤¤à¥\87 à¤°à¥\87à¤\96ापथनातà¥\80ल à¤µà¤°à¥\8dà¤\97(tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
+       "trackingcategories-summary": "या à¤ªà¤¾à¤¨à¤¾à¤¤ à¤¤à¥\87 à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87णारà¥\87 à¤µà¤°à¥\8dà¤\97 (tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
        "trackingcategories-msg": "मागोवा घेणारा वर्ग",
        "trackingcategories-name": "संदेश नाम",
        "trackingcategories-desc": "वर्ग अंतर्भूत करण्याचे निकष",
+       "restricted-displaytitle-ignored-desc": "या पानात दुर्लक्षित <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> आहे कारण ते पानाच्या मूळ शीर्षकासम नाही.",
+       "noindex-category-desc": "हे पान सांगकाम्यांद्वारे अनुक्रमित नाही कारण त्यात <code><nowiki>__NOINDEX__</nowiki></code> हा जादुई शब्द आहे व ते त्या नामविश्वात आहे, जेथे या खूणपताकेची परवानगी आहे.",
+       "index-category-desc": "या पानात <code><nowiki>__INDEX__</nowiki></code> ही खूणपताका आहे (व ते अश्या नामविश्वात आहे जेथे या खूणपताकेची परवानगी आहे), आणि म्हणून ही सांगकाम्यांद्वारे अनुक्रमित आहे, जेथे ती सामान्यपणे असावयास नको.",
+       "post-expand-template-inclusion-category-desc": "येथील सर्व साच्यांचा विस्तार केल्यावर, या पानाचा आकार <code>$wgMaxArticleSize</code> पेक्षा जास्त मोठा झाला आहे, म्हणून काही साचे विस्तारल्या गेले नाहीत.",
+       "broken-file-category-desc": "या पानात तुटलेला संचिका-दुवा आहे (तो दुवा, जो अस्तित्वात नसलेल्या संचिकेस जोडण्याचा प्रयत्न करतो).",
+       "hidden-category-category-desc": "या वर्गाच्या आशय मजकूरात <code><nowiki>__HIDDENCAT__</nowiki></code> ही खूणपताका आहे, जी त्या पानास, पानांसाठी   असलेल्या वर्गदुवेपेटीत दिसण्यापासून अविचलरित्या रोखते.",
        "trackingcategories-nodesc": "वर्णन उपलब्ध नाही.",
        "trackingcategories-disabled": "वर्ग अक्षम केल्या गेला आहे",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "created": "तयार केले",
        "changed": "बदलले",
        "deletepage": "पान वगळा",
-       "confirm": "निश्चीत",
+       "confirm": "निश्चीत करा",
        "excontent": "मजकूर होता: '$1'",
        "excontentauthor": "मजकूर होता: \"$1\" आणि फक्त [[Special:Contributions/$2|$2]]  ([[User talk:$2|चर्चा]])यांचेच योगदान होते.",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "modifiedarticleprotection": "\"[[$1]]\"करिता सुरक्षापातळी बदलली",
        "unprotectedarticle": "\"[[$1]]\" असुरक्षित केला.",
        "movedarticleprotection": "सुरक्षापातळी \"[[$2]]\" येथून \"[[$1]]\" येथे हलवली.",
+       "protectedarticle-comment": "\"[[$1]]\" ला {{GENDER:$2|ने संरक्षित केले}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" ची {{GENDER:$2| ने संरक्षण पातळी बदलली}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" ची {{GENDER:$2| ने सुरक्षा हटविली}}",
        "protect-title": "\"$1\" सुरक्षित करत आहे",
        "protect-title-notallowed": "\"$1\" ची सुरक्षा पातळी पहा",
        "prot_1movedto2": "\"[[$1]]\" हे पान \"[[$2]]\" मथळ्याखाली स्थानांतरित केले.",
        "pageinfo-display-title": "दृश्य शीर्षक",
        "pageinfo-default-sort": "डिफॉल्ट निवड-कळ (सॉर्ट कि)",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
-       "pageinfo-article-id": "पà¥\83षà¥\8dठ-परिà¤\9aय",
-       "pageinfo-language": "पानाच्या मजकूराची भाषा",
-       "pageinfo-content-model": "पान आशय नमूना",
+       "pageinfo-article-id": "पà¥\83षà¥\8dठ-à¤\93ळà¤\96ण",
+       "pageinfo-language": "पान-आशय भाषा",
+       "pageinfo-content-model": "पान-आशय नमूना",
        "pageinfo-content-model-change": "बदला",
-       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवादà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमन",
+       "pageinfo-robot-policy": "यà¤\82तà¥\8dरमानवाà¤\82दà¥\8dवारà¥\87 à¤\85नà¥\81à¤\95à¥\8dरमण",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-watchers": "पानावर पहारा देणाऱ्यांची संख्या",
+       "pageinfo-visiting-watchers": "या पानात झालेल्या अलीकडील संपादनांना पहारा देणाऱ्यांची संख्या",
        "pageinfo-few-watchers": "$1 पेक्षा कमी {{PLURAL:$1|पहारेदार}}",
        "pageinfo-redirects-name": "या पानास असलेली  पुनर्निर्देशनांची संख्या",
-       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤\89प-पान",
+       "pageinfo-subpages-name": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\89प-पानà¥\87",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देशन|पुनर्निर्देशने}}; $3 {{PLURAL:$3|अ-पुनर्निर्देशन|अ-पुनर्निर्देशने}})",
-       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमानक",
+       "pageinfo-firstuser": "पà¥\83षà¥\8dठ à¤¨à¤¿à¤°à¥\8dमाणक",
        "pageinfo-firsttime": "पान निर्मितीचा दिनांक",
        "pageinfo-lastuser": "अलीकडील संपादक",
        "pageinfo-lasttime": "अलीकडिल संपादनाचा दिनांक",
        "pageinfo-edits": "एकूण संपादने",
        "pageinfo-authors": "सुस्पष्ट-लेखकांची एकुण संख्या",
-       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1 मध्ये)",
+       "pageinfo-recent-edits": "सध्याची संपादनसंख्या (मागील $1)",
        "pageinfo-recent-authors": "सुस्पष्ट लेखकांची सध्या असलेली संख्या",
        "pageinfo-magic-words": "जादुई {{PLURAL:$1|शब्द}} ($1)",
        "pageinfo-hidden-categories": "लपविलेले {{PLURAL:$1|वर्ग}} ($1)",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
+       "pageinfo-user-id": "सदस्य ओळखण",
        "markaspatrolleddiff": "टेहळणी केल्याची खूण करा",
        "markaspatrolledtext": "या पानावर गस्त झाल्याची खूण करा",
        "markaspatrolledtext-file": "या संचिकेच्या आवृत्तीस गस्त घातली म्हणून् खूण करा",
        "watchlistedit-raw-done": "तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} भर घातली:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} वगळले:",
-       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95à¥\87लà¥\80",
+       "watchlistedit-clear-title": "निरà¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80 à¤¸à¤¾à¤« à¤\95रा",
        "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
-       "watchlistedit-clear-explain": "à¤\86पलà¥\8dया à¤¨à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤¸à¤°à¥\8dव à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¤\9fविलà¥\8dया à¤\9cातà¥\80ल.",
+       "watchlistedit-clear-explain": "आपल्या निरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
        "watchlistedit-clear-titles": "शिर्षके:",
        "watchlistedit-clear-submit": "निरीक्षणसूची साफ करा(हे कायमस्वरुपी आहे!)",
        "watchlistedit-clear-done": "तुमची पहाऱ्याची सूची स्वच्छ करण्यात आली आहे.",
        "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा {{SITENAME}}",
        "searchsuggest-containing": ".......हे असलेले",
-       "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
-       "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहे परंतु{{PLURAL:$1|ते वगळल्या गेले|ती वगळल्या गेलीत}}",
-       "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
-       "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
-       "api-error-fileexists-forbidden": "\"$1\" या नावाची संचिका पूर्वीच उपलब्ध आहे व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" या नावाची संचिका, 'सहभागी संचिका भांडारात' पूर्वीच उपलब्ध आहे,व त्यावर पुनर्लेखन करता येऊ शकत नाही.",
-       "api-error-file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.",
-       "api-error-filename-tooshort": "संचिकेचे नाव खूपच छोटे आहे.",
-       "api-error-filetype-banned": "याप्रकारची संचिका प्रतिबंधित आहे.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हा परवानगी नसलेला  संचिका-प्रकार आहे|या परवानगी नसलेल्या संचिका-प्रकार आहेत}}. $2 {{PLURAL:$3|हा परवानगी असलेला संचिका-प्रकार आहे|या परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
-       "api-error-filetype-missing": "या संचिकेस विस्तार(एक्सटेंशन) नाही.",
-       "api-error-hookaborted": "तुम्ही केलेला बदल extension ने उलटवला आहे",
-       "api-error-http": "अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.",
-       "api-error-illegal-filename": "हे संचिकानाम प्रतिबंधित आहे.",
-       "api-error-internal-error": "अंतर्गत त्रुटी:आपण विकिवर चढविलेल्या संचिकेवर प्रक्रिया करतांना काहीतरी चुकले आहे.",
-       "api-error-invalid-file-key": "अंतर्गत त्रुटी: तात्पुरत्या साठवणीत संचिका सापडली नाही.",
-       "api-error-missingparam": "अंतर्गत चूक: मागणीतील काही नोंदी राहून गेल्या आहेत",
-       "api-error-missingresult": "आंतरिक त्रुटी : प्रत यशस्वी झाली की नाही हे ठरवता  येत नाही",
-       "api-error-mustbeloggedin": "संचिका चढविण्यासाठी आपण दाखल होणे जरुरी आहे.",
-       "api-error-mustbeposted": "अंतर्गत चूक: मागणी पूर्ण करण्यासाठी HTTP POST असायला हवे",
-       "api-error-noimageinfo": "डाटा अपलोड यशस्वी झाले आहे पण सर्व्हर कडून तशी माहिती अजून मिळाली नाही",
-       "api-error-nomodule": "अंतर्गत चूक: module set चढवलेला नाही",
-       "api-error-ok-but-empty": "आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं",
-       "api-error-overwrite": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.",
-       "api-error-ratelimited": "आपण, हा विकी परवानगी देत असल्यापेक्षा अधिक संचिका, कमी कालावधीत अपभारणाचा प्रयत्न करीत आहात.\nकाही मिनिटांनी पुन्हा प्रयत्न करा.",
-       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-publishfailed": "अंतर्गत त्रुटी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.",
-       "api-error-stasherror": "स्टॅचमध्ये ही संचिका अपभारणात त्रुटी आली.",
-       "api-error-timeout": "अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.",
-       "api-error-unclassified": "एक अज्ञात चूक उद्भवली.",
-       "api-error-unknown-code": "अज्ञात त्रुटी: \"$1\"",
-       "api-error-unknown-error": "अंतर्गत त्रुटी:आपली संचिका चढवितांना काहीतरी चुकले आहे.",
+       "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
        "api-error-unknown-warning": "अज्ञात इशारा : $1",
        "api-error-unknownerror": "अज्ञात चूक $1",
-       "api-error-uploaddisabled": "चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे",
-       "api-error-verification-error": "ही संचिका भ्रष्ट(करप्ट) झाली किंवा चुकीचा विस्तार(एक्सटेंशन) असलेली असू शकते.",
        "duration-seconds": "$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनिटापूर्वी|मिनिटांपूर्वी}}",
        "duration-hours": "$1 {{PLURAL:$1|तासापूर्वी|तासांपूर्वी}}",
index f0376cb..802933e 100644 (file)
@@ -27,7 +27,7 @@
                ]
        },
        "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -",
-       "tog-hideminor": "á\80\9cá\80\90á\80ºá\80\90á\80\9cá\80±á\80¬ á\80¡á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80¡á\80\9cá\80²á\80\99á\80»á\80¬á\80¸á\80\90á\80½á\80\84á\80º á\80¡á\80\9bá\80±á\80¸á\80\99á\80\80á\80¼á\80®á\80¸á\80\9eá\80\8aá\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ ဝှက်ရန်",
+       "tog-hideminor": "á\80¡á\80\9bá\80±á\80¸á\80\99á\80\80á\80¼á\80®á\80¸á\80\9eá\80±á\80¬ á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\99á\80¾á\80¯á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\9cá\80\90á\80ºá\80\90á\80\9cá\80±á\80¬ á\80¡á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80¡á\80\9cá\80²á\80\99á\80»á\80¬á\80¸á\80\99á\80¾ ဝှက်ရန်",
        "tog-hidepatrolled": "လတ်တလော အပြောင်းအလဲများတွင် ကင်းလှည့်တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "tog-newpageshidepatrolled": "စာမျက်နှာသစ်စာရင်းတွင် ကင်းလှည့်စာမျက်နှာများကို ဝှက်ရန်",
        "tog-hidecategorization": "စာမျက်နှာများ၏ ကဏ္ဍကို ဝှက်ရန်",
@@ -38,7 +38,7 @@
        "tog-editondblclick": "ကလစ်နှစ်ခါနှိပ်ပြီး စာမျက်နှာများအား ပြင်ဆင်ရန်",
        "tog-editsectiononrightclick": "အပိုင်းလိုက်ခေါင်းစဉ်များကို ညာကလစ်နှိပ်ခြင်းဖြင့် အပိုင်းလိုက် တည်းဖြတ်ခြင်းကို အသုံးပြုရန်",
        "tog-watchcreations": "ကျွန်ုပ်စတင်ရေးသားခဲ့သည့်စာမျက်နှာများနှင့် အပ်လုပ်တင်ခဲ့သည့် ဖိုင်များကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ရန်",
-       "tog-watchdefault": "á\80\80á\80»á\80½á\80\94á\80ºá\80¯á\80\95á\80º á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80²á\80·á\80\9eá\80\8aá\80·á\80º á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\96á\80­á\80¯á\80\84á\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\9eá\80­á\80¯á\80·  á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\95á\80«á\81\8b",
+       "tog-watchdefault": "á\80\80á\80»á\80½á\80\94á\80ºá\80¯á\80\95á\80º á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80²á\80·á\80\9eá\80\8aá\80·á\80º á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\94á\80¾á\80\84á\80·á\80º á\80\96á\80­á\80¯á\80\84á\80ºá\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\80á\80¼á\80\8aá\80·á\80ºá\80\85á\80¬á\80\9bá\80\84á\80ºá\80¸á\80\9eá\80­á\80¯á\80·  á\80\95á\80±á\80«á\80\84á\80ºá\80¸á\80\91á\80\8aá\80·á\80ºá\80\9bá\80\94á\80º",
        "tog-watchmoves": "ကျွန်ုပ်ရွှေ့လိုက်သော စာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
        "tog-watchdeletion": "ဖျက်လိုက်သောစာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်သို့ ပေါင်းထည့်ရန်",
        "tog-watchuploads": "ကျွန်ုပ်တင်လိုက်သော ဖိုင်အသစ်များအား ကျွန်ုပ်၏ စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
@@ -57,9 +57,9 @@
        "tog-watchlisthideown": "ကျွန်ုပ်၏ တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthidebots": "ဘော့တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
-       "tog-watchlisthideliu": "စောင့်ကြည့်စာရင်းမှ loggin ဝင်ထားသော အသုံးပြုသူတို့၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
+       "tog-watchlisthideliu": "စောင့်ကြည့်စာရင်းမှ log in ဝင်ထားသော အသုံးပြုသူတို့၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "tog-watchlisthideanons": "စောင့်ကြည့်စာရင်းမှ အမည်မသိ အသုံးပြုသူများ၏ တည်းဖြတ်မှုများကို ဝှက်ရန်",
-       "tog-watchlisthidepatrolled": "patrolled တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
+       "tog-watchlisthidepatrolled": "စောင့်ကြည့်စစ်ဆေးထားသော တည်းဖြတ်မှုများကို စောင့်ကြည့်စာရင်းမှ ဝှက်ထားရန်",
        "tog-watchlisthidecategorization": "စာမျက်နှာများ၏ ကဏ္ဍကို ဝှက်ရန်",
        "tog-ccmeonemails": "ကျွန်ုပ် အခြားအသုံးပြုသူများထံပို့သော အီးမေးမိတ္တူကို ကျွန်ုပ်ထံ ပြန်ပို့ရန်",
        "tog-diffonly": "ကွဲပြားမှုများအောက်ရှိ စာမျက်နှာတွင်ပါဝင်သည်များကို မပြပါနှင့်",
        "and": "&#32;နှင့်",
        "qbfind": "ရှာပါ",
        "qbbrowse": "ရှာဖွေလှန်လှောရန်",
-       "qbedit": "ပြင်​ဆင်​ရန်​",
+       "qbedit": "ပြင်ဆင်ရန်",
        "qbpageoptions": "ဤစာမျက်နှာ",
        "qbmyoptions": "ကျွန်ုပ် စာမျက်နှာများ",
        "faq": "မေးလေ့ရှိကြသည်များ",
        "print": "ပရင့်",
        "view": "ကြည့်ရန်",
        "view-foreign": "$1 တွင် ကြည့်ရန်",
-       "edit": "ပြင်​ဆင်​ရန်​",
+       "edit": "ပြင်ဆင်ရန်",
        "create": "စတင်ရေးသားရန်",
+       "create-local": "ဒေသတွင်း ဖော်ပြချက် ထည့်ရန်",
        "editthispage": "ဤစာမျက်နှာကို ပြင်ရန်",
        "create-this-page": "ဤစာမျက်နှာကို စတင်ရေးသားရန်",
        "delete": "ဖျက်​ပါ​",
        "talk": "ဆွေးနွေးချက်",
        "views": "အမြင်ပုံစံများ",
        "toolbox": "ကိရိယာများ",
+       "tool-link-userrights": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို ပြောင်းလဲရန်",
+       "tool-link-userrights-readonly": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို ကြည့်ရန်",
+       "tool-link-emailuser": "ဤ{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်",
        "userpage": "အသုံးပြုသူ၏ စာမျက်နှာကို ကြည့်ရန်",
        "projectpage": "ပရောဂျက်စာမျက်နှာကို ကြည့်ရန်",
        "imagepage": "ဖိုင်စာမျက်နှာကိုကြည့်ရန်",
        "currentevents-url": "Project:လက်ရှိဖြစ်ရပ်များ",
        "disclaimers": "သတိပြုစရာများ",
        "disclaimerpage": "Project: အထွေထွေ သတိပြုဖွယ်",
-       "edithelp": "á\80\95á\80¼á\80\84á\80ºâ\80\8bá\80\86á\80\84á\80ºâ\80\8bá\80\9bá\80\94á\80º á\80¡â\80\8bá\80\80á\80°â\80\8bá\80¡â\80\8bá\80\8aá\80®â\80\8b",
+       "edithelp": "á\80\90á\80\8aá\80ºá\80¸á\80\96á\80¼á\80\90á\80ºá\80\81á\80¼á\80\84á\80ºá\80¸ á\80¡á\80\80á\80°á\80¡á\80\8aá\80®",
        "helppage-top-gethelp": "အကူအညီ",
        "mainpage": "ဗဟိုစာမျက်နှာ",
        "mainpage-description": "ဗ​ဟို​စာ​မျက်​နှာ​",
        "newmessageslinkplural": "{{PLURAL:$1|စာလွှာအသစ် တစ်စောင်|999=စာလွှာ အသစ်များ}}",
        "newmessagesdifflinkplural": "နောက်ဆုံး {{PLURAL:$1|ပြောင်းလဲမှု|999=ပြောင်းလဲမှုများ}}",
        "youhavenewmessagesmulti": "$1 မှာ စာတိုအသစ်များ ရှိသည်",
-       "editsection": "ပြင်​ဆင်​ရန်​",
-       "editold": "ပြင်​ဆင်​ရန်​",
+       "editsection": "ပြင်ဆင်ရန်",
+       "editold": "ပြင်ဆင်ရန်",
        "viewsourceold": "ရင်းမြစ်ကို ကြည့်ရန်",
-       "editlink": "ပြင်​ဆင်​ရန်",
+       "editlink": "ပြင်ဆင်ရန်",
        "viewsourcelink": "ရင်းမြစ်ကို ကြည့်ရန်",
        "editsectionhint": "ဤအပိုင်းကို တည်းဖြတ်ရန် - $1",
        "toc": "မာတိကာ",
        "red-link-title": "$1 (စာမျက်နှာ မရှိသေးပါ)",
        "sort-descending": "အစဉ်လိုက်စီရန်",
        "sort-ascending": "အစဉ်လိုက် ပြောင်းပြန်စီရန်",
-       "nstab-main": "စာ​မျက်​နှာ​",
-       "nstab-user": "အ​သုံး​ပြု​သူ​၏ ​စာ​မျက်​နှာ​",
+       "nstab-main": "စာမျက်နှာ",
+       "nstab-user": "အသုံးပြုသူ စာမျက်နှာ",
        "nstab-media": "မီဒီယာ စာမျက်နှာ",
        "nstab-special": "အထူး စာမျက်နှာ",
        "nstab-project": "ပရောဂျက်စာမျက်နှာ",
        "retypenew": "စကားဝှက် အသစ်ကို ထပ်ရိုက်ပါ -",
        "resetpass_submit": "စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန်",
        "changepassword-success": "သင့်စကားဝှက်ကို ပြောင်းလဲပြီးပါပြီ!",
+       "botpasswords": "ဘော့ စကားဝှက်များ",
        "botpasswords-label-appid": "ဘော့အမည်-",
        "botpasswords-label-create": "ဖန်တီး",
        "botpasswords-label-cancel": "မလုပ်တော့ပါ",
        "revdelete-confirm": "ဤသို့ ဖျက်ပစ်ရန် သင် အမှန်တကယ် ရည်ရွယ်လျက် နောက်ဆက်တွဲ အကျိုးဆက်များကို သိရှိနားလည်ပြီး [[{{MediaWiki:Policy-url}}|မူဝါဒ]]အတိုင်း လုပ်ဆောင်နေခြင်းဖြစ်ကြောင်းကို ကျေးဇူးပြု၍ အတည်ပြုပေးပါ။",
        "revdelete-legend": "မြင်နိုင်စွမ်းရှိမှုတို့အား ကန့်သတ်ခြင်းကို သတ်မှတ်ရန်",
        "revdelete-hide-text": "တည်းဖြတ်မူမှ စာသား",
-       "revdelete-hide-image": "á\80\96á\80­á\80¯á\80\84á\80ºá\80\95á\80« á\80¡á\80±á\80\80á\80¼ာင်းအရာများကို ဝှက်ရန်",
+       "revdelete-hide-image": "á\80\96á\80­á\80¯á\80\84á\80ºá\80\95á\80« á\80¡á\80\80á\80¼á\80±ာင်းအရာများကို ဝှက်ရန်",
        "revdelete-hide-comment": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "revdelete-hide-user": "တည်းဖြတ်သူ၏ အသုံးပြုသူအမည်/အိုင်ပီလိပ်စာ",
        "revdelete-radio-same": "(မပြောင်းလဲ)",
        "searchprofile-advanced-tooltip": "စိတ်ကြိုက်အမည်ညွှန်းများတွင် ရှာရန်",
        "search-result-size": "$1 ({{PLURAL:$2|စကားလုံး 1 လုံး|စကားလုံး $2 လုံး}})",
        "search-result-category-size": "{{PLURAL:$1|အသင်းဝင်တစ်ခု|အသင်းဝင် $1 ခု}} ({{PLURAL:$2|ကဏ္ဍခွဲတစ်ခု|ကဏ္ဍခွဲ $2 ခု}}, {{PLURAL:$3|ဖိုင်တစ်ခု|ဖိုင် $3 ခု}})",
-       "search-redirect": "($1 á\80\9eá\80­á\80¯á\80· á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºးသည်)",
+       "search-redirect": "($1 á\80\99á\80¾ á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\91á\80¬းသည်)",
        "search-section": "(အပိုင်း $1)",
        "search-category": "(ကဏ္ဍ $1)",
        "search-suggest": "$1 ဟု ဆိုလိုပါသလား။",
        "search-relatedarticle": "ဆက်နွယ်သော",
        "searchrelated": "ဆက်နွယ်သော",
        "searchall": "အားလုံး",
-       "showingresults": "'''$2''' နှင့်စသော ရလဒ် {{PLURAL:$1|'''1''' ခု|'''$1''' ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "showingresults": "№<strong>$2</strong> နှင့်စသော ရလဒ် {{PLURAL:$1|<strong>1</strong> ခု|<strong>$1</strong> ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "showingresultsinrange": "№<strong>$2</strong> မှ #<strong>$3</strong> အထိ ရလဒ် {{PLURAL:$1|<strong>1</strong> ခု|<strong>$1</strong> ခု}}ထိကို အောက်တွင် ပြထားသည်။",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ၏ <strong>$1</strong> ရလဒ်|<strong>$3</strong> ၏ <strong>$1 - $2</strong> ရလဒ်များ}}",
        "search-nonefound": "စုံစမ်းမှုနှင့်ကိုက်ညီသော ရလဒ်မရှိပါ။",
        "powersearch-legend": "အထူးပြု ရှာဖွေရန်",
        "powersearch-ns": "အမည်ညွှန်းတို့တွင် ရှာရန် -",
        "prefs-skin": "အသွင်အပြင်",
        "skin-preview": "နမူနာ",
        "datedefault": "မရွေးချယ်",
-       "prefs-user-pages": "အသုံးပြုသူ စာမျက်နှာများ",
+       "prefs-user-pages": "အသုံးပြုသူ စာမျက်နှာများ",
        "prefs-personal": "အသုံးပြုသူ ပရိုဖိုင်",
        "prefs-rc": "လတ်​တ​လောအ​ပြောင်း​အ​လဲ​",
        "prefs-watchlist": "စောင့်ကြည့်စာရင်း",
        "saveprefs": "သိမ်းရန်",
        "restoreprefs": "မူလအပြင်အဆင်အားလုံးသို့ ပြန်ပြောင်းရန် (အပိုင်းအားလုံးတွင်)",
        "prefs-editing": "တည်းဖြတ်ခြင်း",
-       "rows": "အလျားလိုက်တန်း -",
-       "columns": "ဒေါင်လိုက်တန်း -",
        "searchresultshead": "ရှာဖွေရန်",
        "stub-threshold-disabled": "ပိတ်ထားသည်",
        "recentchangesdays": "လတ်တလောအပြောင်းအလဲများကို ပြရန်နေ့များ -",
        "prefs-tokenwatchlist": "တိုကင်",
        "prefs-diffs": "ကွဲပြားချက်",
        "userrights": "အသုံးပြုသူ၏ အခွင့်အရေးများကို စီမံခန့်ခွဲခြင်း",
-       "userrights-lookup-user": "á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80¯á\80\95á\80ºá\80\85á\80¯á\80\80á\80­á\80¯ á\80\85á\80®á\80\99á\80ရန်",
+       "userrights-lookup-user": "á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80\90á\80\85á\80ºá\80¦á\80¸á\80\80á\80­á\80¯ á\80\9bá\80½á\80±á\80¸á\80\81á\80»á\80\9aá\80ºရန်",
        "userrights-user-editname": "အသုံးပြုသူအမည်တစ်ခုကို ထည့်ပါ -",
-       "editusergroup": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို တည်းဖြတ်ရန်",
+       "editusergroup": "အသုံးပြုသူအုပ်စုကို ဖော်ပြရန်",
        "editinguser": "{{GENDER:$1|အသုံးပြုသူ}} <strong>[[User:$1|$1]]</strong> $2 ၏ အသုံးပြုအခွင့်အရေးများကို ပြောင်းလဲခြင်း",
        "userrights-editusergroup": "အသုံးပြုသူအုပ်စုကို တည်းဖြတ်ရန်",
        "saveusergroups": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို သိမ်းရန်",
        "userrights-groupsmember": "အဖွဲ့ဝင်",
        "userrights-reason": "အ​ကြောင်း​ပြ​ချက်:",
-       "userrights-notallowed": "သင့်တွင် အသုံးပြုသူအခွင့်အရေး ပေါင်းထည့်ရန်  သို့ ဖယ်ရှားရန် အခွင့်အရေး မရှိပါ။",
        "userrights-changeable-col": "သင်ပြောင်းလဲပေးနိုင်သောအုပ်စုများ",
        "userrights-unchangeable-col": "သင်ပြောင်းလဲမပေးနိုင်သောအုပ်စုများ",
        "group": "အုပ်စု -",
        "group-user": "အသုံးပြုသူများ",
        "group-autoconfirmed": "အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူများ",
        "group-bot": "ဘော့များ",
-       "group-sysop": "á\80¡á\80\80á\80ºá\80\92á\80\99á\80\84á\80ºများ",
+       "group-sysop": "á\80\85á\80®á\80\99á\80¶á\80\81á\80\94á\80·á\80ºá\80\81á\80½á\80²á\80\9eá\80°များ",
        "group-bureaucrat": "ဗျူရိုကရက်",
        "group-all": "(အားလုံး)",
        "group-user-member": "{{GENDER:$1|အသုံးပြုသူ}}",
        "grouppage-user": "{{ns:project}}:အသုံးပြုသူများ",
        "grouppage-autoconfirmed": "{{ns:project}}:အလိုအလျောက်အတည်ပြုထားသောအသုံးပြုသူများ",
        "grouppage-bot": "{{ns:project}}:ဘော့များ",
-       "grouppage-sysop": "{{ns:project}}: အက်ဒမင်များ",
+       "grouppage-sysop": "{{ns:project}}:စီမံခန့်ခွဲသူများ",
        "grouppage-bureaucrat": "{{ns:project}}:ဗျူရိုကရက်များ",
        "right-read": "စာမျက်နှာများကို ဖတ်ရန်",
        "right-edit": "စာမျက်နှာများကို တည်းဖြတ်ရန်",
        "action-reupload": "ဤရှိပြီးသားဖိုင်ကို ထပ်ရေးရန်",
        "action-writeapi": "ရေးသားမှု API ကို သုံးရန်",
        "action-delete": "ဤစာမျက်နှာကို ဖျက်ရန်",
-       "action-deleterevision": "á\80¤á\80\99á\80°ကို ဖျက်ရန်",
-       "action-deletedhistory": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\81\8fဖျက်လိုက်သောရာဇဝင်ကို ကြည့်ရန်",
+       "action-deleterevision": "á\80\99á\80°á\80\99á\80»á\80¬á\80¸ကို ဖျက်ရန်",
+       "action-deletedhistory": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\90á\80\85á\80ºá\80\81á\80¯á\81\8f ဖျက်လိုက်သောရာဇဝင်ကို ကြည့်ရန်",
        "action-browsearchive": "ဖျက်ပစ်လိုက်သော စာမျက်နှာများကို ရှာရန်",
-       "action-undelete": "á\80¤á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\80á\80­á\80¯ မဖျက်တော့ရန်",
+       "action-undelete": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸ á\80\95á\80¼á\80\94á\80ºမဖျက်တော့ရန်",
        "action-suppressionlog": "ဤကိုယ်ပိုင်မှတ်တမ်းကို ကြည့်ရန်",
        "action-block": "တည်းဖြတ်ခြင်းမှ ဤအသုံးပြုသူကို ပိတ်ပင်ရန်",
        "action-protect": "ဤစာမျက်နှာအတွက် ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲရန်",
        "action-import": "အခြားဝီကီများမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
        "action-importupload": "Upload တင်လိုက်သော ဖိုင်တစ်ခုမှ စာမျက်နှာများကို ထည့်သွင်းရန်",
+       "action-patrol": "အခြားသူများ၏ တည်းဖြတ်မှုများအား စောင့်ကြည့်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်",
        "action-autopatrol": "သင့်တည်းဖြတ်မှုကို စောင့်ကြပ်စစ်ဆေးနေသည်ဟု မှတ်သားထားရန်",
        "action-unwatchedpages": "စောင့်မကြည့်တော့သော စာမျက်နှာများ၏ စာရင်းကို ကြည့်ရန်",
        "action-mergehistory": "ဤစာမျက်နှာ၏ရာဇဝင်ကို ပေါင်းရန်",
        "recentchanges-label-bot": "ဤတည်းဖြတ်မှုကို ဘော့က လုပ်ဆောင်သွားသည်။",
        "recentchanges-label-unpatrolled": "ဤတည်းဖြတ်မှုကို မစောင့်ကြပ်မစစ်ဆေးရသေးပါ",
        "recentchanges-label-plusminus": "စာမျက်နှာ အရွယ်အစားမှာ အောက်ပါ ဘိုက်ပမာဏ ပြောင်းလဲသွားခဲ့သည်",
+       "recentchanges-legend-heading": "<strong>အညွှန်း:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|စာမျက်နှာသစ်များ စာရင်း]]ကိုလည်း ကြည့်ရန်)",
        "recentchanges-submit": "ပြသရန်",
        "rcnotefrom": "အောက်ပါတို့မှာ <strong>$3၊ $4</strong> မှစ၍ {{PLURAL:$5|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}} ဖြစ်သည်  (<strong>$1</strong> အထိ ပြထား)။",
        "rcshowhideminor-hide": "ဝှက်",
        "rcshowhidebots": "ဘော့များ $1ရန်",
        "rcshowhidebots-show": "ပြ",
-       "rcshowhidebots-hide": "ဝှက်ရန်",
+       "rcshowhidebots-hide": "ဝှက်",
        "rcshowhideliu": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ $1",
        "rcshowhideliu-show": "ပြသရန်",
        "rcshowhideliu-hide": "ဝှက်",
        "tmp-create-error": "ယာယီဖိုင် မဖန်တီးနိုင်ပါ။",
        "tmp-write-error": "ယာယီဖိုင်ရေးသားရာတွင် အမှားဖြစ်ပေါ်နေသည်။",
        "largefileserver": "ဤဖိုင်သည် ဆာဗာတွင် ခွင့်ပြုရန်သတ်မှတ်ထားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်။",
+       "file-exists-duplicate": "ဤဖိုင်သည် အောက်ပါ {{PLURAL:$1|ဖိုင်|ဖိုင်များ}}၏ ထပ်တူပုံပွား ဖြစ်သည် -",
        "uploadwarning": "Upload တင်ရာတွင် သတ်ပေးချက်",
        "savefile": "ဖိုင်သိမ်းရန်",
        "uploaddisabled": "Upload တင်ခြင်း ပိတ်ထားသည်။",
        "upload-options": "Upload တင်သည့် ရွေးချယ်မှုများ",
        "watchthisupload": "ဤဖိုင်အား စောင့်ကြည့်ရန်",
        "upload-misc-error": "upload တင်ရာတွင် အမည်မသိ အမှား",
+       "upload-form-label-infoform-categories": "ကဏ္ဍများ",
        "img-auth-accessdenied": "ဝင်ရောက်ခြင်းကို ငြင်းပယ်လိုက်သည်",
        "img-auth-nofile": "\"$1\" ဟူသည့်ဖိုင် မရှိပါ။",
        "img-auth-streaming": "\"$1\" ကို စထရင်းမင်း ဆွဲနေသည်။",
        "filepage-nofile-link": "ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။ သိုရာတွင် ယင်းကို [$1 upload တင်]နိုင်သည်။",
        "uploadnewversion-linktext": "ဤဖိုင်၏ နောက်ဆုံး version ကို upload တင်ရန်",
        "shared-repo-from": "$1 ထံမှ",
+       "shared-repo-name-wikimediacommons": "ဝီကီမီဒီယာ ကွန်မွန်းစ်",
        "upload-disallowed-here": "သင်သည် ဤဖိုင်အား ထပ်၍ ရေးသားမရနိုင်ပါ။",
        "filerevert": "$1 ကို ပြန်ပြောင်းရန်",
        "filerevert-legend": "ဖိုင်ကို ပြန်ပြောင်းရန်",
        "download": "ဒေါင်းလုဒ်",
        "unwatchedpages": "မစောင့်ကြည့်တော့သော စာမျက်နှာများ",
        "listredirects": "ပြန်ညွှန်းသည့် လင့်များစာရင်း",
+       "listduplicatedfiles": "ထပ်တူပုံပွားဖိုင်များ စာရင်း",
        "unusedtemplates": "မသုံးသော တမ်းပလိတ်များ",
        "unusedtemplateswlh": "အခြားလိပ်စာများ",
        "randompage": "ကျ​ပန်း​စာ​မျက်​နှာ​",
+       "randomincategory": "ကဏ္ဍတွင်းရှိ ကျပန်း စာမျက်နှာ",
+       "randomincategory-category": "ကဏ္ဍ:",
        "randomredirect": "ကျပန်းပြန်ညွှန်း",
        "randomredirect-nopages": "အမည်ညွှန်း \"$1\" တွင် ပြန်ညွှန်းမရှိပါ။",
        "statistics": "စာရင်းအင်း",
        "double-redirect-fixed-move": "[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ၎င်းအား အလိုအလျောက် ပြင်ဆင်ပြီး [[$2]] သို့ ပြန်ညွှန်းထားသည်။",
        "brokenredirects": "ကျိုးပျက်နေသော ပြန်ညွှန်းများ",
        "brokenredirectstext": "အောက်ပါ ပြန်ညွှန်းများသည် မရှိသောစာမျက်နှာများသို့ လင့်ထားသည် -",
-       "brokenredirects-edit": "ပြင်​ဆင်​ရန်",
+       "brokenredirects-edit": "ပြင်ဆင်ရန်",
        "brokenredirects-delete": "ဖျက်​ပါ",
        "withoutinterwiki": "ဘာသာစကားလင့်မပါသော စာမျက်နှာများ",
        "withoutinterwiki-summary": "အောက်ပါစာမျက်နှာများသည် အခြားဘာသာစကားဗားရှင်းများသို့ လင့်မထားပါ။",
        "wantedpages": "အလိုရှိသော စာမျက်နှာများ",
        "wantedfiles": "အလိုရှိသော ဖိုင်များ",
        "wantedtemplates": "အလိုရှိသော တမ်းပလိတ်များ",
+       "mostlinked": "အများဆုံး လာရောက်ချိတ်ဆက်ထားသည့် စာမျက်နှာများ",
+       "mostlinkedcategories": "အများဆုံး လာရောက် ချိတ်ဆက်ထားသည့် ကဏ္ဍများ",
        "mostcategories": "ကဏ္ဍအများဆုံးပါသော စာမျက်နှာများ",
+       "mostimages": "အများဆုံး လာရောက်ချိတ်ဆက်ထားသည့် ဖိုင်များ",
+       "mostrevisions": "တည်းဖြတ်မှု အများဆုံး စာမျက်နှာများ",
        "prefixindex": "ရှေ့ဆုံးမှ prefix ပါသော စာမျက်နှာ အားလုံး",
        "prefixindex-submit": "ပြသရန်",
        "shortpages": "စာမျက်နှာတို",
        "longpages": "ရှည်လျားသောစာမျက်နှာများ",
-       "deadendpages": "လမ်းပိတ်နေသော (လင့်မရှိသော) စာမျက်နှာများ",
+       "deadendpages": "လမ်းဆုံးနေသော (လင့်ခ်မချိတ်ထားသော) စာမျက်နှာများ",
+       "deadendpagestext": "အောက်ပါ စာမျက်နှာများသည် {{SITENAME}} တွင် အခြား စာမျက်နှာများသို့ လင့်ခ်ချိတ်ဆက်ထားခြင်း မရှိပါ။",
        "protectedpages": "ကာကွယ်ထားသော စာမျက်နှာများ",
        "protectedpages-noredirect": "ပြန်ညွှန်းများအား ဝှက်ရန်",
+       "protectedpages-page": "စာမျက်နှာ",
        "protectedtitles": "ကာကွယ်ထားသော ခေါင်းစဉ်များ",
        "listusers": "အသုံးပြုသူစာရင်း",
        "listusers-editsonly": "တည်းဖြတ်ထားဖူးသော အသုံးပြုသူများကိုသာ ဖော်ပြရန်",
        "ancientpages": "အဟောင်းဆုံးစာမျက်နှာ",
        "move": "ရွှေ့ရန်",
        "movethispage": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
+       "unusedimagestext": "အောက်ပါဖိုင်များသည် မည်သည့်စာမျက်နှာတွင်မှ သုံးစွဲထားခြင်း မရှိပါ။\nအခြားသော ဝက်ဘ်ဆိုဒ်များမှနေ၍ ဖိုင်တစ်ခုခုသို့ တိုက်ရိုက် URL ဖြင့် တိုက်ရိုက်ချိတ်ဆက်ထားခြင်း ရှိနေနိုင်ပြီး သုံးစွဲနေခြင်းမရှိသော်လည်း ဤနေရာတွင် ဖော်ပြထားနိုင်ကြောင်း ကျေးဇူးပြု၍ မှတ်သားပါ။",
        "pager-newer-n": "{{PLURAL:$1|ပိုသစ်သော တစ်ခု|ပိုသစ်သော $1 ခု}}",
        "pager-older-n": "{{PLURAL:$1|ပိုဟောင်းသော တစ်ခု|ပိုဟောင်းသော $1 ခု}}",
        "booksources": "မှီငြမ်း စာအုပ်များ",
        "all-logs-page": "အများနှင့်ဆိုင်သောမှတ်တမ်းအားလုံး",
        "alllogstext": "{{SITENAME}}၏ ရရှိနိုင်သော မှတ်တမ်းများအားလုံး ပေါင်းစည်းပြသခြင်း ဖြစ်သည်။\nမှတ်တမ်းအမျိုးအစား၊ အသုံးပြုသူအမည် (စာလုံးအကြီးအသေး)၊ သို့မဟုတ် သက်ဆိုင်ရာ စာမျက်နှာ (စာလုံးအကြီးအသေး) ကို ရွေးချယ်ခြင်းဖြင့် ကြည့်ရှုမှုကို အကျဉ်းချုံးနိုင်ပါသည်။",
        "logempty": "မှတ်တမ်းထဲတွင် ကိုက်ညီသော အရာများ မရှိပါ။",
+       "checkbox-all": "အားလုံး",
        "allpages": "စာမျက်နှာအားလုံး",
        "nextpage": "နောက်ထပ်စာမျက်နှာ ($1)",
        "prevpage": "ယခင် စာမျက်နှာ ($1)",
        "listusers-blocked": "(ပိတ်ပင်ထားသည်)",
        "activeusers": "တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူစာရင်း",
        "activeusers-intro": "ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။",
+       "activeusers-count": "{{PLURAL:$3|ရက်|$3 ရက်}}အတွင်း {{PLURAL:$1|လုပ်ဆောင်မှု|လုပ်ဆောင်မှု}} $1 ခု",
        "activeusers-from": "ဤမှစသော အသုံးပြုသူများကို ပြရန် -",
        "activeusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။",
        "listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ",
        "listgrouprights-removegroup-all": "အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
        "listgrouprights-addgroup-self-all": "အုပ်စုအားလုံးကို မိမိ၏အကောင့်သို့ ပေါင်းထည့်ရန်",
        "listgrouprights-removegroup-self-all": "မိမိ၏အကောင့်မှ အုပ်စုအားလုံးကို ဖယ်ရှားရန်",
+       "trackingcategories": "နောက်ယောင်ခံ ကဏ္ဍများ",
+       "trackingcategories-msg": "နောက်ယောင်ခံ ကဏ္ဍ",
        "mailnologin": "ပို့ရန်လိပ်စာ မရှိပါ",
        "emailuser": "ဤ​အ​သုံး​ပြု​သူ​အား​ အီး​မေး​ပို့​ပါ​",
        "emailuser-title-target": "{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်",
        "minimum-size": "အသေးဆုံးအရွယ်အစား",
        "maximum-size": "အကြီးဆုံးအရွယ်အစား -",
        "pagesize": "(ဘိုက်)",
-       "restriction-edit": "ပြင်​ဆင်​ရန်​",
+       "restriction-edit": "ပြင်ဆင်ရန်",
        "restriction-move": "ရွှေ့ရန်",
        "restriction-create": "ထွင်",
        "restriction-upload": "Upload တင်ရန်",
        "invert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "tooltip-invert": "ဤအကွက်ကို အမှန်ခြစ်၍ ရွေးချယ်ထားသော အမည်ညွှန်း (နှင့် ဆက်စပ်အမည်ညွှန်း)တွင် ပြောင်းလဲမှုများကို ဝှက်ပါ။",
        "namespace_association": "ဆက်စပ်နေသော အမည်ညွှန်း",
+       "tooltip-namespace_association": "ရွေးချယ်ထားသည့် အမည်ညွှန်းနှင့် ဆက်စပ်နေသည့် ဆွေးနွေးချက် သို့မဟုတ် အကြောင်းအရာ အမည်ညွှန်း ပါဝင်စေရန် ဤအကွက်တွင် အမှန်ခြစ်ရန်",
        "blanknamespace": "(ပင်မ)",
        "contributions": "{{GENDER:$1|အသုံးပြုသူ}}၏ ဆောင်ရွက်ချက်များ",
        "contributions-title": "$1 အတွက် အသုံးပြုသူ၏ ဆောင်ရွက်ချက်များ",
        "mycontris": "ဆောင်ရွက်ချက်များ",
        "anoncontribs": "ဆောင်ရွက်ချက်များ",
        "contribsub2": "{{GENDER:$3|$1}}အတွက် ($2)",
+       "nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။",
        "uctop": "(လက်ရှိ)",
        "month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :",
        "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :",
        "sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
        "sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်",
        "sp-contributions-blocklog": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
+       "sp-contributions-deleted": "ဖျက်ခံထားရသည့် {{GENDER:$1|အသုံးပြုသူ}} ဆောင်ရွက်ချက်များ",
        "sp-contributions-uploads": "အပ်လုပ်တင်ထားသည်များ",
        "sp-contributions-logs": "မှတ်​တမ်း​များ​",
        "sp-contributions-talk": "ဆွေးနွေး",
        "sp-contributions-search": "ပံ့ပိုးမှုများကို ရှာရန်",
        "sp-contributions-username": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် :",
        "sp-contributions-toponly": "နောက်ဆုံးတည်းဖြတ်မူများသာပြရန်",
+       "sp-contributions-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "sp-contributions-submit": "ရှာဖွေရန်",
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
        "whatlinkshere-title": "\"$1\" ကို လင့်ထားသော စာမျက်နှာများ",
        "ipaddressorusername": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် -",
        "ipbexpiry": "သက်တမ်းကုန်လွန်ရက် -",
        "ipbreason": "အ​ကြောင်း​ပြ​ချက်:",
+       "ipb-hardblock": "ဤအိုင်ပီလိပ်စာမှ လော့ဂ်အင်ဝင်ထားသော အသုံးပြုသူများကို တည်းဖြတ်ခြင်းမှ တားမြစ်ရန်",
        "ipbcreateaccount": "အကောင့်အသစ်ပြုလုပ်ခြင်းကို တားဆီးရန်",
        "ipbemailban": "အီးမေးပို့ခြင်းမှ အသုံးပြုသူကို တားဆီးရန်",
+       "ipbenableautoblock": "ဤအသုံးပြုသူ အသုံးပြုသော အိုင်ပီလိပ်စာနှင့် သူတို့ ပြင်ဆင်ရန် ကြိုးစားသည့် နောက်ဆက်တွဲ အိုင်ပီလိပ်စာများကိုပါ အလိုအလျောက်ပိတ်ပင်ရန်",
        "ipbsubmit": "ဤအသုံးပြုသူကို ပိတ်ပင်ရန်",
        "ipbother": "အခြားအချိန်:",
        "ipboptions": "၂ နာရီ:2 hours,၁ ရက်:1 day,၃ ရက်:3 days,၁ ပတ်:1 week,၂ ပတ်:2 weeks,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year,အနန္တ:infinite",
        "ipbhidename": "အသုံးပြုသူအမည်ကို တည်းဖြတ်မှုများနှင့် စာရင်းမှထဲတွင် ဝှက်ထားရန်",
-       "ipbwatchuser": "ဤအသုံးပြုသူ၏စာမျက်နှနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
+       "ipbwatchuser": "ဤအသုံးပြုသူ၏ စာမျက်နှာနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
+       "ipb-disableusertalk": "ပိတ်ပင်ထားစဉ်အတွင်း ဤအသုံးပြုသူအား သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်းမှ ပိတ်ပင်ရန်",
+       "ipb-change-block": "အသုံးပြုသူအား ဤအပြင်အဆင်များဖြင့် ထပ်မံပိတ်ပင်ရန်",
        "badipaddress": "တရားမဝင်သော IP address",
        "blockipsuccesssub": "ပိတ်ပင်ခြင်း အောင်မြင်သည်",
        "ipb-edit-dropdown": "ပိတ်ပင်ရသောအကြောင်းရင်းများ",
        "change-blocklink": "စာကြောင်းအမည် ပြောင်းရန်",
        "contribslink": "ပံ့ပိုး",
        "blocklogpage": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
+       "blocklog-showlog": "ဤအသုံးပြုသူအား ယခင်က ပိတ်ပင်ထားပြီး ဖြစ်သည်။\nပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။",
        "blocklogentry": "[[$1]] ကို $2 ကြာအောင် ပိတ်ပင် တားဆီးလိုက်သည် $3",
        "blocklogtext": "ဤသည်မှာ အသုံးပြုသူအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှုဖယ်ရှားခြင်း ဆောင်ရွက်မှု မှတ်တမ်း ဖြစ်သည်။\nအလိုအလျောက် ပိတ်ပင်ထားသည့် အိုင်ပီလိပ်စာများအား မထည့်သွင်းထားပါ။\nလက်ရှိ တားမြစ်မှုများနှင့် ပိတ်ပင်မှုများ စာရင်းအတွက် [[Special:BlockList|ပိတ်ပင်စာရင်း]]ကို ကြည့်ပါ။",
        "unblocklogentry": "$1 ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ရန်",
        "block-log-flags-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ",
        "block-log-flags-hiddenname": "အသုံးပြုသူအမည် ဝှက်ထားသည်",
        "ipb_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။",
-       "ipb_already_blocked": "\"$1\" ကို အစကတည်းက ပိတ်ထားသည်",
+       "ipb_already_blocked": "\"$1\" ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။",
+       "ipb-needreblock": "$1 ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။ အပြင်အဆင်များကို ပြောင်းလဲလိုပါသလား?",
        "move-page": "$1 ကို ရွှေ့ရန်",
        "move-page-legend": "စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်",
        "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movereason": "အ​ကြောင်း​ပြ​ချက် -",
        "revertmove": "ပြောင်းရန်",
        "delete_and_move_confirm": "ဟုတ်ပါသည်။ စာမျက်နှာကို ဖျက်ပါ။",
+       "delete_and_move_reason": "\"[[$1]]\" ရွှေ့ပြောင်းရန်အတွက် ဖျက်ပစ်ခြင်း",
        "immobile-source-page": "ဤစာမျက်နှာကို ရွှေ့မရပါ။",
        "move-leave-redirect": "ပြန်ညွှန်းတစ်ခု ချန်ထားရန်",
        "export": "စာမျက်နှာများကို Export ထုတ်ရန်",
        "show-big-image": "မူရင်းဖိုင်",
        "show-big-image-preview": "ဤနမူနာ၏ အရွယ်အစား - $1။",
        "show-big-image-other": "အခြား {{PLURAL:$2|ပုံရိပ်ပြတ်သားမှု|ပုံရိပ်ပြတ်သားမှု}}: $1။",
+       "show-big-image-size": "$1 × $2 ပစ်ဇယ်",
        "newimages": "ပုံအသစ်များပြခန်း",
        "newimages-legend": "စိစစ်မှု",
        "newimages-label": "ဖိုင်အမည် (သို့ ယင်း၏အစိတ်အပိုင်း) -",
        "exif-usercomment": "အသုံးပြုသူ မှတ်ချက်များ",
        "exif-relatedsoundfile": "ဆက်နွယ်သော အသံဖိုင်",
        "exif-datetimeoriginal": "ဒေတာဖန်တီးခဲ့သော နေ့စွဲနှင့် အချိန်",
+       "exif-datetimedigitized": "ဒီဂျစ်တယ်ပြောင်းသည့် နေ့ရက်နှင့် အချိန်",
        "exif-exposuretime-format": "$1 စက္ကန့် ($2)",
        "exif-shutterspeedvalue": "APEX ရှပ်တာ အမြန်နှုန်း",
        "exif-flash": "ဖလက်ရှ်",
        "fileduplicatesearch-filename": "ဖိုင်အမည် -",
        "fileduplicatesearch-submit": "ရှာဖွေရန်",
        "specialpages": "အ​ထူး ​စာ​မျက်​နှာ​များ",
+       "specialpages-note": "* ပုံမှန် အထူးစာမျက်နှာများ။\n* <span class=\"mw-specialpagerestricted\">ကန့်သတ်ထားသော အထူးစာမျက်နှာများ။</span>",
        "specialpages-group-maintenance": "ထိန်းသိမ်းမှု အစီရင်ခံချက်များ",
        "specialpages-group-other": "အခြားအထူးစာမျက်နှာများ",
        "specialpages-group-login": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
        "tags": "အသုံးပြုနေသော အပြောင်းအလဲစာတွဲများ",
        "tag-filter": "[[Special:Tags|Tag]] သီးသန့်စစ်ထုတ်ရန် -",
        "tag-filter-submit": "စိစစ်မှု",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|စာတွဲ|စာတွဲများ}}]]: $2)",
        "tags-title": "အမည်တွဲ",
        "tags-tag": "အမည်တွဲ အမည်",
-       "tags-edit": "ပြင်​ဆင်​ရန်",
+       "tags-edit": "ပြင်ဆင်ရန်",
        "comparepages": "စာမျက်နှာများကို နှိုင်းယှဉ်ရန်",
        "compare-page1": "စာမျက်နှာတစ်",
        "compare-page2": "စာမျက်နှာနှစ်",
        "htmlform-reset": "ပြောင်းလဲထားသည်များ မလုပ်တော့ရန်",
        "htmlform-selectorother-other": "အခြား",
        "logentry-delete-delete": "$3 စာမျက်နှာကို $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
+       "logentry-delete-delete_redir": "ပြန်ညွှန်း $3 ကို ထပ်ပိုးရေးသားခြင်းဖြင့် $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}",
        "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4",
        "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
+       "logentry-suppress-block": "{{GENDER:$4|$3}} အား $5 ကြာအောင် $1 က {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}} $6",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
-       "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားပဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်ပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
+       "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
        "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
-       "searchsuggest-search": "ရှာဖွေရန်",
-       "api-error-filename-tooshort": "ဖိုင်အမည်သည် တိုလွန်းသည်။",
-       "api-error-filetype-banned": "ဤဖိုင်အမျိုးအစားကို တားမြစ်ထားသည်။",
-       "api-error-http": "အတွင်းပိုင်းအမှား - ဆာဗာကို မဆက်သွယ်နိုင်ပါ။",
-       "api-error-illegal-filename": "ဖိုင်အမည်ကို ခွင့်မပြုပါ။",
-       "api-error-mustbeloggedin": "ဖိုင်တင်ရန် login ဝင်ထားရမည်။",
-       "api-error-ok-but-empty": "အတွင်းပိုင်းအမှား - ဆာဗာထံမှ တုံ့ပြန်မှု မရပါ။",
-       "api-error-unknown-code": "အမည်မသိ အမှား - \"$1\"",
+       "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
-       "api-error-uploaddisabled": "ဤဝီကီတွင် ဖိုင်တင်ခြင်း ပိတ်ထားသည်။",
-       "api-error-verification-error": "ဖိုင်ပျက်နေသည် (သို့) ဖိုင်နောက်ဆက် extension မှားနေသည်။",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
+       "pagelang-name": "စာမျက်နှာ",
        "pagelang-language": "ဘာသာစကား",
        "pagelang-use-default": "ပင်မ ဘာသာစကားကို အသုံးပြုရန်",
        "right-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
        "log-name-pagelang": "ဘာသာစကား ပြောင်းလဲမှု မှတ်တမ်း",
-       "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။"
+       "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။",
+       "log-action-filter-newusers": "အကောင့်ဖန်တီးမှု အမျိုးအစား:",
+       "log-action-filter-all": "အားလုံး",
+       "log-action-filter-newusers-create": "အမည်မသိ အသုံးပြုသူများမှ ဖန်တီးမှု",
+       "log-action-filter-newusers-create2": "မှတ်ပုံတင်ထားသော အသုံးပြုသူမှ ဖန်တီးမှု",
+       "log-action-filter-newusers-autocreate": "အလိုအလျောက် ဖန်တီးမှု",
+       "log-action-filter-newusers-byemail": "အီးမေးလ်မှတဆင့် စကားဝှက်ပို့၍ ဖန်တီးမှု"
 }
index 7407749..ecff7b5 100644 (file)
                        "Akapochtli"
                ]
        },
-       "tog-underline": "Mokìnxòîkuilòtzàswis tzòwilistìn:",
+       "tog-underline": "Moquinxoihcuilotzazhuiz tzohuiliztin:",
        "tog-hideminor": "Motlàtìs tepỉtzìn tlayèktlàlilistli ìpan welok tlapảtlalistli",
        "tog-hidepatrolled": "Motlàtìs tlapîpialli tlayèktlàlilistli ìpan welok tlapảtlalistli",
        "tog-newpageshidepatrolled": "Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn",
-       "tog-extendwatchlist": "Mìxmảnas in tlapòpòwaltekpàntlachialli ìka mỏtas nochi in tlapảtlalistli, âmò in san okachi yankuik.",
+       "tog-extendwatchlist": "Mixmanaz in tlapopohualtecpantlachialli ica mottaz nochi in tlapatlaliztli, ahmo in zan ocachi yancuic.",
        "tog-usenewrc": "Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)",
        "tog-showtoolbar": "Motlaīxtlatīz in tlachihchīhualōni pāntli",
        "tog-editondblclick": "Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa",
@@ -38,9 +38,9 @@
        "tog-oldsig": "Nicān tōcāyoh:",
        "tog-fancysig": "Wikitext īpan ticmatiz tōcāyoh (in ahtleh auto-link)",
        "tog-forceeditsummary": "Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac",
-       "tog-watchlisthideown": "Tiquintlātīz mopatlaliz motlachiyalizpan",
+       "tog-watchlisthideown": "Tictlatiz mopatlaliz ipan motlachiyaliz",
        "tog-watchlisthidebots": "Tiquintlātīz tepozpatlaliztli motlachiyalizpan",
-       "tog-watchlisthideminor": "Tiquintlātīz tlapatlalitzintli motlachiyalizpan",
+       "tog-watchlisthideminor": "Tictlatiz in tlapatlalitzintli ipan motlachiyaliz",
        "tog-watchlisthideliu": "Tiquintlātīz tlācah ōmocalacqueh īntlapatlaliz motlachiyalizpan",
        "tog-watchlisthideanons": "Tiquintlātīz tlācah ahtōcāitl īntlapatlaliz motlachiyalizpan",
        "tog-ccmeonemails": "Nō xinēch-mailīz ihcuāc nitē-mailīz tlatequitiltilīlli",
        "tog-showhiddencats": "Mà monèxtìkàn in tlatlatìltìn tlaìxmatkàtlàlilòmë",
        "underline-always": "Mochipa",
        "underline-never": "Aīc",
-       "editfont-monospace": "Cencoyāhualiztli machiyōtlahtōliztli",
-       "editfont-sansserif": "Sans-serif machiyōtlahtōliztli",
-       "editfont-serif": "Serif machiyōtlahtōliztli",
-       "sunday": "Īccemilhuitl",
-       "monday": "Īcōmilhuitl",
+       "editfont-monospace": "Cencoyahualiztli machiyotlahtoliztli",
+       "editfont-sansserif": "Sans-serif machiyotlahtoliztli",
+       "editfont-serif": "Serif machiyotlahtoliztli",
+       "sunday": "Iccemilhuitl",
+       "monday": "Icomilhuitl",
        "tuesday": "Icyeyilhuitl",
-       "wednesday": "Īcnāhuilhuitl",
-       "thursday": "Īcmācuīlilhuitl",
-       "friday": "Īcchicuacemilhuitl",
-       "saturday": "Īcchicōmilhuitl",
+       "wednesday": "Icnahuilhuitl",
+       "thursday": "Icmacuililhuitl",
+       "friday": "Icchicuacemilhuitl",
+       "saturday": "Icchicomilhuitl",
        "sun": "Cemilhui",
        "mon": "Ōmilhui",
        "tue": "Ēyilhui",
        "sat": "7 ilhui",
        "january": "Icce metztli",
        "february": "Icome metztli",
-       "march": "3 Metz",
-       "april": "Ic nāuhtetl mētztli",
-       "may_long": "Ic mācuīlli mētztli",
-       "june": "Ic chicuacē mētztli",
-       "july": "7 Metz",
-       "august": "8 Metz",
-       "september": "9 Metz",
-       "october": "10 Metz",
+       "march": "Ic yetetl metztli",
+       "april": "Ic nauhtetl metztli",
+       "may_long": "Ic macuiltetl metztli",
+       "june": "Ic chicuacentetl metztli",
+       "july": "Ic chicontetl metztli",
+       "august": "Ic chicuetetl metztli",
+       "september": "Ic chiucnahtetl metztli",
+       "october": "Ic mahtlactetl metztli",
        "november": "11 Metz",
        "december": "12 Metz",
        "january-gen": "Ic cē mētztli",
        "february-gen": "Īcōmemētztli",
        "march-gen": "Īcyēyimētztli",
-       "april-gen": "Ic nāuhtetl mētztli",
+       "april-gen": "Ic nauhtetl metztli",
        "may-gen": "Īcmācuīllimētztli",
-       "june-gen": "Ic chicuacemmētztli",
-       "july-gen": "Ic chicōme mētztli",
+       "june-gen": "Ic chicuacemmetztli",
+       "july-gen": "Ic chicome metztli",
        "august-gen": "Īcchicuēyimētztli",
        "september-gen": "Īcchiucnāhuimētztli",
        "october-gen": "Īcmahtlāctetlmētztli",
        "november-gen": "Īcmahtlāctetloncēmētztli",
-       "december-gen": "Īcmahtlāctetlomōmemētztli",
-       "jan": "Ic cē",
-       "feb": "2 Metz",
-       "mar": "Ic ēyi",
-       "apr": "Nāhui",
-       "may": "Mācuilli",
-       "jun": "Chicuacē",
-       "jul": "Chicōme",
-       "aug": "Chicuēyi",
-       "sep": "Chiucnāhui",
-       "oct": "Mahtlāctli",
-       "nov": "Mahtlāctlioncē",
-       "dec": "Mahtlāctliomōme",
+       "december-gen": "Icmahtlactetlomomemetztli",
+       "jan": "Icce m",
+       "feb": "Icome m",
+       "mar": "Ic eyi m",
+       "apr": "Icnahui m",
+       "may": "Icmacuil m",
+       "jun": "Icchicuace m",
+       "jul": "Icchicome m",
+       "aug": "Icchicueyi m",
+       "sep": "Icchiucnauh m",
+       "oct": "Icmahtlac m",
+       "nov": "Icmahtlacce m",
+       "dec": "Icmahtlacome m",
        "january-date": "Īccēmētztli $1",
        "february-date": "Īcōmemētztli $1",
        "march-date": "Īquēyimētztli $1",
        "category-media-header": "Media \"$1\" ipan neneuhcayotl",
        "category-empty": "''Ahtle oncah ipan neneuhcayotl.''",
        "hidden-categories": "{{PLURAL:$1|tlatlatilli neneuhcayotl|tlatlatiltin neneuhcayomeh}}",
-       "hidden-category-category": "Tlatlàtìlkàtlaìxmatkàtlàlilòmë",
+       "hidden-category-category": "Tlahyanalli neneuhcayotl",
        "category-subcat-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlani-neneuhcayotl.|Inin neneuhcayotl {{PLURAL:$1|quipiya in tetoquilli tlani-neneuhcayotl|in tetoquiltin $1 tlani-neneuhcayomeh}}, itech tlacecempohualoni $2.}}",
        "category-subcat-count-limited": "Inin {{PLURAL:$1|neneuhcayotl quipiya|$1 in tetoquilli tlani-neneuhcayotl|in tetoquiltin tlani-neneuhcayomeh}}.",
        "category-article-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlahcuilolli.|{{PLURAL:$1|In tetoquilli tlahcuilolli itech pohui|In tetoquiltin $1 tlahcuiloltin itech pohui}}, inin neneuhcayotl itech tlacecempohualoni ipan $2.}}",
        "category-article-count-limited": "Inīn {{PLURAL:$1|zāzanilli cah|$1 zāzanilli cateh}} inīn neneuhcāyōc.",
-       "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîke $1 èwaltìn}}, ìwikpa $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
+       "category-file-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya|Inin neneuhcayotl quimpiya {{PLURAL:$1|inin ehualli|inihqueh $1 ehualtin}}, ihuicpa $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Inin tlahcuilolehualli kah|Inihqueh $1 tlahcuilolehualtin catehqueh}} ipan inin neneuhcayotl.",
        "listingcontinuesabbrev": "niman",
-       "about": "Ītechcopa",
+       "about": "Itechcopa",
        "article": "Tlahcuilolamatl",
        "newwindow": "(Motlapoaz ce yancuic tlanexillotl)",
        "cancel": "Moxitiniz",
        "anontalk": "Teixnamiquiliztli",
        "navigation": "Panoliztli",
        "and": "&#32;ihuan",
-       "qbfind": "Xicahci",
+       "qbfind": "Tlatemoliztli",
        "qbbrowse": "Xitlatepotztoca",
        "qbedit": "Xicpatla",
        "qbpageoptions": "Inīn tlaīxtli",
        "variants": "Nepapan",
        "navigation-heading": "Nemiliztlahtolpohualamatl",
        "errorpagetitle": "Aiuhcāyōtl",
-       "returnto": "Ximocuepa īhuīc $1.",
+       "returnto": "Ximocuepa ihuic $1.",
        "tagline": "Itechcopa {{SITENAME}}",
        "help": "Tepalehuiliztli",
        "search": "Tlatemoliztli",
        "searchbutton": "Tlatemoliztli",
-       "go": "Xiyauh",
-       "searcharticle": "Xiyauh",
+       "go": "Yaliztica",
+       "searcharticle": "Yaliztica",
        "history": "Tlahtollotl",
        "history_short": "Tlahtollotl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "view-foreign": "Īpan xiquitta in $1",
        "edit": "Xicpatla",
        "edit-local": "Xicpatla nicān tlahtōlli",
-       "create": "Xicchīhua",
+       "create": "Xicchihua",
        "create-local": "Xicahxilti nicān tlahtōlli",
-       "editthispage": "Xicpatla inīn tlaīxtli",
+       "editthispage": "Xicpatla inin tlahcuilolamatl",
        "create-this-page": "Xicchīhua inīn tlaīxtli",
        "delete": "Xicpolo",
        "deletethispage": "Xicpolo inīn tlaīxtli",
        "newpage": "Yancuic tlahcuilolli",
        "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
        "talkpagelinktext": "Teixnamiquiliztli",
-       "specialpage": "Nònkuâkìskàtlaìxtlapalli",
+       "specialpage": "Noncuahquizcatlahcuilolamatl",
        "personaltools": "In tlein nitēquitiltilia",
        "articlepage": "Xiquitta tlahcuilolamatl",
        "talk": "Teixnamiquiliztli",
        "toolbox": "Tequitihualoni",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
-       "imagepage": "Xiquitta in zāzanilli īāma",
+       "imagepage": "Tiquittaz in tlahcuilolamatl itecpanaliztlapiyaliz",
        "mediawikipage": "Xiquitta tetitlaniliztli itlahcuilolamauh",
        "templatepage": "Xiquitta tlahcuilolamatl ineixcuitil",
        "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
        "privacy": "Tlahcuilolli piyaliznahuatilli",
        "privacypage": "Project:Tlahcuilōlpiyaliztechcopa nahuatīltōn",
        "badaccess": "Tlahuelītiliztechcopa ahcuallōtl",
-       "badaccess-group0": "Tehhuātl ahmo tiquichīhua inōn tiquiēlēhuia.",
-       "badaccess-groups": "Inōn tiquiēlēhuia zan quichīhuah tlatequitiltilīlli {{PLURAL:$2|oncān}}: $1.",
-       "ok": "Cualli",
+       "badaccess-group0": "Tehhuatl ahmo hueli ticchihua in tlein tiquelehuia.",
+       "badaccess-groups": "Inin tlen tiquelehuia zan quichihuah tequitiuhqueh {{PLURAL:$2|itech necentlaliliztli| centetl itech inin $2 necentlaliliztin}}: $1.",
+       "ok": "Cayecualli",
        "retrievedfrom": "Ōquīzqui ītech  \"$1\"",
        "youhavenewmessages": "Tiquimpiya $1 ($2).",
        "youhavenewmessagesmulti": "Tiquimpiya yancuīc tlahcuilōlli īpan $1",
        "site-atom-feed": "$1 Atom huelītiliztli",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
        "page-atom-feed": "\"$1\" RSS huelitiliztli",
-       "red-link-title": "$1 (ahmo oncah tlahcuilolli)",
+       "red-link-title": "$1 (ahmo oncah tlahcuilolamatl)",
        "nstab-main": "Tlahcuilolamatl",
        "nstab-user": "Tequitiuhqui itlahcuilolamauh",
-       "nstab-media": "Mēdiatl",
+       "nstab-media": "Multimedia",
        "nstab-special": "Noncuahquizqui tlahcuilolli",
        "nstab-project": "Ìtlaìxtlapal in tlayẻkàntekitl",
        "nstab-image": "Tlahcuilolpiyalli",
        "nstab-mediawiki": "Tlahcuilōltzintli",
-       "nstab-template": "Nemachiòtl",
-       "nstab-help": "Tèpalèwilistli",
+       "nstab-template": "Nemachiyotilli",
+       "nstab-help": "Tepalehuiliztli",
        "nstab-category": "Neneuhcayotl",
        "mainpage-nstab": "Yacatlahcuilolli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "filerenameerror": "Ahmō ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
        "filedeleteerror": "Ahmō ōmohuelītic tlapoloa \"$1\".",
        "filenotfound": "Ahmō ōmohuelītic tlanāmiqui \"$1\".",
-       "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
+       "cannotdelete": "Ahmo omopoloh in tlahcuilolamatl \"$1\".\nHueli tlein occe tequitiuhqui oquipoloh achtopa.",
        "badtitle": "Ahcualli tocaitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
        "viewsource": "Tiquittaz itzintiliz",
        "noname": "Ahmo ōtiquihto cualli tlatequitiltilīlli tōcāitl.",
        "loginsuccesstitle": "Ōticalac",
        "loginsuccess": "'''Ōticalac {{SITENAME}} quemeh \"$1\".'''",
-       "nosuchuser": "Ayāc tlatequitiltilīlli motōcāitīlo «$1».\nn tlatequitiltilīltōcāitl quimati in huēyimachiyōtlahtōliztli.\nXiquitta moyēquihcuilōl, ahnozo [[Special:CreateAccount|xicchīhua yancuīc cuentah]].",
+       "nosuchuser": "Ahmo oncah tequitiuhqui tlen quipiya tocaitl «$1».\nIn tequitiuhqueh intoca monequi pehua ic hueyimachiyotlahtoliztli.\nXiquitta moyequihcuilol, ahnozo [[Special:CreateAccount|xicchihua yancuic cuentah]].",
        "nosuchusershort": "Ayāc tlatequitiltilīlli motōcāitia \"$1\". Xiquitta in tlein ōtitlahcuiloh melāhuacā cah.\nXiquitta moyēquihcuilōl.",
        "nouserspecified": "Mohuīquilia tiquihtoa cualli tlatequitiltilīltōcāitl.",
        "wrongpassword": "Ahcualli motlahtōlichtacāyo.\nTimitztlātlauhtia xicchīhua occeppa.",
        "changepassword-success": "Moichtacātlahtōl ōmopatlac.",
        "resetpass_forbidden": "Tlahtōlichtacayōtl ahmo mohuelītih mopatlah",
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass-submit-cancel": "Xiccāhua",
+       "resetpass-submit-cancel": "Xiccahua",
        "passwordreset-username": "Tequihuihcātōcāitl:",
        "bold_sample": "Tliltic tlahcuilolpiyaliz",
        "bold_tip": "Tlīltic tlahcuilōlli",
-       "italic_sample": "Cōliuhqui tlahcuilōliztli",
-       "italic_tip": "Cōliuhqui tlahcuilōliztli",
+       "italic_sample": "Nacacic tlahcuiloliztli",
+       "italic_tip": "Nacacic tlahcuiloliztli",
        "link_sample": "Tzonhuiliztli ītōcā",
        "link_tip": "Tlahtic tzonhuiliztli",
        "extlink_sample": "http://www.machiyōtl.com Tzonhuiliztōcāitl",
        "extlink_tip": "Calān tzonhuiliztli (xiquilnamiqui ticaquiāz in http://)",
        "headline_sample": "Cuātlahcuilōlli",
        "headline_tip": "Iuhcāyōtl 2 tōcāyōtl",
-       "image_sample": "Machiyōtl.jpg",
-       "media_sample": "Machiyōtl.ogg",
+       "image_sample": "Machiyotl.jpg",
+       "media_sample": "Machiyotl.ogg",
        "media_tip": "Mēdiahuīc tzonhuiliztli",
        "sig_tip": "Motōcā īca cāhuitl",
        "hr_tip": "Pāntli",
        "summary": "Mopatlaliz:",
-       "subject": "Ītechpa:",
+       "subject": "Itechpa:",
        "minoredit": "Ca tepiton inin tlapatlaliztli",
        "watchthis": "Tictlachiyaz inin tlahcuilolli",
        "savearticle": "Xicpiya tlahcuilolli",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "blockedtitle": "Ōmotzacuili tlatequitiltilīlli",
        "blockednoreason": "ahmo cah īxtlamatiliztli",
-       "whitelistedittext": "Tihuīquilia $1 ic ticpatla zāzaniltin.",
-       "nosuchsectiontitle": "In xeliuhcāyōtl ahmo ōquināmic",
+       "whitelistedittext": "Monequi tlen $1 ic ticpatla tlahcuilolamatl.",
+       "nosuchsectiontitle": "In xeliuhcayotl ahmo oquinamic",
        "loginreqtitle": "Ximocalaqui",
        "loginreqlink": "ximocalaqui",
-       "loginreqpagetext": "Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.",
+       "loginreqpagetext": "Monequi $1 ic tiquimitta occequintin tlahcuilolamameh.",
        "accmailtitle": "Tlahtōlichtacāyōtl ōmoihuah.",
-       "accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
+       "accmailtext": "Oquiyocox ce ichtacatlahtolli ipan [[User talk:$1|$1]] auh omoquititlan ihuic $2. Hueli ticpatlazquia ipan ''[[Special:ChangePassword|Ticpatlaz in ]]'' niman oticalaco achtopa.",
        "newarticle": "(Yancuic)",
        "newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
        "noarticletext": "In axcan, ahmo oncah tlahcuilolli ipan inin amatl.\nTihueliti [[Special:Search/{{PAGENAME}}|tictemoz inin tlahcuilolli itoca]] occequintin tlahcuilolli,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictemoa ipan in occe tlahcuilolmachiyotl],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichihua inin tlahcuilolli]</span>.",
        "userjspreview": "'''Ca inīn moachtochīhualiz ītechcopa moJavaScript.'''\n'''¡Ahmo ōmochīuh nozan!'''",
        "updated": "(Ōmoyancuīli)",
        "note": "'''Tlahtōlcaquiliztilōni:'''",
-       "previewnote": "'''Xiquilnamiqui tein inīn zan tlaachtopaittaliztli.'''\n¡Motlapatlaliz ayamo ōquinpix!",
+       "previewnote": "'''Xiquilnamiqui tlein inin zan tlaachtopaittaliztli.'''\n¡Ayamo omopix motlapatlaliz!",
        "editing": "Ticpatla $1",
        "creating": "Ticchīhua $1",
        "editingsection": "Ticpatlacah $1 (tlahtōltzintli)",
-       "editingcomment": "Ticpatlacah $1 (tlahtōltzintli)",
+       "editingcomment": "tlapatlaliztli itech $1 (yancuic xeliuhcayotl)",
        "editconflict": "Tlapatlaliztli yāōyōtōn: $1",
        "yourtext": "Motlahcuilolpiyaliz",
        "yourdiff": "Ahneneuhquiliztli",
        "copyrightwarning2": "<small>Āqueh tlācah quipatlazqueh in motlahcuilōl auh tlatzayāna occeppa; intlā ahmō ticnequi, zātēpan ahmō titlahcuilōz nicān {{SITENAME}}. Nō mitzihtoah in ōtitlahcuiloh ahmō quipiya in copyright nozo in yōllōxoxouhqui tlahcuilōlli (huēhca ōmpa xiquitta $1). '''¡AHMŌ TIQUINTEQUITILTIA AHYŌLLŌXOXOUHQUI TLAHCUILŌLLI!'''</small>",
        "longpageerror": "'''Aiuhcāyōtl: In tlahcuilōlli tlein ōtiquihuah tlatamachīhua {{PLURAL:$1|cē kilobyte|$1 kilobyte}}, tzonēhua {{PLURAL:$2|cē kilobyte|$2 kilobyte}}. Ahmo mopiyāz.'''",
        "templatesused": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlahcuilolamatl:",
-       "templatesusedpreview": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn achtochìwalistli:",
-       "templatesusedsection": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaxélòlistli:",
+       "templatesusedpreview": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin achtochihualiztli:",
+       "templatesusedsection": "{{PLURAL:$1|Nemachiotl tlen motequiuhtia|Nemachiomeh tlen moquintequiuhtiah}} ipan inin tlaxeloliztli:",
        "template-protected": "(ōmoquīxti)",
        "hiddencategories": "Inin tlahcuilolli pohui {{PLURAL:$1|1 tlatlalilli neneuhcayotl|$1 tlatlaliltin neneuhcayomeh}}:",
-       "nocreatetext": "Inīn huiqui ōquitzacuili tlahuelītiliztli ic tlachīhua yancuīc zāzaniltin. Tichuelīti ticcuepa auh ticpatla cē zāzanilli, [[Special:UserLogin|xicalaqui nozo xicchīhua cē cuentah]].",
-       "nocreate-loggedin": "Ahmo tihuelīti tiquinchīhua yancuīc zāzaniltin.",
+       "nocreatetext": "Inin huiqui oquitzacuili ic mochihua yancuic tlahcuilolamatl. Quil ticcuepaznequi auh ticpatlaz occe tlahcuilolamatl, [[Special:UserLogin|xicalaqui nozo xicchihua ce cuentah]].",
+       "nocreate-loggedin": "Ahmo hueli ticchihua yancuic tlahcuilolamatl.",
        "permissionserrors": "Tēmācāhualiztli aiuhcāyōtl",
        "permissionserrorstext": "Ahmo tihuelīti quichīhua inōn, inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
        "permissionserrorstext-withaction": "Ahmo tiquihuelīti $2 inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
        "page_first": "achto",
        "page_last": "xōcoyōc",
        "history-fieldset-title": "Xitlatēmo īpan tlahtōllōtl",
-       "history-show-deleted": "Zan tlapolōlli",
+       "history-show-deleted": "Zan tlapololtin",
        "histfirst": "in achto",
        "histlast": "in tlatzaucticah",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "rev-delundel": "tiquittāz/tictlātīz",
        "rev-showdeleted": "xicnēxti",
        "revisiondelete": "Tiquimpolōz/ahtiquimpolōz tlachiyaliztli",
-       "revdelete-show-file-submit": "Quēmah",
+       "revdelete-show-file-submit": "Quemah",
        "revdelete-hide-text": "In tlahtlachiyaliztli ītlahcuilōl",
        "revdelete-hide-image": "Tictlātīz tlahcuilōlli ītlapiyaliz",
-       "revdelete-radio-set": "Tlaīnāyalli",
-       "revdelete-radio-unset": "Ittalōni",
+       "revdelete-radio-set": "Tlahnayalli",
+       "revdelete-radio-unset": "Ittaloni",
        "revdelete-log": "Tleīpampa:",
        "revdel-restore": "Ticpatlāz tlattaliztli",
        "pagehist": "Tlaīxtli ītlahtōllo",
        "mergehistory-autocomment": "Ōmocēntili [[:$1]] īpan [[:$2]]",
        "mergehistory-comment": "Ōmocēntili [[:$1]] īpan [[:$2]]: $3",
        "mergehistory-reason": "Tleīpampa:",
-       "revertmerge": "Tiquīxipehuaz",
+       "revertmerge": "Ticahtletiliz in cetiliztli",
        "history-title": "«$1» ītlaceppahuiliztlahtōllo",
        "lineno": "Pantli $1:",
        "editundo": "Ticxitiniz",
        "shown-title": "Monextiz $1 {{PLURAL:$1|mochihualiztli}} cecen amatl",
        "viewprevnext": "Xiquintta ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ye ia zāzanilli ītōca \"[[$1]]\" inīn huiquipan'''",
-       "searchmenu-new": "<strong>Ticchīhuāz in zāzanilli «[[:$1]]» inīn huiquipan.</strong> {{PLURAL:$2|0=|Nō xiquitta in tlanāmiquiliztli in mochīhualiztli.}}",
-       "searchprofile-articles": "Tlapiyaliztli zāzanilli",
+       "searchmenu-new": "<strong>Ticchihuaz in tlahcuilolamatl «[[:$1]]» inin huiquipan.</strong> {{PLURAL:$2|0=|No xiquitta in tlanamiquiliztli itech tlatemoliztli.}}",
+       "searchprofile-articles": "Itech tlahcuilolamatl",
        "searchprofile-images": "Nepapan media",
        "searchprofile-everything": "Mochi",
        "searchprofile-advanced": "Huehca ōmpa",
        "mypreferences": "Notlaelehuiliz",
        "prefs-edits": "Tlapatlaliztli tlapōhualli:",
        "prefs-skin": "Ēhuatl",
-       "skin-preview": "Xiquitta quemeh yez",
+       "skin-preview": "Xiquitta quenin yez",
        "datedefault": "Ayāc tlanequiliztli",
        "prefs-labs": "Ìntlâtlamảtilis in tlayêyẻkòyàntìn",
        "prefs-personal": "Tequihuihcātlapōhualli",
        "prefs-resetpass": "Ticpatlāz motlahtōlichtacāyo",
        "saveprefs": "Xicpiya",
        "prefs-editing": "Tlapatlaliztli",
-       "rows": "Pāntli:",
        "searchresultshead": "Tlatemoliztli",
        "recentchangesdays": "Tōnaltin tiquinttāz yancuīc tlapatlalizpan:",
        "localtime": "Cāhuitl nicān:",
        "timezoneregion-africa": "Africa",
-       "timezoneregion-america": "Ixachitlān",
+       "timezoneregion-america": "America",
        "timezoneregion-antarctica": "Antártida",
        "timezoneregion-arctic": "Ártico",
        "timezoneregion-asia": "Asia",
-       "timezoneregion-atlantic": "Atlántico Ilhuicaātl",
+       "timezoneregion-atlantic": "Atlantico Ilhuicaatl",
        "timezoneregion-australia": "Australia",
        "timezoneregion-europe": "Europan",
-       "timezoneregion-indian": "Índico Ilhuicaātl",
-       "timezoneregion-pacific": "Pacífico Ilhuicaātl",
+       "timezoneregion-indian": "Indico Ilhuicaatl",
+       "timezoneregion-pacific": "Pacifico Ilhuicaatl",
        "prefs-searchoptions": "Titlatēmōz",
        "prefs-namespaces": "Tōcātlacāuhtli",
        "default": "ic default",
        "username": "{{GENDER:$1|Tequihuihcātōcāitl}}:",
        "prefs-memberingroups": "{{GENDER:$2|Tlacotōncayōtl}} in {{PLURAL:$1|tēolōlolli|tēolōloltin}}",
        "yourrealname": "Melāhuac motōcā:",
-       "yourlanguage": "Tlahtōlli:",
+       "yourlanguage": "Tlahtolli:",
        "yournick": "Motōcātlaliz:",
-       "badsiglength": "Motōcātlaliz cah ocachi huēyac.\nAhmo quihuīquilia quimpiya achi $1 {{PLURAL:$1|machiyōtlahtōliztli}}.",
+       "badsiglength": "Motocatlaliz cah huel hueyac.\nAhmo hueli quipiya achi $1 {{PLURAL:$1|machiyotlahtoliztli}}.",
        "gender-male": "Oquichtli",
        "gender-female": "Cihuātl",
        "email": "E-mail",
        "prefs-help-email-required": "Tihuīquilia quihcuiloa mo e-mailcān.",
        "prefs-signature": "Motōcā",
        "userrights-user-editname": "Xihcuiloa cē tlatequitiltilīltōcāitl:",
-       "editusergroup": "Tiquimpatlāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
+       "editusergroup": "Tiquimpatlaz {{GENDER:$1|tequitiuhqui}} itlacentlalilizhuan",
        "userrights-editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
-       "saveusergroups": "Tiquimpiyāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
+       "saveusergroups": "Tiquimpiyaz {{GENDER:$1|tequitiuhqui}} itlacentlalilizhuan",
        "userrights-groupsmember": "Olōlco:",
        "userrights-reason": "Īxtlamatiliztli:",
        "userrights-no-interwiki": "Ahmo tihuelīti ticpatla tlatequitiltilīlli huelītiliztli occequīntīn huiquipan.",
        "rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
        "action-read": "xāmapōhua inīn tlaīxtli",
        "action-edit": "xicpatla inīn tlaīxtli",
-       "action-createpage": "xicchīhua inīn āmatl",
-       "action-createtalk": "xicchīhuā inīn tēixnāmiquiliztli zāzaniltin",
+       "action-createpage": "xicchihua inin tlahcuilolamatl",
+       "action-createtalk": "xicchihua inin tlahcuilolamatl iteixnamiquiliz",
        "action-createaccount": "ticchīhuaz inīn tlatequitiltilīlli īcuentah",
        "action-move": "ticpatlāz inīn zāzanilli",
        "action-move-subpages": "tiquimpatlāz inīn zāzanilli īhuān zāzaniltōn",
        "rclinks": "Xiquitta yancuic $1 tlapatlaliztli yancuic $2 tonalpan.<br />$3",
        "diff": "ahneneuhqui",
        "hist": "tlahtollotl",
-       "hide": "Tiquintlātīz",
+       "hide": "Tictlatiz",
        "show": "Xicnēxti",
        "minoreditletter": "p",
        "newpageletter": "Y",
        "uploadbtn": "Tlahcuilōlquetza",
        "uploadnologin": "Ahmo ōtimocalac",
        "uploaderror": "Tlaquetzaliztli ahcuallōtl",
-       "uploadlogpage": "Tlaquetzaliztli tlahcuilōlloh",
+       "uploadlogpage": "Tlaquetzaliztli itlahcuilolloh",
        "filename": "Tlahcuilōlli ītōcā",
        "filedesc": "Tlahcuilōltōn",
        "fileuploadsummary": "Tlahcuilōltōn:",
        "filetype-missing": "Tlahcuilōlli ahmo quipiya huēiyaquiliztli (quemeh \".jpg\").",
        "large-file": "Mā tlahcuilōlli ahmo achi huēiyac $1; inīn cah $2.",
        "fileexists-extension": "Tlahcuilōlli zan iuh tōcātica ia: [[$2|thumb]]\n* Tlahcuilōlli moquetzacah: <strong>[[:$1]]</strong>\n* Tlahcuilōlli tlein ia ītōca: <strong>[[:$2]]</strong>\nTimitztlātlauhtiah, xitlahcuiloa occē tōcāitl.",
-       "savefile": "Quipiyāz tlahcuilōlli",
+       "savefile": "Mopiyaz in tlahcuilolli",
        "uploaddisabled": "Ahmo mohuelīti tlahcuilōlquetzā",
        "uploaddisabledtext": "Ahmo huelīti moquetzazqueh tlahcuilōlli.",
        "upload-source": "Mēyalihcuilōlli",
        "sourcefilename": "Mēyalihcuilōltōcāitl:",
        "sourceurl": "Mēyal-URL:",
        "destfilename": "Tōcāhuīc:",
-       "watchthisupload": "Tictlachiyāz inīn zāzanilli",
+       "watchthisupload": "Tictlachiyaz inin tecpanaliztlapiyaliztli",
        "upload-form-label-infoform-name": "Tōcāitl",
        "upload-form-label-usage-filename": "Ihcuilōlli ītōcā",
        "upload_source_file": "(ticpepenaz ce tlahcuilolli mochiuhpohualhuazco)",
        "listfiles": "Mochīntīn īxiptli",
        "listfiles_name": "Tōcāitl",
        "listfiles_user": "Tequihuihqui",
-       "listfiles_size": "Octacayōtl (bytes)",
+       "listfiles_size": "Octacayotl (bytes)",
        "listfiles_count": "Cuepaliztli",
        "listfiles-latestversion-yes": "Quēmah",
        "listfiles-latestversion-no": "Ahmō",
        "filehist-deleteone": "xicpolo",
        "filehist-revert": "tlacuepāz",
        "filehist-current": "āxcān",
-       "filehist-datetime": "Tlapōhualpan/Cāhuitl",
-       "filehist-thumb": "Īxiptlahtōn",
+       "filehist-datetime": "Tonallapohualpan ihuan imman",
+       "filehist-thumb": "Ixiptlatontli",
        "filehist-user": "Tequitiuhqui",
        "filehist-dimensions": "Octacayotl",
        "filehist-comment": "TlahtoIcaquiliztiloni",
        "linkstoimage": "Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:",
        "nolinkstoimage": "Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.",
        "morelinkstoimage": "Tiquinttāz [[Special:WhatLinksHere/$1|achi tzonhuiliztli]] inīn tlahcuilōlhuīc.",
-       "duplicatesoffile": "Inōn {{PLURAL:$1|tlahcuilōlli cah|$1 tlahcuilōlli cateh}} ōntiah inīn zāzanilli ([[Special:FileDuplicateSearch/$2|ocahci]]):",
-       "sharedupload": "Inīn $1 zāzanilli huelīti motequitiltia zāzocāmpa.",
+       "duplicatesoffile": "Inin {{PLURAL:$1|tlahcuilolli oppa ochihualoc|$1 tlahcuiloltin oppa ochihualoqueh}} ixquichca inin tlahcuilolli ([[Special:FileDuplicateSearch/$2|oc temachiztiliztli]]):",
+       "sharedupload": "Inin tlahcuilolli itech pohui $1 ihuan hueli motequitiltia ipan occe proyectos.",
        "uploadnewversion-linktext": "Ticquetzāz yancuīc tlahcuilōlli",
        "filerevert": "Ticcuepāz $1",
        "filerevert-legend": "Tlahcuilōlli tlacuepaliztli",
-       "filerevert-comment": "Tlèka:",
+       "filerevert-comment": "Tleca:",
        "filerevert-submit": "Tlacuepāz",
        "filedelete": "Ticpolōz $1",
        "filedelete-legend": "Ticpolōz tlahcuilōlli",
        "filedelete-nofile": "'''$1''' ahmo ia.",
        "filedelete-otherreason": "Occē īxtlamatiliztli:",
        "filedelete-reason-otherlist": "Occē īxtlamatiliztli",
-       "filedelete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "mimesearch": "MIME tlatēmoliztli",
+       "filedelete-edit-reasonlist": "Xiquihto ipampa ticpohpoloznequi in",
+       "mimesearch": "MIME tlatemoliztli",
        "mimetype": "MIME iuhcāyōtl:",
        "download": "tictemōz",
        "unwatchedpages": "Zāzaniltin ahmo motlachiya",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "unusedtemplateswlh": "occequīntīn tzonhuiliztli",
        "randompage": "Cecen tlahcuilolli",
-       "randompage-nopages": "Ahmo oncah zāzanilli īpan inīn {{PLURAL:$2|tōcāitl}}: $1.",
-       "randomincategory-submit": "Yāuh",
+       "randompage-nopages": "Ahmo oncah tlahcuilolamameh ipan inin {{PLURAL:$2|tocatlacauhtli|tocatlacauhtin}}: $1.",
+       "randomincategory-submit": "Yaliztica",
        "randomredirect": "Zāzotlacuepaliztli",
        "statistics": "Tlapōhualiztli",
        "statistics-header-pages": "Zāzaniltin tlapōhualli",
        "withoutinterwiki": "Zāzaniltin ahtle tzonhuiliztli",
        "withoutinterwiki-submit": "Tiquittāz",
        "nbytes": "$1 {{PLURAL:$1|byte}}",
-       "ncategories": "$1 {{PLURAL:$1|tlaìxmatkàyòtlàlilòtl|tlaìxmatkàyòtlàlilòme}}",
-       "nlinks": "$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}",
+       "ncategories": "$1 {{PLURAL:$1|neneuhcayotl|neneuhcayomeh}",
+       "nlinks": "$1 {{PLURAL:$1|tzohuililiztli|tzohuililiztin}}",
        "nmembers": "$1 {{PLURAL:$1|tlahcuilolamatl|tlahcuilolamameh}}",
        "nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
        "nimagelinks": "Motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}",
        "uncategorizedcategories": "Tlaìxmatkàtlàlilòmë âmò tlatlaìxmatkàtlàlìltìn",
        "uncategorizedimages": "Ìxiptìn âmò tlatlaìxmatkàtlàlìltìn",
        "uncategorizedtemplates": "Nemachiòmë âmò tlatlaìxmatkàtlàlìltìn",
-       "unusedcategories": "Tlaìxmatkàtlàlilòmë tlèn âmò mokìntekìuhtia",
+       "unusedcategories": "Neneuhcayomeh tlen ahmo motequitiltia",
        "unusedimages": "Ìxiptìn tlèn âmò mokìntekìuhtia",
-       "wantedcategories": "Ìtech kineki tlaìxmatkàtlàlilòtl",
-       "wantedpages": "Zāzaniltin moēlēhuiah",
+       "wantedcategories": "Itech monequini neneuhcayotl",
+       "wantedpages": "Tlahcuilolamameh tlen elehuiloh",
        "wantedfiles": "Ìpan moneki èwaltìn",
        "wantedtemplates": "Ìtech moneki nemachiòmë",
        "mostlinked": "Tlâkuilòlpiltìn tlèn okachi tlatzòtzòwìllôkë",
        "movethispage": "Ticzacāz inīn zāzanilli",
        "pager-newer-n": "{{PLURAL:$1|1 yancuic|$1 yancuicqueh}}",
        "pager-older-n": "{{PLURAL:$1|1 huehcauh|$1 huehcauhqueh}}",
-       "booksources": "Āmoxmēyalli",
+       "booksources": "Amoxtzintiliztli",
        "booksources-search-legend": "Tiquixtemoz amoxtli itzintiliz",
        "booksources-search": "Tlatemoliztli",
        "specialloguserlabel": "Tlatequitiltilīlli:",
        "speciallogtitlelabel": "Tōcāitl:",
-       "log": "Tlahcuilōlloh",
-       "all-logs-page": "Mochīntīn tlācah īntlahcuilōlloh",
+       "log": "Tlahcuilolloh",
+       "all-logs-page": "Mochintin nohuiyanyoh intlahcuilolhuan",
        "allpages": "Mochintin tlahcuilolamatl",
        "nextpage": "Niman zāzanilli ($1)",
        "prevpage": "Achto zāzanilli ($1)",
        "allinnamespace": "Mochintin tlahcuilolamameh (tocatlacauhtli $1)",
        "allpagessubmit": "Tiyaz",
        "categories": "Neneuhcayotl",
-       "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàyòtlàlilòtl kimpia|Inîke tlaìxmatkàyòtlàlilòme kimpiâke}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâke nikàn in [[Special:UnusedCategories|tlaìxmatkàyòtlàlilòme tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàyòtlàlilòtl]].",
-       "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
-       "linksearch": "Calān tzonhuiliztli tlatemoliztli",
+       "categoriespagetext": "In tetoquiltin {{PLURAL:$1|neneuhcayotl quimpiya|neneuhcayomeh quimpiyah}} tlahcuiloltin nozo medios.\nAhmo monextiah nican in [[Special:UnusedCategories|neneuhcayomeh tlen ahmo moquintequitiltia]].\nNo ma motta in tlen [[Special:WantedCategories|ipan quinequi neneuhcayomeh]].",
+       "categoriesfrom": "Ma monextican neneuhcayomeh tlen pehuaz ica:",
+       "linksearch": "Tlatemoliztli ihuic quiyahuac tzonhuiliztli",
        "linksearch-ns": "Tōcātzin:",
        "linksearch-ok": "Tictēmōz",
        "linksearch-line": "$1 tzonhuīlo īxquichca $2",
        "removedwatchtext": "Zāzanilli \"[[:$1]]\" ōmopolo [[Special:Watchlist|motlachiyalizco]].",
        "watch": "Tictlachiyāz",
        "watchthispage": "Tictlachiyāz inīn zāzanilli",
-       "unwatch": "Ahtictlachiyāz",
+       "unwatch": "Ahmo titlachiyaz",
        "watchlist-details": "{{PLURAL:$1|$1 zāzanilli|$1 zāzaniltin}} motlachiyaliz, ahmo mopōhua tēixnāmiquiliztli.",
        "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin",
        "watching": "Tlachiyacah...",
        "excontentauthor": "Tlapiyaliztli ōcatca: '$1' (auh zancē ōquipatlac ōcatca '[[Special:Contributions/$2|$2]]')",
        "delete-confirm": "Ticpolōz \"$1\"",
        "delete-legend": "Ticpolōz",
-       "actioncomplete": "Cēntetl",
+       "actioncomplete": "Ye tlachihualiztli",
        "deletedtext": "\"$1\" ōmopolo.\nXiquitta $2 ic yancuīc tlapololiztli.",
        "dellogpage": "Tlapololiztli tlahcuilōlloh",
-       "deletionlog": "tlapololiztli tlahcuilōlloh",
+       "deletionlog": "tlapohpololiztli itlahcuilolloh",
        "deletecomment": "Īxtlamatiliztli:",
-       "deleteotherreason": "Occē īxtlamatiliztli:",
+       "deleteotherreason": "Occe ixtlamatiliztli:",
        "deletereasonotherlist": "Occē īxtlamatiliztli",
-       "delete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "rollbacklink": "ticcuepaz",
+       "delete-edit-reasonlist": "Xiquihto ipampa ticpohpoloznequi in",
+       "rollbacklink": "ticxitiniz",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
        "changecontentmodel-title-label": "Tlaīxtōcāitl",
        "changecontentmodel-reason-label": "Tleīpampa:",
        "protectcomment": "Tleīpampa:",
        "protectexpiry": "Tlamiliztli:",
        "protect_expiry_invalid": "Ahcualli tlamiliztli cāhuitl.",
-       "protect-default": "Ticmācāhuaz mochintin in tlatequitiltilīltin",
+       "protect-default": "Macahualo ica mochintin in tequitiuhqueh",
        "protect-fallback": "Zan momācāhuazqueh tlatequitiltilīltin in tēmācāhualiztica «$1»",
-       "protect-level-autoconfirmed": "Zan momācāhuaz moneltilīlli tlatequitiltilīltin",
-       "protect-level-sysop": "Zan momācāhuaz tētlamahmacanimeh",
+       "protect-level-autoconfirmed": "Zan macahualo ica neneltililli tequitiuhqueh",
+       "protect-level-sysop": "Zan macahualo in tetlamahmacanimeh",
        "protect-expiring": "motlamīz $1 (UTC)",
-       "protect-expiry-options": "1 hora:1 hour,1 tōnalli:1 day,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite",
-       "restriction-type": "Mācāhualiztli:",
+       "protect-expiry-options": "1 hora:1 hour,1 tonalli:1 day,1 chicueyilhuitl:1 week,2 chicueyilhuitl:2 weeks,1 metztli:1 month,3 metztli:3 months,6 metztli:6 months,1 xihuitl:1 year,mochipa:infinite",
+       "restriction-type": "Temacahualiztli:",
        "restriction-edit": "xicpatla",
        "restriction-move": "Ticzacāz",
        "restriction-create": "Ticchīhuāz",
        "restriction-upload": "Tlahcuilōlquetza",
-       "undelete": "Xiquitta mopoloh tlaīxtli",
-       "viewdeletedpage": "Tiquinttāz zāzaniltin ōmopolōzqueh",
+       "undelete": "Tiquimittaz tlahcuilolamameh tlen omopohpolohqueh",
+       "viewdeletedpage": "Tiquimittaz tlahcuilolamameh tlen omopohpolohqueh",
        "undelete-revision": "Tlapoloc $1 ītlachiyaliz (īpan $4, $5) īpal $3:",
        "undeletebtn": "Ahticpolōz",
-       "undeletelink": "xiquitta/xicmācuepa",
-       "undeleteviewlink": "tiquittāz",
+       "undeletelink": "tlattaliztli/tlacuepaliztli",
+       "undeleteviewlink": "tiquittaz",
        "undeletecomment": "Tleīpampa:",
-       "undelete-search-box": "Tiquintlatēmōz zāzaniltin ōmopolōz",
-       "undelete-search-prefix": "Tiquittāz zāzaniltin mopēhua īca:",
-       "undelete-search-submit": "Tlatēmōz",
+       "undelete-search-title": "Tiquintemoz tlahcuilolamameh tlen omopohpolohqueh",
+       "undelete-search-box": "Tiquintemoz tlahcuilolamameh tlen omopohpolohqueh",
+       "undelete-search-prefix": "Tiquimittaz tlahcuilolamameh tlen pehuah ica:",
+       "undelete-search-submit": "Tlatemoliztli",
        "undelete-error-short": "Ahcuallōtl ihcuāc momāquīxtiya: $1",
        "undelete-show-file-submit": "Quemah",
        "namespace": "Tocatlacauhtli:",
-       "invert": "Tlacuepaz motlahtol",
+       "invert": "Ticcuepaz in tocatecpanaliztli",
        "blanknamespace": "(Tlayacatic)",
        "contributions": "In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl",
        "contributions-title": "Tlatequitiltilīlli $1 ītlahcuilōl",
        "mycontris": "Notlahcuilol",
        "contribsub2": "$1 ($2)",
-       "uctop": "(āxcān tlapatlaliztli)",
+       "uctop": "(axcan tlapatlaliztli)",
        "month": "Īhuīcpa mētztli (auh achtopa):",
        "year": "Xiuhhuīcpa (auh achtopa):",
        "sp-contributions-newbies": "Tiquinttāz zan yancuīc tlatequitiltilīlli īntlapatlaliz",
        "sp-contributions-newbies-sub": "Ic yancuīc",
        "sp-contributions-newbies-title": "Yancuīc tlatequitiltilīlli ītlahcuilōl",
        "sp-contributions-blocklog": "Tlatzacuiliztli tlahcuilōlloh",
-       "sp-contributions-uploads": "tlahcuilōlquetzaliztli",
-       "sp-contributions-talk": "zānīlli",
-       "sp-contributions-search": "Tiquintlatēmōz tlapatlaliztli",
+       "sp-contributions-uploads": "tlahcuilolquetzaliztli",
+       "sp-contributions-talk": "teixnamiquiliztli",
+       "sp-contributions-search": "Tiquitemoz tlapatlaliztin",
        "sp-contributions-username": "IP nozo tlatequitiltilīlli ītōcā:",
        "sp-contributions-submit": "Tlatemoliztli",
        "whatlinkshere": "In tlein quitzonhuilia nican",
        "unblockip": "Ahtiquitzacuilīz tlatequitiltilīlli",
        "ipblocklist": "Tlatequitiltilīltzacualli",
        "blocklist-reason": "Tleīpampa",
-       "ipblocklist-submit": "Tlatēmōz",
+       "ipblocklist-submit": "Tlatemoliztli",
        "infiniteblock": "ahtlamic",
-       "expiringblock": "tlami īpan $1 īpan $2",
-       "anononlyblock": "zan ahtōcā",
+       "expiringblock": "tlami ipan $1 ipan $2",
+       "anononlyblock": "zan ahtocaitl",
        "blocklink": "tictzacuiliz",
        "unblocklink": "ahtiquitzacuilīz",
        "change-blocklink": "Ticpatlaz tlatzacualli",
        "export-addcat": "Ticcētilīz",
        "export-download": "Ticpiyāz quemeh tlahcuilōlli",
        "export-templates": "Tiquimpiyāz nemachiyōtīlli",
-       "allmessages": "Mochīntīn Huiquimedia tlahcuilōltzintli",
+       "allmessages": "Mochintin tetitlaniliztli ipan liHuiquimedia",
        "allmessagesname": "Tocaitl",
        "allmessagescurrent": "Tlahcuilolpiyaliztli itech axcan",
        "allmessages-filter-all": "Mochi",
-       "allmessages-language": "Tlâtòlli:",
-       "allmessages-filter-submit": "Yāuh",
+       "allmessages-language": "Tlahtolli:",
+       "allmessages-filter-submit": "Tiyaz",
        "thumbnail-more": "Tiquihuēyiyāz",
        "thumbnail_error": "Aiuhcāyōtl ihcuāc mochīhuaya tepitōntli: $1",
        "import": "Tiquincōhuāz zāzaniltin",
        "importbadinterwiki": "Ahcualli interhuiqui tzonhuiliztli",
        "import-upload": "Tiquinquetzāz XML tlahcuilōlli",
        "importlogpage": "Tiquincōhuāz tlahcuilōlloh",
-       "tooltip-pt-userpage": "{{GENDER:|Motlatequitiltilīlzāzanil}}",
-       "tooltip-pt-mytalk": "{{GENDER:|Motēīxnāmiquiliztli}}",
+       "tooltip-pt-userpage": "{{GENDER:|Motequitiuhcatlahcuilolamauh}}",
+       "tooltip-pt-mytalk": "{{GENDER:|Moteixnamiquiliz}}",
        "tooltip-pt-preferences": "{{GENDER:|Motlaēlēhuiliz}}",
-       "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
-       "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilōl}}",
+       "tooltip-pt-watchlist": "Tlahcuilolamatl itecpantiliz tlen tictlachiyalia itlapatlaliz",
+       "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilol}}",
        "tooltip-pt-login": "Tihueliti timocalaqui, tel ahmo tihuiquilia.",
        "tooltip-pt-logout": "Tiquizaz",
        "tooltip-ca-talk": "Iteixnamiquiliz itechpa inin tlahcuilolli",
        "tooltip-ca-edit": "Ticpatlaz inin tlahcuilolli",
-       "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
+       "tooltip-ca-addsection": "Ticpehualiz ce yancuic xeliuhcayotl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-ca-protect": "Ticquīxtiāz inīn zāzanilli",
        "tooltip-ca-undelete": "Ahticpolōz inīn zāzanilli",
        "tooltip-ca-move": "Ticzacaz inin tlahcuilolamatl",
        "tooltip-ca-watch": "Ticcentiliz inin tlahtolli motecpanaliz",
-       "tooltip-ca-unwatch": "Ahtictlachiyāz inīn zāzanilli",
+       "tooltip-ca-unwatch": "Ticpohpoloz inin tlahcuilolamatl ipan motlachiyaliz",
        "tooltip-search": "Tlatemoliztli ipan {{SITENAME}}",
-       "tooltip-search-go": "Tiyaz ihuicpa tlahcuilolli ica inin huel melahuac tocaitl intla oncah",
+       "tooltip-search-go": "Tiyaz ihuicpa tlahcuilolamatl ica inin huel melahuac tocaitl intla oncah",
        "tooltip-search-fulltext": "Tictemoz inin tlahcuilolli ipan amatl",
        "tooltip-p-logo": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-mainpage": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-help": "In tēmachtīlōyān",
        "tooltip-t-whatlinkshere": "Mochintin tlahcuiloltin huiquipan quitzonhuiliah nican",
        "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli ipan tlahcuiloltin tlein quitzonhuilia nican",
-       "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
+       "tooltip-feed-rss": "RSS tlachicahualiztli inin tlahcuilolamatl",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Tlapōhualmatl ītechpa {{GENDER:$1|inīn tlatequitiltilīlli}} ītlahcuilōl",
        "tooltip-t-emailuser": "Tiquihcuilōz inīn tlatequitiltililhuīc",
        "tooltip-ca-nstab-main": "Tiquittaz tlein quipiya in tlahcuilolli",
        "tooltip-ca-nstab-user": "Xiquitta tequitiuhqui itlahcuilolamauh",
        "tooltip-ca-nstab-special": "Inīn nōncuahquīzqui āmatl, auh ahmohuelitizpatla",
-       "tooltip-ca-nstab-project": "Xiquitta in tlatequipanōllaīxtli",
+       "tooltip-ca-nstab-project": "Xiquitta in tlayecantequitl itlahcuilolamauh",
        "tooltip-ca-nstab-image": "Xiquittāz īxipzāzanilli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
        "tooltip-summary": "Xiquihcuilo ce tepiton tlahcuiloltontli",
        "anonymous": "Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "siteuser": "$1 tlatequitiltilīlli īpan {{SITENAME}}",
-       "lastmodifiedatby": "Inīn zāzanilli ōtlapatlac catca īpan $2, $1 īpal $3.",
+       "lastmodifiedatby": "Inin tlahcuilolamatl omopatlac ipan $2, $1 ipal $3.",
        "others": "occequīntīn",
-       "siteusers": "$1 {{PLURAL:$2|tlatequitiltilīlli}} īpan {{SITENAME}}",
+       "siteusers": "$1 {{PLURAL:$2|{{GENDER:$1|tequitiuhqui}}|tequitiuhqueh}} īpan {{SITENAME}}",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "spam_blanking": "Mochi tlapatlaliztli quimpiyah tzonhuiliztli īhuīc $1, iztāctiliacah",
        "pageinfo-firstuser": "Tlaīxchīuhqui",
        "pageinfo-contentpage-yes": "Quēmah",
        "pageinfo-protect-cascading-yes": "Quēmah",
        "previousdiff": "← Achtopa",
-       "nextdiff": "Oc ye cencah yancuīc tlapatlaliztli →",
+       "nextdiff": "Oc ye cencah yancuic tlapatlaliztli →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|zāzanilli|zāzanilli}}",
-       "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
+       "file-info-size": "$1 × $2 pixel; tlaixiptlayotl octacayotl: $3; machiyotl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
        "show-big-image": "Tzintiliztlahcuilolli",
        "show-big-image-size": "$1 × $2 pixels",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
-       "ilsubmit": "Tlatēmōz",
-       "bydate": "tōnalcopa",
+       "ilsubmit": "Tlatemoliztli",
+       "bydate": "tonaltica",
        "metadata": "Metadata",
        "metadata-expand": "Tiquittāz tlanōnōtzaliztli huehca ōmpa",
        "metadata-collapse": "Tictlātīz tlanōnōtzaliztli huehca ōmpa",
        "exif-photometricinterpretation": "Pixel tlachīhualiztli",
-       "exif-imagedescription": "Īxiptli ītōcā",
+       "exif-imagedescription": "Ixiptli itoca",
        "exif-software": "Software ōmotēquitilti",
        "exif-artist": "Chīhualōni",
        "exif-exifversion": "Exif-cuepaliztli",
        "exif-isospeedratings": "ISO iciuhquiliztli tlapōhualcāyōtl",
        "exif-flash": "Flax",
        "exif-flashenergy": "Flax chicāhualiztli",
-       "exif-gpslatituderef": "Mictlāmpa ahnozo huitztlāmpa āncāyōtl",
-       "exif-gpslatitude": "Āncāyōtl",
-       "exif-gpslongituderef": "Tlāpcopa ahnozo cihuātlāmpa huehtlatzīncāyōtl",
+       "exif-gpslatituderef": "Mictlampa nozo huitztlampa ancayotl",
+       "exif-gpslatitude": "Ancayotl",
+       "exif-gpslongituderef": "Tlapcopa nozo cihuatlampa huehtlatzincayotl",
        "exif-gpslongitude": "Huehtlatzīncāyōtl",
        "exif-gpsaltitude": "Huehcapancayōtl",
        "exif-gpstimestamp": "GPS cāhuitl (atomic tepozcāhuitl)",
-       "exif-iimcategory": "Tlaìxmatkàyòtlàlilòtl",
+       "exif-iimcategory": "Neneuhcayotl",
        "exif-orientation-1": "Yēctli",
        "exif-meteringmode-255": "Occē",
        "exif-lightsource-1": "Tōnameyōtl",
        "monthsall": "(mochīntīn)",
        "confirmemail": "Ticchicāhuāz e-mail",
        "confirmemail_needlogin": "Tihuīquilia $1 ic ticchicāhua mo e-mail.",
-       "confirmemail_success": "Mocorreo ōmotlahtōlneltilih\nNiman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.",
+       "confirmemail_success": "Mocorreo omotlahtolneltilih\nNiman tihueliti [[Special:UserLogin|timocalaquiz]] auh ticpactiaz huiquitica.",
        "confirmemail_loggedin": "Mo e-mailcān ōmochicāuh.",
        "confirmemail_subject": "e-mailcān {{SITENAME}} ītlachicāhualiz",
-       "scarytranscludetoolong": "[In URL achi huel huēiyac ca]",
+       "scarytranscludetoolong": "[In URL huel hueyac]",
        "recreate": "Ticchīhuāz occeppa",
        "confirm_purge_button": "Cualli",
        "imgmultipageprev": "← achto zāzanilli",
        "imgmultipagenext": "niman zāzanilli →",
-       "imgmultigo": "¡uh!",
-       "imgmultigoto": "Yāuh $1 zāzanilhuīc",
+       "imgmultigo": "¡Ma xiyauh!",
+       "imgmultigoto": "Yaliztica ihuicpa tlahtolamatl $1",
        "ascending_abbrev": "quetza",
        "descending_abbrev": "temoa",
        "table_pager_next": "Niman zāzanilli",
        "table_pager_prev": "Achto zāzanilli",
        "table_pager_first": "Achtopa zāzanilli",
        "table_pager_last": "Xōcoyōc zāzanilli",
-       "table_pager_limit_submit": "Yāuh",
+       "table_pager_limit_submit": "Yaliztica",
        "table_pager_empty": "Ahtlein",
-       "autosumm-blank": "Tlaiztāctilīlli zāzanilli",
+       "autosumm-blank": "Tlaiztaliztli in tlahcuilolamatl",
        "autoredircomment": "Mocuepahua īhuīc [[$1]]",
-       "autosumm-new": "Tlachihuhtli tlahcuilolamatl ica: \"$1\"",
+       "autosumm-new": "Tlachiuhtli tlahcuilolamatl ica: \"$1\"",
        "size-bytes": "$1 B",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "version-version": "($1)",
        "version-software-version": "Machiyōtzin",
        "fileduplicatesearch-filename": "Tlahcuilōlli ītōcā:",
-       "fileduplicatesearch-submit": "Tlatēmōz",
+       "fileduplicatesearch-submit": "Tlatemoliztli",
        "fileduplicatesearch-info": "$1 × $2 pixelli<br />Tlahcuilōlli īxquichiliz: $3<br />MIME iuhcāyōtl: $4",
        "specialpages": "Noncuahquizqui tlahcuilolli",
        "specialpages-note": "* Yeliztli nōncuahquīzqui āmatl.\n* <span class=\"mw-specialpagerestricted\">Tlaquīxtīlli nōncuahquīzqui āmatl.</span>\n* <span class=\"mw-specialpagecached\">Tlatlātīlli nōncuahquīzqui āmatl (aocmo monemitīa).</span>",
        "specialpages-group-changes": "Yancuīc tlapatlaliztli īhuān tlahcuilōlloh",
        "specialpages-group-users": "Tlatequitiltilīlli īhuān huelītiliztli",
        "specialpages-group-highuse": "Zāzaniltin tlatequitiliztechcopa",
-       "specialpages-group-pages": "Mochīntīn zāzaniltin",
+       "specialpages-group-pages": "Mochintin tlahcuilolamameh",
        "specialpages-group-redirects": "Tlatēmoliztli īhuān  tlacuepaliztli",
        "blankpage": "Iztāc zāzanilli",
-       "htmlform-selectorother-other": "Occē",
+       "htmlform-selectorother-other": "Occe",
        "rightsnone": "ahtlein",
        "revdelete-summary": "ticpatlāz tlahcuilōltōn",
        "searchsuggest-search": "Tlatemoliztli",
-       "api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
-       "api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
        "api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
-       "api-error-timeout": "In tlatèmakani âmò òwalnàwat kèn òmochìxtikatka.",
-       "api-error-unclassified": "Òpanòk sè âmò ìxmatkàyo îtlakawilistli.",
-       "api-error-unknown-code": "Âmò ìxmatkàyo îtlakawilistli: \"$1\".",
-       "api-error-unknown-error": "Tlâtek îtlakawilistli: Îtlâtlèn òîtlakauh îkuàk òmonekià motilànas in èwalli.",
        "api-error-unknown-warning": "Âmò ìxmatkàyo tlanawatilistli: \"$1\".",
        "api-error-unknownerror": "Âmò ìxmatkàyo îtlakawilistli: \"$1\".",
-       "api-error-uploaddisabled": "Sèuhtok in êkawilistli ìpan inìn wiki.",
-       "api-error-verification-error": "Inìn èwalli welis îtlakauhtok, noso âmò kualli motzòwîtok.",
-       "expand_templates_ok": "Cualli",
+       "expand_templates_ok": "Cayecualli",
        "expand_templates_preview": "Xiquitta achtochīhualiztli",
-       "special-characters-group-latin": "Latintlahcuilōlli",
-       "special-characters-group-latinextended": "Mantoc latintlahcuilōlli",
+       "special-characters-group-latin": "Latintlahcuilolli",
+       "special-characters-group-latinextended": "Mantoc latintlahcuilolli",
        "special-characters-group-greek": "Greciatlahcuilōlli",
        "special-characters-group-cyrillic": "Cirilotlahcuilōlli",
        "special-characters-group-arabic": "Arabiatlahcuilōlli",
        "special-characters-group-thai": "Taitlahcuilōlli",
        "special-characters-group-lao": "Laotlahcuilōlli",
        "special-characters-group-khmer": "Jemertlahcuilōlli",
-       "randomrootpage": "Sâsaìntlèn nelwatlaìxtlapalli"
+       "randomrootpage": "Zazantlen nelhuatlahcuilolamatl"
 }
index 01b9711..3d79d8c 100644 (file)
        "category-media-header": "Tī lūi-pia̍t \"$1\" ê mûi-thé",
        "category-empty": "''Chit-má chit ê lūi-pia̍t  bô ia̍h ia̍h-sī mûi-thé.''",
        "hidden-categories": "{{PLURAL:$1|Hidden category|Chhàng khí-lâi ê lūi-pia̍t}}",
-       "hidden-category-category": "Chhàng--khí-lâi ê lūi piat",
+       "hidden-category-category": "Chhàng--khí-lâi ê lūi-piat",
        "category-subcat-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ē-lūi-pia̍t.|Chit ê lūi-piat ū ē-bīn {{PLURAL:$1| ê ē-lūi-piat|$1 ê ē-lūi-piat}}, choân-pō͘ $2 ê.}}",
        "category-subcat-count-limited": "Chit ê lūi-piat ū ē-bīn ê {{PLURAL:$1| ē-lūi-pia̍t|$1 ē-lūi-pia̍t}}.",
        "category-article-count": "{{PLURAL:$2|Chit ê lūi-piat chí-ū ē-bīn ê ia̍h.|Ē-bīn {{PLURAL:$1|bīn ia̍h sī|$1bīn ia̍h sī}} tī chit lūi-pia̍t, choân-pō͘ $2 bīn ia̍h}}",
        "category-file-count-limited": "Chit-má chit-ê lūi-pia̍t ū {{PLURAL:$1| ê tóng-àn}}",
        "listingcontinuesabbrev": "(chiap-sòa thâu-chêng)",
        "index-category": "Ū sek-ín ê ia̍h",
-       "noindex-category": "Bī sik-ín ê ia̍h.",
-       "broken-file-category": "Sit-khì tóng-àn liân-kiat ê ia̍h.",
+       "noindex-category": "Bī sik-ín ê ia̍h",
+       "broken-file-category": "Sit-khì tóng-àn liân-kiat ê ia̍h",
        "about": "Koan-hē",
        "article": "Loē-iông ia̍h",
        "newwindow": "(ē khui sin thang-á hián-sī)",
index 7ed322e..ca6ace5 100644 (file)
        "searcharticle": "Gå",
        "history": "Sidehistorikk",
        "history_short": "Historikk",
+       "history_small": "historikk",
        "updatedmarker": "oppdatert siden mitt forrige besøk",
        "printableversion": "Utskriftsvennlig versjon",
        "permalink": "Permanent lenke",
        "blockedtitle": "Brukeren er blokkert",
        "blockedtext": "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''\n\nBlokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkering ment på: $7\n\nDu kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.\nDu kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.\nDin nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta all denne informasjonen ved henvendelser.",
        "autoblockedtext": "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.\nDen oppgitte grunnen var:\n\n:'''$2'''\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkeringen er ment for: $7\n\nDu kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.\n\nMerk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].\n\nDin IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta med all denne informasjonen ved henvendelser.",
+       "systemblockedtext": "Ditt brukernavn eller IP-adresse har blitt blokkert automatisk av MediaWiki.\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokaden startet: $8\n* Blokaden gjelder til: $6\n* Blokaden er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
        "blockednoreason": "ingen grunn gitt",
        "whitelistedittext": "Du må $1 for å redigere artikler.",
        "confirmedittext": "Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].",
        "saveprefs": "Lagre",
        "restoreprefs": "Tilbakestill alt til standardinnstillinger",
        "prefs-editing": "Redigering",
-       "rows": "Rader:",
-       "columns": "Kolonner",
        "searchresultshead": "Søk",
        "stub-threshold": "Grense for stubblenkeformatering ($1):",
        "stub-threshold-sample-link": "eksempel",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Last brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Viser {{GENDER:$1|brukerrettighetene}} til  <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Rediger brukergrupper",
+       "userrights-viewusergroup": "Se brukergrupper",
        "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}",
        "userrights-groupsmember": "Medlem av:",
        "userrights-groupsmember-auto": "Implisitt medlem av:",
        "right-writeapi": "Redigere via API",
        "right-delete": "Slette sider",
        "right-bigdelete": "Slette sider med stor historikk",
-       "right-deletelogentry": "Slett og gjenopprett spesifikke loggoppføringer",
+       "right-deletelogentry": "Slette og gjenopprette spesifikke loggoppføringer",
        "right-deleterevision": "Slette og gjenopprette enkeltrevisjoner av sider",
        "right-deletedhistory": "Se slettet sidehistorikk uten tilhørende sidetekst",
        "right-deletedtext": "Vise slettet tekst og endringer mellom slettede versjoner",
        "right-browsearchive": "Søke i slettede sider",
        "right-undelete": "Gjenopprette sider",
-       "right-suppressrevision": "Se på, skjul og hent frem igjen spesifikke siderevisjoner for alle brukere",
+       "right-suppressrevision": "Se, skjule og hente frem igjen spesifikke siderevisjoner for alle brukere",
        "right-viewsuppressed": "Se på revisjoner som er skjult for alle brukere",
        "right-suppressionlog": "Se private logger",
        "right-block": "Blokkere andre brukere fra å redigere",
        "right-ipblock-exempt": "Kan redigere fra blokkerte IP-adresser",
        "right-unblockself": "Fjerne blokkering av seg selv",
        "right-protect": "Endre beskyttelsesnivåer og redigere beskyttete sider",
-       "right-editprotected": "Redigere beskyttede sider som «{{int:protect-level-sysop}}»",
-       "right-editsemiprotected": "Redigere beskyttede sider som «{{int:protect-level-autoconfirmed}}»",
-       "right-editcontentmodel": "Rediger innholdsmodellen til en side",
+       "right-editprotected": "Redigere beskyttede sider som er «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "Redigere beskyttede sider som er «{{int:protect-level-autoconfirmed}}»",
+       "right-editcontentmodel": "Redigere innholdsmodellen til en side",
        "right-editinterface": "Redigere brukergrensesnittet",
        "right-editusercssjs": "Redigere andre brukeres CSS- og JS-filer",
        "right-editusercss": "Redigere andre brukeres CSS-filer",
        "right-edituserjs": "Redigere andre brukeres JS-filer",
-       "right-editmyusercss": "Rediger dine egne CSS-filer",
-       "right-editmyuserjs": "Rediger dine egne Javascript-filer",
-       "right-viewmywatchlist": "Vis din egen overvåkningsliste",
-       "right-editmywatchlist": "Redigere din egen overvåkningsliste. Legg merke til at noen aksjoner fortsatt vil legge til sider uten denne rettigheten.",
-       "right-viewmyprivateinfo": "Vise dine egne private data (f.eks. epostadresse og virkelig navn)",
-       "right-editmyprivateinfo": "Redigere dine egne private data (f.eks. epostadresse og virkelig navn)",
-       "right-editmyoptions": "Redigere dine egne innstillinger",
+       "right-editmyusercss": "Redigere sine egne CSS-filer",
+       "right-editmyuserjs": "Redigere sine egne JavaScript-filer",
+       "right-viewmywatchlist": "Vise sin egen overvåkningsliste",
+       "right-editmywatchlist": "Redigere sin egen overvåkningsliste. Legg merke til at noen handlinger fortsatt vil legge til sider uten denne rettigheten.",
+       "right-viewmyprivateinfo": "Vise sine egne private data (f.eks. epostadresse og virkelig navn)",
+       "right-editmyprivateinfo": "Redigere sine egne private data (f.eks. epostadresse og virkelig navn)",
+       "right-editmyoptions": "Redigere sine egne innstillinger",
        "right-rollback": "Raskt tilbakestille den siste brukeren som har redigert en gitt side",
        "right-markbotedits": "Markere tilbakestillinger som robotredigeringer",
        "right-noratelimit": "Påvirkes ikke av hastighetsgrenser",
        "right-import": "Importere sider fra andre wikier",
        "right-importupload": "Importere sider via opplasting",
        "right-patrol": "Markere redigeringer som patruljerte",
-       "right-autopatrol": "Får sine egne redigeringer merket som patruljerte",
+       "right-autopatrol": "Få sine egne redigeringer merket som patruljerte",
        "right-patrolmarks": "Bruke patruljeringsfunksjoner i siste endringer",
        "right-unwatchedpages": "Se listen over uovervåkede sider",
        "right-mergehistory": "Flette sidehistorikker",
        "right-userrights-interwiki": "Redigere rettigheter for brukere på andre wikier",
        "right-siteadmin": "Låse og låse opp databasen",
        "right-override-export-depth": "Eksporter sider inkludert lenkede sider til en dypde på 5",
-       "right-sendemail": "Send e-post til andre brukere",
+       "right-sendemail": "Sende e-post til andre brukere",
        "right-managechangetags": "Opprette og (de)aktivere [[Special:Tags|tagger]]",
-       "right-applychangetags": "Legg til [[Special:Tags|merker]] sammen med ens endringer",
-       "right-changetags": "Legg til og fjern vilkårlige [[Special:Tags|merker]] på individuelle revisjoner og loggposter",
+       "right-applychangetags": "Legge til [[Special:Tags|tagger]] sammen med ens endringer",
+       "right-changetags": "Legge til og fjerne vilkårlige [[Special:Tags|tagger]] på individuelle revisjoner og loggoppføringer",
        "right-deletechangetags": "Slette [[Special:Tags|tagger]] fra databasen",
        "grant-generic": "Rettighetspakken «$1»",
        "grant-group-page-interaction": "Interagere med sider",
        "action-upload_by_url": "laste opp denne filen fra en URL",
        "action-writeapi": "bruke skrive-API-en",
        "action-delete": "slette denne siden",
-       "action-deleterevision": "slette denne revisjonen",
-       "action-deletedhistory": "se denne sidens slettede historikk",
+       "action-deleterevision": "slett revisjoner",
+       "action-deletelogentry": "slette loggoppføringer",
+       "action-deletedhistory": "se en sides slettede historikk",
+       "action-deletedtext": "se slettet revisjonstekst",
        "action-browsearchive": "søke i slettede sider",
-       "action-undelete": "gjenopprette denne siden",
-       "action-suppressrevision": "se og gjenopprette denne skjulte revisjonen",
+       "action-undelete": "gjenopprette sider",
+       "action-suppressrevision": "se gjennom og gjenopprette skjulte revisjoner",
        "action-suppressionlog": "se denne private loggen",
        "action-block": "blokkere denne brukeren fra å redigere",
        "action-protect": "endre denne sidens beskyttelsesnivåer",
        "action-userrights-interwiki": "endre brukerrettigheter for brukere på andre wikier",
        "action-siteadmin": "låse eller låse opp databasen",
        "action-sendemail": "sende e-poster",
+       "action-editmyoptions": "redigere innstillingene dine",
        "action-editmywatchlist": "redigere din overvåkningsliste",
        "action-viewmywatchlist": "Vis din overvåkningsliste",
        "action-viewmyprivateinfo": "vise din private informasjon",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste over nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
+       "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-search-placeholder": "Filtrer siste endringer (søk eller begyn å skrive)",
+       "rcfilters-invalid-filter": "Ugyldig filter",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-noresults": "Ingen filtre funnet",
+       "rcfilters-filtergroup-registration": "Brukerregistrering",
+       "rcfilters-filter-registered-label": "Registrerte",
+       "rcfilters-filter-registered-description": "Innloggede brukere.",
+       "rcfilters-filter-unregistered-label": "Uregistrerte",
+       "rcfilters-filter-unregistered-description": "Brukere som ikke er logget inn.",
+       "rcfilters-filtergroup-authorship": "Redigeringens forfatter",
+       "rcfilters-filter-editsbyself-label": "Dine egne redigeringer",
+       "rcfilters-filter-editsbyself-description": "Redigeringer gjort av deg.",
+       "rcfilters-filter-editsbyother-label": "Redigeringer av andre",
+       "rcfilters-filter-editsbyother-description": "Redigeringer som er gjort av andre brukere enn deg.",
+       "rcfilters-filtergroup-userExpLevel": "Erfaringsnivå (kun for registrerte brukere)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nykommere",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Færre enn 10 redigeringer og 4 dagers aktivitet.",
+       "rcfilters-filter-userExpLevel-learner-label": "Nybegynnere",
+       "rcfilters-filter-userExpLevel-learner-description": "Flere dagers aktivitet enn «Nykommere», men mindre enn «Erfarne brukere».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarne brukere",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mer enn 30 dagers aktivitet og 500 redigeringer.",
+       "rcfilters-filtergroup-automated": "Automatiske bidrag",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redigeringer gjort med automatiske verktøy.",
+       "rcfilters-filter-humans-label": "Menneske (ikke bot)",
+       "rcfilters-filter-humans-description": "Redigeringer gjort av menneskelige brukere.",
+       "rcfilters-filtergroup-significance": "Betydning",
+       "rcfilters-filter-minor-label": "Mindre endringer",
+       "rcfilters-filter-minor-description": "Redigeringer merket som mindre av brukeren.",
+       "rcfilters-filter-major-label": "Ikke-mindre endringer",
+       "rcfilters-filter-major-description": "Redigeringer som ikke er merket som mindre.",
+       "rcfilters-filtergroup-changetype": "Type endring",
+       "rcfilters-filter-pageedits-label": "Sideredigeringer",
+       "rcfilters-filter-pageedits-description": "Redigeringer til wikiinnhold, diskusjoner, kategoribeskrivelser ...",
+       "rcfilters-filter-newpages-label": "Sideopprettelser",
+       "rcfilters-filter-newpages-description": "Redigeringer som oppretter nye sider.",
+       "rcfilters-filter-categorization-label": "Kategoriendringer",
+       "rcfilters-filter-categorization-description": "Sporer sider som legges til i eller fjernes fra kategorier.",
+       "rcfilters-filter-logactions-label": "Loggførte handlinger",
+       "rcfilters-filter-logactions-description": "Administrative handlinger, kontoopprettelser, sideslettinger, opplastinger ...",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "recentchangeslinked-summary": "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).\nSider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis endringer på sider som lenker til den gitte siden istedet",
-       "recentchanges-page-added-to-category": "[[:$1]] lagt til kategori",
+       "recentchanges-page-added-to-category": "[[:$1]] ble lagt til i kategorien",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] lagt til i kategori, [[Special:WhatLinksHere/$1|denne siden er inkludert i andre sider]]",
        "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] fjernet fra kategori, [[Special:WhatLinksHere/$1|denne siden er inkludert i andre sider]]",
        "uncategorizedcategories": "Ukategoriserte kategorier",
        "uncategorizedimages": "Ukategoriserte filer",
        "uncategorizedtemplates": "Ukategoriserte maler",
+       "uncategorized-categories-exceptionlist": "# Inneholder ei liste over kategorier som ikke skal nevnes på Special:UncategorizedCategories. Én kategori per linje, som starter med «*». Linjer som starter med adre tegn (inkludert mellomrom) ignoreres. Bruk «#» for kommentarer.",
        "unusedcategories": "Ubrukte kategorier",
        "unusedimages": "Ubrukte filer",
        "wantedcategories": "Ønskede kategorier",
        "changecontentmodel-emptymodels-title": "Ingen innholdsmodeller er tilgjengelige",
        "changecontentmodel-emptymodels-text": "Innholdet på [[:$1]] kan ikke konverteres til noen type.",
        "log-name-contentmodel": "Logg over endringer i endringsloggen",
-       "log-description-contentmodel": "Hendelseslogg relatert til innholdsmodellen for en side",
+       "log-description-contentmodel": "Denne siden lister endringer i innholdsmodellen til sider, og sider som ble laget med andre innholdsmodeller enn den som er standard.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|opprettet}} siden $3 med den ikke-standard innholdsmodellen «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|endret}} innholdsmodellen for siden $3 fra «$4» til «$5»",
        "logentry-contentmodel-change-revertlink": "tilbakestill",
        "proxyblockreason": "IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.",
        "sorbsreason": "IP-adressen din er listet som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.",
        "sorbs_create_account_reason": "Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto",
+       "softblockrangesreason": "Anonyme bidrag tillates ikke fra din IP-adresse ($1). Vennligst logg inn.",
        "xffblockreason": "En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1",
        "cant-see-hidden-user": "Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.",
        "ipbblocked": "Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert",
        "cant-move-to-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
        "cant-move-category-page": "Du har ikke tillatelse til å flytte kategorisider.",
        "cant-move-to-category-page": "Du har ikke tillatelse til å flytte en side til en kategoriside.",
+       "cant-move-subpages": "Du har ikke tillatelse til å flytte undersider.",
+       "namespace-nosubpages": "Navnerommet «$1» tillater ikke undersider.",
        "newtitle": "Ny tittel:",
        "move-watch": "Overvåk kilde- og målsiden",
        "movepagebtn": "Flytt side",
        "pageinfo-length": "Sidestørrelse (i bytes)",
        "pageinfo-article-id": "Side-ID",
        "pageinfo-language": "Språk for sideinnholdet",
+       "pageinfo-language-change": "endre",
        "pageinfo-content-model": "Modell for sideinnhold",
        "pageinfo-content-model-change": "endre",
        "pageinfo-robot-policy": "Bot-indeksering",
        "version-variables": "Variabler",
        "version-antispam": "Søppelpostforebygging",
        "version-other": "Annet",
-       "version-mediahandlers": "Mediahåndterere",
+       "version-mediahandlers": "Mediehåndterere",
        "version-hooks": "Haker",
        "version-parser-extensiontags": "Tilleggstagger",
        "version-parser-function-hooks": "Parserfunksjoner",
        "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
-       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|sletta}} omdirigeringa $3 gjennom overskriving",
        "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4",
        "feedback-useragent": "Brukeragent",
        "searchsuggest-search": "Søk i {{SITENAME}}",
        "searchsuggest-containing": "inneholder …",
-       "api-error-autoblocked": "Din IP-adresse har blitt blokkert automatisk fordi den ble brukt av en blokkert bruker.",
-       "api-error-badaccess-groups": "Du har ikke tillatelse til å laste opp filer til denne wikien.",
        "api-error-badtoken": "Intern feil: Ugyldig nøkkel.",
-       "api-error-blocked": "Du har blitt blokkert fra å redigere.",
-       "api-error-copyuploaddisabled": "Opplasting ved URL er deaktivert på denne tjeneren.",
-       "api-error-duplicate": "Det er allerede {{PLURAL:$1|en annen fil|flere andre filer}} på denne siden med samme innhold.",
-       "api-error-duplicate-archive": "Det fantes {{PLURAL:$1|en annen fil|noen andre filer}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.",
-       "api-error-empty-file": "Filen du sendte inn var tom.",
        "api-error-emptypage": "Det er ikke tillatt å opprette nye, tomme sider.",
-       "api-error-fetchfileerror": "Intern feil: Noe gikk galt ved henting av denne filen.",
-       "api-error-fileexists-forbidden": "En fil med navnet «$1» finnes allerede, og kan ikke overskrives.",
-       "api-error-fileexists-shared-forbidden": "En fil med navnet «$1» finnes allerede i det delte filsystemet, og kan ikke overskrives.",
-       "api-error-file-too-large": "Filen du la inn var for stor.",
-       "api-error-filename-tooshort": "Filnavnet er for kort.",
-       "api-error-filetype-banned": "Denne filtypen er ikke tillatt.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Filtypen|Filtypene}} $1 er ikke {{PLURAL:$4|tillatt|tillatte}}. {{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.",
-       "api-error-filetype-missing": "Filen mangler filendelse.",
-       "api-error-hookaborted": "Endringen du prøvde å gjøre ble avbrutt av en utvidelsestilkobling.",
-       "api-error-http": "Intern feil: kan ikke få forbindelse til server.",
-       "api-error-illegal-filename": "Filnavnet er ikke tillatt.",
-       "api-error-internal-error": "Intern feil: Noe gikk galt ved prosessering av din opplastning til wikien.",
-       "api-error-invalid-file-key": "Intern feil: Fil ble ikke funnet i midlertidig lagerplass",
-       "api-error-missingparam": "Intern feil: Manglende parameter i forespørselen",
-       "api-error-missingresult": "Intern feil: Kan ikke bekrefte at kopieringen var vellykket.",
-       "api-error-mustbeloggedin": "Du må være logget inn for å laste opp filer.",
-       "api-error-mustbeposted": "Intern feil: forespørsel krever HTTP POST.",
-       "api-error-noimageinfo": "Opplastingen var vellykket, men serveren returnerte ikke noe informasjon om filen.",
-       "api-error-nomodule": "Intern feil: ingen opplastningsmodul har blitt valgt.",
-       "api-error-ok-but-empty": "Intern feil: ingen svar fra server.",
-       "api-error-overwrite": "Det er ikke tillatt å overskrive eksisterende filer.",
-       "api-error-ratelimited": "Du prøver å laste opp flere filer enn wikien tillater i et kort tidsrom.\nPrøv igjen om noen minutter.",
-       "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
        "api-error-publishfailed": "Intern feil: Tjeneren greide ikke å publisere midlertidig fil.",
-       "api-error-stasherror": "Det oppstod en feil mens filen ble lastet opp til stash.",
-       "api-error-stashedfilenotfound": "Den temporære filen ble ikke funnet ved forsøk på å laste den opp fra lageret.",
-       "api-error-stashpathinvalid": "Stien som den temporære filen skulle vært funnet via var ugyldig.",
-       "api-error-stashfilestorage": "Det oppsto en feil når filen skulle lastes opp til lageret.",
-       "api-error-stashzerolength": "Tjenermaskinen kunne i lagre den temporære filen fordi den hadde null lengde.",
-       "api-error-stashnotloggedin": "Du må være innlogget for å lagre filene i opplastingslageret.",
-       "api-error-stashwrongowner": "Filen du prøvde å få tilgang til tilhører ikke deg.",
-       "api-error-stashnosuchfilekey": "Filnøkkelen du prøvde å få tilgang til finnes ikke.",
-       "api-error-timeout": "Serveren svarte ikke innenfor forventet tid.",
-       "api-error-unclassified": "En ukjent feil har oppstått",
-       "api-error-unknown-code": "Ukjent feil: \"$1\"",
-       "api-error-unknown-error": "Intern feil: Noe gikk galt ved opplastning av filen din.",
-       "api-error-unknown-warning": "Ukjent advarsel: $1",
+       "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
+       "api-error-unknown-warning": "Ukjent advarsel: «$1».",
        "api-error-unknownerror": "Ukjent feil: «$1».",
-       "api-error-uploaddisabled": "Opplastning har blitt deaktivert på denne wikien.",
-       "api-error-verification-error": "Filen kan være korrupt, eller ha feil filendelse.",
-       "api-error-was-deleted": "En fil med dette navnet har tidligere blitt lastet opp og senere slettet.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutt|minutter}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timer}}",
        "pagelang-language": "Språk",
        "pagelang-use-default": "Bruk standardspråk",
        "pagelang-select-lang": "Velg språk",
+       "pagelang-reason": "Årsak",
        "pagelang-submit": "Lagre",
+       "pagelang-nonexistent-page": "Siden «$1» eksisterer ikke.",
+       "pagelang-unchanged-language": "Siden «$1» er allerede satt til språket $2.",
+       "pagelang-unchanged-language-default": "Siden $1 er allerede satt til wikiens standard innholdsspråk.",
+       "pagelang-db-failed": "Databasen kunne ikke endre sidespråket.",
        "right-pagelang": "Endre sidespråk",
        "action-pagelang": "endre sidespråket",
        "log-name-pagelang": "Logg for språkendringer",
        "usercssispublic": "Merk: CSS-undersidene bør ikke inneholde konfidensielle data siden de kan ses av andre brukere.",
        "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 <br /><code>0.0.0.0/0</code><br /><code>::/0</code>"
+       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "revisjon $1",
+       "pageid": "side-ID $1"
 }
index f5f497e..96c4c7a 100644 (file)
        "viewpagelogs": "यस पृष्ठका लगहरू हेर्नुहोस्",
        "nohistory": "यस पृष्ठको लागी कुनै सम्पादन इतिहास छैन।",
        "currentrev": "हालको संस्करण",
-       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमा à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1को संशोधन",
        "previousrevision": "← पुरानो संशोधन",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
-       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
-       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-deleted-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
+       "rev-suppressed-unhide-diff": "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं <strong>मेटियो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको लग]मा पाउन सकिनेछ।",
        "rev-suppressed-diff-view": "यस भिन्नताका संशोधनहरुमध्येको एउटा चाहिं  <strong>दबाइयो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} दबाइएको लग]मा पाउन सकिनेछ।",
        "rev-delundel": "दृश्यता परिवर्तन गर्ने",
        "rev-showdeleted": "देखाउनुहोस्",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\87/मà¥\87à¤\9fाà¤\8fà¤\95à¥\8b à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-nooldid-text": "यस क्रियालाई गर्नको लागि तपाईंले लक्ष्य अवतरण दिनु भएको छैन, वा तपाईंले दिएको अवतरण अस्तित्वमा छैन वा तपाईं सद्य अवतरणलाई लुकाउने प्रयत्न गर्दै हुनुहुन्छ।",
        "revdelete-no-file": "खुलाइएको पृष्ठ अस्तित्वमा छैन",
        "mergehistory-merge": "[[:$1]]को निम्न अवतरण [[:$2]]मा समाविष्ट गर्न सकिनेछ।\nदिइएको समय वा त्यस भन्दा पहिले भएको अवतरणहरूलाई एकत्रित गर्नका लागि  रेडियो बटनको प्रयोग गर्नुहोस।\nन्याभिगेसन लिङ्कहरूको प्रयोग पछी यो कलम आफ्नो पुरानै स्थितिमा आउनेछ।",
        "mergehistory-go": "जोड्न मिल्ने सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरु जोड्नुहोस्",
-       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 जोड्न मिल्दैन ।",
+       "mergehistory-empty": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 जोड्न मिल्दैन ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
-       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 देखाउने/लुकाउने",
+       "showhideselectedversions": "à¤\9bानिà¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 देखाउने/लुकाउने",
        "editundo": "रद्द गर्ने",
        "diff-empty": "(कुनै भिन्नता छैन)",
        "diff-multi-sameuser": "(यस प्रयोगकर्ताद्वारा {{PLURAL:$1|गरिएको बीचको एउटा अवतरण देखाइएन|गरिएको बीचको $1 अवतरण देखाइएन}})",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरू :",
-       "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-sample-link": "उदाहरण",
        "userrights-reason": "कारण :",
        "userrights-no-interwiki": "तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
        "userrights-nodatabase": "डेटाबेस $1 उपलब्ध छैन या स्थानीय हैन।",
-       "userrights-nologin": "प्रयोगकर्ता अधिकार प्रदान गर्न तपाईंले प्रबन्धक खाताबाट [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।",
-       "userrights-notallowed": "प्रयोगकर्तालाई अधिकार प्रदान गर्ने वा हटाउने अनुमति तपाईंलाई छैन।",
        "userrights-changeable-col": "तपाईंले परिवर्तन गर्न सक्ने समूहहरू",
        "userrights-unchangeable-col": "तपाईंले परिवर्तन गर्न नसक्ने समूहहरू",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमा मतभेद भयो ! कृपया तपाईंको परिवर्तन पुनरावलोकन तथा पुष्टि गर्नुहोस् ।",
-       "userrights-removed-self": "तपाईंले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटाउनु भयो । त्यस कारण तपाईं अब यो पृष्ठ हेर्न सक्नु हुन्न ।",
        "group": "समूह :",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत निश्चित गरिएका प्रयोगकर्ताहरू",
        "nlinks": "$1 {{PLURAL:$1|लिंक|लिंकहरू}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्यहरू}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य|सदस्यहरू}}",
-       "nrevisions": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}}",
+       "nrevisions": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}}",
        "nimagelinks": "$1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}माथि प्रयोग गरिएको",
        "ntransclusions": "$1 {{PLURAL:$1पृष्ठमा प्रयोग गरिएको|पृष्ठहरूमा प्रयोग गरिएका}}",
        "specialpage-empty": "यो पृष्ठ खाली छ।",
        "restriction-level-all": "कुनै स्तर",
        "undelete": "मेटिएका पृष्ठहरू हेर्नुहोस्",
        "undeletepage": "मेटाइएका पृष्ठहरू हेर्ने अनि पुनर्स्थापित गर्ने",
-       "undeletepagetitle": "'''[[:$1|$1]]à¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 यसभित्र  छन् '''।",
+       "undeletepagetitle": "'''[[:$1|$1]]à¤\95ा à¤®à¥\87à¤\9fाà¤\87à¤\8fà¤\95ा à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 यसभित्र  छन् '''।",
        "viewdeletedpage": "मेटिएका पृष्ठहरू हेर्नुहोस्",
        "undeletepagetext": "निम्नलिखित {{PLURAL:$1|पृष्ठ मेटिएकोछ तर पूरालेखभित्रै छ|$1 पृष्ठ मेटिएकाछन् तर पूरालेखभित्रै छन्}} र पुनर्स्थापित गर्न सकिन्छ।\nपूरालेखको समय-समयमा सफाई गर्न सकिन्छ।",
-       "undelete-fieldset-title": "पà¥\81नरावलà¥\8bà¤\95नहरà¥\81  पूर्वावस्थामा ल्याउनुहोस्",
+       "undelete-fieldset-title": "पà¥\81नरावलà¥\8bà¤\95नहरà¥\82  पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteextrahelp": "यस पृष्ठक पुरै इतिहास पूर्वरुपमा फर्काउनको लागि  छनोट सन्दुकहरुलाई नछानी '''''{{int:undeletebtn}}''''' मा क्लिक गर्नुहोस।\nअनुकुल पूर्वरुपमा फर्काउने कार्य गर्न छनौट चाहिएका संस्करणक सन्दुकहरुलाई छानेर '''''{{int:undeletebtn}}'''''मा क्लिक गर्नुहोस।",
        "undeleterevisions": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} संग्रहित",
        "undeletehistory": "यदि कुनै पृष्टलाई पुन: स्थापन गराउनु भयो भने सम्पूर्ण संस्करणहरू इतिहासमा पुन:स्थापन हुनेछन् ।\nयदि यसै नामबाट  नयाँ पृष्ठ निर्माण भैसकेको छ भने पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमा स्थापित हुनेछन् ।",
        "undeletehistorynoadmin": "यस पृष्ठ मेटिएको छ।\nमेटिनाको कारण निम्न जानकारीहरुमा खुलाइएको छ र मेटिनु अगिका योगदानकर्ताहरुको नाम पनि \nमेटिएका पृष्ठको पूरा पाठ प्रवन्धकहरुलाई मात्र उपलब्ध हुन्छ ।",
        "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मा) मेटाइएका संशोधनहरू :",
        "undeleterevision-missing": "अमान्य या मेटिएको संस्करण ।\nखराब लिन्क पनि सक्छ  या संस्करण पुन: स्थापना गरिएको या अभिलेखबाट हटाइएको हुनसक्छ ।",
-       "undelete-nodiff": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81रानà¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 भेटिएन ।",
+       "undelete-nodiff": "à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\81रानà¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 भेटिएन ।",
        "undeletebtn": "पूर्वावस्थामा ल्याउनुहोस्",
        "undeletelink": "हेर्ने/पूर्वरुपमा फर्काउने",
        "undeleteviewlink": "अवलोकन",
        "import-comment": "टिप्पणी :",
        "importtext": "कृपया स्रोत विकिबाट फाइल निर्यात गर्नका लागि [[Special:Export|निर्यात सुविधा]]को प्रयोग गर्नुहोस। यसलाई आफ्नो कम्प्युटरमा सङ्ग्रह गरे यहाँ अपलोड गर्नुहोस।",
        "importstart": "पृष्ठ आयात गरिदै...",
-       "import-revision-count": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}}",
+       "import-revision-count": "$1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}}",
        "importnopages": "आयातगर्नको लागि कुनै पृष्ठ छैन।",
        "imported-log-entries": "आयातित $1 {{PLURAL:$1|लग प्रविष्टी|लग प्रविष्टीहरू}}",
        "importfailed": "आयात असफल भयो :<nowiki>$1</nowiki>",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "अन्य विकिहरूबाट प्रवन्धकहरूद्वारा गरिएको सम्पादन इतिहाससँग हुने पृष्ठहरूको आयात।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} आयात भयो",
-       "import-logentry-interwiki-detail": "$2 à¤¦à¥\87à¤\96ि $1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\81}} आयात भयो",
+       "import-logentry-interwiki-detail": "$2 à¤¦à¥\87à¤\96ि $1 {{PLURAL:$1|पà¥\81नरावलà¥\8bà¤\95न|पà¥\81नरावलà¥\8bà¤\95नहरà¥\82}} आयात भयो",
        "javascripttest": "JavaScript जाँच गरिदै",
        "javascripttest-pagetext-unknownaction": "अज्ञात कारवाही \"$1\" ।",
        "javascripttest-qunit-intro": "mediawiki.org मा [$1 जाँचको कागजात] हेर्नुहोस् ।",
        "patrol-log-header": "गस्ती गरिएका संस्करणहरूको लग यस प्रकार रहेका छन् ।",
        "log-show-hide-patrol": "$1 निगरानी लग",
        "log-show-hide-tag": "$1 ट्याग लग",
-       "deletedrevision": "पà¥\81राना à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 $1 मेटिए",
+       "deletedrevision": "पà¥\81राना à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 $1 मेटिए",
        "filedeleteerror-short": "$1 फाइल मेटाइमा भूल",
        "filedeleteerror-long": "निम्न फाइल मेट्ने क्रममा त्रुटी भयो:\n\n$1",
        "filedelete-missing": "\"$1\" फाइल मेट्न सकिंदैन किनभनें यो फाइल नैं छैन।",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
        "searchsuggest-search": "{{SITENAME}} मा खोज्नुहोस्",
        "searchsuggest-containing": "समावेश भएको...",
-       "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
-       "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
-       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल छ|भएका  केहि अरु फाइलहरू छन्}} ।",
-       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल थियो|भएका  केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
-       "api-error-empty-file": "तपाईंले बुझाएको फाइल खालि छ।",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
-       "api-error-fetchfileerror": "आन्तरिक समस्याः फाइल तान्दा केही कुरा गलत भएछ ।",
-       "api-error-fileexists-forbidden": "\"$1\" नामको फाइल पहिले नै छ र अधिलेखित गर्न सकिंदैन।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" नामको फाइल पहिले नै साझा फाइल भण्डारमा छ, र अधिलेखित गर्न सकिंदैन।",
-       "api-error-file-too-large": "तपाईंले बुझाएको फाइल अति ठूलो छ।",
-       "api-error-filename-tooshort": "फाइलको नाम अति छोटो भयो।",
-       "api-error-filetype-banned": "यस प्रकारको फाइलमाथि प्रतिबन्ध छ।",
-       "api-error-filetype-banned-type": "$1 फाइल {{PLURAL:$4|प्रकार|प्रकारहरू}} को अनुमति छैन। फाइल प्रकार {{PLURAL:$3|जसको|जुनको}} अनुमति छ: $2।",
-       "api-error-filetype-missing": "फाइलमा एक्स्टेन्शनको अभाव छ।",
-       "api-error-hookaborted": "एक्सटेन्शन हुकले गर्दा यस फाइललाई नयाँ रुप दिने क्रिया रद्द भयो।",
-       "api-error-http": "आन्तरिक त्रुटि: सर्वरसित जोड़न असमर्थ",
-       "api-error-illegal-filename": "यस्तो फाइल नामको अनुमति छैन।",
-       "api-error-internal-error": "आन्तरिक त्रुटि: विकिमा आफ्नो अपलोड प्रसंस्करणसँग केहि त्रुटि देखिएको छ।",
-       "api-error-invalid-file-key": "आन्तरिक त्रुटि: अस्थाई भण्डारमा फाइल पाइएन।",
-       "api-error-missingparam": "आन्तरिक त्रुटि: अनुरोधमा पैरामीटरहरुको कमी",
-       "api-error-missingresult": "आन्तरिक त्रुटि: कपी सफल भयो भएन भनेर निश्चय गर्ने सकिएन।",
-       "api-error-mustbeloggedin": "फाइल अपलोड गर्न तपाईंले प्रवेश गरेको हुनुपर्छ।",
-       "api-error-mustbeposted": "आन्तरिक त्रुटि: अनुरोधको निम्ति HTTP POST को आवश्यकता",
-       "api-error-noimageinfo": "अपलोड सफल भयो, तर सर्वरले फाइलको बारेमा कुनै सूचना दिएन।",
-       "api-error-nomodule": "आन्तरिक त्रुटि: अपलोड मोडुल सेट नगरिएको।",
-       "api-error-ok-but-empty": "आन्तरिक त्रुटि: सर्वरबाट कुनै उत्तर आएन।",
-       "api-error-overwrite": "वर्तमान फाइलमाथि अधिलेखन(Overwriting)को अनुमति छैन।",
-       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
        "api-error-publishfailed": "आन्तरिक समस्याः अस्थायी फाइल प्रकाशन गर्न सर्भर असफर भयो ।",
-       "api-error-stasherror": "स्टासमा फाइल अपलोड गर्दा समस्या आएको छ ।",
-       "api-error-stashedfilenotfound": "स्ट्यासमा राखिएको फाइल त्यहाँ अपलोड गरिने प्रयासको समयमा भेटिएन।",
-       "api-error-stashpathinvalid": "त्यो स्थान जहाँ स्ट्यास भएको फाइल भेट्नु पर्ने थियो त्यो अमान्य छ।",
-       "api-error-stashfilestorage": "फाइललाई स्ट्यासमा अपलोड गर्दा समय एक त्रुटि देखिएको छ।",
-       "api-error-stashzerolength": "सर्भर त्यस फाइललाई स्ट्यास गर्न सकेन, किनभने त्यसको लम्बाई शून्य छ।",
-       "api-error-stashnotloggedin": "तपाईंलाई लग इन हुनु आवश्यक छ ताकि फाइललाई अपलोड स्ट्यासमा सुरक्षित गर्न सकियोस।",
-       "api-error-stashwrongowner": "स्ट्यासको जुन फाइल सम्म तपाईं पुग्न चाहनुहुन्छ त्यो तपाईंसँग सम्बन्धित छैन।",
-       "api-error-stashnosuchfilekey": "फाइलको साँचो जसलाई तपाईं स्ट्यासमा प्रयोगमा ल्याउन प्रयास गर्दै हुनुहुन्छ, त्यो अस्तित्वमा छैन।",
-       "api-error-timeout": "अपेक्षित समय भित्रमा सर्वरले प्रतिक्रिया देखाएन।",
-       "api-error-unclassified": "अज्ञात समस्या आइ पर्यो",
-       "api-error-unknown-code": "अज्ञात त्रुटि: \"$1\"",
-       "api-error-unknown-error": "आन्तरिक त्रुटि: तपाईंद्वारा फाइल अपलोड गरिने प्रयास गर्दा समय केहि गलत भएको थियो।",
+       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
        "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
-       "api-error-uploaddisabled": "यस विकिमा अपलोड निस्क्रिय गरिएकोछ।",
-       "api-error-verification-error": "यह फाइल खराब भइसकेको छ, वा गलत एक्सटेन्सन हो।",
        "duration-seconds": "$1 {{PLURAL:$1|सेकेण्ड|सेकेण्डहरू}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनेट|मिनेटहरू}}",
        "duration-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाहरू}}",
index 52f757a..9bcc007 100644 (file)
                        "Jeleniccz",
                        "MrLeopold",
                        "Hex",
-                       "Xxmarijnw"
+                       "Xxmarijnw",
+                       "Mainframe98"
                ]
        },
-       "tog-underline": "Koppelingen onderstrepen:",
+       "tog-underline": "Verwijzingen onderstrepen:",
        "tog-hideminor": "Kleine bewerkingen verbergen in recente wijzigingen",
        "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
        "searcharticle": "OK",
        "history": "Geschiedenis",
        "history_short": "Geschiedenis",
+       "history_small": "geschiedenis",
        "updatedmarker": "bewerkt sinds mijn laatste bezoek",
        "printableversion": "Printvriendelijke versie",
        "permalink": "Permanente koppeling",
        "unprotectthispage": "Beveiliging van deze pagina wijzigen",
        "newpage": "Nieuwe pagina",
        "talkpage": "Overlegpagina",
-       "talkpagelinktext": "Overleg",
+       "talkpagelinktext": "overleg",
        "specialpage": "Speciale pagina",
        "personaltools": "Persoonlijke instellingen",
        "articlepage": "Pagina bekijken",
        "pool-servererror": "De dienst \"pool counter\" is niet beschikbaar ($1).",
        "poolcounter-usage-error": "Gebruiksfout: $1",
        "aboutsite": "Over {{SITENAME}}",
-       "aboutpage": "Project:Info",
+       "aboutpage": "Project:Over",
        "copyright": "De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.",
        "copyrightpage": "{{ns:project}}:Auteursrechten",
        "currentevents": "In het nieuws",
        "blockedtitle": "Gebruiker is geblokkeerd",
        "blockedtext": "'''Uw gebruiker of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "autoblockedtext": "Uw IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.\nDe opgegeven reden is:\n\n:''$2''\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt deze blokkade bespreken met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]].\n\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet is geblokkeerd.\n\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
+       "systemblockedtext": "Uw gebruikersnaam of IP-adres is automatisch geblokkeerd door MediaWiki.\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens in een query die u maakt.",
        "blockednoreason": "geen reden opgegeven",
        "whitelistedittext": "U moet $1 om pagina's te bewerken.",
        "confirmedittext": "U moet uw e-mailadres bevestigen voor u kunt bewerken.\nVoer uw e-mailadres in en bevestig het via uw [[Special:Preferences|voorkeuren]].",
        "search-external": "Extern zoeken",
        "searchdisabled": "Zoeken in {{SITENAME}} is niet mogelijk.\nU kunt gebruik maken van Google.\nDe gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.",
        "search-error": "Er is een fout opgetreden tijdens het zoeken: $1",
+       "search-warning": "Een waarschuwing is opgetreden tijdens het zoeken: $1",
        "preferences": "Voorkeuren",
        "mypreferences": "Voorkeuren",
        "prefs-edits": "Aantal bewerkingen:",
        "saveprefs": "Opslaan",
        "restoreprefs": "Voorkeuren herstellen (voor alle instellingen)",
        "prefs-editing": "Bewerken",
-       "rows": "Regels:",
-       "columns": "Kolommen:",
        "searchresultshead": "Zoekresultaten",
        "stub-threshold": "Drempel voor markering als beginnetje ($1):",
        "stub-threshold-sample-link": "voorbeeld",
        "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
        "prefs-help-watchlist-token2": "Dit is de geheime sleutel voor de webfeed van uw volglijst.\nIedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.\nU kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.",
        "savedprefs": "Uw voorkeuren zijn opgeslagen.",
-       "savedrights": "De gebruikersrechten van {{GENDER:$1|$1}} zijn opgeslagen.",
+       "savedrights": "De gebruikergroepen van {{GENDER:$1|$1}} zijn opgeslagen.",
        "timezonelegend": "Tijdzone:",
        "localtime": "Plaatselijke tijd:",
        "timezoneuseserverdefault": "Wikistandaard gebruiken ($1)",
        "userrights": "Gebruikersrechtenbeheer",
        "userrights-lookup-user": "Een gebruiker selecteren",
        "userrights-user-editname": "Voer een gebruikersnaam in:",
-       "editusergroup": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
+       "editusergroup": "Gebruikersgroepen wijzigen",
        "editinguser": "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
+       "viewinguserrights": "Gebruikersrechten bekijken van {{GENDER:$1|gebruiker}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Gebruikersgroepen wijzigen",
+       "userrights-viewusergroup": "Toon gebruikersgroepen",
        "saveusergroups": "{{GENDER:$1|Gebruikersgroepen}} opslaan",
        "userrights-groupsmember": "Lid van:",
        "userrights-groupsmember-auto": "Impliciet lid van:",
        "action-upload_by_url": "dit bestand vanaf een URL te uploaden",
        "action-writeapi": "via de API bewerkingen uit te voeren",
        "action-delete": "deze pagina te verwijderen",
-       "action-deleterevision": "deze versie te verwijderen",
-       "action-deletedhistory": "de verwijderde versies van deze pagina te bekijken",
+       "action-deleterevision": "verwijder versies",
+       "action-deletelogentry": "logboekregels te verwijderen",
+       "action-deletedhistory": "de verwijderde versies van een pagina te bekijken",
+       "action-deletedtext": "de verwijderde versietekst te bekijken",
        "action-browsearchive": "verwijderde pagina's te zoeken",
        "action-undelete": "deze pagina terug te plaatsen",
-       "action-suppressrevision": "deze verborgen versie te bekijken en terug te plaatsen",
+       "action-suppressrevision": "verborgen versies te bekijken en terug te plaatsen",
        "action-suppressionlog": "dit beschermde logboek te bekijken",
        "action-block": "deze gebruiker een bewerkingsblokkade op te leggen",
        "action-protect": "het beveiligingsniveau van deze pagina aan te passen",
        "action-userrights-interwiki": "gebruikersrechten van gebruikers van andere wiki's te bewerken",
        "action-siteadmin": "de database af te sluiten of open te stellen",
        "action-sendemail": "e-mails te verzenden",
+       "action-editmyoptions": "uw eigen voorkeuren bewerken",
        "action-editmywatchlist": "uw eigen volglijst te bewerken",
        "action-viewmywatchlist": "uw eigen volglijst te bekijken",
        "action-viewmyprivateinfo": "uw eigen privégegevens te bekijken",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|lijst met nieuwe pagina's]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Weergeven",
+       "rcfilters-activefilters": "Actieve filters",
+       "rcfilters-search-placeholder": "Filter recente wijzigingen (blader of begin met intypen)",
+       "rcfilters-invalid-filter": "Ongeldig filter",
+       "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-noresults": "Geen filters gevonden",
+       "rcfilters-filtergroup-registration": "Gebruikers-registratie",
+       "rcfilters-filter-registered-label": "Geregistreerd",
+       "rcfilters-filter-registered-description": "Ingelogde gebruikers.",
+       "rcfilters-filter-unregistered-label": "Niet-geregistreerd",
+       "rcfilters-filter-unregistered-description": "Gebruikers die niet zijn ingelogd.",
+       "rcfilters-filter-editsbyself-label": "Uw eigen bewerkingen",
+       "rcfilters-filter-editsbyself-description": "Bewerkingen door u.",
+       "rcfilters-filter-editsbyother-label": "Bewerkingen door anderen",
+       "rcfilters-filter-editsbyother-description": "Bewerkingen die gemaakt zijn door andere gebruikers (niet door uzelf).",
+       "rcfilters-filtergroup-userExpLevel": "Gebruikerservarings niveau (alleen voor geregistreerde gebruikers)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nieuwkomers",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Minder dan 10 bewerkingen en 4 dagen van activiteit.",
+       "rcfilters-filter-userExpLevel-learner-label": "Leerlingen",
+       "rcfilters-filter-userExpLevel-learner-description": "Meer dagen van activiteit en bewerkingen dan \"Nieuwkomers\", maar minder dan \"Ervaren gebruikers\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Ervaren gebruikers",
+       "rcfilters-filter-userExpLevel-experienced-description": "Meer dan 30 dagen van activiteit en 500 bewerkingen.",
+       "rcfilters-filtergroup-automated": "Automatische bijdragen",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "De wijzigingen van geautomatiseerde hulpmiddelen.",
+       "rcfilters-filter-humans-label": "Menselijk (geen bot)",
+       "rcfilters-filter-humans-description": "Bewerkingen door menselijke bewerkers.",
+       "rcfilters-filtergroup-significance": "Belangrijkheid",
+       "rcfilters-filter-minor-label": "Kleine bewerkingen",
+       "rcfilters-filter-minor-description": "Bewerkingen die door de bewerker zijn gelabeld als klein.",
+       "rcfilters-filter-major-label": "Geen kleine bewerking",
+       "rcfilters-filter-major-description": "Bewerkingen niet gelabeld als klein.",
+       "rcfilters-filtergroup-changetype": "Soort wijziging",
+       "rcfilters-filter-pageedits-label": "Paginabewerkingen",
+       "rcfilters-filter-pageedits-description": "Wijzigingen aan de wiki inhoud, discussies, categorie beschrijvingen....",
+       "rcfilters-filter-newpages-label": "Nieuwe pagina's",
+       "rcfilters-filter-newpages-description": "Bewerkingen die een nieuwe pagina aanmaken.",
+       "rcfilters-filter-categorization-label": "Categorie wijzigingen",
+       "rcfilters-filter-logactions-label": "Geregistreerde acties",
+       "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads....",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "rcshowhideminor": "Kleine bewerkingen $1",
        "uncategorizedcategories": "Niet-gecategoriseerde categorieën",
        "uncategorizedimages": "Niet-gecategoriseerde bestanden",
        "uncategorizedtemplates": "Niet-gecategoriseerde sjablonen",
+       "uncategorized-categories-exceptionlist": "# Bevat een lijst van categorieën, welke niet op Speciaal:NietGecategoriseerdeCategorieën getoond moeten worden. Een per regel, beginnend met \"*\". Regels die starten met een ander teken (inclusief witruimte) worden genegeerd. Gebruik \"#\" voor opmerkingen.",
        "unusedcategories": "Ongebruikte categorieën",
        "unusedimages": "Ongebruikte bestanden",
        "wantedcategories": "Niet-bestaande categorieën met de meeste koppelingen",
        "listgrants-grant": "Toestemming",
        "listgrants-rights": "Rechten",
        "trackingcategories": "Volgcategorieën",
-       "trackingcategories-summary": "Op deze pagina worden volgcategorieën weergegeven die automatisch worden gevuld door de MediaWikisoftware. De namen van de categorieën kunnen gewijzigd worden door de bijbehorende systeemberichten in de naamruimte \"{{ns:8}}\" bij te werken.",
+       "trackingcategories-summary": "Op deze pagina worden volgcategorieën weergegeven die automatisch worden gevuld door de MediaWiki software. De namen van de categorieën kunnen gewijzigd worden door de bijbehorende systeemberichten in de naamruimte \"{{ns:8}}\" bij te werken.",
        "trackingcategories-msg": "Volgcategorie",
        "trackingcategories-name": "Berichtnaam",
        "trackingcategories-desc": "Opnamecriteria",
        "emailccsubject": "Kopie van uw bericht aan $1: $2",
        "emailsent": "E-mail verzonden",
        "emailsenttext": "Uw e-mail is verzonden.",
-       "emailuserfooter": "Deze e-mail is {{GENDER:$1|verstuurd}} door $1 aan {{GENDER:$2|$2}} door de functie \"{{int:emailuser}}\" van {{SITENAME}}.",
+       "emailuserfooter": "Deze e-mail is door $1 aan {{GENDER:$2|$2}} {{GENDER:$1|verstuurd}} middels de functie \"{{int:emailuser}}\" van {{SITENAME}}. {{GENDER:$2|Uw}} e-mail wordt direct naar de {{GENDER:$1|oorspronkelijke afzender}} verstuurd, waardoor {{GENDER:$2|uw}} e-mailadres aan {{GENDER:$1|hem|haar|hem of haar}} onthuld wordt.",
        "usermessage-summary": "Systeembericht achtergelaten",
        "usermessage-editor": "Systeembericht",
        "watchlist": "Volglijst",
        "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich aanmelden.",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
-       "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
-       "addedwatchtext-talk": "\"[[:$1]]\" en de gerelateerde pagina zijn toegevoegd aan je [[Special:Watchlist|volglijst]].",
+       "addedwatchtext": "\"[[:$1]]\" en de bijbehorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" en de bijbehorende pagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
-       "removedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
-       "removedwatchtext-talk": "\"[[:$1]]\" en de bijhorende pagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
+       "removedwatchtext": "\"[[:$1]]\" en de bijbehorende overlegpagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" en de bijbehorende pagina zijn verwijderd van uw [[Special:Watchlist|volglijst]].",
        "removedwatchtext-short": "De pagina \"$1\" is van uw volglijst verwijderd.",
        "watch": "Volgen",
        "watchthispage": "Pagina volgen",
        "changecontentmodel-emptymodels-title": "Geen inhoudsmodellen beschikbaar",
        "changecontentmodel-emptymodels-text": "De inhoud van [[:$1]] kan niet worden omgezet in een ander type.",
        "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
-       "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
+       "log-description-contentmodel": "Deze pagina bevat wijzigingen rond het inhoudsmodel van pagina's en pagina's die aangemaakt zijn met een inhoudsmodel anders dan het standaardmodel.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|maakte}} de pagina $3 aan met behulp van een niet-standaard inhoudsmodel \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" in \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "sp-contributions-newonly": "Alleen nieuwe pagina's weergeven",
        "sp-contributions-hideminor": "Kleine bewerkingen verbergen",
        "sp-contributions-submit": "Bekijken",
-       "whatlinkshere": "Koppelingen naar deze pagina",
+       "whatlinkshere": "Verwijzingen naar deze pagina",
        "whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
        "whatlinkshere-page": "Pagina:",
        "linkshere": "De volgende pagina's verwijzen naar '''[[:$1]]''':",
        "proxyblockreason": "Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver.\nNeem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.",
        "sorbsreason": "Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.",
        "sorbs_create_account_reason": "Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.\nU kunt geen gebruiker registreren.",
+       "softblockrangesreason": "Anonieme bijdragen zijn niet toegestaan op basis van uw IP-adres ($1). Gelieve in te loggen.",
        "xffblockreason": "Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1",
        "cant-see-hidden-user": "De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.\nOmdat u het recht \"hideuser\" niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.",
        "ipbblocked": "U kunt geen andere gebruikers (de)blokkeren, omdat u zelf geblokkeerd bent",
        "cant-move-to-user-page": "U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.",
        "cant-move-category-page": "U hebt geen rechten om categoriepagina's te hernoemen.",
        "cant-move-to-category-page": "U hebt geen rechten om een pagina naar een categoriepagina te hernoemen.",
+       "cant-move-subpages": "U hebt geen rechten om deelpagina's te hernoemen.",
+       "namespace-nosubpages": "Naamruimte \"$1\" laat geen deelpagina's toe.",
        "newtitle": "Nieuwe paginanaam:",
        "move-watch": "Bronpagina en doelpagina volgen",
        "movepagebtn": "Pagina hernoemen",
        "movelogpagetext": "Hieronder staan hernoemde pagina's.",
        "movesubpage": "{{PLURAL:$1|Subpagina|Subpagina's}}",
        "movesubpagetext": "De {{PLURAL:$1|subpagina|$1 subpagina's}} van deze pagina {{PLURAL:$1|wordt|worden}} hieronder weergegeven.",
+       "movesubpagetalktext": "De bijbehorende overlegpagina heeft $1 {{PLURAL:$1|deelpagina|deelpagina's}} hierbeneden getoond.",
        "movenosubpage": "Deze pagina heeft geen subpagina's.",
        "movereason": "Reden:",
        "revertmove": "terugdraaien",
        "tooltip-ca-move": "Deze pagina hernoemen",
        "tooltip-ca-watch": "Deze pagina aan mijn volglijst toevoegen",
        "tooltip-ca-unwatch": "Deze pagina van mijn volglijst verwijderen",
-       "tooltip-search": "Zoeken in {{SITENAME}}",
-       "tooltip-search-go": "Naar een pagina met deze naam gaan als die bestaat",
+       "tooltip-search": "Doorzoek {{SITENAME}}",
+       "tooltip-search-go": "Naar een pagina met deze naam gaan als deze bestaat",
        "tooltip-search-fulltext": "Alle pagina's op deze tekst doorzoeken",
        "tooltip-p-logo": "Naar de hoofdpagina gaan",
        "tooltip-n-mainpage": "Naar de hoofdpagina gaan",
        "pageinfo-length": "Paginalengte (in bytes)",
        "pageinfo-article-id": "Paginanummer",
        "pageinfo-language": "Taal voor de pagina",
+       "pageinfo-language-change": "wijzigen",
        "pageinfo-content-model": "Paginainhoudmodel",
        "pageinfo-content-model-change": "wijzigen",
        "pageinfo-robot-policy": "Indexering door robots",
        "pageinfo-category-pages": "Aantal pagina's",
        "pageinfo-category-subcats": "Aantal subcategorieën",
        "pageinfo-category-files": "Aantal bestanden",
+       "pageinfo-user-id": "Gebruikers-ID",
        "markaspatrolleddiff": "Als gecontroleerd markeren",
        "markaspatrolledtext": "Deze pagina als gecontroleerd markeren",
        "markaspatrolledtext-file": "Deze bestandsversie als gecontroleerd markeren",
        "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "confirmemail_invalidated": "De e-mailbevestiging is geannuleerd",
        "invalidateemail": "E-mailbevestiging annuleren",
+       "notificationemail_subject_changed": "{{SITENAME}} geregistreerd e-mailadres is gewijzigd",
+       "notificationemail_subject_removed": "{{SITENAME}} geregistreerd e-mailadres is verwijderd",
+       "notificationemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1, heeft het e-mailadres van de gebruiker \"$2\" op {{SITENAME}} gewijzigd naar \"$3\". \n\nAls u dit niet was, neem dan onmiddellijk contact op met een sitebeheerder.",
        "notificationemail_body_removed": "Iemand, waarschijnlijk u, met het IP-adres $1, heeft het e-mailadres geregistreerd voor gebruiker \"$2\" verwijderd op {{SITENAME}}. \n\nAls u dit niet was, neem dan onmiddellijk contact op met een sitebeheerder.",
        "scarytranscludedisabled": "[Interwiki-invoeging van sjablonen is uitgeschakeld]",
        "scarytranscludefailed": "[De sjabloon $1 kon niet opgehaald worden]",
        "tag-filter": "[[Special:Tags|Labelfilter]]:",
        "tag-filter-submit": "Filteren",
        "tag-list-wrapper": "([[Special:Tags|Label{{PLURAL:$1||s}}]]: $2)",
+       "tag-mw-contentmodelchange": "inhoudsmodel wijzigen",
+       "tag-mw-contentmodelchange-description": "Bewerkingen die [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel het  inhoudsmodel van een pagina wijzigen]",
        "tags-title": "Labels",
        "tags-intro": "Op deze pagina staan de labels waarmee de software iedere bewerking kan markeren, en hun betekenis.",
        "tags-tag": "Labelnaam",
        "tags-delete-not-found": "Het label \"$1\" bestaat niet.",
        "tags-delete-too-many-uses": "Het label \"$1\" is toegepast op meer dan $2 {{PLURAL:$2|versies}}. Daardoor kan het niet verwijderd worden.",
        "tags-delete-warnings-after-delete": "Het label \"$1\" is verwijderd, maar de volgende {{PLURAL:$2|waarschuwing is|waarschuwingen zijn}} opgetreden:",
+       "tags-delete-no-permission": "U hebt geen rechten om wijzigingslabels te verwijderen.",
        "tags-activate-title": "Label activeren",
        "tags-activate-question": "U activeert het label \"$1\".",
        "tags-activate-reason": "Reden:",
        "htmlform-date-placeholder": "JJJJ-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "JJJJ-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "De waarde die u hebt opgegeven is niet herkend als datum. Probeer het YYYY-MM-DD datumformaat.",
+       "htmlform-time-invalid": "De waarde die u hebt opgegeven is niet herkend als tijd. Probeer het HH:MM:SS tijdformaat.",
+       "htmlform-datetime-invalid": "De waarde die u hebt opgegeven is niet herkend als datum en tijd. Probeer het JJJJ-MM-DD HH:MM:SS formaat.",
+       "htmlform-date-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane datum van $1.",
+       "htmlform-date-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane datum van $1.",
+       "htmlform-time-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane tijd van $1.",
+       "htmlform-time-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane tijd van $1.",
+       "htmlform-datetime-toolow": "De waarde die u hebt opgegeven ligt voor de vroegste toegestane datum en tijd van $1.",
+       "htmlform-datetime-toohigh": "De waarde die u hebt opgegeven ligt na de laatste toegestane datum en tijd van $1.",
        "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
        "htmlform-title-not-exists": "$1 bestaat niet.",
        "htmlform-user-not-exists": "<strong>$1</strong> bestaat niet.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
+       "logentry-delete-delete_redir": "$1 heeft de doorverwijzing $3 {{GENDER:$2|verwijderd}} door deze te overschrijven",
        "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
        "logentry-delete-event": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4",
        "feedback-thanks": "Bedankt! Uw terugkoppeling is op de pagina \"[$2 $1]\" geplaatst.",
        "feedback-thanks-title": "Bedankt!",
        "feedback-useragent": "Useragent:",
-       "searchsuggest-search": "Zoeken in {{SITENAME}}",
+       "searchsuggest-search": "Doorzoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "U mag geen bestanden uploaden in deze wiki.",
        "api-error-badtoken": "Interne fout: het token klopt niet.",
-       "api-error-blocked": "U bent geblokkeerd en kunt niet bewerken.",
-       "api-error-copyuploaddisabled": "Uploaden via URL is uitgeschakeld op deze server.",
-       "api-error-duplicate": "Er {{PLURAL:$1|staat al een bestand|staan al bestanden}} met dezelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al een ander bestand|waren al $1 andere bestanden}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
-       "api-error-empty-file": "Het bestand dat u hebt geüpload is leeg.",
        "api-error-emptypage": "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
-       "api-error-fetchfileerror": "Interne fout: er is iets misgegaan bij het ophalen van het bestand.",
-       "api-error-fileexists-forbidden": "Er bestaat al een bestand met de naam \"$1\" dat niet overschreven kan worden.",
-       "api-error-fileexists-shared-forbidden": "Er bestaat al een bestand met de naam \"$1\" in de gedeelde repository dat niet overschreven kan worden.",
-       "api-error-file-too-large": "Het bestand dat u hebt geüpload is te groot.",
-       "api-error-filename-tooshort": "De bestandsnaam is te kort.",
-       "api-error-filetype-banned": "Dit bestandstype mag niet geüpload worden.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Het bestandstype $1 wordt|De bestandstypes $1 worden}} niet toegelaten. {{PLURAL:$3|Het toegelaten bestandstype is|De toegelaten bestandstypes zijn}} $2.",
-       "api-error-filetype-missing": "Het bestand heeft geen extensie.",
-       "api-error-hookaborted": "De wijziging die u probeert te maken is afgebroken door een uitbreiding.",
-       "api-error-http": "Interne fout: er kon geen verbinding gemaakt worden met de server.",
-       "api-error-illegal-filename": "Deze bestandsnaam is niet toegestaan.",
-       "api-error-internal-error": "Interne fout: er is iets misgegaan tijdens het verwerken van uw upload door de wiki.",
-       "api-error-invalid-file-key": "Interne fout: het bestand is niet aangetroffen in de tijdelijke opslag.",
-       "api-error-missingparam": "Interne fout: niet alle parameters zijn in het verzoek meegeleverd.",
-       "api-error-missingresult": "Interne fout: het was niet mogelijk vast te stellen of het kopiëren is geslaagd.",
-       "api-error-mustbeloggedin": "U moet aangemeld zijn om bestanden te kunnen uploaden.",
-       "api-error-mustbeposted": "Er zit een fout in de software. Er wordt geen gebruik gemaakt van de juiste HTTP-methode.",
-       "api-error-noimageinfo": "De upload is afgerond, maar de server heeft geen gegevens over het bestand verstrekt.",
-       "api-error-nomodule": "Interne fout: er is geen uploadmodule ingesteld.",
-       "api-error-ok-but-empty": "Interne fout: de server heeft geen gegevens teruggeleverd.",
-       "api-error-overwrite": "Het overschrijven van een bestand bestand is niet toegestaan.",
-       "api-error-ratelimited": "U probeert meer bestanden te uploaden in een korte periode dan deze wiki toelaat.\nProbeer het over een aantal minuten opnieuw.",
-       "api-error-stashfailed": "Interne fout: de server kon het tijdelijke bestand niet opslaan.",
        "api-error-publishfailed": "Interne fout: de server kon het tijdelijke bestand niet publiceren.",
-       "api-error-stasherror": "Er is een fout opgetreden tijdens het uploaden van het bestand naar de tijdelijke opslagruimte.",
-       "api-error-stashedfilenotfound": "Het opgeslagen bestand is niet aangetroffen tijdens het uploaden vanuit de stash.",
-       "api-error-stashpathinvalid": "Het pad waar het bestand in de stash werd verwacht is ongeldig.",
-       "api-error-stashfilestorage": "Er is een fout opgetreden tijdens het opslaan van het bestand in de stash.",
-       "api-error-stashzerolength": "De server kon het bestand niet opslaan in de stash, omdat het een lengte van nul had.",
-       "api-error-stashnotloggedin": "U moet aangemeld zijn om bestanden te kunnen opslaan in de stash.",
-       "api-error-stashwrongowner": "U bent geen eigenaar van het bestand waar u toegang tot probeerde te krijgen.",
-       "api-error-stashnosuchfilekey": "Het sleutelbestand in de stash waar u toegang tot probeert te krijgen bestaat niet.",
-       "api-error-timeout": "De server heeft niet binnen de verwachte tijd geantwoord.",
-       "api-error-unclassified": "Er is een onbekende fout opgetreden",
-       "api-error-unknown-code": "Interne fout: \"$1\"",
-       "api-error-unknown-error": "Interne fout: er is iets misgegaan tijdens het uploaden van uw bestand.",
-       "api-error-unknown-warning": "Onbekende waarschuwing: $1",
+       "api-error-stashfailed": "Interne fout: de server kon het tijdelijke bestand niet opslaan.",
+       "api-error-unknown-warning": "Onbekende waarschuwing: \"$1\".",
        "api-error-unknownerror": "Onbekende fout: \"$1\"",
-       "api-error-uploaddisabled": "Uploaden is niet mogelijk in deze wiki.",
-       "api-error-verification-error": "Dit bestand is mogelijk beschadigd of heeft een onjuiste extensie.",
-       "api-error-was-deleted": "Een bestand met deze naam is al eerder geüpload en vervolgens verwijderd.",
        "duration-seconds": "$1 {{PLURAL:$1|seconde|seconden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuut|minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|uur|uren}}",
        "pagelang-language": "Taal",
        "pagelang-use-default": "Standaard taal gebruiken",
        "pagelang-select-lang": "Taal selecteren",
+       "pagelang-reason": "Reden",
        "pagelang-submit": "Opslaan",
+       "pagelang-nonexistent-page": "De pagina $1 bestaat niet.",
+       "pagelang-unchanged-language": "De pagina $1 is al ingesteld op de taal $2.",
+       "pagelang-unchanged-language-default": "De pagina $1 is al ingesteld op de wiki's standaard inhoudstaal.",
+       "pagelang-db-failed": "De database kon de paginataal niet wijzigen.",
        "right-pagelang": "Paginataal wijzigen",
        "action-pagelang": "paginataal te wijzigen",
        "log-name-pagelang": "Logboek taalwijzigingen",
        "mw-widgets-dateinput-no-date": "Geen datum geselecteerd",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Zoeken naar media",
+       "mw-widgets-mediasearch-noresults": "Geen resultaten gevonden.",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Voeg een categorie toe...",
        "sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
        "sessionprovider-generic": "$1-sessies",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "op cookies gebaseerde sessies",
        "sessionprovider-nocookies": "Cookies kunnen uitgeschakeld zijn. Zorg ervoor dat u cookies hebt ingeschakeld en probeer het opnieuw.",
        "randomrootpage": "Willekeurige hoofdpagina",
        "log-action-filter-block": "Soort blokkade:",
+       "log-action-filter-contentmodel": "Soort inhoudsmodel wijziging:",
        "log-action-filter-delete": "Soort verwijdering:",
+       "log-action-filter-import": "Type import:",
        "log-action-filter-managetags": "Type labelbeheerhandeling:",
        "log-action-filter-move": "Soort hernoeming:",
        "log-action-filter-newusers": "Type accountaanmaak:",
        "log-action-filter-block-block": "Blokkade",
        "log-action-filter-block-reblock": "Aanpassing van blokkade",
        "log-action-filter-block-unblock": "Opheffing van blokkade",
+       "log-action-filter-contentmodel-change": "Wijziging van het inhoudsmodel",
+       "log-action-filter-contentmodel-new": "Pagina creatie met een niet-standaard inhoudsmodel",
        "log-action-filter-delete-delete": "Verwijderen van pagina",
+       "log-action-filter-delete-delete_redir": "Overschrijven van doorverwijzingen",
        "log-action-filter-delete-restore": "Terugplaatsen van pagina",
+       "log-action-filter-delete-event": "Verwijderen van logboekregels",
+       "log-action-filter-delete-revision": "Verwijderen van versies",
+       "log-action-filter-import-interwiki": "Transwiki imports",
+       "log-action-filter-import-upload": "Import doormiddel van XML uploads",
        "log-action-filter-managetags-create": "Aanmaken van label",
        "log-action-filter-managetags-delete": "Verwijderen van label",
        "log-action-filter-managetags-activate": "Activeren van label",
        "log-action-filter-upload-overwrite": "Herupload",
        "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
        "authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
+       "authmanager-create-from-login": "Om een account aan te maken, gelieve de velden in te vullen.",
+       "authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
+       "authmanager-authplugin-setpass-bad-domain": "Ongeldig domein.",
+       "authmanager-autocreate-noperm": "Het automatisch aanmaken van accounts is niet toegestaan.",
+       "authmanager-autocreate-exception": "Het automatisch aanmaken van accounts is tijdelijk uitgeschakelijk vanwege eerdere fouten.",
+       "authmanager-userdoesnotexist": "Gebruikersaccount \"$1\" is niet geregistreerd.",
+       "authmanager-userlogin-remembermypassword-help": "Of het wachtwoord moet worden opgeslagen voor langer dan de duur van de sessie.",
+       "authmanager-username-help": "Gebruikersnaam for authentificatie.",
+       "authmanager-password-help": "Wachtwoord for authentificatie.",
+       "authmanager-domain-help": "Domein voor externe authentificatie.",
+       "authmanager-retype-help": "Wachtwoord ter bevestiging.",
        "authmanager-email-label": "E-mail",
        "authmanager-email-help": "E-mailadres",
        "authmanager-realname-label": "Echte naam",
        "authmanager-realname-help": "Echte naam van de gebruiker",
        "authmanager-provider-password": "Op wachtwoord gebaseerde authenticatie",
+       "authmanager-provider-password-domain": "Wachtwoord- en domeingebaseerde authentificatie",
        "authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+       "authprovider-confirmlink-request-label": "Accounts die aan elkaar moeten worden gekoppeld.",
+       "authprovider-confirmlink-success-line": "$1: Succesvol gekoppeld.",
        "authprovider-resetpass-skip-label": "Overslaan",
+       "authprovider-resetpass-skip-help": "Sla het resetten van het wachtwoord over.",
+       "authform-newtoken": "Ontbrekend token. $1",
+       "authform-notoken": "Ontbrekend token",
+       "authform-wrongtoken": "Verkeerd token",
        "specialpage-securitylevel-not-allowed-title": "Niet toegestaan",
+       "authpage-cannot-create": "Kon het account aanmaken niet starten.",
        "cannotauth-not-allowed-title": "Geen toegang",
+       "cannotauth-not-allowed": "U hebt geen toestemming om deze pagina te gebruiken",
        "changecredentials": "Authenticatiegegevens wijzigen",
        "changecredentials-submit": "Authenticatiegegevens wijzigen",
+       "changecredentials-invalidsubpage": "$1 is geen geldig identificatietype.",
        "changecredentials-success": "Uw authenticatiegegevens zijn gewijzigd.",
        "removecredentials": "Authenticatiegegevens verwijderen",
        "removecredentials-submit": "Authenticatiegegevens verwijderen",
+       "removecredentials-invalidsubpage": "$1 is geen geldig identificatietype.",
        "removecredentials-success": "Uw authenticatiegegevens zijn verwijderd.",
        "credentialsform-provider": "Soort authenticatiegegevens:",
        "credentialsform-account": "Gebruikersnaam:",
        "linkaccounts-success-text": "Het account is gekoppeld.",
        "linkaccounts-submit": "Accounts koppelen",
        "unlinkaccounts": "Accounts ontkoppelen",
-       "unlinkaccounts-success": "Het account is ontkoppeld."
+       "unlinkaccounts-success": "Het account is ontkoppeld.",
+       "userjsispublic": "Let op: JavaScript deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
+       "usercssispublic": "Let op: CSS deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
+       "restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
+       "restrictionsfield-label": "Toegestane IP-ranges:",
+       "restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "versie $1",
+       "pageid": "Pagina-ID $1"
 }
index 4142ed8..c50b09e 100644 (file)
        "history-feed-description": "Endringshistorikk for denne sida på wikien",
        "history-feed-item-nocomment": "$1 på $2",
        "history-feed-empty": "Den etterspurde sida finst ikkje. Ho kan vere sletta frå wikien, eller vere flytta. Prøv å [[Special:Search|søke på wikien]] for relevante nye sider.",
+       "history-edit-tags": "Endra merka til dei valde versjonane",
        "rev-deleted-comment": "(endringssamandrag fjerna)",
        "rev-deleted-user": "(brukarnamnet er fjerna)",
        "rev-deleted-event": "(fjerna loggoppføring)",
        "saveprefs": "Lagre",
        "restoreprefs": "Hent attende alle standardinnstillingane (i alle bolkane)",
        "prefs-editing": "Endring",
-       "rows": "Rekkjer",
-       "columns": "Kolonnar",
        "searchresultshead": "Søk",
        "stub-threshold": "Grense (i byte) for at frø/spirer skal formaterast <a href=\"#\" class=\"stub\">slik</a>:",
        "stub-threshold-disabled": "Deaktivert",
        "feedback-thanks": "Takk! Attendemeldinga di er lagd inn på sida «[$2 $1]».",
        "searchsuggest-search": "Søk i {{SITENAME}}",
        "searchsuggest-containing": "som inneheld …",
-       "api-error-badaccess-groups": "Du har ikkje løyve til å lasta opp filer til wikien.",
        "api-error-badtoken": "Intern feil: ugild token.",
-       "api-error-copyuploaddisabled": "Opplasting etter URL er avslege på tenaren.",
-       "api-error-duplicate": "Det finst {{PLURAL:$1|ei anna fil|andre filer}} på nettstaden med same innhaldet.",
-       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi|andre file}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
-       "api-error-empty-file": "Fila du sende var tom.",
        "api-error-emptypage": "Det er ikkje tillate å oppretta nye tomme sider.",
-       "api-error-fetchfileerror": "Intern feil: Noko gjekk gale då fila vart henta.",
-       "api-error-fileexists-forbidden": "Ei fil med namnet «$1» finst alt, og kan ikkje skrivast over.",
-       "api-error-fileexists-shared-forbidden": "Ei fil med namnet «$1» finst alt i den delte filsamlinga, og kan ikkje skrivast over.",
-       "api-error-file-too-large": "Fila du sende var for stor.",
-       "api-error-filename-tooshort": "Filnamnet er for stutt.",
-       "api-error-filetype-banned": "Denne filtypen er ikkje tillaten.",
-       "api-error-filetype-banned-type": "$1 er ikkje {{PLURAL:$4|ein tillaten filtype|tillatne filtypar}}. {{PLURAL:$3|Tillaten filtype|Tillatne filtypar}} er $2.",
-       "api-error-filetype-missing": "Fila saknar ei ending.",
-       "api-error-hookaborted": "Endringa du freista vart avbroten av ei utviding.",
-       "api-error-http": "Intern feil: kan ikkje kopla til tenaren.",
-       "api-error-illegal-filename": "Filnamnet er ikkje tillate.",
-       "api-error-internal-error": "Intern feil: Noko gjekk gale med handsaminga av opplastinga di til wikien.",
-       "api-error-invalid-file-key": "Intern feil: Fila vart ikkje funnen i mellombels lagringsplass.",
-       "api-error-missingparam": "Intern feil: det saknar parametrar i førespurnaden.",
-       "api-error-missingresult": "Intern feil: kunne ikkje avgjera om koperinga var vellukka.",
-       "api-error-mustbeloggedin": "Du lyt vera innlogga for å lasta opp filer.",
-       "api-error-mustbeposted": "Intern feil: førespurnad krev HTTP POST.",
-       "api-error-noimageinfo": "Opplastinga gjekk greitt, men tenaren gav oss ikkje noko informasjon om fila.",
-       "api-error-nomodule": "Intern feil: ingen opplastingsmodul er vald.",
-       "api-error-ok-but-empty": "Intern feil: ikkje noko svar frå tenaren.",
-       "api-error-overwrite": "Det er ikkje tillate å skriva over filer som alt finst.",
-       "api-error-stashfailed": "Intern feil: tenaren greidde ikkje å lagra ei mellombels fil.",
        "api-error-publishfailed": "Intern feil: tenaren greidde ikkje å publisera mellombels fil.",
-       "api-error-timeout": "Tenaren svara ikkje innan tida svar var venta.",
-       "api-error-unclassified": "Det oppstod ein ukjend feil.",
-       "api-error-unknown-code": "Ukjend feil: «$1»",
-       "api-error-unknown-error": "Intern feil: Noko gjekk gale då fila di vart freista lasta opp.",
+       "api-error-stashfailed": "Intern feil: tenaren greidde ikkje å lagra ei mellombels fil.",
        "api-error-unknown-warning": "Ukjend åtvaring: $1",
        "api-error-unknownerror": "Ukjend feil: «$1».",
-       "api-error-uploaddisabled": "Det er ikkje høve til å lasta opp filer til wikien.",
-       "api-error-verification-error": "Fila kan vera øydelagd eller ha rang filending.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutt|minutt}}",
        "duration-hours": "$1 {{PLURAL:$1|time|timar}}",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
-       "randomrootpage": "Tilfeldig rotsida"
+       "randomrootpage": "Tilfeldig rotsida",
+       "userjsispublic": "Merk: JavaScript-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
+       "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar."
 }
index eb65fbf..30bcfde 100644 (file)
@@ -15,7 +15,9 @@
                        "아라",
                        "Macofe",
                        "Matma Rex",
-                       "Xð"
+                       "Xð",
+                       "Nicolas Eynaud",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
        "searcharticle": "Consultar",
        "history": "Istoric",
        "history_short": "Istoric",
+       "history_small": "istoric",
        "updatedmarker": "modificat dempuèi ma darrièra visita",
        "printableversion": "Version imprimibla",
        "permalink": "Ligam istoric",
        "no-null-revision": "Impossible de crear una novèla revision voida per la pagina « $1 »",
        "badtitle": "Títol marrit",
        "badtitletext": "Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.",
+       "title-invalid-talk-namespace": "La pagina de títol demandada fa referéncia a una pagina de discussion qu'existís pas.",
+       "title-invalid-characters": "La pagina de títol demandada contèn de caractèrs invalides : $1",
        "perfcached": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "perfcachedts": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "querypage-no-updates": "Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.",
        "changepassword-success": "Vòstre senhal es estat modificat !",
        "changepassword-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
        "botpasswords": "Senhals de robòts",
+       "botpasswords-disabled": "Los senhals robòts son desactivats.",
+       "botpasswords-no-central-id": "Per intrar lo senhau d'un bot, devètz èsser connectat amb un còmpte globau.",
+       "botpasswords-existing": "Senhals de robòts existents",
+       "botpasswords-createnew": "Crear un novèu senhau de bot",
+       "botpasswords-editexisting": "Editar un senhau de bot existent",
        "botpasswords-label-appid": "Nom del robòt :",
        "botpasswords-label-create": "Crear",
        "botpasswords-label-update": "Metre a jorn",
        "botpasswords-label-grants": "Dreits aplicables :",
        "botpasswords-label-grants-column": "Acordat",
        "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.",
+       "botpasswords-created-title": "Senhau de bot creat",
+       "botpasswords-created-body": "Lo senhau dau bot per lo bot $1 de l'utilizaire $2 es estat creat",
+       "botpasswords-updated-title": "Senhau dau bot més a jorn",
+       "botpasswords-updated-body": "Lo senhau dau bot $1 de l'utilizaire $2 es estat més a jorn",
+       "botpasswords-deleted-title": "Senhau dau bot escafat",
+       "botpasswords-deleted-body": "Lo senhay dau bot $1 de l'utilizaire $2 es estat escafat",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
+       "resetpass_forbidden-reason": "Lei senhaus pòdon pas èsser cambiats : $1",
        "resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "resetpass-submit-loggedin": "Modificar lo senhal",
        "resetpass-submit-cancel": "Anullar",
        "passwordreset-emailtext-ip": "Qualqu'un (probablament vos, dempuèi l'adreça IP $1) a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que volètz pas mai lo modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailtext-user": "L'utilizaire $1 sus {{SITENAME}} a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que lo volètz pas mai modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailelement": "Utilizaire: \n$1\n\nSenhal temporari: \n$2",
-       "passwordreset-emailsentemail": "Un corrièr electronic de reïnicializacion de senhal es estat mandat.",
+       "passwordreset-emailsentemail": "Se aquela adreiça de corrièr electrnic es associat ambé vòstre compte, un corrièr electronic de reïnicializacion de senhal es estat mandat.",
+       "passwordreset-emailsentusername": "Se una adreiça de corrier electronic es associada amb aqueu còmpte d'utilizaire, un senhau de reïnicializacion serà mandat.",
+       "passwordreset-nosuchcaller": "L’apelant existís pas : $1",
+       "passwordreset-invalidemail": "Adreiça electronica invalida",
        "changeemail": "Cambiar o suprimir l'adreça electronica",
        "changeemail-header": "Cambiar l'adreça electronica del compte",
        "changeemail-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|es estada fusionada|son estada fusionadas}} dins [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
        "mergehistory-fail-bad-timestamp": "L’orodatatge es pas valid.",
+       "mergehistory-fail-invalid-source": "La pagina font es pas valida.",
+       "mergehistory-fail-invalid-dest": "La pagina de destinacion es invalida",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "saveprefs": "Enregistrar las preferéncias",
        "restoreprefs": "Restablir totes los paramètres per defaut (dins totas las seccions)",
        "prefs-editing": "Fenèstra de modificacion",
-       "rows": "Rengadas :",
-       "columns": "Colomnas :",
        "searchresultshead": "Recèrca",
        "stub-threshold": "Limit pel formatatge dels ligams d’esbòs ($1) :",
        "stub-threshold-sample-link": "exemple",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "editinguser": "Modificacion dels dreits de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar los gropes de l’utilizaire",
+       "userrights-viewusergroup": "Veire lei grops d'utilizaires",
        "saveusergroups": "Enregistrar los gropes de l’{{GENDER:$1|utilizaire|utilizaira}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicit de :",
        "right-sendemail": "Mandar un corrièl als autres utilizaires",
        "right-applychangetags": "Aplicar [[Special:Tags|las balisas]] amb sas pròprias modificacions",
        "grant-generic": "ensemble de dreits « $1 »",
+       "grant-group-page-interaction": "Interagir amb de paginas",
+       "grant-group-file-interaction": "Interagir amb de mèdias",
+       "grant-group-watchlist-interaction": "Interagir amb vòstra lista de seguiment",
        "grant-group-email": "Mandar un corrièr electronic",
        "grant-blockusers": "Blocar e desblocar d'utilizaires",
        "grant-createaccount": "Crear de comptes",
        "grant-createeditmovepage": "Crear, modificar e desplaçar de paginas",
+       "grant-editpage": "Editar lei paginas existentas",
+       "grant-editprotected": "Editar lei paginas protegidas",
        "grant-patrol": "Verificar las modificacions de paginas",
+       "grant-uploadeditmovefile": "Telecargar, remplaçar e desplaçar de fichiers",
+       "grant-uploadfile": "Telecargar un novèu fichier",
        "grant-basic": "Dreits de basa",
+       "grant-viewdeleted": "Veire lei fichiers e lei paginas escafats",
+       "grant-viewmywatchlist": "Afichar vòstra lista de seguiment",
        "newuserlogpage": "Istoric de las creacions de comptes",
        "newuserlogpagetext": "Jornal de las creacions de comptes d'utilizaires.",
        "rightslog": "Istoric de las modificacions d'estatut",
        "action-upload_by_url": "importar aqueste fichièr a partir d’una adreça internet",
        "action-writeapi": "utilizar l‘API d’escritura",
        "action-delete": "suprimir aquesta pagina",
-       "action-deleterevision": "suprimir aquesta version",
-       "action-deletedhistory": "veire l’istoric suprimit d'aquesta pagina",
+       "action-deleterevision": "suprimir las revisions",
+       "action-deletelogentry": "Escafar lo jornau deis intradas",
+       "action-deletedhistory": "veire l’istoric suprimit d'una pagina",
        "action-browsearchive": "recercar de paginas suprimidas",
-       "action-undelete": "restablir aquesta pagina",
-       "action-suppressrevision": "tornar veire e restablir aquesta version suprimida",
+       "action-undelete": "restablir de paginas",
+       "action-suppressrevision": "visionar e restablir de revisions suprimidas",
        "action-suppressionlog": "veire aqueste jornal privat",
        "action-block": "blocar aqueste utilizaire a l’edicion",
        "action-protect": "modificar los nivèls de proteccion per aquesta pagina",
        "action-userrights-interwiki": "modificar los dreits d’utilizaire e los sus d’autres wikis",
        "action-siteadmin": "verrolhar o desverrolhar la basa de donadas",
        "action-sendemail": "mandar corrièrs electronics",
+       "action-editmyoptions": "Editar vòstrei preferéncias",
        "action-editmywatchlist": "modificar vòstra lista de seguiment",
        "action-viewmywatchlist": "afichar vòstra pròpria lista de seguiment",
        "action-viewmyprivateinfo": "veire vòstras informacions personalas",
        "action-editmyprivateinfo": "modificar vòstras informacions personalas",
+       "action-purge": "Purgar la pagina",
        "nchanges": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dempuèi la darrièra visita}}",
        "enhancedrc-history": "istoric",
        "recentchanges-legend-heading": "<strong>Legenda :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
        "recentchanges-submit": "Afichar",
+       "rcfilters-activefilters": "Filtres actius",
+       "rcfilters-invalid-filter": "Filtre pas valid",
+       "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-noresults": "Cap de filtre pas trobat",
+       "rcfilters-filtergroup-registration": "Inscripcion de l'utilizaire",
+       "rcfilters-filter-registered-label": "Enregistrat",
+       "rcfilters-filter-registered-description": "Editors connectats.",
+       "rcfilters-filter-unregistered-label": "Desinscrit",
+       "rcfilters-filter-unregistered-description": "Editors que son pas connectats.",
+       "rcfilters-filtergroup-authorship": "Modificar la paternitat",
+       "rcfilters-filter-editsbyself-label": "Vòstras pròprias modificacions",
+       "rcfilters-filter-editsbyself-description": "Vòstras modificacions.",
+       "rcfilters-filter-editsbyother-label": "Modificacions per d’autres.",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novèls arribants",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprenents",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilizaires experimentats",
+       "rcfilters-filtergroup-automated": "Contribucions automatizadas",
+       "rcfilters-filter-bots-label": "Robòt",
+       "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
+       "rcfilters-filtergroup-significance": "Significacion",
+       "rcfilters-filter-minor-label": "Cambiaments menors",
+       "rcfilters-filter-major-label": "Modificacions pas menoras",
+       "rcfilters-filtergroup-changetype": "Tipe de cambiament",
+       "rcfilters-filter-pageedits-label": "Modificacions de pagina",
+       "rcfilters-filter-newpages-label": "Creacions de pagina",
+       "rcfilters-filter-categorization-label": "Cambiaments de categoria",
+       "rcfilters-filter-logactions-label": "Accions traçadas",
        "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "recentchangeslinked-page": "Nom de la pagina :",
        "recentchangeslinked-to": "Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada",
        "recentchanges-page-added-to-category": "[[:$1]] apondut a la categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] retirat de la categoria",
+       "autochange-username": "Cambiament automatic MediaWiki",
        "upload": "Importar un fichièr",
        "uploadbtn": "Importar un fichièr",
        "reuploaddesc": "Anullar lo cargament e tornar al formulari.",
        "file-thumbnail-no": "Lo nom del fichièr comença per <strong>$1</strong>.\nEs possible que s’agisca d’una version reducha ''(miniatura)''.\nSe dispausatz del fichièr en resolucion nauta, importatz-lo, si que non cambiatz lo nom del fichièr.",
        "fileexists-forbidden": "Un fichièr amb aqueste nom existís ja e pòt pas èsser espotit.\nSe volètz totjorn importar aquel fichièr, mercé de tornar en arrièr e d'utilizar un nom novèl. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un fichièr amb lo meteis nom existís ja dins la basa de donadas comuna.\nS'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Lo telecargament es un doblon de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Lo telecargament es un doblon de {{PLURAL:$2|an older version|older versions}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :",
        "file-deleted-duplicate": "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
        "file-deleted-duplicate-notitle": "Un fichièr identic a aqueste fichièr es ja estat suprimit amai lo títol. \nVos caldriá demandar a qualqu'un la possibilitat de verificar lo jornal d'aqueste fichièr suprimit per tal d'examinar la situacion  abans de l'importar tornarmai.",
        "upload-form-label-own-work": "Soi l'autor d'aquesta òbra",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
+       "upload-form-label-own-work-message-generic-foreign": "Compreni que siáu a telecargar aquest fichier vèrs un estocatge partejat. Confiermi que siáu a lo faire segon lei reglas d'utilizacion e de licéncia en vigor.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se siatz pas capable de telecargar aqust fichir segon lei reglas d'aquest estocatge partejat, mercé de sarrar aquest boita de dialògue a d'assaiar un autre metòde.",
        "backend-fail-stream": "Impossible de legir lo fichièr $1.",
        "backend-fail-backup": "Impossible de salvar lo fichièr $1.",
        "backend-fail-notexists": "Lo fichièr $1 existís pas.",
        "zip-bad": "Lo fichièr es un archiu ZIP corromput o illegible.\nPòt pas èsser verificat corrèctament per la seguretat.",
        "zip-unsupported": "Lo fichièr es un archiu ZIP qu'utiliza de caracteristicas pas suportadas per MediaWiki. \nSa seguretat pòt pas èsser verificada corrèctament.",
        "uploadstash": "Cache d'impòrt",
+       "uploadstash-summary": "La pagina dona accès ai fichiers que son telecargats o en cors de telecargament, mai pas encara publicats sus lo wiki. Aquelei fichiers son unicament visibles per l'utilizaire a l'origina dau telecargament.",
        "uploadstash-clear": "Escafar los fichièrs en cache",
        "uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
        "uploadstash-errclear": "La supression dels fichièrs a fracassat.",
        "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
+       "listfiles-userdoesnotexist": "L'utilizaire \"$1\" es pas enregistrat.",
        "imgfile": "fichièr",
        "listfiles": "Lista dels imatges",
        "listfiles_thumb": "Apercebut",
        "filerevert-submit": "Revocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' es estat revocat fins a [$4 la version del $2 a $3].",
        "filerevert-badversion": "I a pas de version mai anciana del fichièr amb lo Timestamp donat.",
+       "filerevert-identical": "La version actuala d'aqueu fichier es ja identica an aquela qu'es seleccionada.",
        "filedelete": "Suprimir $1",
        "filedelete-legend": "Suprimir lo fichièr",
        "filedelete-intro": "Sètz a suprimir '''[[Media:$1|$1]]''' amb tot son istoric.",
        "protectedpages-unknown-timestamp": "Desconegut",
        "protectedpages-unknown-performer": "Utilizaire desconegut",
        "protectedtitles": "Títols protegits",
+       "protectedtitles-summary": "Aquò es una lista dei títols de pagina que son a l'ora d'ara protegits còntra la creacion. Per una lista dei paginas existentas que son protegidas, veire [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Cap de títol es pas actualament protegit amb aquestes paramètres.",
        "protectedtitles-submit": "Afichar los títols",
        "listusers": "Lista dels participants",
        "apisandbox-dynamic-parameters-add-label": "Apondon del paramètre",
        "apisandbox-dynamic-parameters-add-placeholder": "Nom del paramètre",
        "apisandbox-deprecated-parameters": "Paramètres obsolèts",
+       "apisandbox-submit-invalid-fields-title": "De camps son invalides",
        "apisandbox-results": "Resultats",
+       "apisandbox-sending-request": "Mandadís de la requèsta a l'API...",
        "apisandbox-request-url-label": "Requèsta URL :",
        "apisandbox-request-time": "Durada de la demanda : {{PLURAL:$1|$1 ms}}",
        "apisandbox-continue": "Contunhar",
        "apisandbox-continue-clear": "Escafar",
+       "apisandbox-multivalue-all-namespaces": "$1 (totes los espacis de noms)",
+       "apisandbox-multivalue-all-values": "$1 (totas las valors)",
        "booksources": "Obratges de referéncia",
        "booksources-search-legend": "Recercar demest d'obratges de referéncia",
        "booksources-isbn": "ISBN :",
        "linksearch-error": "Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.",
        "listusersfrom": "Afichar los utilizaires a partir de :",
        "listusers-submit": "Mostrar",
-       "listusers-noresult": "S'es pas trobat de noms d'utilizaires correspondents. Cercatz tanben amb de majusculas e minusculas.",
+       "listusers-noresult": "Cap d’utilizaires pas trobat.",
        "listusers-blocked": "(blocat)",
        "activeusers": "Lista dels utilizaires actius",
        "activeusers-intro": "Aquò es una lista dels utilizaires qu'an exerçat una activitat quina que siá al cors {{PLURAL:$1|de la darrièra jornada|dels $1 darrièrs jorns}}.",
        "activeusers-count": "$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}",
        "activeusers-from": "Afichar los utilizaires dempuèi :",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
+       "activeusers-submit": "Mostrar leis utilizaires actius",
        "listgrouprights": "Dreits dels gropes d'utilizaires",
        "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreits d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreits.",
        "listgrouprights-key": "Legenda :\n*<span class=\"listgrouprights-granted\">Dreit autrejat</span>\n*<span class=\"listgrouprights-revoked\">Dreit revocat</span>",
        "watchlistanontext": "Connectatz-vos per visualizar o modificar los elements de vòstra lista de seguiment.",
        "watchnologin": "Vos sètz pas identificat(ada)",
        "addwatch": "Apondre a la lista de seguiment",
-       "addedwatchtext": "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
+       "addedwatchtext": "La pagina « [[:$1]] » e sa pagina de discussion son estadas apondudas a vòstra [[Special:Watchlist|lista de seguiment]].",
        "addedwatchtext-short": "La pagina « $1 » es estada aponduda a vòstra lista de seguiment.",
        "removewatch": "Suprimir de la lista de seguiment",
-       "removedwatchtext": "La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].",
+       "removedwatchtext": "La pagina « [[:$1]] » e sa pagina de discussion son estadas levadas de vòstra [[Special:Watchlist|lista de seguiment]].",
        "removedwatchtext-short": "La pagina « $1 » es estada suprimida de vòstra lista de seguiment.",
        "watch": "Seguir",
        "watchthispage": "Seguir aquesta pagina",
        "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
        "watchlist-hide": "Amagar",
        "watchlist-submit": "Afichar",
+       "wlshowtime": "Periòde afichat :",
        "wlshowhideminor": "cambiaments menors",
        "wlshowhidebots": "Robòts",
        "wlshowhideliu": "utilizaires enregistrats",
        "wlshowhideanons": "utilizaires anonims",
        "wlshowhidepatr": "modificacions repassadas",
        "wlshowhidemine": "mas modificacions",
+       "wlshowhidecategorization": "categorizacion de la pagina",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
        "sp-contributions-username": "Adreça IP o nom d’utilizaire :",
        "sp-contributions-toponly": "Mostrar sonque las contribucions que son las darrièras dels articles",
        "sp-contributions-newonly": "Afichar unicament las modificacions que son de creacions de pagina",
+       "sp-contributions-hideminor": "Amagar las modificacions menoras",
        "sp-contributions-submit": "Cercar",
        "whatlinkshere": "Paginas ligadas a aquesta",
        "whatlinkshere-title": "Paginas que puntan cap a « $1 »",
        "whatlinkshere-hidelinks": "$1 ligams",
        "whatlinkshere-hideimages": "$1 los ligams cap al fichièr",
        "whatlinkshere-filters": "Filtres",
+       "whatlinkshere-submit": "Validar",
        "autoblockid": "Blocatge automatic #$1",
        "block": "Blocar un utilizaire",
        "unblock": "Desblocar un utilizaire",
        "cant-move-user-page": "Avètz pas la permission de renomenar las paginas principalas d'utilizaires.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
        "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
+       "cant-move-to-category-page": "Avètz pas lei drechs necessaris per desplaçar una pagina vèrs una categoria",
+       "cant-move-subpages": "Avètz pas lei drechs necessaris per desplaçar de sota-paginas.",
+       "namespace-nosubpages": "Lo nom d'espaci $1 autoriza pas lei sota-paginas.",
        "newtitle": "Títol novèl :",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Renomenar l'article",
        "movenosubpage": "Aquesta pagina a pas cap de sospagina.",
        "movereason": "Motiu :",
        "revertmove": "anullar",
-       "delete_and_move_text": "==Supression requerida==\nL’article de destinacion « [[:$1]] » existís ja.\nLo volètz suprimir per permetre lo cambiament de nom ?",
+       "delete_and_move_text": "La pagina de destinacion « [[:$1]] » existís ja.\nSètz segur{{GENDER:||a|}} que la volètz suprimir pe permetre aqueste cambiament de nom ?",
        "delete_and_move_confirm": "Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.",
        "delete_and_move_reason": "Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »",
        "selfmove": "Los títols d’origina e de destinacion son los meteisses : impossible de tornar nomenar una pagina sus ela-meteissa.",
        "export-download": "Salvar en tant que fichièr",
        "export-templates": "Enclure los modèls",
        "export-pagelinks": "Enclure las paginas ligadas a una prigondor de :",
+       "export-manual": "Ajustar de paginas manualament :",
        "allmessages": "Lista dels messatges del sistèma",
        "allmessagesname": "Nom del camp",
        "allmessagesdefault": "Messatge per defaut",
        "tooltip-ca-unprotect": "Cambiar la proteccion d'aquesta pagina",
        "tooltip-ca-delete": "Suprimir aquesta pagina",
        "tooltip-ca-undelete": "Restablir aquesta pagina",
-       "tooltip-ca-move": "Tornar nomenar aquesta pagina",
+       "tooltip-ca-move": "Renomenar aquesta pagina",
        "tooltip-ca-watch": "Apondètz aquesta pagina a vòstra lista de seguiment",
        "tooltip-ca-unwatch": "Levatz aquesta pagina de vòstra lista de seguiment",
        "tooltip-search": "Cercar dins {{SITENAME}}",
        "pageinfo-length": "Talha de la pagina (en octets)",
        "pageinfo-article-id": "Numèro de la pagina",
        "pageinfo-language": "Lenga del contengut de la pagina",
+       "pageinfo-language-change": "modificar",
        "pageinfo-content-model": "Modèl de contengut de la pagina",
        "pageinfo-content-model-change": "modificar",
        "pageinfo-robot-policy": "Indexacion per robòts",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
        "newimages-showbots": "Afichar los impòrts per de robòts",
+       "newimages-hidepatrolled": "Amagar los telecargaments patrolhats",
        "noimages": "Cap d'imatge d'afichar pas.",
+       "gallery-slideshow-toggle": "Bascular las vinhetas",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "sp-newimages-showfrom": "Afichar los imatges novèls importats dempuèi lo $2, $1",
        "exif-compression-4": "CCITT Grop 4 encodatge del fax",
        "exif-copyrighted-true": "Somés al dreit d'autor",
        "exif-copyrighted-false": "Estat dels dreits d’autor pas definit",
+       "exif-photometricinterpretation-1": "Blanc e negre (0 pel negre)",
        "exif-unknowndate": "Data desconeguda",
        "exif-orientation-1": "Normala",
        "exif-orientation-2": "Inversada orizontalament",
        "confirmemail_body_set": "Qualqu’un, probablament vos, dempuèi l’adreça IP $1, a modificat l'adreça de corrièr electronic del compte « $2 » amb aquesta sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e reactivar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nAqueste còdi de confirmacion expirarà lo $4.\n\nSe s’agís *pas* de vòstre compte, seguissètz aqueste ligam per anullar la confirmacion de l'adreça de corrièr electronic :\n\n$5",
        "confirmemail_invalidated": "Confirmacion de l’adreça de corrièr electronic anullada",
        "invalidateemail": "Anullar la confirmacion del corrièr electronic",
+       "notificationemail_subject_changed": "L'adreça de corrièr electronic enregistrada de {{SITENAME}} es estada cambiada",
+       "notificationemail_subject_removed": "L'adreça de corrièr electronic enregistrada de {{SITENAME}} es estada suprimida",
        "scarytranscludedisabled": "[La transclusion interwiki es desactivada]",
        "scarytranscludefailed": "[La recuperacion de modèl a pas capitat per $1]",
        "scarytranscludefailed-httpstatus": "[Fracàs de la recuperacion del modèl per  $1 : HTTP  $2 ]",
        "htmlform-date-placeholder": "AAAA-MM-JJ",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "AAAA-MM-JJ HH:MM:SS",
+       "htmlform-title-not-exists": "$1 existís pas.",
+       "htmlform-user-not-exists": "<strong>$1</strong> existís pas.",
+       "htmlform-user-not-valid": "<strong>$1</strong> es pas un nom d'utilizaire valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restablit}} la pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'un eveniment del jornal|de $5 eveniments del jornal}} sus $3 : $4",
        "logentry-newusers-create2": "Lo compte d'utilizaire $3 {{GENDER:$2|es estat creat}} per $1",
        "logentry-newusers-byemail": "Lo compte d'utilizaire $3 {{GENDER:$2|es estat creat}} per $1 e lo senhal es estat mandat per corrièr electronic",
        "logentry-newusers-autocreate": "Lo compte $1 {{GENDER:$2|es estat creat}} automaticament",
-       "logentry-rights-rights": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3 de $4 a $5",
+       "logentry-rights-rights": "$1 a modificat l’apartenéncia al grop per {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modificat}} l'apartenéncia al grop per $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|es estat promolgut}} automaticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a mandat}} $3",
        "feedback-useragent": "Agent utilizaire :",
        "searchsuggest-search": "Recercar sus {{SITENAME}}",
        "searchsuggest-containing": "que conten...",
-       "api-error-badaccess-groups": "Sètz pas autorizat a cargar de fichièrs sus aqueste wiki.",
        "api-error-badtoken": "Error intèrna : marrit « geton ».",
-       "api-error-copyuploaddisabled": "Los cargaments via URL son desactivats sus aqueste servidor.",
-       "api-error-duplicate": "I a ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut.",
-       "api-error-duplicate-archive": "I aviá ja {{PLURAL:$1|un autre fichièr present|d'autres fichièrs presents}} sul site amb lo meteis contengut, mas {{PLURAL:$1|es estat suprimit|son estats suprimits}}.",
-       "api-error-empty-file": "Lo fichièr qu'avètz somés èra void.",
        "api-error-emptypage": "Creacion de paginas voidas pas autorizada.",
-       "api-error-fetchfileerror": "Error intèrna : Quicòm s'es mal passat al moment de la recuperacion del fichièr.",
-       "api-error-fileexists-forbidden": "Un fichièr nomenat \"$1\" existís ja, e pòt pas èsser espotir.",
-       "api-error-fileexists-shared-forbidden": "Un fichièr nomenat \"$1\" existís ja dins lo repertòri dels fichièrs partejats, e pòt pas èsser espotit.",
-       "api-error-file-too-large": "Lo fichièr qu'avètz somés èra tròp grand.",
-       "api-error-filename-tooshort": "Lo nom del fichièr es tròp cort.",
-       "api-error-filetype-banned": "Aqueste tipe de fichièr es interdich",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|es pas un tipe de fichièr autorizat|son pas de tipes de fichièrs autorizats}}. \n{{PLURAL:$3|Lo tipe de fichièr autorizat es|Los tipes de fichièrs autorizats son}} $2.",
-       "api-error-filetype-missing": "L'extension del fichièr es mancanta.",
-       "api-error-hookaborted": "La modificacion qu'avètz ensajat de realizar es estada anullada per una extension.",
-       "api-error-http": "Error intèrna : se pòt pas connectar al servidor.",
-       "api-error-illegal-filename": "Lo nom del fichièr es pas autorizat.",
-       "api-error-internal-error": "Error intèrna : Quicòm s'es mal passat al moment del tractament de vòstre impòrt sul wiki.",
-       "api-error-invalid-file-key": "Error intèrna : cap de fichièr pas trobat dins l'emmagazinatge temporari.",
-       "api-error-missingparam": "Error intèrna : Manca de paramètres dins la requèsta.",
-       "api-error-missingresult": "Error intèrna : Avèm pas pogut determinar se la còpia aviá capitat.",
-       "api-error-mustbeloggedin": "Vos cal èsser connectat per telecargar de fichièrs.",
-       "api-error-mustbeposted": "Error intèrna : aquesta requèsta necessita lo metòde HTTP POST.",
-       "api-error-noimageinfo": "Lo mandadís a capitat, mas lo servidor a pas donat cap d'informacions sul fichièr.",
-       "api-error-nomodule": "Error intèrna : cap de modul de versament pas definit.",
-       "api-error-ok-but-empty": "Error intèrna : Lo servidor a pas respondut.",
-       "api-error-overwrite": "Espotir un fichièr existent es pas autorizat.",
-       "api-error-stashfailed": "Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.",
        "api-error-publishfailed": "Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.",
-       "api-error-stasherror": "Una error s'es produsida al moment del telecargament del fichièr per lo dissimular.",
-       "api-error-timeout": "Lo servidor a pas respondut dins lo relambi pervist.",
-       "api-error-unclassified": "Una error desconeguda s'es produita.",
-       "api-error-unknown-code": "Error desconeguda : « $1 »",
-       "api-error-unknown-error": "Error intèrna : Quicòm a mal virat al moment del mandadís de vòstre fichièr.",
-       "api-error-unknown-warning": "Avertiment desconegut : $1",
+       "api-error-stashfailed": "Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.",
+       "api-error-unknown-warning": "Avertiment desconegut : « $1 ».",
        "api-error-unknownerror": "Error desconeguda : « $1 »",
-       "api-error-uploaddisabled": "Lo cargament es desactivat sus aqueste wiki.",
-       "api-error-verification-error": "Aqueste fichièr pòt èsser corromput, o son extension es incorrècta.",
        "duration-seconds": "$1 segonda{{PLURAL:$1||s}}",
        "duration-minutes": "$1 minuta{{PLURAL:$1||s}}",
        "duration-hours": "$1 ora{{PLURAL:$1||s}}",
        "pagelang-language": "Lenga",
        "pagelang-use-default": "Utilizar la lenga per defaut",
        "pagelang-select-lang": "Seleccionar la lenga",
+       "pagelang-reason": "Motiu",
+       "pagelang-submit": "Validar",
+       "pagelang-nonexistent-page": "La pagina $1 existís pas.",
        "right-pagelang": "Cambiar la lenga de la pagina",
        "action-pagelang": "cambiar la lenga de la pagina",
        "log-name-pagelang": "Traçar los cambiaments de lenga",
        "special-characters-group-ipa": "API",
        "special-characters-group-symbols": "Simbòls",
        "special-characters-group-greek": "Grèc",
+       "special-characters-group-greekextended": "Grèc espandit",
        "special-characters-group-cyrillic": "Cirillic",
        "special-characters-group-arabic": "Arabi",
        "special-characters-group-arabicextended": "Arabi espandit",
        "special-characters-title-endash": "jonhent anglés",
        "special-characters-title-emdash": "jonhent em",
        "special-characters-title-minus": "signe mens",
+       "mw-widgets-dateinput-no-date": "Cap de data pas seleccionada",
+       "mw-widgets-mediasearch-input-placeholder": "Recercar de mèdias",
+       "mw-widgets-mediasearch-noresults": "Ges de resultat trobat",
+       "mw-widgets-categoryselector-add-category-placeholder": "Ajustar una categoria...",
+       "sessionprovider-generic": "$1 sessions",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basadas sus de cookies",
+       "sessionprovider-nocookies": "Lei cookies son benlèu desactivats. Verificatz que lei cookies siegan ben activat e tornatz assaiar.",
        "randomrootpage": "Pagina raiç aleatòria",
+       "log-action-filter-block": "Tipe d'accion :",
+       "log-action-filter-delete": "Tipe d'accion :",
+       "log-action-filter-import": "Tipe d'importacion :",
+       "log-action-filter-managetags": "Tipe d'accion :",
+       "log-action-filter-move": "Tipe de desplaçament :",
+       "log-action-filter-newusers": "Tipe de creacion :",
+       "log-action-filter-patrol": "Tipe de patrolha :",
+       "log-action-filter-protect": "Tipe d'accion :",
        "log-action-filter-rights": "Tipe de cambiament de dreits :",
        "log-action-filter-suppress": "Tipe de supression :",
+       "log-action-filter-upload": "Tipe de telecargament :",
        "log-action-filter-all": "Tot",
        "log-action-filter-block-block": "Blocatge",
+       "log-action-filter-block-reblock": "Modificacion de blocatge",
        "log-action-filter-block-unblock": "Desblocar",
+       "log-action-filter-delete-delete": "Escafament de pagina",
+       "log-action-filter-delete-restore": "Restauracion de pagina",
+       "log-action-filter-import-interwiki": "Impòrt transwiki",
+       "log-action-filter-managetags-create": "Creacion d'etiqueta",
+       "log-action-filter-managetags-delete": "Supression d'etiqueta",
+       "log-action-filter-managetags-activate": "Activacion d'etiqueta",
+       "log-action-filter-managetags-deactivate": "Desactivacion d'etiqueta",
+       "log-action-filter-newusers-create": "Creacion per un utilizaire anonim",
+       "log-action-filter-newusers-create2": "Creacion per un utilizaire enregistrat",
+       "log-action-filter-newusers-autocreate": "Creacion automatica",
+       "log-action-filter-newusers-byemail": "Creacion amb un senhau mandat per corrier electronic",
+       "log-action-filter-patrol-patrol": "Patrolha manuala",
+       "log-action-filter-patrol-autopatrol": "Patrolha automatica",
+       "log-action-filter-protect-protect": "Proteccion",
+       "log-action-filter-protect-modify": "Modificacion de proteccion",
+       "log-action-filter-protect-unprotect": "Desproteccion",
+       "log-action-filter-protect-move_prot": "Proteccion de renomenatge",
+       "log-action-filter-rights-rights": "Cambiament manuau",
+       "log-action-filter-rights-autopromote": "Cambiament automatic",
+       "log-action-filter-suppress-event": "Supression de jornal",
+       "log-action-filter-suppress-revision": "Supression de revision",
+       "log-action-filter-suppress-delete": "Supression de pagina",
+       "log-action-filter-upload-upload": "Telecargament novèu",
+       "log-action-filter-upload-overwrite": "Retelecargament",
+       "authmanager-create-disabled": "La creacion de còmptes es blocada.",
+       "authmanager-authplugin-setpass-bad-domain": "Domeni invalide",
+       "authmanager-autocreate-noperm": "La creacion automatica de còmptes es blocada.",
+       "authmanager-password-help": "Senhau per autentificacion.",
+       "authmanager-domain-help": "Domeni per autentificacion extèrna.",
+       "authmanager-retype-help": "Mercé de confiermar vòstre senhau.",
        "authmanager-email-label": "Corrièr electronic",
        "authmanager-email-help": "Adreça de corrièr electronic",
        "authmanager-realname-label": "Nom vertadièr",
        "authmanager-realname-help": "Nom real de l'utilizaire",
+       "authmanager-provider-password": "Autentificacion ambé senhau",
+       "authmanager-provider-temporarypassword": "Senhau provisòri",
+       "authprovider-confirmlink-message": "Segon lei vòstreis assais recents de connexion, lei còmptes seguents pòdon èsser liats vèrs lo vòstre còmpte wiki. Lei liar permet de se connectar amb aqueleis còmptes. Mercé de seleccionar lei còmptes de liar.",
+       "authprovider-confirmlink-request-label": "Còmptes de liar",
+       "authprovider-confirmlink-success-line": "$1 : operacion capitada, lei còmptes son estats liats.",
+       "authprovider-confirmlink-failed": "La temptativa de liar lei còmptes a pas capitat : $1",
        "authprovider-resetpass-skip-label": "Sautar",
-       "changecredentials": "Modificar las informacions d’identificacion"
+       "authform-newtoken": "Geton mancant. $1",
+       "authform-notoken": "Geton mancant",
+       "authform-wrongtoken": "Marrit geton",
+       "specialpage-securitylevel-not-allowed-title": "Pas autorizat",
+       "changecredentials": "Modificar las informacions d’identificacion",
+       "credentialsform-account": "Nom de compte :",
+       "linkaccounts": "Liar lei còmptes",
+       "linkaccounts-success-text": "Lo còmpte èra estat liat.",
+       "linkaccounts-submit": "Liar lei còmptes",
+       "revid": "Revision $1",
+       "pageid": "Pagina ID $1"
 }
index 1f25b38..545ff62 100644 (file)
        "passwordreset-emaildisabled": "ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-username": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:",
        "passwordreset-domain": "ଡୋମେନ:",
-       "passwordreset-capture": "ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?",
-       "passwordreset-capture-help": "ଯଦି ଆପଣ ଘରଟିକୁ ଦେଖନ୍ତି ତେବେ (ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ସହିତ) ଇ-ମେଲଟି ଆପଣଙ୍କୁ ଦେଖାଯିବ ଓ ବାକି ସଭ୍ୟମାନଙ୍କୁ ଚାଲିଯିବ ।",
        "passwordreset-email": "ଇ-ମେଲ ଠିକଣା:",
        "passwordreset-emailtitle": "{{SITENAME}} ର ଖାତା ସବିଶେଷ",
        "passwordreset-emailtext-ip": "କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP addressରୁ) {{SITENAME}} ($4)ରେ ପାସୱାର୍ଡ଼ ରି-ସେଟ କରିବା ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି । ଉକ୍ତ ଇମେଲ ଠିକଣା ସହିତ ଏହି {{PLURAL:$3|ସଭ୍ୟ ଖାତାଟି|ସଭ୍ୟ ଖାତାମାନ}} ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି କିମ୍ବା ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଲା, ଏବଂ ଆଉ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇବାକୁ ଚାହୁଁନାହାଁନ୍ତି ତାହେଲେ ଏହି ମେଲଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ।",
        "saveprefs": "ସାଇତିବେ [Save]",
        "restoreprefs": "(ସମସ୍ତ ସ୍ଥାନରେ) ଆରମ୍ଭରୁ ଥିବା ମୂଳ ସଜାଣିକୁ ଫେରିଯିବେ",
        "prefs-editing": "ସମ୍ପାଦନା",
-       "rows": "ଧାଡ଼ି:",
-       "columns": "ସ୍ତମ୍ଭସବୁ:",
        "searchresultshead": "ଖୋଜନ୍ତୁ",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ଅସମ୍ପୂର୍ଣ ପୃଷ୍ଠା ଲିଙ୍କ</a> ସଜାଣି (ବାଇଟ) ପାଇଁ ସୀମା:",
        "stub-threshold-disabled": "ଅଚଳ କରିଦିଆଯାଇଛି",
        "userrights-reason": "କାରଣ:",
        "userrights-no-interwiki": "ଆପଣଙ୍କୁ ବାକି ଉଇକିରେ ସଭ୍ୟ ଅଧିକାର ବଦଳାଇବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
        "userrights-nodatabase": "$1 ଡାଟାବେସଟି ନାହିଁ ବା କେବଳ ସ୍ଥାନୀୟ ହୋଇ ରହିଛି ।",
-       "userrights-nologin": "ଆପଣ ପରିଚାଳକ ଖାତାରୁ [[Special:UserLogin|ଲଗ ଇନ]] କରି ସଭ୍ୟ ଅଧିକାରର ସୁବିଧା ଦେଇପାରିବେ ।",
-       "userrights-notallowed": "ଆପଣଙ୍କ ଖାତାରେ ସଭ୍ୟ ଅଧିକାର ଯୋଡ଼ିବା ବା କାଢ଼ିବାର ଅନୁମତି ନାହିଁ ।",
        "userrights-changeable-col": "ଆପଣ ବଦଳାଇପାରିବା ଗୋଠସମୂହ",
        "userrights-unchangeable-col": "ଯେଉଁ ଗୋଠସବୁ ଆପଣ ବଦଳାଇପାରିବେ ନାହିଁ",
        "userrights-conflict": "ସଭ୍ୟଙ୍କ ଅଧିକାର ବଦଳାଇବାରେ ମତଭେଦ! କରିଥିବା ବଦଳକୁ ପରଖି ନିଶ୍ଚିତ କରନ୍ତୁ ।",
-       "userrights-removed-self": "ଆପଣ ସଫଳ ଭାବେ ନିଜର ଅଧିକାର କାଢ଼ିଦେଲେ । ଆଗକୁ ଆପଣ ଆଉ ଏହା ଦେଖିପାରିବେ ନାହିଁ ।",
        "group": "ଗୋଠ:",
        "group-user": "ବ୍ୟବହାରକାରୀଗଣ",
        "group-autoconfirmed": "ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ",
        "right-siteadmin": "ଡାଟାବେସକୁ କିଳିବେ ଓ ଖୋଲିବେ",
        "right-override-export-depth": "୫ଟି ଯାଏଁ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠା ସହିତ ସବୁ ପୃଷ୍ଠାକୁ ରପ୍ତାନୀ କରିବେ",
        "right-sendemail": "ବାକି ସଭ୍ୟ ମାନଙ୍କୁ ଇ-ମେଲ ପଠାଇବେ",
-       "right-passwordreset": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ ଇମେଲ କରିବେ",
        "newuserlogpage": "ବ୍ୟବହାରକାରୀ ତିଆରି ଲଗ",
        "newuserlogpagetext": "ସଭ୍ୟଙ୍କର ଖାତା ଗଠନ ପାଇଁ ଏକ ଇତିହାସ ଅଛି ।",
        "rightslog": "ସଭ୍ୟଙ୍କ ଅଧିକାରର ଲଗ",
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "whatlinkshere-page": "ପୃଷ୍ଠା:",
-       "linkshere": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>[[:$1]]</strong> ସହ ଯୋଡା ଯାଇଅଛି:",
+       "linkshere": "à¬\8fହି à¬ªà­\83ଷà­\8dଠା à¬¸à¬¬à­\81  <strong>[[:$1]]</strong> à¬¸à¬¹ à¬¯à­\8bଡ଼ା à¬¯à¬¾à¬\87à¬\85à¬\9bି:",
        "nolinkshere": "'''[[:$1]]''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "nolinkshere-ns": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''[[:$1]]''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "isredirect": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
        "lag-warn-high": "ଅଧିକ ଡାଟାବେସ ସର୍ଭର ପଛୁଆ ଅବସ୍ଥା ହେତୁ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳସବୁ ଏହି ତାଲିକାରେ ଦେଖାଯିବ ନାହିଁ ।",
        "watchlistedit-normal-title": "ଦେଖଣାତାଲିକା ସମ୍ପାଦନା କରିବେ",
        "watchlistedit-normal-legend": "ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡିକରୁ ଶିରୋନାମା ହଟାଇବେ ।",
-       "watchlistedit-normal-explain": "à¬\86ପଣà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାର à¬¶à¬¿à¬°à­\8bନାମାà¬\97à­\81ଡିà¬\95 à¬¤à¬³à­\87 à¬¦à­\87à¬\96ା à¬¯à¬¾à¬\87à¬\9bି à¥¤\nଶିରà­\8bନାମା  ହଟାଇବାକୁ ଚାହୁଁଥିଲେ, ଏହାର ପାଖରେ ଥିବା ବାକ୍ସରେ ଟିକ ମାରନ୍ତୁ ଏବଂ \"{{int:Watchlistedit-normal-submit}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।\nଆପଣ [[Special:EditWatchlist/raw|edit the raw list]] ମଧ୍ୟ କରିପାରିବେ ।",
+       "watchlistedit-normal-explain": "à¬\86ପଣà¬\99à­\8dà¬\95ର à¬¦à­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାର à¬¶à¬¿à¬°à­\8bନାମà¬\97à­\81ଡ଼ିà¬\95 à¬¤à¬³à­\87 à¬¦à­\87à¬\96ା à¬¯à¬¾à¬\87à¬\9bି à¥¤\nଶିରà­\8bନାମ ହଟାଇବାକୁ ଚାହୁଁଥିଲେ, ଏହାର ପାଖରେ ଥିବା ବାକ୍ସରେ ଟିକ ମାରନ୍ତୁ ଏବଂ \"{{int:Watchlistedit-normal-submit}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।\nଆପଣ [[Special:EditWatchlist/raw|edit the raw list]] ମଧ୍ୟ କରିପାରିବେ ।",
        "watchlistedit-normal-submit": "ଶିରୋନାମାଗୁଡିକୁ ଲିଭାଇବେ",
        "watchlistedit-normal-done": "{{PLURAL:$1|ଗୋଟିଏ ନାମ|$1 ଗୋଟି ନାମ}} ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରୁ କାଢ଼ିଦିଆଗଲା:",
        "watchlistedit-raw-title": "ଫାଙ୍କା ଦେଖା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ",
index 0156bdb..9c135cb 100644 (file)
@@ -50,7 +50,7 @@
        "tog-enotifminoredits": "ਸਫ਼ਿਆਂ ਅਤੇ ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੀ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "tog-enotifrevealaddr": "ਇਤਲਾਹ ਦੇਣ ਵਾਲੀਆਂ ਈ-ਮੇਲਾਂ ਵਿੱਚ ਮੇਰਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਕਰੋ",
        "tog-shownumberswatching": "ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ",
-       "tog-oldsig": "ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:",
+       "tog-oldsig": "ਤà©\81ਹਾਡà©\87 à¨®à©\8cà¨\9cà©\82ਦਾ à¨¦à¨¸à¨¤à¨\96਼ਤ:",
        "tog-fancysig": "ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)",
        "tog-uselivepreview": "ਮੌਜੂਦਾ ਝਲਕ ਵਰਤੋ",
        "tog-forceeditsummary": "ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ",
        "talk": "ਚਰਚਾ",
        "views": "ਵਿਊ",
        "toolbox": "ਸੰਦ",
+       "tool-link-emailuser": "ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ",
        "userpage": "ਵਰਤੋਂਕਾਰ ਸਫ਼ਾ ਵੇਖੋ",
        "projectpage": "ਪ੍ਰੋਜੈਕਟ ਸਫ਼ਾ ਵੇਖੋ",
        "imagepage": "ਫਾਇਲ ਸਫ਼ਾ ਵੇਖੋ",
        "createacct-yourpasswordagain-ph": "ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ",
        "userlogin-remembermypassword": "ਮੈਨੂੰ ਲਾਗਇਨ ਰੱਖੋ",
        "userlogin-signwithsecure": "ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਰੱਖੋ",
+       "cannotcreateaccount-title": "ਖਾਤੇ ਨਹੀਂ ਬਣ ਸਕੇ",
        "yourdomainname": "ਤੁਹਾਡਾ ਡੋਮੇਨ:",
        "password-change-forbidden": "ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।",
        "externaldberror": "ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "passwordreset-emaildisabled": "ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
        "passwordreset-username": "ਵਰਤੋਂਕਾਰ ਨਾਂ:",
        "passwordreset-domain": "ਡੋਮੇਨ:",
-       "passwordreset-capture": "ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?",
-       "passwordreset-capture-help": "ਜੇਕਰ ਤੁਸੀਂ ਇਹ ਬਕਸਾ ਸਹੀ ਕਰਦੇ ਹੋ ਤਾਂ ਇਹ ਈਮੇਲ (ਅਸਥਾਈ ਪਾਸਵਰਡ ਸਮੇਤ) ਤੁਹਾਨੂੰ ਵਿਖਾਈ ਜਾਵੇਗੀ ਅਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਵੀ ਭੇਜੀ ਜਾਵੇਗੀ।",
        "passwordreset-email": "ਈਮੇਲ ਐਡਰੈੱਸ:",
        "passwordreset-emailtitle": "{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ",
        "passwordreset-emailtext-ip": "ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}\n($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:\n$3|ਖਾਤਾ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜਿਆ ਹੈ|ਖਾਤੇ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜੇ ਹਨ}}:\n$2\n\nਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ\n{{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।",
        "searchprofile-advanced-tooltip": "ਆਪਣੀਆਂ ਬਣਾਈਆਂ ਨਾਂ-ਥਾਂਵਾਂ ਵਿੱਚ ਖੋਜੋ",
        "search-result-size": "$1 ({{PLURAL:$2|1 ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})",
        "search-result-category-size": "{{PLURAL:$1|1 ਮੈਂਬਰ|$1 ਮੈਂਬਰ}} ({{PLURAL:$2|1 ਉਪਸ਼੍ਰੇਣੀ|$2 ਉਪਸ਼੍ਰੇਣੀਆਂ}}, {{PLURAL:$3|1 ਫ਼ਾਈਲ|$3 ਫ਼ਾਈਲਾਂ}})",
-       "search-redirect": "($1 à¨°à©\80ਡਿਰੈਕਟ)",
+       "search-redirect": "($1 à¨¤à©\8bà¨\82 à¨°à©\80ਡਾà¨\87ਰੈਕਟ)",
        "search-section": "(ਹਿੱਸਾ $1)",
        "search-category": "(ਸ਼੍ਰੇਣੀ $1)",
        "search-file-match": "(ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਰਲ਼ਦਾ-ਮਿਲ਼ਦਾ)",
        "userrights-reason": "ਕਾਰਨ:",
        "userrights-no-interwiki": "ਤੁਹਾਨੂੰ ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਹੱਕਾਂ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-nodatabase": "ਡੈਟਾਬੇਸ $1 ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਕਾਮੀ ਨਹੀਂ ਹੈ।",
-       "userrights-notallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਵਰਤੋਂਕਾਰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "userrights-changeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਸਕਦੇ ਹੋ",
        "userrights-unchangeable-col": "ਉਹ ਸਮੂਹ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਦਲ ਨਹੀਂ ਸਕਦੇ",
        "group": "ਟੋਲੀ:",
        "right-userrights-interwiki": "ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ",
        "right-siteadmin": "ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ",
        "right-sendemail": "ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ",
-       "right-passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ",
        "grant-group-email": "ਈ-ਮੇਲ ਭੇਜੋ",
        "grant-group-customization": "ਅਨੁਕੂਲਨ ਅਤੇ ਪਸੰਦਾੰ",
        "grant-createaccount": "ਖਾਤੇ ਬਣਾਓ",
        "feedback-submit": "ਹਵਾਲੇ ਕਰੋ",
        "feedback-thanks-title": "ਧੰਨਵਾਦ!",
        "feedback-useragent": "ਉਪਭੋਗੀ ਏਜੰਟ:",
-       "searchsuggest-search": "ਖੋਜ",
+       "searchsuggest-search": "ਖੋਜ {{SITENAME}}",
        "api-error-badaccess-groups": "ਤੁਹਾਨੂੰ ਇਸ ਵਿਕੀ ਉੱਤੇ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "api-error-badtoken": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਗ਼ਲਤ ਟੋਕਨ",
        "api-error-empty-file": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੀ ਫ਼ਾਈਲ ਖ਼ਾਲੀ ਸੀ।",
index 170ea04..8ad40e4 100644 (file)
        "searcharticle": "Przejdź",
        "history": "Historia strony",
        "history_short": "historia",
+       "history_small": "historia",
        "updatedmarker": "zmienione od ostatniej wizyty",
        "printableversion": "Wersja do druku",
        "permalink": "Link do tej wersji",
        "blockedtitle": "Użytkownik jest zablokowany",
        "blockedtext": "'''Twoje konto lub adres IP zostały zablokowane.'''\n\nBlokada została nałożona przez $1.\nPodany powód to: ''$2''.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nW celu wyjaśnienia przyczyny zablokowania możesz się skontaktować z $1 lub innym [[{{MediaWiki:Grouppage-sysop}}|administratorem]].\nNie możesz użyć funkcji „Wyślij e‐mail do tego użytkownika”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.\nProsimy o podanie obu tych informacji przy wyjaśnianiu blokady.",
        "autoblockedtext": "Ten adres IP został zablokowany automatycznie, gdyż korzysta z niego inny użytkownik, zablokowany przez administratora $1.\nPowód blokady:\n\n:''$2''\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nMożesz skontaktować się z $1 lub jednym z pozostałych [[{{MediaWiki:Grouppage-sysop}}|administratorów]] w celu uzyskania informacji o blokadzie.\n\nNie możesz użyć funkcji „Wyślij e‐mail do tego użytkownika”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\n\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.\nProsimy o podanie obu tych numerów przy wyjaśnianiu blokady.",
+       "systemblockedtext": "Twoja nazwa użytkownika lub adres IP zostały automatycznie zablokowane przez MediaWiki.\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zamierzano zablokować: $7\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
        "blockednoreason": "nie podano przyczyny",
        "whitelistedittext": "Musisz $1, by edytować strony.",
        "confirmedittext": "Edytowanie jest możliwe dopiero po zweryfikowaniu adresu e‐mail.\nPodaj adres e‐mail i potwierdź go w swoich [[Special:Preferences|ustawieniach użytkownika]].",
        "saveprefs": "Zapisz",
        "restoreprefs": "Przywróć wszystkie domyślne preferencje (we wszystkich zakładkach)",
        "prefs-editing": "Edycja",
-       "rows": "Wiersze:",
-       "columns": "Kolumny:",
        "searchresultshead": "Wyszukiwanie",
        "stub-threshold": "Maksymalny rozmiar strony oznaczanej jako zalążek ($1):",
        "stub-threshold-sample-link": "przykład",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
        "editusergroup": "Wczytaj grupy użytkownika",
        "editinguser": "Zmiana uprawnień {{GENDER:$1|użytkownika|użytkowniczki}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Przeglądanie grup do których należy {{GENDER:$1|użytkownik|użytkowniczka}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Edytuj grupy użytkownika",
+       "userrights-viewusergroup": "Przeglądanie grup {{GENDER:$1|użytkownika|użytkowniczki}}",
        "saveusergroups": "Zapisz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-groupsmember": "Należy do:",
        "userrights-groupsmember-auto": "Na stałe należy do:",
        "action-upload_by_url": "przesłania tego pliku z adresu URL",
        "action-writeapi": "zapisu poprzez interfejs API",
        "action-delete": "usunięcia tej strony",
-       "action-deleterevision": "usunięcia tej wersji",
-       "action-deletedhistory": "podglądu historii usunięć tej strony",
+       "action-deleterevision": "usuwania wersji",
+       "action-deletelogentry": "usuwania wpisów w rejestrze",
+       "action-deletedhistory": "podglądu historii usunięć strony",
+       "action-deletedtext": "wyświetlania tekstu usuniętej wersji",
        "action-browsearchive": "przeszukiwania usuniętych stron",
-       "action-undelete": "odtworzenia tej strony",
-       "action-suppressrevision": "podglądu i odtworzenia tej wersji ukrytej",
+       "action-undelete": "odtwarzania stron",
+       "action-suppressrevision": "podglądu i odtwarzania ukrytych wersji",
        "action-suppressionlog": "podglądu rejestru ukrywania",
        "action-block": "zablokowania temu użytkownikowi możliwości edycji",
        "action-protect": "zmiany poziomu zabezpieczenia tej strony",
        "action-userrights-interwiki": "edytowania uprawnień użytkowników na innych witrynach wiki",
        "action-siteadmin": "blokowania i odblokowywania bazy danych",
        "action-sendemail": "wysyłania e-maili",
+       "action-editmyoptions": "edycja swoich preferencji",
        "action-editmywatchlist": "edycji swojej listy obserwowanych stron",
        "action-viewmywatchlist": "zobaczenia swojej listy obserwowanych stron",
        "action-viewmyprivateinfo": "zobaczenia swoich prywatnych danych",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
+       "rcfilters-activefilters": "Aktywne filtry",
+       "rcfilters-search-placeholder": "Filtruj ostatnie zmiany (przeglądaj lub zacznij wpisywać)",
+       "rcfilters-invalid-filter": "Nieprawidłowy filtr",
+       "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
+       "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
+       "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
+       "rcfilters-filtergroup-authorship": "Autorstwo edycji",
+       "rcfilters-filter-editsbyself-label": "Moje edycje",
+       "rcfilters-filter-editsbyself-description": "Edycje dokonane przez Ciebie.",
+       "rcfilters-filter-editsbyother-label": "Edycje inne niż Twoje",
+       "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych niż Ty.",
+       "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko dla zarejestrowanych użytkowników)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Początkujący",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
+       "rcfilters-filter-userExpLevel-learner-label": "Uczący się",
+       "rcfilters-filter-userExpLevel-learner-description": "Więcej dni aktywności i edycji niż „Nowicjusze”, ale mniej niż „Doświadczeni użytkownicy”.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Doświadczeni użytkownicy",
+       "rcfilters-filter-userExpLevel-experienced-description": "Ponad 30 dni aktywności i 500 edycji.",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-humans-label": "Człowiek (nie bot)",
+       "rcfilters-filter-minor-label": "Drobne zmiany",
+       "rcfilters-filter-pageedits-label": "Edycje strony",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.",
        "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
        "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
+       "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń <code>$1=\"$2\"</code> jest niedozwolone w plikach SVG.",
+       "uploaded-href-attribute-svg": "atrybuty href w plikach SVG mogą linkować tylko do celów z http:// lub https://, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Znaleziono atrybut href kierujący do niebezpiecznych danych: cel URI <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
+       "uploaded-animate-svg": "Znaleziono znacznik \"animate\", który może zmieniać atrybut href, przy użyciu atrybutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> w przesłanym pliku SVG.",
+       "uploaded-setting-event-handler-svg": "Ustawianie atrybutów obsługi zdarzeń jest zablokowane, znaleziono <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
+       "uploaded-setting-href-svg": "Użycie znacznika \"set\" do dodania atrybutu \"href\" do elementu nadrzędnego jest zablokowane.",
+       "uploaded-wrong-setting-svg": "Użycie znacznika \"set\" do dodania do dowolnych atrybutów zdalnych elementów/danych/skryptów jest zablokowane. Znaleziono <code>&lt;set to=\"$1\"&gt;</code> w przesyłanym pliku SVG.",
+       "uploaded-setting-handler-svg": "SVG ustawiające atrybut \"handler\" z zdalnymi elementami/danymi/skryptami są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
+       "uploaded-remote-url-svg": "SVG, które ustawiają w dowolnym atrybucie stylu zdalne URL, są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
+       "uploaded-image-filter-svg": "Znaleziono filtr obrazu zawierający URL: <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
        "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw '$1'",
        "uploadinvalidxml": "Nie udało się przeanalizować XML w załadowanym pliku.",
        "uploadvirus": "W pliku jest wirus! Szczegóły: $1",
        "uncategorizedcategories": "Nieskategoryzowane kategorie",
        "uncategorizedimages": "Nieskategoryzowane pliki",
        "uncategorizedtemplates": "Nieskategoryzowane szablony",
+       "uncategorized-categories-exceptionlist": " # Zawiera listę kategorii, które nie powinny być wymieniane na stronie Specjalna:Nieskategoryzowane_kategorie. Każda w osobnej linii, zaczynającej się \"*\". Linie zaczynające się innym znakiem (włącznie ze spacjami) będą ignorowane. Użyj \"#\" dla komentarzy.",
        "unusedcategories": "Puste kategorie",
        "unusedimages": "Nieużywane pliki",
        "wantedcategories": "Brakujące kategorie",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "apisandbox-continue": "Kontynuuj",
        "apisandbox-continue-clear": "Wyczyść",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} spowoduje [https://www.mediawiki.org/wiki/API:Query#Continuing_queries pobranie kolejnej części wyników] ostatnio wykonanego żądania; {{int:apisandbox-continue-clear}} wyczyści parametry związane z kontynuowaniem wyników.",
        "apisandbox-param-limit": "Wpisz <kbd>max</kbd>, aby wykorzystać maksymalny limit.",
        "apisandbox-multivalue-all-namespaces": "$1 (wszystkie przestrzenie nazw)",
        "apisandbox-multivalue-all-values": "$1 (wszystkie wartości)",
        "emailccsubject": "Kopia Twojej wiadomości do $1: $2",
        "emailsent": "Wiadomość została wysłana",
        "emailsenttext": "Twoja wiadomość została wysłana.",
-       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”.",
+       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”. {{GENDER:$2|Twoja}} odpowiedź na ten e-mail zostanie wysłana do {{GENDER:$1|oryginalnego nadawcy}}, a {{GENDER:$2|Twój}} adres e-mail zostanie {{GENDER:$1|mu|jej}} ujawniony.",
        "usermessage-summary": "Pozostawianie komunikatu systemowego.",
        "usermessage-editor": "Nadawca komunikatów systemowych",
        "watchlist": "Obserwowane",
        "changecontentmodel-emptymodels-title": "Nie ma dostępnych modeli treści",
        "changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
-       "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
+       "log-description-contentmodel": "Ta strona wymienia zmiany w modelu zawartości stron oraz tworzenie nowych stron z modelem zawartości innym niż domyślnie.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|utworzył|utworzyła}} stronę $3 o niebędącym domyślnym modelu zawartości \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} model zawartości strony $3 z „$4” na „$5”",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "proxyblockreason": "Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.\nO tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.",
        "sorbsreason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.",
        "sorbs_create_account_reason": "Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.\nNie możesz utworzyć konta",
+       "softblockrangesreason": "Edycje niezalogowanych z Twojego adresu IP ($1) są niedozwolone. Proszę się zalogować.",
        "xffblockreason": "Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1",
        "cant-see-hidden-user": "Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.",
        "ipbblocked": "Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany",
        "cant-move-to-user-page": "Nie masz uprawnień do przenoszenia strony do strony użytkownika (za wyjątkiem podstron użytkownika).",
        "cant-move-category-page": "Nie masz uprawnień do przenoszenia stron kategorii.",
        "cant-move-to-category-page": "Nie masz uprawnień do przenoszenia strony do strony kategorii.",
+       "cant-move-subpages": "Nie masz uprawnień do przenoszenia podstron.",
+       "namespace-nosubpages": "Przestrzeń nazw „$1” nie pozwala na korzystanie z podstron.",
        "newtitle": "Nowy tytuł:",
        "move-watch": "Obserwuj",
        "movepagebtn": "Przenieś stronę",
        "pageinfo-length": "Długość strony (w bajtach)",
        "pageinfo-article-id": "Identyfikator strony",
        "pageinfo-language": "Język zawartości strony",
+       "pageinfo-language-change": "zmień",
        "pageinfo-content-model": "Model zawartości",
        "pageinfo-content-model-change": "zmień",
        "pageinfo-robot-policy": "Indeksowanie przez roboty",
        "feedback-useragent": "Aplikacja klienta:",
        "searchsuggest-search": "Przeszukaj {{GRAMMAR:B.lp|{{SITENAME}}}}",
        "searchsuggest-containing": "zawierające...",
-       "api-error-autoblocked": "Twój adres IP został automatycznie zablokowany, ponieważ był używany przez zablokowanego użytkownika.",
-       "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.",
        "api-error-badtoken": "Błąd wewnętrzny – nieprawidłowy kod weryfikacyjny (token).",
-       "api-error-blocked": "Została ci zablokowana możliwość edycji.",
-       "api-error-copyuploaddisabled": "Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jest już inny plik|Są już inne pliki}} o tej samej zawartości",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Był już inny plik|Były już inne pliki}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
-       "api-error-empty-file": "Przesłany przez Ciebie plik jest pusty.",
        "api-error-emptypage": "Tworzenie nowych, pustych stron jest niedozwolone.",
-       "api-error-fetchfileerror": "Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.",
-       "api-error-fileexists-forbidden": "Plik o nazwie \"$1\" już istnieje i nie może być nadpisany.",
-       "api-error-fileexists-shared-forbidden": "Plik o nazwie \"$1\" już istnieje we współdzielonym repozytorium i nie może być nadpisany.",
-       "api-error-file-too-large": "Przesłany przez Ciebie plik jest zbyt duży.",
-       "api-error-filename-tooshort": "Nazwa pliku jest zbyt krótka.",
-       "api-error-filetype-banned": "Zabroniony format pliku.",
-       "api-error-filetype-banned-type": "$1 nie {{PLURAL:$4|jest dozwolonym typem pliku|są dozwolonymi typami plików}}. Dopuszczalne są pliki w {{PLURAL:$3|formacie|formatach}} $2.",
-       "api-error-filetype-missing": "Brak rozszerzenia w nazwie pliku.",
-       "api-error-hookaborted": "Zmiana, którą próbowałeś wykonać została przerwana przez hak rozszerzenia.",
-       "api-error-http": "Błąd wewnętrzny – brak połączenia z serwerem.",
-       "api-error-illegal-filename": "Niedopuszczalna nazwa pliku.",
-       "api-error-internal-error": "Błąd wewnętrzny – wystąpił błąd w trakcie przetwarzania przesłanego pliku.",
-       "api-error-invalid-file-key": "Błąd wewnętrzny – nie można odnaleźć pliku w wśród plików tymczasowych.",
-       "api-error-missingparam": "Błąd wewnętrzny –  brak jest niektórych wymaganych informacji do realizacji przesłania.",
-       "api-error-missingresult": "Błąd wewnętrzny – nie można określić czy kopiowanie się udało.",
-       "api-error-mustbeloggedin": "Aby przesyłać pliki, musisz się zalogować.",
-       "api-error-mustbeposted": "Wystąpił błąd w oprogramowaniu. Nie użyto właściwej metody HTTP.",
-       "api-error-noimageinfo": "Plik przesłano, ale serwer nie zwrócił informacji na jego temat.",
-       "api-error-nomodule": "Błąd wewnętrzny – nie określono modułu przesyłania plików.",
-       "api-error-ok-but-empty": "Błąd wewnętrzny – brak odpowiedzi od serwera.",
-       "api-error-overwrite": "Nadpisanie istniejącego pliku nie jest dopuszczalne.",
-       "api-error-ratelimited": "Próbujesz przesłać więcej plików w krótszym odstępie czasowym, niż ta wiki na to pozwala.\nSpróbuj jeszcze raz za kilka minut.",
-       "api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
        "api-error-publishfailed": "Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.",
-       "api-error-stasherror": "Wystąpił błąd podczas przesyłania pliku.",
-       "api-error-stashedfilenotfound": "Nie odnaleziono pliku podczas próby pobrania go ze schowka.",
-       "api-error-stashpathinvalid": "Ścieżka do pliku zapasowego jest błędna.",
-       "api-error-stashfilestorage": "Wystąpił błąd podczas przesyłania pliku do archiwum.",
-       "api-error-stashzerolength": "Serwer nie może zapisać pliku zapasowego do archiwum, gdyż ma on zerową długość.",
-       "api-error-stashnotloggedin": "Musisz się zalogować, aby móc zapisać plik zapasowy do archiwum.",
-       "api-error-stashwrongowner": "Plik w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
-       "api-error-stashnosuchfilekey": "Klucz zbioru w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
-       "api-error-timeout": "Serwer nie odpowiedział w oczekiwanym czasie.",
-       "api-error-unclassified": "Wystąpił nieznany błąd",
-       "api-error-unknown-code": "Błąd nieznany – „$1”",
-       "api-error-unknown-error": "Błąd wewnętrzny – wysŧapił nierozpoznany błąd w trakcie próby przesłania pliku.",
-       "api-error-unknown-warning": "Nieznane ostrzeżenie – $1",
+       "api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
+       "api-error-unknown-warning": "Nieznane ostrzeżenie: „$1”.",
        "api-error-unknownerror": "Nieznany błąd: „$1”",
-       "api-error-uploaddisabled": "Na tej wiki przesyłanie zostało wyłączone.",
-       "api-error-verification-error": "Plik może być uszkodzony lub nazwa pliku ma nieprawidłowe rozszerzenie.",
-       "api-error-was-deleted": "Plik o tej nazwie już istniał, ale został usunięty.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuty|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|godzina|godziny|godzin}}",
        "expand_templates_generate_rawhtml": "Pokaż surowy HTML",
        "expand_templates_preview": "Podgląd",
        "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
+       "expand_templates_preview_fail_html_anon": "<em>Ponieważ {{SITENAME}} ma włączoną możliwość korzystania z surowego HTML a jesteś niezalogowany, podgląd został ukryty - jest to środek zapobiegawczy przeciwko atakom JavaScript.</em>\n\n<strong>Jeżeli jest to spodziewana próba podglądu, [[Special:UserLogin|zaloguj się]] i spróbuj ponownie.</strong>",
        "expand_templates_input_missing": "Trzeba wpisać jakiś tekst.",
        "pagelanguage": "Zmiana języka strony",
        "pagelang-name": "Strona",
        "pagelang-language": "Język",
        "pagelang-use-default": "Użyj domyślnego języka",
        "pagelang-select-lang": "Wybierz język",
+       "pagelang-reason": "Powód",
        "pagelang-submit": "Wyślij",
+       "pagelang-nonexistent-page": "Strona $1 nie istnieje.",
+       "pagelang-unchanged-language": "Strona $1 ma już ustawiony język $2.",
+       "pagelang-unchanged-language-default": "Strona $1 ma już ustawiony język taki, jak domyślny język zawartości wiki.",
+       "pagelang-db-failed": "Nie udało się zmienić języka strony w bazie danych.",
        "right-pagelang": "Zmiana języka strony",
        "action-pagelang": "zmiany języka strony",
        "log-name-pagelang": "Rejestr zmian języka",
        "log-description-pagelang": "Rejestr zmian języków przypisanych do poszczególnych stron",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|zmienił|zmieniła}} język strony $3 z „$4” na „$5”.",
        "default-skin-not-found": "Ups! Domyślna skórka dla Twojej wiki, zdefiniowana jako <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, nie jest dostępna.\n\nTwoja instalacja, jak się wydaje, zawiera {{PLURAL:$4|następującą skórkę|następujące skórki}}. Zobacz [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pl Podręcznik:Konfiguracja skórki] z informacjami o tym, jak {{PLURAL:$4|ją włączyć|je włączyć i wybrać domyślną}}.\n\n$2\n\n; Jeśli zainstalowałeś właśnie MediaWiki:\n: Prawdopodobnie zrobiłeś to z Git lub bezpośrednio z kodu źródłowego z wykorzystaniem innej metody. Wtedy jest to możliwe. Spróbuj zainstalować niektóre skórki z [https://www.mediawiki.org/wiki/Category:All_skins/pl folderu skórek serwisu mediawiki.org]:\n:* pobierając [https://www.mediawiki.org/wiki/Download/pl archiwum plików instalacyjnych], zawierające kilka skórek i rozszerzeń. Możesz skopiować i wkleić z niego folder <code>skins/</code>;\n:* pobierając archiwa poszczególnych skórek z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pl#Korzystanie_z_Git_do_pobrania_rozszerzeń_MediaWiki Używając Git do pobrania skórek].\n: Jeśli jesteś programistą MediaWiki, nie powinno to zaszkodzić twojemu repozytorium Git.\n\n\n; Jeśli tylko aktualizowałeś MediaWiki:\n: MediaWiki w wersji 1.24 i nowszej nie zawiera automatycznie zainstalowanych skórek (zobacz [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual:Skin autodiscovery]).\nMożna wstawić {{PLURAL:$5|następujący linię|następujące linie}} do <code>LocalSettings.php</code>, aby włączyć {{PLURAL:$5|zainstalowaną skórkę|wszystkie zainstalowane skórki}}: \n\n<pre dir=\"ltr\">$3</pre>\n\n; Jeśli właśnie zmodyfikowałeś <code>LocalSettings.php</code>:\n: Dokładnie sprawdź nazwy skórek pod kątem literówek.",
+       "default-skin-not-found-no-skins": "Ups! Domyślna skórka dla Twojej wiki, zdefiniowana w <code>$wgDefaultSkin</code> jako <code>$1</code> nie jest dostępna.\n\nNie masz zainstalowanych żadnych skórek.\n\n; Jeżeli właśnie zainstalowałeś lub zaktualizowałeś MediaWiki:\n: Prawdopodobnie zainstalowałeś z gita lub bezpośrednio z kodu źródłowego z użyciem innej metody. Jest to możliwe. MediaWiki 1.24 i nowsze nie mają dołączonych żadnych skórek w głównym repozytorium. Spróbuj zainstalować jakieś skórki z [https://www.mediawiki.org/wiki/Category:All_skins katalogu skórek na mediawiki.org], poprzez:\n:* Pobranie [https://www.mediawiki.org/wiki/Download spakowanej wersji instalacyjnej], która zawiera kilka skórek i rozszerzeń. Możesz skopiować i wkleić z niej katalog <code>skins/</code>.\n:* Pobranie pojedynczych archiwów tar z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Wykorzystanie Gita do pobierania skórek].\n: Zrobienie tego nie powinno kolidować z Twoim repozytorium git, jeżeli jesteś twórcą MediaWiki. Zobacz [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pl Podręcznik: Konfiguracja skórek] po informacje jak włączać skórki i wybrać domyślną.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (włączone)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>wyłączone</strong>)",
        "mediastatistics": "Statystyki mediów",
        "sessionprovider-nocookies": "Być może cookies są wyłączone. Upewnij się, że masz włączone cookies i zacznij od nowa.",
        "randomrootpage": "Losowa strona (bez podstron)",
        "log-action-filter-block": "Rodzaj blokady:",
-       "log-action-filter-contentmodel": "Typ modyfikacji modelu zawartości:",
+       "log-action-filter-contentmodel": "Typ zmiany modelu zawartości:",
        "log-action-filter-delete": "Rodzaj usunięcia:",
        "log-action-filter-import": "Typ importu:",
        "log-action-filter-managetags": "Typ działania zarządzania znacznikami:",
        "log-action-filter-block-reblock": "Zmiana blokady",
        "log-action-filter-block-unblock": "Odblokowanie",
        "log-action-filter-contentmodel-change": "Zmiana modelu zawartości",
-       "log-action-filter-contentmodel-new": "Utworzenie strony z niestandardowym modelem zawartości",
+       "log-action-filter-contentmodel-new": "Utworzenie strony z niedomyślnym modelem zawartości",
        "log-action-filter-delete-delete": "Usunięcie strony",
+       "log-action-filter-delete-delete_redir": "Nadpisanie przekierowania",
        "log-action-filter-delete-restore": "Odtworzenie strony",
        "log-action-filter-delete-event": "Usunięcie wpisu rejestru",
        "log-action-filter-delete-revision": "Usunięcie wersji",
        "authmanager-provider-password": "Uwierzytelnianie oparte na haśle",
        "authmanager-provider-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
        "authmanager-provider-temporarypassword": "Hasło tymczasowe",
+       "authprovider-confirmlink-request-label": "Konta, które powinny być powiązane",
        "authprovider-confirmlink-success-line": "$1: Połączono.",
+       "authprovider-confirmlink-failed": "Powiązanie konta nie udało się w pełni: $1",
        "authprovider-confirmlink-ok-help": "Kontynuuj po wyświetleniu komunikatów o błędach linkowania.",
        "authprovider-resetpass-skip-label": "Pomiń",
        "authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
        "usercssispublic": "Uwaga: Podstrony z kodem CSS są widoczne publicznie i nie powinny zawierać poufnych danych.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "wersja $1",
+       "pageid": "ID strony: $1"
 }
index c23e1c5..ab2c9ff 100644 (file)
        "passwordreset-emaildisabled": "په دې ويکي باندې د برېښليک ځانتياوې ناچارنې شوي دي.",
        "passwordreset-username": "کارن-نوم:",
        "passwordreset-domain": "شپول:",
-       "passwordreset-capture": "د پايلې برېښليک کتل غواړې؟",
        "passwordreset-email": "برېښليک پته:",
        "passwordreset-emailtitle": "د {{SITENAME}} د گڼون څرگندنې",
        "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
        "saveprefs": "خوندي کول",
        "restoreprefs": "ټولې تلواليزې امستنې پرځای کول (په ټولو برخو کې)",
        "prefs-editing": "سمېدنې کې دی",
-       "rows": "ليکې:",
-       "columns": "ستنې:",
        "searchresultshead": "پلټل",
        "stub-threshold-sample-link": "مخبېلگه",
        "stub-threshold-disabled": "ناچارن",
        "right-userrights-interwiki": "په نورو ويکي گانو د نورو کارنانو  کارن-رښتې سمول",
        "right-siteadmin": "توکبنسټ کولپول او پرانيستل",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
-       "right-passwordreset": "د پټنوم بياپرځايولو برېښليکونه کتل",
        "grant-group-email": "برېښليک لېږل",
        "grant-group-other": "بېلابېل فعاليتونه",
        "grant-blockusers": "په کارنانو بنديز لگول او بنديز ليرې کول",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ښکاره کول",
+       "rcfilters-filterlist-title": "چاڼگران",
+       "rcfilters-filter-userExpLevel-newcomer-label": "نوي راغلي",
+       "rcfilters-filter-userExpLevel-learner-label": "زده کوونکي",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "نوي بدلونونه چې له $3، $2 څخه پيلېږي ښکاره کول",
        "rcshowhideminor": "وړې سمونې $1",
index 368907c..73eb495 100644 (file)
                        "Tark",
                        "O Andarilho",
                        "Bruno.S.Alves 270",
-                       "!Silent"
+                       "!Silent",
+                       "Joao Xavier",
+                       "Nahime2015"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "tog-enotifminoredits": "Notificar-me por email também sobre edições menores de páginas ou arquivos",
        "tog-enotifrevealaddr": "Revelar meu endereço de email nas mensagens de notificação",
        "tog-shownumberswatching": "Mostrar o número de usuários que estão vigiando",
-       "tog-oldsig": "Sua Assinatura Existente:",
+       "tog-oldsig": "Assinatura atual:",
        "tog-fancysig": "Tratar assinatura como wikitexto (sem link automático)",
        "tog-uselivepreview": "Utilizar pré-visualização em tempo real",
        "tog-forceeditsummary": "Avisar-me ao introduzir um sumário de edição vazio",
        "searcharticle": "Ir",
        "history": "Histórico da página",
        "history_short": "Histórico",
+       "history_small": "Histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
        "permalink": "Ligação permanente",
        "unprotectthispage": "Alterar a proteção desta página",
        "newpage": "Página nova",
        "talkpage": "Discutir sobre esta página",
-       "talkpagelinktext": "Discussão",
+       "talkpagelinktext": "discussão",
        "specialpage": "Página especial",
        "personaltools": "Ferramentas pessoais",
        "articlepage": "Ver página de conteúdo",
        "talk": "Discussão",
        "views": "Visualizações",
        "toolbox": "Ferramentas",
-       "tool-link-userrights": "Editar grupos {{GENDER:$1|usuário}}",
+       "tool-link-userrights": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
+       "tool-link-userrights-readonly": "Ver grupos {{GENDER:$1|do usuário|da usuária}}",
+       "tool-link-emailuser": "Enviar e-mail a {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}}",
        "userpage": "Ver página de usuário",
        "projectpage": "Ver página de projeto",
        "imagepage": "Ver página do arquivo",
        "viewsourcetext": "Você pode ver e copiar o código desta página.",
        "viewyourtext": "Você pode ver e copiar o código fonte '''das suas edições''' a esta página.",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [https://translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
-       "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
+       "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários desta wiki.",
        "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [https://translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída {{PLURAL:$1| na seguinte página que está protegida|nas seguintes páginas que estão protegidas}} com a opção \"em cascata\" ativada: $2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].",
        "yourname": "Nome de usuário:",
        "userlogin-yourname": "Nome de usuário(a)",
-       "userlogin-yourname-ph": "Escreva seu nome de usuário",
+       "userlogin-yourname-ph": "Escreva seu nome de usuário(a)",
        "createacct-another-username-ph": "Forneça o nome de usuário",
        "yourpassword": "Senha:",
        "userlogin-yourpassword": "Senha",
        "yourpasswordagain": "Redigite sua senha",
        "createacct-yourpasswordagain": "Confirmar senha",
        "createacct-yourpasswordagain-ph": "Digite a senha novamente",
-       "userlogin-remembermypassword": "Mantenha-me conectado",
+       "userlogin-remembermypassword": "Mantenha-me conectado(a)",
        "userlogin-signwithsecure": "Use a conexão segura",
        "cannotlogin-title": "Não é possível entrar com sua conta",
        "cannotlogin-text": "Não é possível conectar-se.",
        "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
-       "notloggedin": "Não autenticado",
+       "notloggedin": "Não autenticado(a)",
        "userlogin-noaccount": "Não possui uma conta?",
        "userlogin-joinproject": "Junte-se ao projeto {{SITENAME}}",
        "nologin": "Não possui uma conta? $1.",
        "eauthentsent": "Uma mensagem de confirmação foi enviada para o endereço de e-mail fornecido.\nAntes de qualquer outro e-mail ser enviado para a sua conta, você precisará seguir as instruções da mensagem, de modo a confirmar que a conta é mesmo sua.",
        "throttled-mailpassword": "Um lembrete de senha já foi enviado {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, apenas um lembrete poderá ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
        "mailerror": "Erro a enviar o email: $1",
-       "acct_creation_throttle_hit": "Visitantes deste wiki utilizando o seu endereço IP criaram {{PLURAL:$1|1 conta|$1 contas}} no último dia, o que é o máximo permitido neste período de tempo.\nComo resultado, visitantes que usam este endereço IP não podem criar mais nenhuma conta no momento.",
+       "acct_creation_throttle_hit": "Visitantes desta wiki com endereço IP igual ao seu criaram {{PLURAL:$1|uma conta|$1 contas}} nos últimos (ou últimas) $2, o que é o máximo permitido neste período de tempo.\nComo resultado, visitantes com este endereço IP não podem criar mais nenhuma conta no momento.",
        "emailauthenticated": "O seu endereço de e-mail foi autenticado às $3 de $2.",
        "emailnotauthenticated": "O seu endereço de e-mail ainda não foi autenticado.\nNão lhe será enviado nenhum e-mail sobre nenhuma das seguintes funcionalidades.",
        "noemailprefs": "Especifique um endereço de e-mail para que os seguintes recursos funcionem.",
        "botpasswords-label-delete": "Apagar",
        "botpasswords-label-resetpassword": "Redefinir a sua senha",
        "botpasswords-label-grants": "Permissões aplicáveis",
-       "botpasswords-help-grants": "Cada permissão da acesso à lista permissões de usuários que um usuário já tenha. Veja o [[Special:ListGrants|Lista de Permissões]] para mais informações.",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de usuário. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de usuário não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome de robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falha ao adicionar o nome de robô \"$1\". Ele já foi adicionado?",
        "blockedtitle": "O usuário está bloqueado",
        "blockedtext": "'''O seu nome de usuário ou endereço de IP foi bloqueado.'''\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi ''$2''.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nVocê só poderá utilizar a funcionalidade \"Contatar usuário\" se um endereço de ''e-mail'' válido estiver especificado em suas [[Special:Preferences|preferências de usuário]] e você não tiver sido bloqueado de utilizar tal recurso.\nO seu endereço de IP atual é $3 e a ID de bloqueio é #$5.\nPor favor, inclua todos os detalhes acima em quaisquer tentativas de esclarecimento.",
        "autoblockedtext": "O seu endereço de IP foi bloqueado de forma automática, uma vez que foi utilizado recentemente por outro usuário, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:''$2''\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nNote que não poderá utilizar a funcionalidade \"Contatar usuário\" se não possuir uma conta nesta wiki ({{SITENAME}}) com um endereço de ''e-mail'' válido indicado nas suas [[Special:Preferences|preferências de usuário]] ou se tiver sido bloqueado de utilizar tal recurso.\n\nSeu endereço de IP no momento é $3 e sua ID de bloqueio é #$5.\nPor favor, inclua tais dados em qualquer tentativa de esclarecimentos que for realizar.",
+       "systemblockedtext": "O seu nome de usuário ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
        "whitelistedittext": "Você precisa $1 para poder editar páginas.",
        "confirmedittext": "Você precisa confirmar o seu endereço de e-mail antes de começar a editar páginas.\nPor favor, introduza um e valide-o através das suas [[Special:Preferences|preferências de usuário]].",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de usuário(a) removido)",
        "rev-deleted-event": "(registros de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de usuário(a) ou endereço de IP eliminado – edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de usuário(a) ou endereço de IP ocultado no histórico – edição invisível nas contribuições públicas]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
        "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "rev-deleted-text-unhide": "Esta revisão desta página foi '''removida'''.\nPoderá haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].\nVocê ainda pode [$1 ver esta revisão] se deseja prosseguir.",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
-       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}",
        "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada com sua pesquisa.|Veja também os resultados da pesquisa encontrados.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "search-external": "Pesquisa externa",
        "searchdisabled": "A busca em {{SITENAME}} se encontra desativada.\nVocê poderá pesquisar através do Google enquanto isso.\nNote que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.",
        "search-error": "Ocorreu um erro ao buscar por: $1",
+       "search-warning": "Ocorreu um aviso ao pesquisar: $1",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-edits": "Número de edições:",
        "saveprefs": "Salvar",
        "restoreprefs": "Restaurar todas as configurações padrão (em todas as seções)",
        "prefs-editing": "Opções de edição",
-       "rows": "Linhas:",
-       "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
        "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
        "stub-threshold-sample-link": "amostra",
        "prefs-help-recentchangescount": "Isto inclui mudanças recentes, histórico de páginas e registros.",
        "prefs-help-watchlist-token2": "Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.\nQualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram salvas.",
-       "savedrights": "Os direitos de usuário de {{GENDER:$1|$1}} foram salvos.",
+       "savedrights": "Os grupos {{GENDER:$1|do usuário|da usuária}} $1 foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Horário local:",
        "timezoneuseserverdefault": "Utilizar padrão do wiki ($1)",
        "yourlanguage": "Língua:",
        "yourvariant": "Variante da língua de conteúdo:",
        "prefs-help-variant": "A sua variante preferida ou ortografia para mostrar no conteúdo das páginas deste wiki.",
-       "yournick": "Assinatura:",
+       "yournick": "Nova assinatura:",
        "prefs-help-signature": "Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.",
        "badsig": "Assinatura inválida; verifique o código HTML utilizado.",
        "badsiglength": "A sua assinatura é muito longa.\nEla deve ter menos de $1 {{PLURAL:$1|caractere|caracteres}}.",
        "prefswarning-warning": "Você fez alterações em suas preferências, que não foram salvas ainda. \nSe você sair desta página sem clicar em \"$1\" suas preferências não serão atualizado.",
        "prefs-tabs-navigation-hint": "Dica: Você pode usar as teclas de seta esquerda e direita para navegar entre as abas da lista de abas.",
        "userrights": "Gestão de privilégios {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária|de usuário(a)}}",
-       "userrights-lookup-user": "Administrar grupos de usuários",
+       "userrights-lookup-user": "Selecionar um usuário",
        "userrights-user-editname": "Forneça um nome de usuário(a):",
-       "editusergroup": "Editar grupos {{GENDER:$1|do(a) usuário(a)}}",
+       "editusergroup": "Carregar grupos de usuários",
        "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
+       "viewinguserrights": "Visualizar os privilégios {{GENDER:$1|do usuário|da usuária}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
+       "userrights-viewusergroup": "Ver grupos de usuários",
        "saveusergroups": "Salvar grupos de{{GENDER:$1|usuário}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "grant-basic": "Direitos básicos",
        "grant-viewdeleted": "Ver páginas e arquivos excluídos",
        "grant-viewmywatchlist": "Veja sua lista de páginas vigiadas",
+       "grant-viewrestrictedlogs": "Ver entradas de registro restritas",
        "newuserlogpage": "Registro de criação de usuários",
        "newuserlogpagetext": "Este é um registro de novas contas de usuário",
        "rightslog": "Registro de privilégios de usuários",
        "action-upload_by_url": "enviar este arquivo a partir de um URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-delete": "excluir esta página",
-       "action-deleterevision": "eliminar esta revisão",
-       "action-deletedhistory": "ver o histórico de edições eliminadas desta página",
+       "action-deleterevision": "eliminar revisões",
+       "action-deletelogentry": "eliminar entradas de registro",
+       "action-deletedhistory": "ver o histórico de edições eliminadas de uma página",
+       "action-deletedtext": "ver o texto de uma revisão eliminada",
        "action-browsearchive": "pesquisar páginas eliminadas",
-       "action-undelete": "restaurar esta página",
-       "action-suppressrevision": "rever e restaurar esta edição oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "rever e restaurar edições ocultas",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "impedir que este usuário edite",
        "action-protect": "alterar os níveis de proteção desta página",
        "action-userrights-interwiki": "editar privilégios de usuários de outros wikis",
        "action-siteadmin": "bloquear ou desbloquear o banco de dados",
        "action-sendemail": "enviar e-mails",
+       "action-editmyoptions": "editar as suas preferências",
        "action-editmywatchlist": "modifique sua lista de páginas vigiadas",
        "action-viewmywatchlist": "veja sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Exibir",
+       "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-search-placeholder": "Filtrar alterações recentes (procurar ou começar a digitar)",
+       "rcfilters-invalid-filter": "Filtro inválido",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
+       "rcfilters-filtergroup-registration": "Registro de usuário",
+       "rcfilters-filter-registered-label": "Registrado",
+       "rcfilters-filter-registered-description": "Editores conectados.",
+       "rcfilters-filter-unregistered-label": "Não registrado",
+       "rcfilters-filter-unregistered-description": "Editores que não estão conectados.",
+       "rcfilters-filtergroup-authorship": "Editar autoria",
+       "rcfilters-filter-editsbyself-label": "Suas próprias edições",
+       "rcfilters-filter-editsbyself-description": "Edições por você.",
+       "rcfilters-filter-editsbyother-label": "Edições de outros",
+       "rcfilters-filter-editsbyother-description": "Edições criadas por outros usuários (não você.)",
+       "rcfilters-filtergroup-userExpLevel": "Nível de experiência (apenas para usuário registados)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Recém-chegados",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendizes",
+       "rcfilters-filter-userExpLevel-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Usuários experientes\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Usuários experientes",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
+       "rcfilters-filtergroup-automated": "Contribuições automatizadas",
+       "rcfilters-filter-bots-label": "Robô",
+       "rcfilters-filter-bots-description": "Edições feitas por ferramentas automatizadas.",
+       "rcfilters-filter-humans-label": "Humano (não bot)",
+       "rcfilters-filter-humans-description": "Edições feitas por editores humanos.",
+       "rcfilters-filtergroup-significance": "Significado",
+       "rcfilters-filter-minor-label": "Edições menores",
+       "rcfilters-filter-minor-description": "Edita o autor rotulado como menor.",
+       "rcfilters-filter-major-label": "Edições não menores",
+       "rcfilters-filter-major-description": "Edições não rotuladas como menores.",
+       "rcfilters-filtergroup-changetype": "Tipo de mudança",
+       "rcfilters-filter-pageedits-label": "Edições da página",
+       "rcfilters-filter-pageedits-description": "Edições para conteúdo wiki, discussões, descrições de categorias ....",
+       "rcfilters-filter-newpages-label": "Criações de páginas",
+       "rcfilters-filter-newpages-description": "Edições que fazem novas páginas.",
+       "rcfilters-filter-categorization-label": "Mudanças de categoria",
+       "rcfilters-filter-categorization-description": "Registros de páginas que estão sendo adicionadas ou removidas de categorias.",
+       "rcfilters-filter-logactions-label": "Acções registadas",
+       "rcfilters-filter-logactions-description": "Ações administrativas, criação de contas, eliminação de páginas, carregamentos ...",
        "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Mostrar as novas alterações a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "fileexists-forbidden": "Já existe um arquivo com este nome e ele não pode ser sobrescrito.\nSe ainda pretende enviar seu arquivo, volte e use um novo nome.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Já existe um arquivo com este nome no repositório de arquivos compartilhados.\nSe você ainda quer enviar seu arquivo, volte e use um novo nome.\n[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "O arquivo carregado é uma duplicata exata da versão atual de <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "O arquivo carregado é um duplicado exato {{PLURAL:$2|de uma versão anterior|de uma das versões anteriores}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Este arquivo é uma duplicata do seguinte {{PLURAL:$1|arquivo|arquivos}}:",
        "file-deleted-duplicate": "Um arquivo idêntico a este ([[:$1]]) foi eliminado anteriormente.\nVerifique o histórico de eliminação de tal arquivo antes de tentar re-enviar.",
        "file-deleted-duplicate-notitle": "Um arquivo idêntico a este foi anteriormente excluído, e o título foi suprimido. Você deve comunicar com alguém capaz de visualizar dados suprimidos, para verificar a situação antes de enviá-lo novamente.",
        "uploaded-href-attribute-svg": "os atributos href nos ficheiros SVG só están autorizados a ligar a direccións http:// ou https://, atopado <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Encontrado href para dados não seguros: alvo URI <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
        "uploaded-animate-svg": "Encontrado a tag \"animate\" que pode estar mudando \"href\", usando o atributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
+       "uploaded-setting-event-handler-svg": "A definição de atributos controladores de eventos está bloqueada. Foi detetado <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
+       "uploaded-setting-href-svg": "O uso da tag \"set\" para adicionar o atributo \"href\" ao elemento mãe está bloqueado.",
+       "uploaded-wrong-setting-svg": "O uso da tag \"set\" para adicionar um destino remoto/de dados/<i>script</i> a qualquer atributo está bloqueado. No arquivo SVG enviado foi encontrado <code>&lt;set to=\"$1\"&gt;</code>.",
+       "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
+       "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
+       "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
        "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "upload-options": "Opções de envio",
        "watchthisupload": "Vigiar este arquivo",
        "filewasdeleted": "Um arquivo com este nome foi enviado anteriormente e eliminado.\nVerifique o $1 antes de enviar novamente.",
+       "filename-thumb-name": "Este título parece ser o de uma miniatura. Não coloque miniaturas na wiki donde as obteve, por favor. Se não a obteve desta wiki, altere o nome do arquivo para que este seja mais fácil de compreender e não tenha o prefixo de uma miniatura, por favor.",
        "filename-bad-prefix": "O nome do arquivo que você está enviando começa com '''\"$1\"''', um nome pouco esclarecedor, comumente associado de forma automática por câmeras digitais.\nEscolha um nome de arquivo mais explicativo.",
        "filename-prefix-blacklist": " #<!-- deixe esta linha exatamente como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Tudo a partir do caractere \"#\" até ao fim da linha é um comentário\n#   * Todas as linhas não vazias são um prefixo para nomes de arquivos típicos atribuídos automaticamente por câmaras digitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alguns telefones móveis\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deixe esta linha exatamente como está -->",
        "upload-proto-error": "Protocolo incorreto",
        "upload-too-many-redirects": "A URL contém redirecionamentos demais",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar envios remotos neste domínio.",
+       "upload-foreign-cant-upload": "Este wiki não está configurado para carregar arquivos para o repositório de arquivos externo solicitados.",
+       "upload-foreign-cant-load-config": "Falha ao carregar a configuração para carregamentos de arquivos para o repositório de arquivos externo.",
+       "upload-dialog-disabled": "Essa wiki desativou o envio de arquivos através dessa caixa de diálogo.",
        "upload-dialog-title": "Enviar arquivo",
        "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-back": "Voltar",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Salvar",
        "upload-dialog-button-upload": "Enviar",
        "upload-form-label-infoform-title": "Detalhes",
        "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-name-tooltip": "Um título descritivo e único para o arquivo, que servirá como nome do arquivo. É possível usar linguagem simples com espaços. Não inclua a extensão de arquivo.",
        "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-infoform-description-tooltip": "Descreva de forma breve todos os elementos de nota sobre a obra.\nPara uma fotografia, mencione as principais coisas que estão fotografadas, a ocasião e o lugar.",
        "upload-form-label-usage-title": "Uso",
        "upload-form-label-usage-filename": "Nome do arquivo",
        "upload-form-label-own-work": "Isto é o meu próprio trabalho",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
+       "upload-form-label-own-work-message-generic-local": "Garanto que estou enviando este arquivo em conformidade com os termos de serviço e as políticas de licenciamento do site {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Se não for possível enviar este arquivo sob as políticas do site {{SITENAME}}, feche essa caixa de diálogo e tente outro método.",
        "upload-form-label-not-own-work-local-generic-local": "Você pode também querer tentar [[Special:Upload|the default upload page]]",
+       "upload-form-label-own-work-message-generic-foreign": "Entendo que estou enviando este arquivo para um repositório compartilhado. Garanto que minha ação está em conformidade com os respectivos termos de serviço e políticas de licenciamento.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se não for possível enviar este arquivo sob as políticas desse repositório compartilhado, feche essa caixa de diálogo e tente outro método.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Experimente também usar a [[Special:Upload|página de envios]] do site {{SITENAME}}, caso as políticas do mesmo permitam o envio.",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "uploadstash-errclear": "A limpeza dos arquivos falhou.",
        "uploadstash-refresh": "Atualizar a lista de arquivos",
        "uploadstash-thumbnail": "ver miniatura",
+       "uploadstash-exception": " Não foi possível armazenar o upload no cache ($1): \"$2\".",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "img-auth-accessdenied": "Acesso negado",
        "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Image Authorization].",
        "filehist-filesize": "Tamanho do arquivo",
        "filehist-comment": "Comentário",
        "imagelinks": "Uso do arquivo",
-       "linkstoimage": "{{PLURAL:$1|A página|As $1 páginas}} a seguir tem link para este arquivo:",
+       "linkstoimage": "{{PLURAL:$1|A página a seguir tem|As $1 páginas a seguir têm}} link para este arquivo:",
        "linkstoimage-more": "Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.\nA lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.\nUma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.",
        "nolinkstoimage": "Nenhuma página contém links para este arquivo.",
        "morelinkstoimage": "Ver [[Special:WhatLinksHere/$1|mais links]] para este arquivo.",
        "filerevert-submit": "Reverter",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' foi revertida para a [$4 versão de $2 - $3].</span>",
        "filerevert-badversion": "Não há uma versão local anterior deste arquivo no período de tempo especificado.",
+       "filerevert-identical": "A versão atual do arquivo é idêntica à versão do selecionado.",
        "filedelete": "Eliminar $1",
        "filedelete-legend": "Eliminar arquivo",
        "filedelete-intro": "Você está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' junto com todo o seu histórico.",
        "statistics-header-hooks": "Outras estatísticas",
        "statistics-articles": "Páginas de conteúdo",
        "statistics-pages": "Páginas",
-       "statistics-pages-desc": "Todas as páginas no wiki, incluindo páginas de discussão, redirecionamentos, etc.",
+       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos etc.",
        "statistics-files": "Arquivos carregados",
        "statistics-edits": "Edições de página desde que {{SITENAME}} foi instalado",
        "statistics-edits-average": "Média de edições por página",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Imagens não categorizadas",
        "uncategorizedtemplates": "Predefinições não categorizadas",
+       "uncategorized-categories-exceptionlist": " # Contém uma lista de categorias que não devem ser mencionadas na página Especial:Categorias não categorizadas. Uma por linha, iniciada por \"*\". As linhas iniciadas por qualquer outro carácter (incluindo espaços em branco) são ignoradas. Use \"#\" para comentários.",
        "unusedcategories": "Categorias não utilizadas",
        "unusedimages": "Arquivos não utilizados",
        "wantedcategories": "Categorias pedidas",
        "usercreated": "{{GENDER:$3|criado|criada|criado(a)}} em $1 às $2",
        "newpages": "Páginas novas",
        "newpages-submit": "Exibir",
-       "newpages-username": "Nome de usuário:",
+       "newpages-username": "Nome de usuário(a):",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "apisandbox": "Caixa de areia da API",
+       "apisandbox-jsonly": "JavaScript é necessário para usar o sandbox API.",
        "apisandbox-api-disabled": "A API está desabilitada neste site.",
-       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [https://www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as ações que executar nesta página podem modificar a wiki.",
+       "apisandbox-intro": "Use esta página para fazer experiências com a <strong>API operacional do MediaWiki</strong>.\nConsulte a [[mw:API:Main page|documentação da API]] para informações sobre o seu uso. Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-fullscreen": "Expandir painel",
+       "apisandbox-fullscreen-tooltip": "Expanda o painel do sandbox para preencher a janela do navegador.",
        "apisandbox-unfullscreen": "Mostrar página",
+       "apisandbox-unfullscreen-tooltip": "Reduza o painel do sandbox, para que os links de navegação do MediaWiki estejam disponíveis.",
        "apisandbox-submit": "Fazer requisição",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Tentar novamente",
        "apisandbox-loading": "Carregando informação para o módulo API \"$1\"...",
+       "apisandbox-load-error": "Ocorreu um erro ao carregar informações para o módulo API \"$1\": $2",
+       "apisandbox-no-parameters": "Este módulo API não tem parâmetros.",
        "apisandbox-helpurls": "Links de ajuda",
        "apisandbox-examples": "Exemplos",
        "apisandbox-dynamic-parameters": "Parâmetros adicionais",
        "apisandbox-dynamic-parameters-add-label": "Parâmetro adicional",
        "apisandbox-dynamic-parameters-add-placeholder": "Nome do parâmetro",
+       "apisandbox-dynamic-error-exists": "Um parâmetro chamado \"$1\" já existe.",
        "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
+       "apisandbox-fetch-token": "Preencher automaticamente o token",
        "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
+       "apisandbox-submit-invalid-fields-message": "Corrija os campos marcados e tente novamente.",
        "apisandbox-results": "Resultados",
+       "apisandbox-sending-request": "Enviando solicitação de API ...",
+       "apisandbox-loading-results": "Recebendo resultados da API ...",
+       "apisandbox-results-error": "Ocorreu um erro ao carregar a resposta de consulta da API: $1.",
        "apisandbox-request-url-label": "URL solicitante:",
        "apisandbox-request-time": "Tempo do pedido: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Corrigir token e reenviar",
+       "apisandbox-results-fixtoken-fail": "Falha ao buscar token \"$1\".",
+       "apisandbox-alert-page": "Os campos nesta página não são válidos.",
+       "apisandbox-alert-field": "O valor deste campo não é válido.",
+       "apisandbox-continue": "Continuar",
+       "apisandbox-continue-clear": "Limpar",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] o último pedido; {{int:apisandbox-continue-clear}} limpará os parâmetros relativos à continuação.",
+       "apisandbox-param-limit": "Entre <kbd>max</kbd> para usar o limite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Todos os espaços de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Todos os valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "booksources-text": "É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.",
+       "magiclink-tracking-rfc": "Páginas usando links mágicos de RFC",
+       "magiclink-tracking-rfc-desc": "Esta página usa links mágicos RFC. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-pmid": "Páginas que usam links mágicos do PMID",
+       "magiclink-tracking-pmid-desc": "Esta página usa links mágicos PMID. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
+       "magiclink-tracking-isbn": "Páginas usando links mágicos do ISBN",
+       "magiclink-tracking-isbn-desc": "Esta página usa links mágicos ISBN. Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para saber como migrar.",
        "specialloguserlabel": "Executor:",
        "speciallogtitlelabel": "Alvo (título da página ou {{ns:user}}:'nomedeusuário' para usuários):",
        "log": "Registros",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Pesquisar",
        "linksearch-text": "É possível usar caracteres coringa, como \"*.wikipedia.org\".\nNecessário no mínimo um domínio de nível superior, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: $1 (caso nenhum seja especificado, o protocolo http:// será selecionado automaticamente).",
-       "linksearch-line": "$2 possui links para $1",
+       "linksearch-line": "$1 na página $2",
        "linksearch-error": "\"Caracteres mágicos\" (''wildcards'') só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar usuários começando em:",
        "listusers-submit": "Exibir",
        "activeusers-intro": "Esta é uma lista de usuários com algum tipo de atividade nos últimos $1 {{PLURAL:$1|dia|dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar usuários começando por:",
+       "activeusers-groups": "Exibir usuários pertencentes a grupos:",
+       "activeusers-excludegroups": "Excluir usuários pertencentes a grupos:",
        "activeusers-noresult": "Nenhum usuário encontrado.",
        "activeusers-submit": "Mostrar usuários ativos",
        "listgrouprights": "Privilégios de grupos de usuários",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
        "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
        "listgrants": "Atribuições",
-       "listgrants-summary": "Esta é uma lista de atribuições com os respetivos acessos às permissões de usuário. Os usuários podem autorizar aplicações a utilizar suas contas, mas com permissões limitadas baseadas nas atribuições dadas pelos usuários a cada aplicação. No entanto, uma aplicação agindo em nome de um usuário não pode utilizar permissões que o usuário não possui.\nPode haver [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre permissões individuais.",
+       "listgrants-summary": "Esta é uma lista das possíveis concessões de permissões e das respetivas permissões dos usuários que são atribuídas por cada concessão. Os usuários podem autorizar aplicações a utilizar a sua conta, agindo assim em seu nome mas com as permissões limitadas com base nestas concessões. Uma aplicação que age em nome de um usuário não pode utilizar permissões que o utilizador não possui.\nPoderá existir [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre as permissões individuais.",
        "listgrants-grant": "Atribuição",
        "listgrants-rights": "Direitos",
        "trackingcategories": "Categorias de rastreamento",
        "emailsubject": "Assunto:",
        "emailmessage": "Mensagem:",
        "emailsend": "Enviar",
-       "emailccme": "Enviar ao meu e-mail uma cópia de minha mensagem.",
+       "emailccme": "Enviar ao meu e-mail uma cópia de minha mensagem",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este e-mail foi {{GENDER:$1|enviado}} por $1 para {{GENDER:$2|$2}} através do recurso \"{{int:emailuser}}\" do site {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo usuário|pela usuária}} $1 para {{GENDER:$2|$2}} através da opção “{{int:emailuser}}” do projeto {{SITENAME}}. {{GENDER:$2|A sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e revelar-lhe-á {{GENDER:$2|o seu}} endereço de e-mail.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "watchnologin": "Não está autenticado",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" e sua página de discussão foram adicionadas à sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram adicionadas à sua lista de [[Special:Watchlist|páginas vigiadas]].",
        "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de páginas vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
        "removedwatchtext": "A página \"[[:$1]]\" e sua página de discussão foram removidas de sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
        "removedwatchtext-short": "A página \"$1\" foi removida de sua lista de páginas vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "notvisiblerev": "Edição eliminada",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
-       "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
+       "wlheader-showupdated": "As páginas modificadas desde a sua última visita são mostradas em <strong>negrito</strong>.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-hide": "Ocultar",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: '$1'",
-       "excontentauthor": "o conteúdo era: \"$1\",e o único editor era \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|discussão]])",
+       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora|o(a) único(a) editor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: '$1'",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "actioncomplete": "Ação concluída",
        "actionfailed": "Falha na ação",
        "deletedtext": "\"$1\" foi eliminada.\nConsulte $2 para um registro de eliminações recentes.",
-       "dellogpage": "Registro de eliminação",
+       "dellogpage": "Registro de eliminações",
        "dellogpagetext": "Abaixo uma lista das eliminações mais recentes.",
        "deletionlog": "registro de eliminações",
        "reverted": "Revertido para versão anterior",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais de $1 {{PLURAL:$1|edição|edições}}",
        "rollbackfailed": "A reversão falhou",
+       "rollback-missingparam": "Falta de parâmetros necessários a pedido.",
+       "rollback-missingrevision": "Não foi possível carregar os dados de revisão.",
        "cantrollback": "Não foi possível reverter a edição; o último contribuidor é o único autor desta página",
        "alreadyrolled": "Não foi possível reverter a última edição de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém já editou ou reverteu a página.\n\nA última edição da página foi feita por [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O sumário de edição era: <em>$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas as edições de um usuário oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detetados problemas com a sua sessão;\nEsta ação foi cancelada como medida de proteção contra a intercepção de sessões.\nExperimente usar o botão \"Voltar\" e atualizar a página de onde veio e tente novamente.",
        "changecontentmodel": "Alterar o modelo de conteúdo de uma página",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-model-label": "Modelo de conteúdo novo",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Mudar",
        "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
        "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
+       "changecontentmodel-cannot-convert": "O conteúdo em [[:$1]] não pode ser convertido para um tipo de $2.",
+       "changecontentmodel-nodirectediting": "O modelo de conteúdo $1 não suporta edição direta",
+       "changecontentmodel-emptymodels-title": "Não há modelos de conteúdo disponíveis",
+       "changecontentmodel-emptymodels-text": "O conteúdo da [[:$1]] não pode ser convertido para nenhum tipo.",
        "log-name-contentmodel": "Log de alterações do modelo de conteúdo",
+       "log-description-contentmodel": "Esta página lista alterações ao modelo de conteúdo de páginas e páginas que foram criadas com um modelo de conteúdo diferente do padrão.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|criado}} a página $3 usando um modelo de conteúdo não-padrão \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|alterou}} o modelo de conteúdo da página $3 de \"$4\" para \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
-       "protectlogpage": "Registro de proteção",
+       "protectlogpage": "Registro de proteções",
        "protectlogtext": "Encontra-se abaixo o registro de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "modifiedarticleprotection": "alterou o nível de proteção para \"[[$1]]\"",
        "unprotectedarticle": "removeu a proteção de \"[[$1]]\"",
        "movedarticleprotection": "moveu as configurações de proteção de \"[[$2]]\" para \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protegido}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Alterou o nível de proteção}} de \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removeu a proteção}} de \"[[$1]]\"",
        "protect-title": "Protegendo \"$1\"",
        "protect-title-notallowed": "Ver o nível de proteção de \"$1\"",
        "prot_1movedto2": "[[$1]] foi movido para [[$2]]",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no súmario abaixo, junto dos detalhes do usuário que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
        "undeleterevision-missing": "Edição inválida ou não encontrada. Talvez você esteja com um link incorreto ou talvez a edição foi restaurada ou removida dos arquivos.",
+       "undeleterevision-duplicate-revid": "Não foi possível restaurar {{PLURAL:$1|uma revisão|$1 revisões}}, porque {{PLURAL:$1|a sua <code>rev_id</code> já estava usada|as respetivas <code>rev_id</code> já estavam usadas}}.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "undeletedrevisions": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}}",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}",
        "undeletedfiles": "{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}",
-       "cannotundelete": "Falha ao restaurar:\n$1",
+       "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1",
        "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
        "undelete-header": "Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.",
        "undelete-search-title": "Pesquisar páginas eliminadas",
        "sp-contributions-newbies-sub": "Para contas novas",
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registro de bloqueios",
-       "sp-contributions-suppresslog": "Contribuições de usuário suprimidas",
-       "sp-contributions-deleted": "contribuições eliminadas",
+       "sp-contributions-suppresslog": "Contribuições de {{GENDER:$1|usuário}} suprimidas",
+       "sp-contributions-deleted": "contribuições eliminadas do {{GENDER:$1|usuário}}",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "disc",
        "sp-contributions-username": "Endereço de IP ou usuário(a):",
        "sp-contributions-toponly": "Mostrar somente as edições que sejam a última alteração",
        "sp-contributions-newonly": "Mostrar somente as criações de páginas",
+       "sp-contributions-hideminor": "Ocultar edições menores",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas que têm links para \"$1\"",
        "unblock": "Desbloquear usuário",
        "blockip": "Bloquear {{GENDER:$1|usuário|usuária|usuário(a)}}",
        "blockip-legend": "Bloquear usuário(a)",
-       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário(a).\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).",
+       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário(a).\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).\nVocê pode bloquear os intervalos de endereços IP com a sintaxe [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] A maior faixa permitida é de $1 para IPv4 $2 para IPv6.",
        "ipaddressorusername": "Endereço de IP ou nome de usuário(a):",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipb-unblock": "Desbloquear um usuário ou endereço de IP",
        "ipb-blocklist": "Ver bloqueios em vigência",
        "ipb-blocklist-contribs": "Contribuições de $1",
+       "ipb-blocklist-duration-left": "$1 restantes",
        "unblockip": "Desbloquear usuário",
        "unblockiptext": "Utilize o formulário a seguir para restaurar o acesso à escrita para um endereço de IP ou usuário previamente bloqueado.",
        "ipusubmit": "Remover este bloqueio",
        "block-log-flags-hiddenname": "nome de usuário oculto",
        "range_block_disabled": "A funcionalidade de bloquear gamas de IPs encontra-se desativada.",
        "ipb_expiry_invalid": "Tempo de expiração inválido.",
+       "ipb_expiry_old": "O tempo de expiração está no passado.",
        "ipb_expiry_temp": "Bloqueios com nome de usuário ocultado devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela tem mais de {{PLURAL:$1|uma}}edições.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "proxyblockreason": "O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.",
        "sorbsreason": "O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta",
+       "softblockrangesreason": "Contribuições anônimas não são permitidas do seu endereço  IP $1 Por favor, faça login.",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1",
        "cant-see-hidden-user": "O usuário que você está tentando bloquear já está bloqueado ou oculto. Como você não possui privilégio de ocultar usuários, você não pode ver ou editar o bloqueio desse usuário.",
        "ipbblocked": "Não é possível que você bloqueie ou desbloqueie outros usuários, já que você se encontra bloqueado",
        "lockdbsuccesstext": "A base de dados da {{SITENAME}} foi bloqueada.\n<br />Lembre-se de remover o bloqueio após a manutenção.",
        "unlockdbsuccesstext": "O banco de dados foi desbloqueado.",
        "lockfilenotwritable": "O arquivo de bloqueio da base de dados não pode ser escrito. Para bloquear ou desbloquear a base de dados, este precisa de poder ser escrito pelo servidor Web.",
+       "databaselocked": "O banco de dados já está bloqueado.",
        "databasenotlocked": "A base de dados não encontra-se bloqueada.",
        "lockedbyandtime": "(por $1 em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
-       "movepagetext": "Utilizando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo título.\nO título anterior será transformado em um redirecionamento para o novo.\nVocê poderá optar em atualizar automaticamente os redirecionamentos que se destinem ao título original.\nCaso escolha pela não-atualização, se certifique de verificar por redirecionamentos [[Special:DoubleRedirects|duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ de sua responsabilidade que os links continuem direcionando para onde eles devem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a não ser que ele seja um redirecionamento e não tenha histórico de edições.\nIsto significa que você pode renomear uma página de volta para o seu nome anterior se cometer algum engano e que não poderá sobrescrever uma página existente.\n\n'''CUIDADO!'''\nEsta pode ser uma mudança drástica e inesperada para uma página popular;\ntenha certeza de que compreende as consequências da mudança antes de prosseguir.",
-       "movepagetext-noredirectfixer": "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.\nA página antiga será transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
+       "movepagetext": "Utilizando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo título.\nO título anterior será transformado em um redirecionamento para o novo.\nVocê poderá optar em atualizar automaticamente os redirecionamentos que se destinem ao título original.\nCaso escolha pela não-atualização, se certifique de verificar por redirecionamentos [[Special:DoubleRedirects|duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ de sua responsabilidade que os links continuem direcionando para onde eles devem.\n\nNote que a página <strong>não</strong> será movida se já existir uma página com o novo título, a não ser que ele seja um redirecionamento e não tenha histórico de edições.\nIsto significa que você pode renomear uma página de volta para o seu nome anterior se cometer algum engano e que não poderá sobrescrever uma página existente.\n\n<strong>Nota:</strong>\nEsta pode ser uma mudança drástica e inesperada para uma página popular;\ntenha certeza de que compreende as consequências da mudança antes de prosseguir.",
+       "movepagetext-noredirectfixer": "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.\nA página antiga será transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.\n\nNote que a página <strong>não</strong> será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n<strong>Nota:</strong>\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
        "movepagetalktext": "Caso marcar esta caixa, a página de discussão associada será automaticamente movida para um novo título, a menos que uma página de discussão com conteúdo já existir lá.\n\n\nNeste caso, você deverá mover ou mesclar a página manualmente se desejar.",
        "moveuserpage-warning": "'''Aviso:''' Você irá mover uma página de usuário. Note que apenas a página será movida, ''sem'' alterar o nome do usuário.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Você está prestes a mover uma página de categoria. Por favor, note que apenas a página será transferida e quaisquer páginas da categoria antiga <em>não</em> serão recategorizadas para o novo.",
        "cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
        "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
        "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
+       "cant-move-subpages": "Você não tem permissão para mover subpáginas.",
+       "namespace-nosubpages": "O espaço nominal \"$1\" não permite subpáginas.",
        "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "movepage-page-moved": "A página $1 foi movida para $2",
        "movepage-page-unmoved": "A página $1 não pôde ser movida para $2.",
        "movepage-max-pages": "O limite de $1 {{PLURAL:$1|página movida|páginas movidas}} foi atingido; não será possível mover mais páginas de forma automática.",
-       "movelogpage": "Registro de movimento",
+       "movelogpage": "Registro de movimentos",
        "movelogpagetext": "Abaixo encontra-se uma lista de páginas movidas.",
        "movesubpage": "{{PLURAL:$1|Subpágina|Subpáginas}}",
        "movesubpagetext": "Esta página tem $1 {{PLURAL:$1|subpágina mostrada|subpáginas mostradas}} abaixo.",
+       "movesubpagetalktext": "A página de discussão correspondente tem $1 {{PLURAL:$1|subpágina|subpáginas}}, mostradas abaixo.",
        "movenosubpage": "Esta página não tem subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move_text": "==Eliminação necessária==\nA página de destino (\"[[:$1]]\") já existe. Deseja eliminá-la de modo a poder mover?",
+       "delete_and_move_text": "A página de destino \"[[:$1]]\" já existe. Deseja excluí-lo para abrir caminho para o movimento?",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para mover \"[[$1]]\"",
        "selfmove": "O título fonte e o título destinatário são os mesmos; não é possível mover uma página para ela mesma.",
        "move-leave-redirect": "Criar um redirecionamento",
        "protectedpagemovewarning": "'''Atenção:''' Esta página foi protegida de modo que apenas usuários com privilégio de administrador possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
        "semiprotectedpagemovewarning": "''Nota:''' Esta página foi protegida de modo que apenas usuários registrados possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "move-over-sharedrepo": "=== Arquivo existente ===\n[[:$1]] existe em um repositório compartilhado. Mover um arquivo para este título irá sobrescrever o arquivo compartilhado.",
+       "move-over-sharedrepo": "[[:$1]] existe em um repositório compartilhado. Mover um arquivo para este título irá sobrescrever o arquivo compartilhado.",
        "file-exists-sharedrepo": "O nome de arquivo escolhido já está em uso em um repositório compartilhado.\nPor favor, escolha outro nome.",
        "export": "Exportar páginas",
        "exporttext": "Você pode exportar o texto e o histórico de edições, ou de uma página em particular ou de um conjunto de páginas, para um arquivo XML.\nA partir disso, será possível importar esse conteúdo em outro wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].\n\nPara exportar páginas, insira os títulos na caixa de texto abaixo, um título por linha; selecione entre a edição atual acompanhada das edições anteriores e respectivo histórico de edições ou entre apenas a última edição e suas respectivas informações.\n\nPara o último caso, é possível obter o XML a partir de um link direto (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a edição mais recente da página \"[[{{MediaWiki:Mainpage}}]]\").",
        "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
-       "import-token-mismatch": "Perda dos dados da sessão. Por favor tente novamente.",
+       "import-token-mismatch": "Perda de dados da sessão.\n\nVocê pode ter sido desconectado. <strong>Verifique se você ainda está conectado e tente novamente</strong>.\nSe ainda não funcionar, tente [[Special:UserLogout|sair]] e efetuando login novamente e verifique se seu navegador permite cookies neste site.",
        "import-invalid-interwiki": "Não é possível importar do wiki especificado.",
        "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
        "tooltip-feed-rss": "Feed RSS desta página",
        "tooltip-feed-atom": "Feed Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste usuário|desta usuária|deste(a) usuário(a)}}",
-       "tooltip-t-emailuser": "Enviar um e-mail a {{GENDER:{{BASEPAGENAME}}|este usuário|esta usuária|este(a) usuário(a)}}",
+       "tooltip-t-emailuser": "Enviar um e-mail a {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}}",
        "tooltip-t-info": "Mais informações sobre esta página",
        "tooltip-t-upload": "Enviar arquivos",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-ca-nstab-category": "Ver a página descritiva da categoria",
        "tooltip-minoredit": "Marcar esta alteração como uma edição menor",
        "tooltip-save": "Salva as suas alterações",
+       "tooltip-publish": "Publicar suas alterações",
        "tooltip-preview": "Prevê as alterações feitas por você. Antes de salvar, use para ver se está tudo como esperado!",
        "tooltip-diff": "Visualizar as alterações que você fez no texto",
        "tooltip-compareselectedversions": "Ver o que há de diferente entre as duas versões selecionadas desta página.",
        "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
-       "siteusers": "{{PLURAL:$2|um usuário|$2 usuários}} da {{SITENAME}} ($1)",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|um usuário}}|$2 usuários}} da {{SITENAME}} ($1)",
        "anonusers": "{{PLURAL:$2|usuário anônimo|usuários anônimos}} da {{SITENAME}} ($1)",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informações disponíveis sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "O texto que deseja salvar foi bloqueado pelo filtro de spam.\nIsso é provavelmente causado por um link para um site externo que está na lista negra.",
+       "spamprotectiontext": "O texto que desejava salvar foi bloqueado pelo filtro de ''spam''.\nProvavelmente isso foi causado por um link para um site externo que está na lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "Revertendo para a última versão que não contém links para $1",
        "pageinfo-length": "Tamanho da página (em bytes)",
        "pageinfo-article-id": "ID da página",
        "pageinfo-language": "Idioma do conteúdo da página",
+       "pageinfo-language-change": "alterar",
        "pageinfo-content-model": "Modelo de conteúdo de página",
+       "pageinfo-content-model-change": "alterar",
        "pageinfo-robot-policy": "Indexado por robôs",
        "pageinfo-robot-index": "Autorizado",
        "pageinfo-robot-noindex": "Desautorizado",
        "pageinfo-watchers": "Número de vigilantes da página",
        "pageinfo-visiting-watchers": "Número de vigilantes que consultaram as edições recentes da página",
        "pageinfo-few-watchers": "Menos de  $1  {{PLURAL:$1|vigilante|vigilantes}}",
+       "pageinfo-few-visiting-watchers": "Pode haver ou não ser um usuário assistindo visitando edições recentes",
        "pageinfo-redirects-name": "Número de redirecionamentos para esta página",
        "pageinfo-subpages-name": "Subpáginas desta página",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de arquivos",
+       "pageinfo-user-id": "ID de usuário",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "markaspatrolledtext-file": "Marcar esta versão de artigo como patrulhada",
        "patrol-log-header": "Este é um registro de edições patrulhadas.",
        "log-show-hide-patrol": "$1 registro de edições patrulhadas",
        "log-show-hide-tag": "$1 etiqueta de log",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marque a revisão $3 de $2 como patrulhado?",
        "deletedrevision": "Apagou a versão antiga $1",
        "filedeleteerror-short": "Erro ao eliminar arquivo: $1",
        "filedeleteerror-long": "Foram encontrados erros ao tentar eliminar o arquivo:\n\n$1",
        "svg-long-error": "Arquivo SVG inválido: $1",
        "show-big-image": "Arquivo original",
        "show-big-image-preview": "Tamanho desta previsualização: $1.",
+       "show-big-image-preview-differ": "Tamanho desta visualização de $3 deste arquivo de $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "cíclico",
        "newimages-showbots": "Mostrar uploads realizados por robôs",
        "newimages-hidepatrolled": "Ocultar os carregamentos patrulhados.",
        "noimages": "Nada para ver.",
+       "gallery-slideshow-toggle": "Alternar miniaturas",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar novos arquivos a partir das $2 de $1",
+       "seconds-abbrev": "$1&nbsp;s",
+       "minutes-abbrev": "$1&nbsp;min",
+       "hours-abbrev": "$1&nbsp;h",
        "seconds": "{{PLURAL:$1|um segundo|$1 segundos}}",
        "minutes": "{{PLURAL:$1|um minuto|$1 minutos}}",
        "hours": "{{PLURAL:$1|uma hora|$1 horas}}",
        "confirmemail_body_set": "Alguém, provavelmente você, com o endereço de IP $1,\ndefiniu o endereço de e-mail da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de email em {{SITENAME}},\nabra o seguinte link no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, siga o seguinte link\npara cancelar a confirmação do endereço de e-mail:\n\n$5\n\nEste código de confirmação irá expirar em $4.",
        "confirmemail_invalidated": "Confirmação de endereço de e-mail cancelada",
        "invalidateemail": "Cancelar confirmação de e-mail",
+       "notificationemail_subject_changed": "O endereço de e-mail registrado {{SITENAME}} foi alterado",
+       "notificationemail_subject_removed": "O endereço de e-mail registrado {{SITENAME}} foi removido",
+       "notificationemail_body_changed": "Alguém, provavelmente você, do endereço IP $1,\nalterou o endereço de e-mail da conta \"$2\" para \"$3\" em {{SITENAME}}.\n\nSe este não foi você, entre em contato com um administrador do site imediatamente.",
+       "notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o e-mail da conta \"$2\" na wiki {{SITENAME}}.\n\nSe este não foi você, entre em contato com um administrador do site imediatamente.",
        "scarytranscludedisabled": "[A transclusão de páginas de outros wikis encontra-se desabilitada]",
        "scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: erro HTTP $2]",
        "scarytranscludetoolong": "[URL longa demais]",
        "deletedwhileediting": "'''Aviso''': Esta página foi eliminada após você ter começado a editar!",
        "confirmrecreate": "O usuário [[User:$1|$1]] ([[User talk:$1|Discussão]]) eliminou esta página após você ter começado a editar, pelo seguinte motivo:\n: ''$2''\nPor favor, confirme que realmente deseja recriar esta página.",
-       "confirmrecreate-noreason": "O usuário [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de você ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
+       "confirmrecreate-noreason": "{{GENDER:$1|O usuário|A usuário|O(a) usuário(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) {{GENDER:$1|eliminou}} esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
        "recreate": "Recriar",
+       "unit-pixel": "&nbsp;px",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
        "confirm-purge-bottom": "Purgar uma página limpa o ''cache'' e força a sua versão mais recente a aparecer.",
        "confirm-watch-top": "Adicionar esta página às suas páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Reverter edições nesta página?",
        "quotation-marks": "$1",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "próxima página →",
        "watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
-       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas",
        "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
        "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
        "watchlistedit-clear-titles": "Títulos:",
        "version-libraries-description": "Descrição",
        "version-libraries-authors": "Autores",
        "redirect": "Redirecionar por arquivo, usuário, página, revisão ou registro de identificação.",
-       "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão ou ID da página) ou a uma página de usuário (dado o ID do usuário). Uso: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ou [[{{#Special:Redirect}}/user/101]] ou  [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Buscar",
        "redirect-value": "Valor:",
        "redirect-page": "ID da página",
        "redirect-revision": "Revisão da página",
        "redirect-file": "Nome do arquivo",
+       "redirect-logid": "ID de log",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Procurar por arquivos duplicados",
        "fileduplicatesearch-summary": "Procure por arquivos duplicados tendo por base seu valor \"hash\".",
        "tag-filter": "Filtrar [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
+       "tag-mw-contentmodelchange": "Mudança de modelo de conteúdo",
+       "tag-mw-contentmodelchange-description": "Edições que [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel alteram o modelo de conteúdo] de uma página",
        "tags-title": "Etiquetas",
        "tags-intro": "Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.",
        "tags-tag": "Nome da etiqueta",
        "tags-actions-header": "Ações",
        "tags-active-yes": "Sim",
        "tags-active-no": "Não",
-       "tags-source-extension": "Definida por uma extensão",
+       "tags-source-extension": "Definida por um software",
        "tags-source-manual": "Aplicado manualmente pelos usuários e pelos robôs",
        "tags-source-none": "Não mais em uso",
        "tags-edit": "editar",
        "tags-deactivate": "Desativar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
        "tags-manage-no-permission": "Você não possui permissão para gerenciar alterações de etiquetas",
-       "tags-manage-blocked": "Você não pode fazer mudanças nas etiquetas enquanto bloqueado.",
+       "tags-manage-blocked": "Você não pode fazer mudanças nas etiquetas enquanto {{GENDER:$1|você}} bloqueado.",
        "tags-create-heading": "Criar uma nova etiqueta",
        "tags-create-explanation": "Por padrão, etiquetas recém-criadas serão disponibilizadas para usuários e robôs",
        "tags-create-tag-name": "Nome de etiqueta",
        "tags-delete-not-allowed": "Etiquetas definidas por uma extensão não podem ser apagadas a menos que a extensão especificamente o permita.",
        "tags-delete-not-found": "A etiqueta \"$1\" não existe.",
        "tags-delete-too-many-uses": "A etiqueta \"$1\" é aplicada em mais que $2 {{PLURAL:$2|edição|edições}}, o que significa que não pode ser apagada.",
-       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi apagada com sucesso, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi apagada, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-delete-no-permission": "Você não tem permissão para excluir as etiquetas de alteração.",
        "tags-activate-title": "Ativar etiqueta",
        "tags-activate-question": "Você está prestes a ativar a etiqueta \"$1\".",
        "tags-activate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "Não é possível desativar a etiqueta \"$1\".",
        "tags-deactivate-submit": "Desativar",
        "tags-apply-no-permission": "Você não tem permissão para aplicar mudanças de etiquetas, juntamente com suas alterações.",
-       "tags-apply-blocked": "Você não pode aplicar as mudanças nas etiquetas enquanto está bloqueado.",
+       "tags-apply-blocked": "Você não pode aplicar as mudanças nas etiquetas enquanto {{GENDER:$1|você}} está bloqueado.",
        "tags-apply-not-allowed-one": "A etiqueta \"$1\" não pode ser aplicada manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser aplicada|As seguintes etiquetas não podem ser aplicadas}} manualmente: $1",
        "tags-update-no-permission": "Você não tem permissão para adicionar ou remover mudanças de etiquetas de revisões individuais ou entradas de registro.",
-       "tags-update-blocked": "Você não pode adicionar ou remover mudanças nas etiquetas enquanto bloqueado.",
+       "tags-update-blocked": "Você não pode adicionar ou remover mudanças nas etiquetas enquanto {{GENDER:$1|você}} bloqueado.",
        "tags-update-add-not-allowed-one": "A etiqueta \"$1\" não pode ser adicionada manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser adicionada|As seguintes etiquetas não podem ser adicionadas}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "A remoção da etiqueta \"$1\" não é permitida.",
        "htmlform-cloner-create": "Adicionar mais",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é requerido",
+       "htmlform-date-placeholder": "AAAA-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "O valor que você especificou não é uma data reconhecida. Tente usar o formato AAAA-MM-DD.",
+       "htmlform-time-invalid": "O valor especificado não é um tempo reconhecido. Tente usar o formato HH:MM:SS.",
+       "htmlform-datetime-invalid": "O valor especificado não é uma data e hora reconhecidas. Tente usar o formato AAAA-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "O valor especificado é anterior à data mais antiga permitida de $1.",
+       "htmlform-date-toohigh": "O valor especificado é posterior à data mais recente permitida de $1.",
+       "htmlform-time-toolow": "O valor que você especificou está antes do tempo permitido mais antigo de $1.",
+       "htmlform-time-toohigh": "O valor especificado é posterior à horário  mais recente permitida de $1.",
+       "htmlform-datetime-toolow": "O valor que você especificou está antes da data e hora de $1.",
+       "htmlform-datetime-toohigh": "O valor especificado é posterior à data e hora máxima permitida, $1.",
+       "htmlform-title-badnamespace": "[[:$1]] não se encontra no domínio \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
        "htmlform-title-not-exists": "$1 não existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de usuário válido.",
        "logentry-delete-delete": "$1 apagou a página $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|eliminou}} o redirecionamento $3, sobrescrevendo-o",
        "logentry-delete-restore": "$1 restaurou a página $3",
        "logentry-delete-event": "$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|alterou}} a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} na página $3: $4",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|modificou}} configurações de bloqueio de {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importado}} $3 por envio de arquivo",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importou}} $3 por carregamento de arquivo($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importado}} $3 de outra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importou}} $3 de $5 ($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
-       "logentry-move-move": "$1 moveu a página $3 para $4",
-       "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4 suprimindo o primeiro",
+       "logentry-move-move": "$1 moveu $3 para $4",
+       "logentry-move-move-noredirect": "$1 moveu $3 para $4 sem deixar um redirecionamento",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} $3 para seu redirecionamento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} $3 para seu redirecionamento $4 suprimindo o primeiro",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de usuário $1 foi {{GENDER:$2|criada}}",
        "logentry-newusers-create2": "A conta de usuário $3 foi criada por $1",
        "logentry-newusers-byemail": "A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail",
        "logentry-newusers-autocreate": "A conta de usuário $1 foi criada automaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|moveu}} as preferências de proteção de $4 para $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|removeu}} a proteção de $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|protegeu}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atualizou}} etiquetas em revisão $4 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atualizou}} etiquetas na entrada de registro $5 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "rightsnone": "(nenhum)",
-       "revdelete-summary": "sumário de edição",
+       "revdelete-summary": "resumo da edição",
        "feedback-adding": "Adicionando os comentários na página...",
        "feedback-back": "Voltar",
        "feedback-bugcheck": "Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].",
        "feedback-useragent": "Agente de usuário:",
        "searchsuggest-search": "Pesquisar em {{SITENAME}}",
        "searchsuggest-containing": "páginas contendo…",
-       "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
        "api-error-badtoken": "Erro interno: token inválido.",
-       "api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} no site com o mesmo conteúdo",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu outro arquivo|existiram outros arquivos}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
-       "api-error-empty-file": "O arquivo que você enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
-       "api-error-fetchfileerror": "Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.",
-       "api-error-fileexists-forbidden": "Já existe um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-fileexists-shared-forbidden": "Já existe, no repositório de arquivos partilhados, um arquivo com o nome \"$1\". Não é possível substituí-lo.",
-       "api-error-file-too-large": "O arquivo que você enviou é muito grande.",
-       "api-error-filename-tooshort": "O nome do arquivo é curto demais.",
-       "api-error-filetype-banned": "Este tipo do arquivo é proibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivos permitidos}}. {{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivos permitidos são}} $2.",
-       "api-error-filetype-missing": "Falta a extensão de arquivo.",
-       "api-error-hookaborted": "A modificação que você tentou realizar foi abortada pelo hook de uma extensão.",
-       "api-error-http": "Erro interno: não foi possível conectar ao servidor.",
-       "api-error-illegal-filename": "O nome do arquivo não é permitido.",
-       "api-error-internal-error": "Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.",
-       "api-error-invalid-file-key": "Erro interno: o arquivo não foi encontrado no armazenamento temporário.",
-       "api-error-missingparam": "Erro interno: parâmetros em falta no pedido.",
-       "api-error-missingresult": "Erro interno: não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Você precisa estar autenticado para enviar arquivos.",
-       "api-error-mustbeposted": "Erro interno: a solicitação requer HTTP POST",
-       "api-error-noimageinfo": "O upload foi concluído, mas o servidor não retornou informações sobre o arquivo.",
-       "api-error-nomodule": "Erro interno: o módulo de upload não está configurado.",
-       "api-error-ok-but-empty": "Erro interno: não há resposta do servidor.",
-       "api-error-overwrite": "Não é permitido sobrescrever um arquivo já existente.",
-       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
        "api-error-publishfailed": "Erro interno: O servidor falhou ao publicar o arquivo temporário.",
-       "api-error-stasherror": "Houve um erro durante o upload do arquivo para a pilha.",
-       "api-error-stashedfilenotfound": "O arquivo escondido não foi encontrado ao tentar enviá-lo de seu esconderijo.",
-       "api-error-stashpathinvalid": "O caminho no qual o arquivo escondido deveria ter sido encontrado era inválido.",
-       "api-error-stashfilestorage": "Ocorreu um erro ao armazenar o arquivo em seu esconderijo.",
-       "api-error-stashzerolength": "O servidor não pôde esconder o arquivo, porque ele tinha zero de tamanho.",
-       "api-error-stashnotloggedin": "Você precisa estar logado para salvar arquivos no esconderijo.",
-       "api-error-stashwrongowner": "O arquivo que você estava tentando acessar no esconderijo não pertence a você.",
-       "api-error-stashnosuchfilekey": "O arquivo chave que você estava tentando acessar no esconderijo não existe.",
-       "api-error-timeout": "O servidor não respondeu dentro do tempo esperado.",
-       "api-error-unclassified": "Ocorreu um erro desconhecido",
-       "api-error-unknown-code": "Erro desconhecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.",
-       "api-error-unknown-warning": "Aviso desconhecido: $1",
+       "api-error-stashfailed": "Erro interno: o servidor não conseguiu armazenar o arquivo temporário.",
+       "api-error-unknown-warning": "Aviso desconhecido: \"$1\".",
        "api-error-unknownerror": "Erro desconhecido: \"$1\".",
-       "api-error-uploaddisabled": "Este wiki está com o upload de arquivos desabilitado.",
-       "api-error-verification-error": "Este arquivo pode estar corrompido ou ter a extensão errada.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "expand_templates_generate_xml": "Mostrar árvore de análise (parse) do XML",
        "expand_templates_generate_rawhtml": "Mostrar HTML puro",
        "expand_templates_preview": "Pré-visualização",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, tente novamente.</strong> Se não funcionar, tente [[Special:UserLogout|sair]] e iniciar novamente a sessão e verifique se o seu navegador permite cookies neste site.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e você não estar logado, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor, [[Special:UserLogin|entre]] e tente novamente.</strong>",
-       "pagelanguage": "Seletor de idioma de página",
+       "expand_templates_input_missing": "Você precisa fornecer pelo menos algum texto de entrada.",
+       "pagelanguage": "Mudar idioma da página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Idioma padrão de uso",
        "pagelang-select-lang": "Selecionar idioma",
+       "pagelang-reason": "Razão:",
        "pagelang-submit": "Enviar",
+       "pagelang-nonexistent-page": "O artigo $1 não existe.",
+       "pagelang-unchanged-language": "A pagina $1 já está definido para idioma $2.",
+       "pagelang-unchanged-language-default": "A pagina $1 já está na língua de conteúdo padrão da wiki.",
+       "pagelang-db-failed": "O banco de dados falhou ao alterar o idioma da página.",
        "right-pagelang": "Mudar idioma da página",
        "action-pagelang": "mudar idioma da página",
-       "log-name-pagelang": "Mudar idioma do log",
+       "log-name-pagelang": "Registro de alteração de idioma",
        "log-description-pagelang": "Este é um registro de alterações aos idiomas das páginas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da  $3 de $4 para $5",
        "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pt-br#Usando_o_Git_para_baixar_extensões_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada|aparências instaladas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
        "default-skin-not-found-no-skins": "Opa! A aparência padrão da sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você acabou de instalar ou atualizar o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código-fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem aparências no repositório principal. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins/pt-br diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download/pt-br instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência do [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Usando_o_Git_para_baixar_aparências_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você for um(a) desenvolvedor(a) do MediaWiki. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pt-br Manual:Configuração de aparências] para informações sobre como habilitar aparências e escolher a padrão.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitado)",
        "mediastatistics": "Estatísticas de mídia",
        "mediastatistics-summary": "Estatísticas sobre os tipos de arquivos carregados. Inclui apenas a versão mais recente do arquivo. Versões antigas ou apagadas são excluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Tamanho total dos arquivos desta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Tamanho total de todos os arquivos: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Possíveis extensões",
        "mediastatistics-table-count": "Número de arquivos",
        "special-characters-group-ipa": "AFI (IPA)",
        "special-characters-group-symbols": "Símbolos",
        "special-characters-group-greek": "Grego",
+       "special-characters-group-greekextended": "Grego estendido",
        "special-characters-group-cyrillic": "Cirílico",
        "special-characters-group-arabic": "Árabe",
        "special-characters-group-arabicextended": "Árabe estendido",
        "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Procurar por mídia",
+       "mw-widgets-mediasearch-noresults": "Nenhum resultado encontrado.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
-       "randomrootpage": "Página raiz aleatória"
+       "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "sessionmanager-tie": "Não é possível combinar vários tipos de autenticação de solicitação: $1.",
+       "sessionprovider-generic": "$1 sessões",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "Sessões baseadas em cookie",
+       "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e comece novamente.",
+       "randomrootpage": "Página raiz aleatória",
+       "log-action-filter-block": "Tipo de bloqueio:",
+       "log-action-filter-contentmodel": "Tipo de alteração do modelo de conteúdo:",
+       "log-action-filter-delete": "Tipo de exclusão:",
+       "log-action-filter-import": "Tipo de importação:",
+       "log-action-filter-managetags": "Tipo de acção de gestão de etiqueta:",
+       "log-action-filter-move": "Tipo de movimento:",
+       "log-action-filter-newusers": "Tipo de criação de conta:",
+       "log-action-filter-patrol": "Tipo de patrulha:",
+       "log-action-filter-protect": "Tipo de proteção:",
+       "log-action-filter-rights": "Tipo de mudança direita:",
+       "log-action-filter-suppress": "Tipo de supressão:",
+       "log-action-filter-upload": "Tipo de upload:",
+       "log-action-filter-all": "Todos",
+       "log-action-filter-block-block": "Bloquear",
+       "log-action-filter-block-reblock": "Modificação do bloqueio",
+       "log-action-filter-block-unblock": "Desbloquear",
+       "log-action-filter-contentmodel-change": "Modelo de alteração de conteúdo",
+       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padrão",
+       "log-action-filter-delete-delete": "Exclusão de página",
+       "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
+       "log-action-filter-delete-restore": "Restauro de página",
+       "log-action-filter-delete-event": "Excluir registro",
+       "log-action-filter-delete-revision": "Exclusão de revisão",
+       "log-action-filter-import-interwiki": "Importar transwiki",
+       "log-action-filter-import-upload": "Importação por upload XML",
+       "log-action-filter-managetags-create": "Criar Etiqueta",
+       "log-action-filter-managetags-delete": "Deletar etiqueta",
+       "log-action-filter-managetags-activate": "Ativar etiqueta",
+       "log-action-filter-managetags-deactivate": "Desativar etiqueta",
+       "log-action-filter-move-move": "Mover sem sobrescrever redirecionamentos",
+       "log-action-filter-move-move_redir": "Mover com substituição de redirecionamentos",
+       "log-action-filter-newusers-create": "Criação por usuário anônimo",
+       "log-action-filter-newusers-create2": "Criação por usuário registrado",
+       "log-action-filter-newusers-autocreate": "Criação automática",
+       "log-action-filter-newusers-byemail": "Criação com a senha enviada por e-mail",
+       "log-action-filter-patrol-patrol": "Patrulha manual",
+       "log-action-filter-patrol-autopatrol": "Patrulha automática",
+       "log-action-filter-protect-protect": "Proteção",
+       "log-action-filter-protect-modify": "Modificação de protecção",
+       "log-action-filter-protect-unprotect": "Desprotecção",
+       "log-action-filter-protect-move_prot": "Proteção movida",
+       "log-action-filter-rights-rights": "Mudança manual",
+       "log-action-filter-rights-autopromote": "Mudança automática",
+       "log-action-filter-suppress-event": "Supressão de registro",
+       "log-action-filter-suppress-revision": "Supressão de revisão",
+       "log-action-filter-suppress-delete": "Supressão de páginas",
+       "log-action-filter-suppress-block": "Supressão de usuário por bloqueio",
+       "log-action-filter-suppress-reblock": "Supressão de usuário por rebloqueio",
+       "log-action-filter-upload-upload": "Novo Upload",
+       "log-action-filter-upload-overwrite": "Recarregar",
+       "authmanager-authn-not-in-progress": "A autenticação não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-authn-no-primary": "As credenciais fornecidas não puderam ser autenticadas.",
+       "authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum usuário neste wiki.",
+       "authmanager-authn-no-local-user-link": "As credenciais fornecidas são válidas, mas não estão associadas a nenhum usuário neste wiki. Efetue login de uma maneira diferente ou crie um novo usuário e você terá uma opção para vincular suas credenciais anteriores a essa conta.",
+       "authmanager-authn-autocreate-failed": "Falha na criação automática de uma conta local: $1",
+       "authmanager-change-not-supported": "As credenciais fornecidas não podem ser alteradas, pois nada as utilizaria.",
+       "authmanager-create-disabled": "A criação da conta está desativada.",
+       "authmanager-create-from-login": "Para criar sua conta, preencha os campos.",
+       "authmanager-create-not-in-progress": "A criação da conta não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-create-no-primary": "As credenciais fornecidas não puderam ser usadas para criação de conta.",
+       "authmanager-link-no-primary": "As credenciais fornecidas não puderam ser usadas para vinculação de contas.",
+       "authmanager-link-not-in-progress": "A associação de contas não está em andamento ou os dados da sessão foram perdidos. Por favor, comece novamente desde o início.",
+       "authmanager-authplugin-setpass-failed-title": "Falha na alteração da senha",
+       "authmanager-authplugin-setpass-failed-message": "O plugin de autenticação negou a alteração da senha.",
+       "authmanager-authplugin-create-fail": "O plugin de autenticação negou a criação da conta.",
+       "authmanager-authplugin-setpass-denied": "O plugin de autenticação não permite alterar senhas.",
+       "authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
+       "authmanager-autocreate-noperm": "A criação automática de conta não é permitida.",
+       "authmanager-autocreate-exception": "Criação automática de conta temporariamente desativada devido a erros anteriores.",
+       "authmanager-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
+       "authmanager-userlogin-remembermypassword-help": "Se a senha deve ser lembrada por mais tempo do que a duração da sessão.",
+       "authmanager-username-help": "Nome de usuário para autenticação.",
+       "authmanager-password-help": "Senha para autenticação.",
+       "authmanager-domain-help": "Domínio para autenticação externa.",
+       "authmanager-retype-help": "Senha novamente para confirmar.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "Endereço de e-mail",
+       "authmanager-realname-label": "Nome real",
+       "authmanager-realname-help": "Nome real do usuário",
+       "authmanager-provider-password": "Autenticação baseada em senha",
+       "authmanager-provider-password-domain": "Autenticação baseada em senha e domínio",
+       "authmanager-provider-temporarypassword": "Senha temporária",
+       "authprovider-confirmlink-message": "Com base nas tentativas de login recentes, as seguintes contas podem ser vinculadas à sua conta do wiki. Vinculá-los permite o login através dessas contas. Selecione quais devem ser vinculados.",
+       "authprovider-confirmlink-request-label": "Contas que devem ser vinculadas",
+       "authprovider-confirmlink-success-line": "$1: Vinculado com sucesso.",
+       "authprovider-confirmlink-failed": "A associação de contas não teve êxito total: $1",
+       "authprovider-confirmlink-ok-help": "Continue depois de exibir mensagens de falha de vinculação.",
+       "authprovider-resetpass-skip-label": "Pular",
+       "authprovider-resetpass-skip-help": "Ignorar a redefinição da senha.",
+       "authform-nosession-login": "A autenticação foi bem-sucedida, mas seu navegador não pode \"lembrar\" de estar conectado.\n\n$1",
+       "authform-nosession-signup": "A conta foi criada, mas seu navegador não pode \"lembrar\" de estar conectado.\n\n\n$1",
+       "authform-newtoken": "Token faltando. $1",
+       "authform-notoken": "Token faltando",
+       "authform-wrongtoken": "Token errado",
+       "specialpage-securitylevel-not-allowed-title": "Não permitido",
+       "specialpage-securitylevel-not-allowed": "Desculpe, você não tem permissão para usar esta página porque sua identidade não pôde ser verificada.",
+       "authpage-cannot-login": "Não é possível iniciar o login.",
+       "authpage-cannot-login-continue": "Não foi possível continuar o login. Sua sessão provavelmente esgotou o tempo limite.",
+       "authpage-cannot-create": "Não é possível iniciar a criação da conta.",
+       "authpage-cannot-create-continue": "Não é possível continuar a criação da conta. Sua sessão provavelmente esgotou o tempo limite.",
+       "authpage-cannot-link": "Não é possível iniciar a associação de contas.",
+       "authpage-cannot-link-continue": "Não é possível continuar vinculando a conta. Sua sessão provavelmente esgotou o tempo limite.",
+       "cannotauth-not-allowed-title": "Permissão negada",
+       "cannotauth-not-allowed": "Você não está autorizado a ver esta página",
+       "changecredentials": "Alterar credenciais",
+       "changecredentials-submit": "Alterar credenciais",
+       "changecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "changecredentials-success": "Suas credenciais foram alteradas.",
+       "removecredentials": "Remover credenciais",
+       "removecredentials-submit": "Remover credenciais",
+       "removecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
+       "removecredentials-success": "Suas credenciais foram removidas.",
+       "credentialsform-provider": "Tipo de credenciais:",
+       "credentialsform-account": "Nome da conta:",
+       "cannotlink-no-provider-title": "Não há contas vinculáveis",
+       "cannotlink-no-provider": "Não há contas vinculáveis.",
+       "linkaccounts": "Vincular contas",
+       "linkaccounts-success-text": "A conta foi vinculada.",
+       "linkaccounts-submit": "Vincular contas",
+       "unlinkaccounts": "Desassociar contas",
+       "unlinkaccounts-success": "A conta foi desassociada.",
+       "authenticationdatachange-ignored": "A alteração de dados de autenticação não foi processada. Talvez nenhum provedor tenha sido configurado?",
+       "userjsispublic": "Observação: as subpáginas JavaScript não devem conter dados confidenciais, pois são visíveis por outros usuários.",
+       "usercssispublic": "Observação: As subpáginas CSS não devem conter dados confidenciais, pois são visíveis por outros usuários.",
+       "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>",
+       "revid": "revisão $1",
+       "pageid": "ID da página $1"
 }
index 25f50b8..bf967dc 100644 (file)
        "searcharticle": "Ir",
        "history": "Histórico",
        "history_short": "Histórico",
+       "history_small": "histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
        "permalink": "Ligação permanente",
        "botpasswords-label-delete": "Eliminar",
        "botpasswords-label-resetpassword": "Redefinir palavra-passe",
        "botpasswords-label-grants": "Concessões de permissões aplicáveis:",
-       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a usa conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
+       "botpasswords-help-grants": "As concessões de permissões permitem acesso a permissões já detidas pela sua conta de utilizador. Fazer uma concessão aqui não fornece acesso a quaisquer permissões que a sua conta de utilizador não possua. Consulte a [[Special:ListGrants|tabela de concessões]] para mais informação.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome do robô \"$1\" não é válido.",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "blockedtitle": "O utilizador está bloqueado",
        "blockedtext": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\nNote que para utilizar a funcionalidade \"Contactar utilizador\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro utilizador, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"Contactar utilizador\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
+       "systemblockedtext": "O seu nome de utilizador ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
        "whitelistedittext": "Precisa de $1 para poder editar páginas.",
        "confirmedittext": "Precisa de confirmar o seu endereço de correio eletrónico antes de começar a editar páginas.\nIntroduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador(a) removido)",
        "rev-deleted-event": "(registos de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido – edição ocultada das contribuições]",
+       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido do histórico – edição ocultada das contribuições públicas]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "rev-deleted-text-unhide": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
-       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados encontrados.}}",
        "searchmenu-new": "<strong>Crie a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "saveprefs": "Gravar",
        "restoreprefs": "Repor todas as configurações padrão (em todas as secções)",
        "prefs-editing": "Edição",
-       "rows": "Linhas:",
-       "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
        "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
        "stub-threshold-sample-link": "amostra",
        "userrights-user-editname": "Introduza um nome de utilizador(a):",
        "editusergroup": "Carregar grupos do utilizador",
        "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
+       "viewinguserrights": "A ver os privilégios {{GENDER:$1|do utilizador|da utilizadora}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
+       "userrights-viewusergroup": "Ver grupos do utilizador",
        "saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "action-upload_by_url": "enviar este ficheiro através de um URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-delete": "eliminar esta página",
-       "action-deleterevision": "eliminar esta edição",
-       "action-deletedhistory": "ver o histórico de edições eliminadas desta página",
+       "action-deleterevision": "eliminar revisões",
+       "action-deletelogentry": "eliminar entradas de registo",
+       "action-deletedhistory": "ver o histórico de edições eliminadas de uma página",
+       "action-deletedtext": "ver o texto de uma revisão eliminada",
        "action-browsearchive": "pesquisar páginas eliminadas",
-       "action-undelete": "restaurar esta página",
-       "action-suppressrevision": "rever e restaurar esta edição oculta",
+       "action-undelete": "restaurar páginas",
+       "action-suppressrevision": "rever e restaurar edições ocultas",
        "action-suppressionlog": "ver este registo privado",
        "action-block": "impedir este utilizador de editar",
        "action-protect": "alterar os níveis de proteção desta página",
        "action-userrights-interwiki": "editar privilégios de utilizadores de outras wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de dados",
        "action-sendemail": "enviar correio eletrónico",
+       "action-editmyoptions": "editar as suas preferências",
        "action-editmywatchlist": "editar a sua lista de páginas vigiadas",
        "action-viewmywatchlist": "ver a sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "ver a sua informação privada",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Mostrar",
+       "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-search-placeholder": "Filtrar mudanças recentes (navegue ou começe a escrever)",
+       "rcfilters-invalid-filter": "Filtro inválido",
+       "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-noresults": "Não foram encontrados filtros",
+       "rcfilters-filtergroup-registration": "Registo de utilizador",
+       "rcfilters-filtergroup-authorship": "Editar autoria",
+       "rcfilters-filter-editsbyself-label": "As suas próprias edições",
+       "rcfilters-filter-editsbyself-description": "Edições suas.",
+       "rcfilters-filter-editsbyother-label": "Edições de outros",
+       "rcfilters-filter-editsbyother-description": "Edições criadas por outros utilizadores (não por si).",
+       "rcfilters-filtergroup-userExpLevel": "Nível de experiência (apenas para utilizadores registados)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novatos",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-userExpLevel-learner-label": "Aprendizes",
+       "rcfilters-filter-userExpLevel-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Utilizadores experientes\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Utilizadores experientes",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
        "rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas mudanças a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "statistics-header-hooks": "Outras estatísticas",
        "statistics-articles": "Páginas de conteúdo",
        "statistics-pages": "Páginas",
-       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos, etc.",
+       "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos etc.",
        "statistics-files": "Ficheiros carregados",
        "statistics-edits": "Edições de páginas desde que a wiki {{SITENAME}} foi instalada",
        "statistics-edits-average": "Média de edições por página",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "uncategorizedtemplates": "Predefinições não categorizadas",
+       "uncategorized-categories-exceptionlist": " # Contém uma lista de categorias que não devem ser mencionadas na página Especial:Categorias não categorizadas. Uma por linha, iniciada por \"*\". As linhas iniciadas por qualquer outro carácter (incluindo espaços em branco) são ignoradas. Use \"#\" para comentários.",
        "unusedcategories": "Categorias não utilizadas",
        "unusedimages": "Ficheiros não utilizados",
        "wantedcategories": "Categorias desejadas",
        "emailsubject": "Assunto:",
        "emailmessage": "Mensagem:",
        "emailsend": "Enviar",
-       "emailccme": "Enviar uma cópia desta mensagem para o meu correio eletrónico.",
+       "emailccme": "Enviar uma cópia desta mensagem para o meu correio eletrónico",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo utilizador|pela utilizadora}} $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}. {{GENDER:$2|A sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e irá revelar-lhe {{GENDER:$2|o seu}} endereço de correio eletrónico.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: \"$1\"",
-       "excontentauthor": "o conteúdo era: \"$1\", e o único editor \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
+       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora|o(a) único(a) editor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "changecontentmodel-emptymodels-title": "Não há modelos de conteúdo disponíveis",
        "changecontentmodel-emptymodels-text": "O conteúdo em [[:$1]] não pode ser convertido para qualquer tipo.",
        "log-name-contentmodel": "Registo de alteração de modelo de conteúdo",
-       "log-description-contentmodel": "Eventos relacionados com os modelos de conteúdo de uma página",
+       "log-description-contentmodel": "Esta página lista alterações do modelo de conteúdo das páginas e páginas criadas com um modelo de conteúdo diferente do padrão.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|criou}} a página $3 com o modelo de conteúdo desconhecido \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|alterou}} o modelo de conteúdo da página $3 de \"$4\" para \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "proxyblockreason": "O seu endereço IP foi bloqueado por ser um ''proxy'' público.\nContacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
        "sorbsreason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}.",
        "sorbs_create_account_reason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}. Não pode criar uma conta.",
+       "softblockrangesreason": "Não são permitidas contribuições anónimas a partir do seu endereço IP ($1). Inicie uma sessão, por favor.",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1",
        "cant-see-hidden-user": "O utilizador que está a tentar bloquear já está bloqueado e oculto.\nComo não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
        "ipbblocked": "Não pode bloquear ou desbloquear outros, porque está bloqueado",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
        "cant-move-category-page": "Não possui permissão para mover categorias.",
        "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
+       "cant-move-subpages": "Não tem permissão para mover subpáginas.",
+       "namespace-nosubpages": "O espaço nominal \"$1\" não permite subpáginas.",
        "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
+       "spamprotectiontext": "O texto que desejava gravar foi bloqueado pelo filtro de ''spam''.\nProvavelmente este bloqueio foi causado por uma ligação para um sítio externo que consta da lista negra.",
        "spamprotectionmatch": "O seguinte texto ativou o filtro de <i>spam</i>: $1",
        "spambot_username": "MediaWiki limpeza de spam",
        "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
        "pageinfo-length": "Tamanho da página (em bytes)",
        "pageinfo-article-id": "ID da página",
        "pageinfo-language": "Idioma do conteúdo da página",
+       "pageinfo-language-change": "alterar",
        "pageinfo-content-model": "Modelo de conteúdo de página",
        "pageinfo-content-model-change": "alterar",
        "pageinfo-robot-policy": "Indexação por robôs",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar novos ficheiros a partir das $2 de $1",
+       "seconds-abbrev": "$1&nbsp;s",
+       "minutes-abbrev": "$1&nbsp;min",
+       "hours-abbrev": "$1&nbsp;h",
        "seconds": "{{PLURAL:$1|um segundo|$1 segundos}}",
        "minutes": "{{PLURAL:$1|um minuto|$1 minutos}}",
        "hours": "{{PLURAL:$1|uma hora|$1 horas}}",
        "recreate": "Recriar",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Limpar a memória cache desta página?",
-       "confirm-purge-bottom": "Recarregar uma página, limpa a cache e força a sua versão mais recente a aparecer.",
+       "confirm-purge-bottom": "Recarregar uma página limpa a cache e força a sua versão mais recente a aparecer.",
        "confirm-watch-button": "OK",
        "confirm-watch-top": "Adicionar esta página à lista de páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importou}} $3 de outra wiki",
        "logentry-import-interwiki-details": "$1 {{GENDER:$2|importou}} $3 de $5 ($4 {{PLURAL:$4|revisão|revisões}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
-       "logentry-move-move": "$1 moveu a página $3 para $4",
-       "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para o seu redirecionamento $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para o seu redirecionamento $4, suprimindo o primeiro",
+       "logentry-move-move": "$1 moveu $3 para $4",
+       "logentry-move-move-noredirect": "$1 moveu $3 para $4 sem deixar um redirecionamento",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} $3 para o seu redirecionamento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} $3 para o seu redirecionamento $4, suprimindo o primeiro",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de utilizador $1 foi {{GENDER:$2|criada}}",
        "feedback-useragent": "Agente de utilizador:",
        "searchsuggest-search": "Pesquisar na wiki {{SITENAME}}",
        "searchsuggest-containing": "contendo...",
-       "api-error-autoblocked": "O seu endereço IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
-       "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
-       "api-error-blocked": "Foi bloqueado de editar.",
-       "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
-       "api-error-empty-file": "O ficheiro que enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
-       "api-error-fetchfileerror": "Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.",
-       "api-error-fileexists-forbidden": "Já existe um ficheiro com o nome \"$1\" e não pode ser substituído.",
-       "api-error-fileexists-shared-forbidden": "Já existe um ficheiro com o nome \"$1\" no repositório de ficheiros partilhados e não pode ser substituído.",
-       "api-error-file-too-large": "O ficheiro que enviou era demasiado grande.",
-       "api-error-filename-tooshort": "O nome do ficheiro é demasiado curto.",
-       "api-error-filetype-banned": "Este tipo de ficheiro é proibido.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|não é um tipo de ficheiro permitido|não são tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos são}} $2.",
-       "api-error-filetype-missing": "Falta a extensão do ficheiro.",
-       "api-error-hookaborted": "A modificação que tentou fazer foi cancelada por uma extensão.",
-       "api-error-http": "Erro interno: Ocorreu um problema na ligação ao servidor.",
-       "api-error-illegal-filename": "Este nome de ficheiro não é permitido.",
-       "api-error-internal-error": "Erro interno: Ocorreu um erro indeterminado na wiki ao processar o ficheiro que enviou.",
-       "api-error-invalid-file-key": "Erro interno: O ficheiro não foi encontrado no armazenamento temporário.",
-       "api-error-missingparam": "Erro interno: Há parâmetros em falta no pedido.",
-       "api-error-missingresult": "Erro interno: Não foi possível determinar se a cópia foi feita.",
-       "api-error-mustbeloggedin": "Tem de iniciar sessão para enviar ficheiros.",
-       "api-error-mustbeposted": "Erro interno: O pedido necessita do HTTP POST.",
-       "api-error-noimageinfo": "O envio correu bem, mas o servidor não forneceu nenhuma informação sobre o ficheiro.",
-       "api-error-nomodule": "Erro interno: Não está definido nenhum módulo para o carregamento de ficheiros.",
-       "api-error-ok-but-empty": "Erro interno: o servidor não respondeu.",
-       "api-error-overwrite": "Não é permitido sobrescrever um ficheiro existente.",
-       "api-error-ratelimited": "Está a tentar carregar mais ficheiros do que esta wiki permite num espaço de tempo curto. Tente de novo dentro de alguns minutos, por favor.",
-       "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-publishfailed": "Erro interno: Servidor não conseguiu publicar ficheiro temporário.",
-       "api-error-stasherror": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashedfilenotfound": "O ficheiro escondido não foi encontrado ao tentar carregá-lo.",
-       "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
-       "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashzerolength": "Não foi possível o servidor esconder o ficheiro, porque este tinha comprimento zero.",
-       "api-error-stashnotloggedin": "Tem de ter uma sessão iniciada para gravar ficheiros na área de ficheiros escondidos.",
-       "api-error-stashwrongowner": "O ficheiro a que estava a tentar aceder na área de ficheiros escondidos não lhe pertence.",
-       "api-error-stashnosuchfilekey": "O chave do ficheiro a que estava a tentar aceder na área de ficheiros escondidos não existe.",
-       "api-error-timeout": "O servidor não respondeu no prazo esperado.",
-       "api-error-unclassified": "Ocorreu um erro desconhecido",
-       "api-error-unknown-code": "Erro desconhecido: \"$1\"",
-       "api-error-unknown-error": "Erro interno: Ocorreu um erro indeterminado ao tentar receber o ficheiro.",
+       "api-error-stashfailed": "Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.",
        "api-error-unknown-warning": "Aviso desconhecido: $1",
        "api-error-unknownerror": "Erro desconhecido: \"$1\".",
-       "api-error-uploaddisabled": "Esta wiki não está configurada para poder receber ficheiros.",
-       "api-error-verification-error": "Este ficheiro pode estar corrompido, ou ter a extensão errada.",
-       "api-error-was-deleted": "Um ficheiro com este nome foi carregado anteriormente e posteriormente eliminado.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "pagelang-language": "Língua",
        "pagelang-use-default": "Usar idioma pré-definido",
        "pagelang-select-lang": "Escolher o idioma",
+       "pagelang-reason": "Motivo",
        "pagelang-submit": "Submeter",
+       "pagelang-nonexistent-page": "A página $1 não existe.",
+       "pagelang-unchanged-language": "A pagina $1 já está na língua $2.",
+       "pagelang-unchanged-language-default": "A pagina $1 já está na língua de conteúdo padrão da wiki.",
+       "pagelang-db-failed": "A base de dados não conseguiu alterar a língua da página.",
        "right-pagelang": "Alterar o idioma da página",
        "action-pagelang": "alterar o idioma da página",
        "log-name-pagelang": "Registo de alteração de idioma",
        "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
        "randomrootpage": "Página aleatória de raiz",
        "log-action-filter-block": "Tipo de bloqueio:",
-       "log-action-filter-contentmodel": "Tipo de alteração de modelo de conteúdo:",
+       "log-action-filter-contentmodel": "Tipo de alteração do modelo de conteúdo:",
        "log-action-filter-delete": "Tipo de eliminação:",
        "log-action-filter-import": "Tipo de importação:",
        "log-action-filter-managetags": "Tipo de ação de gestão de etiqueta:",
        "log-action-filter-block-block": "Bloqueio",
        "log-action-filter-block-reblock": "Alteração de bloqueio",
        "log-action-filter-block-unblock": "Desbloqueio",
-       "log-action-filter-contentmodel-change": "Alteração de modelo de conteúdo",
+       "log-action-filter-contentmodel-change": "Alteração do modelo de conteúdo",
        "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padronizado",
        "log-action-filter-delete-delete": "Eliminação de página",
        "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
        "usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>",
+       "revid": "revisão $1",
+       "pageid": "identificador de página $1"
 }
index f0dc4e3..8c2eef7 100644 (file)
                        "Ата",
                        "Matěj Suchánek",
                        "Chaduvari",
-                       "MarcoAurelio"
+                       "MarcoAurelio",
+                       "Joao Xavier",
+                       "Winstonyin"
                ]
        },
        "sidebar": "{{notranslate}}",
        "apr": "{{doc-months|4|short}}\n{{Identical|April}}",
        "may": "{{doc-months|5|short}}\n{{Identical|May}}",
        "jun": "{{doc-months|6|short}}\n{{Identical|June}}",
-       "jul": "{{doc-months|7|short}}",
-       "aug": "{{doc-months|8|short}}",
-       "sep": "{{doc-months|9|short}}",
-       "oct": "{{doc-months|10|short}}",
-       "nov": "{{doc-months|11|short}}",
-       "dec": "{{doc-months|12|short}}",
+       "jul": "{{doc-months|7|short}}\n{{Identical|July}}",
+       "aug": "{{doc-months|8|short}}\n{{Identical|August}}",
+       "sep": "{{doc-months|9|short}}\n{{Identical|September}}",
+       "oct": "{{doc-months|10|short}}\n{{Identical|October}}",
+       "nov": "{{doc-months|11|short}}\n{{Identical|November}}",
+       "dec": "{{doc-months|12|short}}\n{{Identical|December}}",
        "january-date": "A date in the Gregorian month of January. $1 is the numerical date, for example \"23\".\n{{Identical|January}}",
        "february-date": "A date in the Gregorian month of February. $1 is the numerical date, for example \"23\".\n{{Identical|February}}",
        "march-date": "A date in the Gregorian month of March. $1 is the numerical date, for example \"23\".\n{{Identical|March}}",
-       "april-date": "A date in the Gregorian month of April. $1 is the numerical date, for example \"23\".",
+       "april-date": "A date in the Gregorian month of April. $1 is the numerical date, for example \"23\".\n{{Identical|April}}",
        "may-date": "A date in the Gregorian month of May. $1 is the numerical date, for example \"23\". The month name is not abbreviated.\n{{Identical|May}}",
-       "june-date": "A date in the Gregorian month of June. $1 is the numerical date, for example \"23\".",
-       "july-date": "A date in the Gregorian month of July. $1 is the numerical date, for example \"23\".",
-       "august-date": "A date in the Gregorian month of August. $1 is the numerical date, for example \"23\".",
-       "september-date": "A date in the Gregorian month of September. $1 is the numerical date, for example \"23\".",
-       "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".",
+       "june-date": "A date in the Gregorian month of June. $1 is the numerical date, for example \"23\".\n{{Identical|June}}",
+       "july-date": "A date in the Gregorian month of July. $1 is the numerical date, for example \"23\".\n{{Identical|July}}",
+       "august-date": "A date in the Gregorian month of August. $1 is the numerical date, for example \"23\".\n{{Identical|August}}",
+       "september-date": "A date in the Gregorian month of September. $1 is the numerical date, for example \"23\".\n{{Identical|September}}",
+       "october-date": "A date in the Gregorian month of October. $1 is the numerical date, for example \"23\".\n{{Identical|October}}",
        "november-date": "A date in the Gregorian month of November. $1 is the numerical date, for example \"23\".\n{{Identical|November}}",
-       "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".",
+       "december-date": "A date in the Gregorian month of December. $1 is the numerical date, for example \"23\".\n{{Identical|December}}",
        "period-am": "Text indicating the first period of the day when using a 12-hour calendar.",
        "period-pm": "Text indicating the second period of the day when using a 12-hour calendar.",
        "pagecategories": "Used in the categories section of pages.\n\nFollowed by a colon and a list of categories.\n\nParameters:\n* $1 - number of categories\n{{Identical|Category}}",
        "searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
        "history": "{{Identical|Page history}}",
        "history_short": "Text used on the history tab.\n\n{{Identical|History}}",
+       "history_small": "Uncapitalized version of {{msg-mw|History short}}.\n\n{{Identical|History}}",
        "updatedmarker": "Displayed in the page history (of a page you are [[Special:Watchlist|watching]]), when the page has been edited since the last time you visited it. This feature is used if [[mw:Manual:$wgShowUpdatedMarker|$wgShowUpdatedMarker]] is enabled.",
        "printableversion": "Display name for link in wiki menu that leads to a printable version of a content page. Example: see one but last menu item on [[Main Page]].\n\nSee also:\n* {{msg-mw|Printableversion}}\n* {{msg-mw|Accesskey-t-print}}\n* {{msg-mw|Tooltip-t-print}}\n{{Identical|Printable version}}",
        "permalink": "Display name for a permanent link to the current revision of a page. When the page is edited, permalink will still link to this revision. Example: Last menu link on [[{{MediaWiki:Mainpage}}]]\n\nSee also:\n* {{msg-mw|Permalink}}\n* {{msg-mw|Accesskey-t-permalink}}\n* {{msg-mw|Tooltip-t-permalink}}\n{{Identical|Permalink}}",
        "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
        "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
-       "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
+       "subject": "Used as label for the section title input box when adding a new section on a talk page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
        "savearticle": "Text on the button to create a new page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savechanges}} for the label for the button when the page is being modified.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save page}}",
        "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
        "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\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": "Should match {{msg-mw|subject}}",
+       "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}}",
        "previewerrortext": "When a user has the editing preference LivePreview enabled, clicked the Preview or Show Changes button in the edit page and the action did not succeed.",
-       "blockedtitle": "Used as title displayed for blocked users. The corresponding message body is one of the following messages:\n* {{msg-mw|Blockedtext|notext=1}}\n* {{msg-mw|Autoblockedtext|notext=1}}",
-       "blockedtext": "Text displayed to blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}",
-       "autoblockedtext": "Text displayed to automatically blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}",
+       "blockedtitle": "Used as title displayed for blocked users. The corresponding message body is one of the following messages:\n* {{msg-mw|Blockedtext|notext=1}}\n* {{msg-mw|Autoblockedtext|notext=1}}\n* {{msg-mw|Systemblockedtext}}",
+       "blockedtext": "Text displayed to blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}\n* {{msg-mw|Systemblockedtext}}",
+       "autoblockedtext": "Text displayed to automatically blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Systemblockedtext}}",
+       "systemblockedtext": "Text displayed to requests blocked by MediaWiki configuration.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - (Unused) A dummy user attributed as the blocker, possibly as a link to a user page.\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the dummy blocking user's username (plain text, without the link).\n* $5 - A short string indicating the type of system block.\n* $6 - the expiry of the block\n* $7 - the intended target of the block\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Autoblockedtext}}",
        "blockednoreason": "Substituted with <code>$2</code> in the following message if the reason is not given:\n* {{msg-mw|cantcreateaccount-text}}.\n{{Identical|No reason given}}",
        "whitelistedittext": "Used as error message. Parameters:\n* $1 - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description\nSee also:\n* {{msg-mw|Nocreatetext}}\n* {{msg-mw|Uploadnologintext}}\n* {{msg-mw|Loginreqpagetext}}",
        "confirmedittext": "Used as error message.",
        "saveprefs": "Button for saving changes in the preferences page.\n\nSee also:\n* {{msg-mw|Saveprefs}}\n* {{msg-mw|Accesskey-preferences-save}}\n* {{msg-mw|Tooltip-preferences-save}}\n{{Identical|Save}}",
        "restoreprefs": "Used as link text in [[Special:Preferences]]. The link points to [[Special:Preferences/reset]] which shows the \"Restore all default settings\" form.\n\nAlso used as label for the Submit button in [[Special:Preferences/reset]].",
        "prefs-editing": "Title of a tab in [[Special:Preferences]].\nWhen changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.\n{{Identical|Editing}}",
-       "rows": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Row}}",
-       "columns": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Column}}",
        "searchresultshead": "Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.\n\n{{Identical|Search}}",
        "stub-threshold": "Used in [[Special:Preferences]], \"Advanced options\" section. The setting allows the user to select a threshold value, in bytes, from a predefined list of options. Any links that lead to pages smaller than the threshold (\"stub links\") will be styled differently.\n\nParameters:\n* $1: the text of {{msg-mw|stub-threshold-sample-link}}, styled as a stub link",
        "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.\n{{Identical|Sample}}",
        "right-reupload": "{{doc-right|reupload}}\nThe right to upload a file under a file name that already exists.\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload-own}}\n* {{msg-mw|right-reupload-shared}}",
        "right-reupload-own": "{{doc-right|reupload-own}}\nRight to upload a file under a file name that already exists, and that the same user has uploaded.\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload}}",
        "right-reupload-shared": "{{doc-right|reupload-shared}}\nThe right to upload a file locally under a file name that already exists in a shared database (for example Commons).\n\nRelated messages:\n* {{msg-mw|right-upload}}\n* {{msg-mw|right-reupload}}",
-       "right-upload_by_url": "{{doc-right|upload by url}}",
+       "right-upload_by_url": "{{doc-right|upload_by_url}}",
        "right-purge": "{{doc-right|purge}}\nThe right to use <code>&action=purge</code> in the URL, without needing to confirm it (by default, anonymous users need to confirm it).",
        "right-autoconfirmed": "{{doc-right|autoconfirmed}}\nIf your account is older than [[mw:Manual:$wgAutoConfirmAge|wgAutoConfirmAge]] and if you have at least [[mw:Manual:$wgAutoConfirmCount|$wgAutoConfirmCount]] edits, you are in the '''group \"autoconfirmed\"''' (note that you can't see this group at [[Special:ListUsers]]).\nIf you are in that group, you have (by default) the '''right \"autoconfirmed\"''', which exempts you from certain rate limits (those based on your IP address or otherwise intended solely for new users). Other rate limits may still apply; see {{msg-mw|right-noratelimit}}.",
        "right-bot": "{{doc-right|bot}}",
        "grant-group-private-information": "{{Related|Grant-group}}",
        "grant-group-other": "{{Related|Grant-group}}",
        "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|Grant}}",
-       "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|Grant}}",
+       "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|Grant}}\n{{Identical|Create account}}",
        "grant-createeditmovepage": "Name for grant \"createeditmovepage\".\n{{Related|Grant}}",
        "grant-delete": "Name for grant \"delete\".\n{{Related|Grant}}",
        "grant-editinterface": "Name for grant \"editinterface\".\n\n\"JS\" stands for \"JavaScript\".\n{{Related|Grant}}",
        "action-upload": "{{Doc-action|upload}}",
        "action-reupload": "{{Doc-action|reupload}}",
        "action-reupload-shared": "{{Doc-action|reupload-shared}}",
-       "action-upload_by_url": "{{Doc-action|upload by url}}",
+       "action-upload_by_url": "{{Doc-action|upload_by_url}}",
        "action-writeapi": "{{Doc-action|writeapi}}\n\nAPI is an abbreviation for [[w:API|application programming interface]].",
        "action-delete": "{{Doc-action|delete}}",
        "action-deleterevision": "{{Doc-action|deleterevision}}",
+       "action-deletelogentry": "{{Doc-action|deletelogentry}}",
        "action-deletedhistory": "{{Doc-action|deletedhistory}}",
+       "action-deletedtext": "{{Doc-action|deletedtext}}",
        "action-browsearchive": "{{Doc-action|browsearchive}}",
        "action-undelete": "{{Doc-action|undelete}}",
        "action-suppressrevision": "{{Doc-action|suppressrevision}}",
        "action-userrights-interwiki": "{{Doc-action|userrights-interwiki}}",
        "action-siteadmin": "{{Doc-action|siteadmin}}",
        "action-sendemail": "{{doc-action|sendemail}}\n{{Identical|E-mail}}",
+       "action-editmyoptions": "{{Doc-action|editmyoptions}}",
        "action-editmywatchlist": "{{doc-action|editmywatchlist}}\n{{Identical|Edit your watchlist}}",
        "action-viewmywatchlist": "{{doc-action|viewmywatchlist}}\n{{Identical|View your watchlist}}",
        "action-viewmyprivateinfo": "{{doc-action|viewmyprivateinfo}}",
        "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
+       "rcfilters-activefilters": "Title for the filters selection showing the active filters.",
+       "rcfilters-restore-default-filters": "Label for the button that resets filters to defaults",
+       "rcfilters-clear-all-filters": "Title for the button that clears all filters",
+       "rcfilters-search-placeholder": "Placeholder for the filter search input.",
+       "rcfilters-invalid-filter": "A label for an invalid filter.",
+       "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
+       "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
+       "rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.",
+       "rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}",
+       "rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.",
+       "rcfilters-filter-unregistered-label": "Label for the filter for showing edits made by logged-out users.",
+       "rcfilters-filter-unregistered-description": " Description for the filter for showing edits made by logged-out users.",
+       "rcfilters-filtergroup-authorship": "Title for the filter group for edit authorship. This filter group allows the user to choose between \"Your own edits\" and \"Edits by others\". More info: https://phabricator.wikimedia.org/T149859\n\n{{doc-important|This is another typical example of ambiguity in the English language. Only the documentation will reveal that this message means \"(filter by) authorship of these edits\", not \"edit the authorship\". That is, \"edit\" is a modifying noun, not a verb.}}",
+       "rcfilters-filter-editsbyself-label": "Label for the filter for showing edits made by the current user.",
+       "rcfilters-filter-editsbyself-description": "Description for the filter for showing edits made by the current user.",
+       "rcfilters-filter-editsbyother-label": "Label for the filter for showing edits made by anyone other than the current user.",
+       "rcfilters-filter-editsbyother-description": "Description for the filter for showing edits made by anyone other than the current user.",
+       "rcfilters-filtergroup-userExpLevel": "Title for the filter group for user experience levels.",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Label for the filter for showing edits made by new editors.",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Description for the filter for showing edits made by new editors.",
+       "rcfilters-filter-userExpLevel-learner-label": "Label for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-userExpLevel-learner-description": "Description for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Label for the filter for showing edits made by experienced editors.",
+       "rcfilters-filter-userExpLevel-experienced-description": "Description for the filter for showing edits made by experienced editors.",
+       "rcfilters-filtergroup-automated": "Title for the filter group for editor automation type.",
+       "rcfilters-filter-bots-label": "Label for the filter for showing edits made by automated tools.\n{{Identical|Bot}}",
+       "rcfilters-filter-bots-description": "Description for the filter for showing edits made by automated tools.",
+       "rcfilters-filter-humans-label": "Label for the filter for showing edits made by human editors.",
+       "rcfilters-filter-humans-description": "Description for the filter for showing edits made by human editors.",
+       "rcfilters-filtergroup-significance": "Title for the filter group for edit significance.\n{{Identical|Significance}}",
+       "rcfilters-filter-minor-label": "Label for the filter for showing edits marked as minor.",
+       "rcfilters-filter-minor-description": "Description for the filter for showing edits marked as minor.",
+       "rcfilters-filter-major-label": "Label for the filter for showing edits not marked as minor.",
+       "rcfilters-filter-major-description": " Description for the filter for showing edits not marked as minor.",
+       "rcfilters-filtergroup-changetype": "Title for the filter group for edit type.",
+       "rcfilters-filter-pageedits-label": "Label for the filter for showing edits to existing pages.",
+       "rcfilters-filter-pageedits-description": "Description for the filter for showing edits to existing pages.",
+       "rcfilters-filter-newpages-label": "Label for the filter for showing edits that create a page.",
+       "rcfilters-filter-newpages-description": "Description for the filter for showing edits that create a page.",
+       "rcfilters-filter-categorization-label": "Label for the filter for showing edits adding or removing pages to categories.",
+       "rcfilters-filter-categorization-description": "Description for the filter for showing edits adding or removing pages to categories.",
+       "rcfilters-filter-logactions-label": "Label for the filter for showing logged actions.",
+       "rcfilters-filter-logactions-description": "Description for the filter for showing logged actions.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "uncategorizedimages-summary": "{{notranslate}}\nused in [[Special:Uncategorizedimages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "uncategorizedtemplates": "{{doc-special|UncategorizedTemplates}}",
        "uncategorizedtemplates-summary": "{{doc-specialpagesummary|uncategorizedtemplates}}",
+       "uncategorized-categories-exceptionlist": "{{optional}}\nSystem message used as a list of exceptions for Special:UncategorizedCategories.",
        "unusedcategories": "{{doc-special|UnusedCategories}}",
        "unusedcategories-summary": "{{doc-specialpagesummary|unusedcategories}}",
        "unusedimages": "{{doc-special|UnusedImages}}",
        "booksources-search": "Search button in [[Special:BookSources]]\n\n{{Identical|Search}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
-       "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.",
+       "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.\n\nSee [https://en.wikipedia.org/wiki/Help:Magic_links#RFC Help:Magic links] for more information on RFC magic links.",
        "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
        "magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
        "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "listgrouprights-summary": "The description used on [[Special:ListGroupRights]].\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrouprights-key": "Footer note for the [[Special:ListGroupRights]] page",
-       "listgrouprights-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}",
+       "listgrouprights-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}\n{{Related|Listgrouprights}}",
        "listgrouprights-rights": "The title of the column in the table, about user rights (like you can ''edit'' this page).\n{{Identical|Right}}",
        "listgrouprights-helppage": "The link used on [[Special:ListGroupRights]]. Just translate \"Group rights\", and '''leave the \"Help:\" namespace exactly as it is'''.",
        "listgrouprights-members": "Used on [[Special:ListGroupRights]] and [[Special:Statistics]] as a link to [[Special:ListUsers|Special:ListUsers/\"group\"]], a list of members in that group.",
        "listgrouprights-right-display": "{{optional}}\nParameters:\n* $1 - the text from the \"right-...\" messages, i.e. {{msg-mw|Right-edit}}\n* $2 - the codename of this right",
        "listgrouprights-right-revoked": "{{optional}}\nParameters:\n* $1 - the text from the \"right-...\" messages, i.e. {{msg-mw|Right-edit}}\n* $2 - the codename of this right",
-       "listgrouprights-addgroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-removegroup}}",
+       "listgrouprights-addgroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-removegroup}}\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - an enumeration of group names\n* $2 - the number of group names in $1\nSee also:\n* {{msg-mw|listgrouprights-addgroup}}",
        "listgrouprights-addgroup-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
-       "listgrouprights-addgroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1",
-       "listgrouprights-removegroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1",
+       "listgrouprights-addgroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1\n{{Related|Listgrouprights}}",
+       "listgrouprights-removegroup-self": "This is an individual right for groups, used on [[Special:ListGroupRights]].\n* $1 - the group names\n* $2 - the number of group names in $1\n{{Related|Listgrouprights}}",
        "listgrouprights-addgroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-removegroup-self-all": "Used on [[Special:ListGroupRights]].\n{{Related|Listgrouprights}}",
        "listgrouprights-namespaceprotection-header": "Shown on [[Special:ListGroupRights]] as the header for the namespace restrictions table.",
        "emailccsubject": "Used in [[Special:EmailUser]].\n\nSubject of the carbon-copied email for the sender sent through MediaWiki.\n\nParameters:\n* $1 - target username\n* $2 - email subject",
        "emailsent": "Title of [[Special:EmailUser]] when it says you it sent an email",
        "emailsenttext": "Confirmation page: when you send an email, [[Special:EmailUser]] says you this (Your email has been sent).\n\nParameters:\n* $1 - (Optional) the recipient's username, for local customizations",
-       "emailuserfooter": "This message is appended to every email sent through the \"Email user\" function. Parameters:\n* $1 - username of the sender\n* $2 - username of the recipient",
+       "emailuserfooter": "This message is appended to every email sent through the \"Email user\" function. Parameters:\n* $1 - username of the sender\n* $2 - username of the recipient\n\n{{doc-singularthey}}",
        "usermessage-summary": "This message is used as an edit summary for any message that is posted because of a system event. Translate \"leaving a message\" in the sense of: to give a message to someone; to deliver a message somewhere; to deposit.",
        "usermessage-editor": "The user name for the user that is the editor of system messages. See [{{canonicalurl:Thread:Support/Message_info_please}} discussion on Support].",
        "usermessage-template": "{{optional}}",
        "removedwatchtext": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext}}\n* {{msg-mw|Removedwatchtext-talk}}",
        "removedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext-talk}}\n* {{msg-mw|Removedwatchtext}}",
        "removedwatchtext-short": "Explanation shown when unwatching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Addedwatchtext-short}}.\n* {{msg-mw|Removedwatchtext}}.",
-       "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
+       "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}\n{{Identical|Watch}}",
        "watchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Unwatchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}\n{{Identical|Watch this page}}",
        "unwatch": "{{doc-actionlink}}\nLabel of \"Unwatch\" tab.\n\nSee also:\n* {{msg-mw|Unwatch}}\n* {{msg-mw|Accesskey-ca-unwatch}}\n* {{msg-mw|Tooltip-ca-unwatch}}",
        "unwatchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Watchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}",
        "sorbs": "{{optional}}",
        "sorbsreason": "See also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
        "sorbs_create_account_reason": "Used in [[Special:UserLogin]] when creating an account.\n\nSee also:\n* {{msg-mw|Sorbsreason}}\n* {{msg-mw|Sorbs create account_reason}}",
+       "softblockrangesreason": "This text is shown to the user as a block reason and describes that the user is being blocked because the user is not logged in and their IP is in [[mw:Special:MyLanguage/Manual:$wgSoftBlockRanges|$wgSoftBlockRanges]].\n\nParameters:\n* $1 - The IP address that is blocked.",
        "xffblockreason": "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:\n* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
        "cant-see-hidden-user": "Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.",
        "ipbblocked": "Error message shown when a user tries to alter block settings when they are themselves blocked.",
        "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-subpages": "Used as an error message.",
+       "namespace-nosubpages": "Used as an error message. Parameters:\n* $1 - Namespace name.",
        "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "pageinfo-length": "The length of the page, in bytes.",
        "pageinfo-article-id": "The numeric identifier of the page.\n{{Identical|Page ID}}",
        "pageinfo-language": "Language in which the page content is written.",
+       "pageinfo-language-change": "Link text for a link to Special:PageLanguage. The link will be wrapped in parenthesis.\n{{Identical|Change}}",
        "pageinfo-content-model": "The model in which the page content is written.\n\nUsed as label at [{{fullurl:Main Page|action=info}} action=info]. Followed by one of the following messages:\n* {{msg-mw|Content-model-wikitext}}\n* {{msg-mw|Content-model-javascript}}\n* {{msg-mw|Content-model-css}}\n* {{msg-mw|Content-model-text}}",
        "pageinfo-content-model-change": "Link text for a link to Special:ChangeContentModel. The link will be wrapped in parenthesis.\n{{Identical|Change}}",
        "pageinfo-robot-policy": "The search engine status of the page.\n\nUsed as label. Followed by any one of the following messages:\n*{{msg-mw|Pageinfo-robot-index}}\n*{{msg-mw|Pageinfo-robot-noindex}}",
        "feedback-useragent": "A label denoting the user agent in the feedback that is posted to the feedback page.\n{{Identical|User agent}}",
        "searchsuggest-search": "Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)\n{{Identical|Search}}",
        "searchsuggest-containing": "Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.",
-       "api-error-autoblocked": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Autoblockedtext}}.",
-       "api-error-badaccess-groups": "API error message that can be used for client side localisation of API errors.",
        "api-error-badtoken": "API error message that can be used for client side localisation of API errors.",
-       "api-error-blocked": "API error message that can be used for client side localisation of API errors.",
-       "api-error-copyuploaddisabled": "API error message that can be used for client side localisation of API errors.",
-       "api-error-duplicate": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
-       "api-error-duplicate-archive": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 - a number of files",
-       "api-error-empty-file": "API error message that can be used for client side localisation of API errors.",
        "api-error-emptypage": "API error message that can be used for client side localisation of API errors.",
-       "api-error-fetchfileerror": "API error message that can be used for client side localisation of API errors.",
-       "api-error-fileexists-forbidden": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - filename\nSee also:\n* {{msg-mw|Api-error-fileexists-shared-forbidden}}",
-       "api-error-fileexists-shared-forbidden": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - filename\nSee also:\n* {{msg-mw|Api-error-fileexists-forbidden}}",
-       "api-error-file-too-large": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filename-tooshort": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filetype-banned": "API error message that can be used for client side localisation of API errors.",
-       "api-error-filetype-banned-type": "API error message that can be used for client side localisation of API errors.\n\n* $1 is the extension(s) of the file which cannot be uploaded\n* $2 is the list of file extensions that can be uploaded (Example: ''png, gif, jpg, jpeg, ogg, pdf, svg.'')\n* $3 is the number of allowed file formats (to be used for the PLURAL function)\n* $4 is the number of extensions that could not be uploaded (to be used for the PLURAL function)",
-       "api-error-filetype-missing": "The word \"extension\" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.",
-       "api-error-hookaborted": "The word \"extension\" here refers to a [[:mw:Manual:Extensions|MediaWiki Extension]] which extends the functionality of the basic wiki by adding something to its capabilities. \"… aborted by an extension\" implies that an operation could not be performed successfully or was not allowed to continue to its intended end.",
-       "api-error-http": "API error message that can be used for client side localisation of API errors.",
-       "api-error-illegal-filename": "API error message that can be used for client side localisation of API errors.",
-       "api-error-internal-error": "API error message that can be used for client side localisation of API errors.",
-       "api-error-invalid-file-key": "API error message that can be used for client side localisation of API errors.",
-       "api-error-missingparam": "API error message that can be used for client side localisation of API errors.",
-       "api-error-missingresult": "API error message that can be used for client side localisation of API errors.",
-       "api-error-mustbeloggedin": "API error message that can be used for client side localisation of API errors.",
-       "api-error-mustbeposted": "API error message that can be used for client side localisation of API errors.",
-       "api-error-noimageinfo": "API error message that can be used for client side localisation of API errors.",
-       "api-error-nomodule": "API error message that can be used for client side localisation of API errors.",
-       "api-error-ok-but-empty": "API error message that can be used for client side localisation of API errors.",
-       "api-error-overwrite": "API error message that can be used for client side localisation of API errors.",
-       "api-error-ratelimited": "API error message that can be used for client side localisation of API errors.\n\nCf. {{msg-mw|Actionthrottledtext}}",
-       "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-publishfailed": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stasherror": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashedfilenotfound": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashpathinvalid": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashfilestorage": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashzerolength": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashnotloggedin": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashwrongowner": "API error message that can be used for client side localisation of API errors.",
-       "api-error-stashnosuchfilekey": "API error message that can be used for client side localisation of API errors.",
-       "api-error-timeout": "API error message that can be used for client side localisation of API errors.",
-       "api-error-unclassified": "API error message that can be used for client side localisation of API errors.",
-       "api-error-unknown-code": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - may contain more error details\n{{Identical|Unknown error}}",
-       "api-error-unknown-error": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-unknown-warning": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 is an unknown warning.",
        "api-error-unknownerror": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - an unknown error message\n{{Identical|Unknown error}}",
-       "api-error-uploaddisabled": "API error message that can be used for client side localisation of API errors.",
-       "api-error-verification-error": "The word \"extension\" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.",
-       "api-error-was-deleted": "API error message that can be used for client side localisation of API errors.",
        "duration-seconds": "Used as duration. Parameters:\n* $1 - number of seconds\n{{Related|Duration}}\n{{Identical|Second}}",
        "duration-minutes": "Used as duration. Parameters:\n* $1 - number of minutes\n{{Related|Duration}}\n{{Identical|Minute}}",
        "duration-hours": "Used as duration. Parameters:\n* $1 - number of hours\n{{Related|Duration}}\n{{Identical|Hour}}",
        "pagelang-language": "Language selector label for Special:PageLanguage\n{{Identical|Language}}",
        "pagelang-use-default": "Radio label for selector on Special:PageLanguage for default language",
        "pagelang-select-lang": "Radio label for selector on Special:PageLanguage for language selection\n{{Identical|Select language}}",
+       "pagelang-reason": "Input label for reason on Special:PageLanguage\n\n{{Identical|Reason}}",
        "pagelang-submit": "Submit button label for Special:PageLanguage form\n{{Identical|Submit}}",
+       "pagelang-nonexistent-page": "Error message shown when the page the user is trying to change the language on does not exist.\n\nParameters:\n* $1 - the title of the nonexistent page",
+       "pagelang-unchanged-language": "Error message shown when the language the user is trying to change the page to and the current language the page is in are the same.\n\nParameters:\n* $1 - the title of the target page\n* $2 - the current language of the page",
+       "pagelang-unchanged-language-default": "Error message shown when the language the user is trying to set a page to fall back to the wiki's default content language, but the page is already set to do so.\n\nParameters:\n* $1 - the title of the target page",
+       "pagelang-db-failed": "Error message shown when the database fails to update the language of the page",
        "right-pagelang": "{{Doc-right|pagelang}}\nRight to change page language on Special:PageLanguage",
        "action-pagelang": "{{Doc-action|pagelang}}",
        "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.",
        "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}}",
        "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)."
+       "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
+       "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."
 }
index f6a017d..62f7dec 100644 (file)
        "botpasswords-label-grants": "Permisiuni aplicabile:",
        "botpasswords-label-grants-column": "Permise",
        "botpasswords-bad-appid": "Numele de robot „$1” nu este valid.",
+       "botpasswords-created-title": "Parola de robot a fost creată",
        "resetpass_forbidden": "Parolele nu pot fi schimbate.",
+       "resetpass_forbidden-reason": "Parolele nu pot fi schimbate: $1",
        "resetpass-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "resetpass-submit-loggedin": "Modifică parola",
        "resetpass-submit-cancel": "Revocare",
        "grant-generic": "set de permisiuni „$1”",
        "grant-group-page-interaction": "Interacționează cu paginile",
        "grant-group-file-interaction": "Interacționează cu conținut media",
+       "grant-group-email": "Trimite e-mail",
+       "grant-createaccount": "Creare conturi",
+       "grant-createeditmovepage": "Creează, editează și redenumește pagini",
        "grant-highvolume": "Volum mare de editare",
        "grant-oversight": "Ascunde utilizatori și suprimă versiuni",
        "grant-patrol": "Patrulează schimbările paginilor",
        "action-writeapi": "utilizați scrierea prin API",
        "action-delete": "ștergeți această pagină",
        "action-deleterevision": "ștergeți această versiune",
-       "action-deletedhistory": "vizualizați istoricul șters al acestei pagini",
+       "action-deletelogentry": "ștergeți înregistrări din jurnal",
+       "action-deletedhistory": "vizualizați istoricul șters a unei pagini",
        "action-browsearchive": "căutați pagini șterse",
        "action-undelete": "recuperați această pagină",
-       "action-suppressrevision": "revizuiți și să restaurați această versiune ascunsă",
+       "action-suppressrevision": "revizuiți și să restaurați versiuni ascunse",
        "action-suppressionlog": "vizualizați acest jurnal privat",
        "action-block": "blocați permisiunea de modificare a acestui utilizator",
        "action-protect": "modificați nivelurile de protecție pentru această pagină",
        "recentchangeslinked-page": "Numele paginii:",
        "recentchangeslinked-to": "Arată în schimb modificările asupra paginilor care se leagă de pagina indicată",
        "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă [[Special:WhatLinksHere/$1|{{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}}]] au fost adăugate în categorii",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] a fost adăugată în categorie, [[Special:WhatLinksHere/$1|această pagină este inclusă în alte pagini]]",
        "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] a fost eliminată din categorie, [[Special:WhatLinksHere/$1|această pagină este inclusă în alte pagini]]",
        "autochange-username": "Modificare automată a MediaWiki",
        "upload": "Încărcare fișier",
        "uploadbtn": "Încarcă fișier",
        "apisandbox-results-fixtoken-fail": "Imposibil de recuperat jetonul „$1”.",
        "apisandbox-alert-page": "Câmpurile de pe această pagină nu sunt valide.",
        "apisandbox-alert-field": "Valoare acestui câmp nu este validă.",
+       "apisandbox-continue": "Continuă",
        "booksources": "Surse de cărți",
        "booksources-search-legend": "Căutare surse pentru cărți",
        "booksources-search": "Caută",
        "logentry-contentmodel-change-revert": "revenire",
        "protectlogpage": "Jurnal protecții",
        "protectlogtext": "Mai jos se află o listă cu schimbări în ceea ce privește protejarea paginilor.\nConsultați [[Special:ProtectedPages|indexul paginilor protejate]] pentru o listă cu protecțiile în vigoare.",
-       "protectedarticle": "a protejat \"[[$1]]\"",
+       "protectedarticle": "a protejat „[[$1]]”",
        "modifiedarticleprotection": "schimbat nivelul de protecție pentru \"[[$1]]\"",
        "unprotectedarticle": "a eliminat protecția pentru „[[$1]]”",
        "movedarticleprotection": "setările de protecție au fost mutate de la „[[$2]]” la „[[$1]]”",
+       "protectedarticle-comment": "A protejat „[[$1]]”",
+       "unprotectedarticle-comment": "A eliminat protecția pentru „[[$1]]”",
        "protect-title": "Protejare „$1”",
        "protect-title-notallowed": "Vizualizare nivel de protecție pentru „$1”",
        "prot_1movedto2": "a mutat [[$1]] la [[$2]]",
        "htmlform-user-not-exists": "<strong>$1</strong> nu există.",
        "htmlform-user-not-valid": "<strong>$1</strong> nu este un nume de utilizator valid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a șters}} pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|a șters}} pagina de redirecționare $3 prin suprascriere",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restaurat}} pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4",
index 807ced9..026e178 100644 (file)
@@ -47,6 +47,7 @@
        "tog-watchlistreloadautomatically": "Recareche automaticamende l'eleghe de le pàggene condrollate quanne cange 'nu filtre (richieste Javascript)",
        "tog-watchlisthideanons": "Scunne le cangiaminde de l'utinde scanusciute da l'elenghe de le pàggene condrollate",
        "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate",
+       "tog-watchlisthidecategorization": "Scunne 'a categorizzazzione d'a vôsce",
        "tog-ccmeonemails": "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
        "tog-diffonly": "No fà vedè le pàggene cu le condenute sotte a le differenze",
        "tog-showhiddencats": "Fa vedè le categorije scunnute",
        "talk": "'Ngazzaminde",
        "views": "Visite",
        "toolbox": "Struminde",
+       "tool-link-userrights": "Cange le gruppe {{GENDER:$1|utinde}}",
+       "tool-link-userrights-readonly": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
+       "tool-link-emailuser": "Manne 'na mail a stu {{GENDER:$1|utende}}",
        "userpage": "Vide a pàgene de l'utende",
        "projectpage": "Vide a pàgene de le pruggette",
        "imagepage": "Vide a pàgene de le file",
        "userlogin-remembermypassword": "Arrecuèrdeme",
        "userlogin-signwithsecure": "Ause 'na connessione secure",
        "cannotlogin-title": "Non ge puè trasé",
+       "cannotcreateaccount-title": "Non ge pué ccrejà le cunde utinde",
        "yourdomainname": "'U nome d'u dominie tue:",
        "password-change-forbidden": "Non ge puè cangià le passuord sus a sta uicchi.",
        "externaldberror": "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
        "eauthentsent": "'N'e-mail de conferme ha state mannate a l'indirizze ca tu è ditte.\nApprime ca otre e-mail avènene mannate a 'u cunde tune, tu ha seguì le 'struzione ca stonne jndr'à l'e-mail, pe confermà ca 'u cunde jè une de le tune.",
        "throttled-mailpassword": "'Nu arrecordatore de passuord ha stete già mannate jndr'à {{PLURAL:$1|l'urtema ore|l'urteme $1 ore}}.\nPe prevenì l'abbuse, sulamende 'nu arrecordatore de passuord avene mannate ogne {{PLURAL:$1|ore|$1 ore}}.",
        "mailerror": "Errore mannanne 'a mail: $1",
-       "acct_creation_throttle_hit": "Le visitature de sta Uicchi ca stonne ausene stu indirizze IP onne ccrejete {{PLURAL:$1|'nu cunde utende|$1 cunde utinde}} jndr'à l'urteme giurne, e onne raggiunde 'u numere massime ca se pò fà jndr'à stu periode.\n'U resultete jè ca le visitature ca stonne ausene stu indirizze IP non ge ponne ccrejà otre cunde utinde nuève jndr'à stu mumende.",
+       "acct_creation_throttle_hit": "Le visitature de sta Uicchi ca stonne ausene stu indirizze IP onne ccrejate {{PLURAL:$1|'nu cunde utende|$1 cunde utinde}} jndr'à l'urteme $2, e onne raggiunde 'u numere massime ca se pò fà jndr'à stu periode.\n'U resultate éte ca le visitature ca stonne ausene stu indirizze IP non ge ponne ccrejà otre cunde utinde nuève jndr'à stu mumende.",
        "emailauthenticated": "L'indirizze e-mail ca ne date ha state confermate 'u sciurne $2 a le $3.",
        "emailnotauthenticated": "L'indirizze e-mail tune non g'a state angore confermate.\nNisciuna mail t'avène mannate pe tutte le seguende dettaglie.",
        "noemailprefs": "Specifiche 'n'indirizze e-mail pe ste dettaglie ca onne essere fatiete.",
        "createacct-another-realname-tip": "'U nome vere jè facoltative.\nCe tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fatìe de l'utende.",
        "pt-login": "Tràse",
        "pt-login-button": "Tràse",
+       "pt-login-continue-button": "Condinue a trasé",
        "pt-createaccount": "Ccreje 'nu cunde utende",
        "pt-userlogout": "Isse",
        "php-mail-error-unknown": "Errore scanusciute jndr'à funzione PHP mail()",
        "resetpass_submit": "'Mboste 'a passuord e colleghete",
        "changepassword-success": "'A password toje ha state cangiate!",
        "changepassword-throttled": "Tu è pruvate 'nu sacche de vote a trasè.\nPe piacere aspitte $1 apprime de pruvà arrete.",
+       "botpasswords": "Password d'u bot",
+       "botpasswords-label-appid": "Nome d'u bot:",
+       "botpasswords-label-create": "Ccreje",
+       "botpasswords-label-update": "Aggiorne",
+       "botpasswords-label-cancel": "Annulle",
+       "botpasswords-label-delete": "Scangìlle",
+       "botpasswords-label-resetpassword": "Azzere 'a passuord",
        "resetpass_forbidden": "Le Password non ge ponne cangià",
        "resetpass-no-info": "Tu a essere colleghete pe accedere a sta pàgene direttamende.",
        "resetpass-submit-loggedin": "Cange 'a password",
        "resetpass-submit-cancel": "Annulle",
-       "resetpass-wrong-oldpass": "'A password temboranea o quedda corrende jè invalide.\nPò essere ca tu è già cangete 'a password toje o è richieste una temboranea nove.",
+       "resetpass-wrong-oldpass": "'A password temboranée o quedda corrende non g'è valide.\nPò essere ca tu è già cangiate 'a password toje o n'è cercate una nove temboranée.",
        "resetpass-recycled": "Pe piacere azzere 'a password toje cu 'n'otra password deverse da quedde de mò.",
        "resetpass-temp-emailed": "Tu è trasute cu 'nu codece email tembaranèe.\nPe spiccià de trasè, tu ha 'mbostà 'na password nove aqquà:",
        "resetpass-temp-password": "Password temboranea:",
        "passwordreset-emailtext-ip": "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
-       "passwordreset-emailsentemail": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "accmailtext": "'A passuord ccrejate a uecchije pe [[User talk:$1|$1]] ha state mannate sus a $2.\n\n'A passuord pe stu cunde utende pò essere cangiate sus a pàgene ''[[Special:ChangePassword|cange passuord]]'' 'na vote ca è trasute.",
        "newarticle": "(Nuève)",
        "newarticletext": "Tu ste segue 'nu collegamende a pàgene ca angore non g'esiste.\nPe ccrejà 'a pàgene, accuminze a scrivere jndr'à 'u scatole de sotte (vide 'a [$1 pàggene d'ajute] pe avè cchiù 'mbormaziune).\nCe tu te iacche aqquà e manghe tu 'u se purcè, allore cazze 'u buttone '''back''' d'u brauser.",
-       "anontalkpagetext": "----''Queste jè 'na pàgene de 'ngazzaminde pe 'n'utende anonime, ca non ge vò ccu ccreje angore 'nu cunde utende, o de ce non g'u use.\nNuje auseme 'n'indirizze IP (ca jè numereche) pe identificarle.\nE' normale ca essende 'n'indirizze IP pò essere ausete pure da otre utinde ca 'u pigghiene.\nCe tu non ge si 'n'utende anonime e pinze ca le commende ca so revolte a te sonde studecarije, pe piacere [[Special:CreateAccount|ccreje 'nu cunde utende]] o [[Special:UserLogin|tràse]] pe no fà confusione jndr'à 'u future cu otre utinde anoneme.''",
+       "anontalkpagetext": "----\n<em>Queste jè 'na pàgene de 'ngazzaminde pe 'n'utende anonime, ca non ge vò ccu ccreje angore 'nu cunde utende, o de ce non g'u use.</em>\nNuje ausame 'n'indirizze IP (ca éte numereche) pe identificarle.\nE' normale ca pu fatte ca 'n'indirizze IP pò essere ausate pure da otre utinde ca 'u pigghiane.\nCe tu non ge si 'n'utende anonime e pinze ca le commende ca te arrivane sonde studecarije, pe piacere [[Special:CreateAccount|ccreje 'nu cunde utende]] o [[Special:UserLogin|tràse]] pe no fà confusione jndr'à 'u future cu otre utinde anoneme.",
        "noarticletext": "Non ge stè scritte ninde jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titole]] jndr'à otre pàggene, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche l'archivije sue] o [{{fullurl:{{FULLPAGENAME}}|action=edit}} ccreje sta pàgene]</span>.",
        "noarticletext-nopermission": "Pe mò non ge stè teste jndr'à sta pàgene.\nTu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titole]] jndr'à otre pàggene,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>, ma non ge tìne le permesse pe ccrejà sta pàgene.",
        "missing-revision": "'A revisione #$1 d'a pàgene chiamate \"{{FULLPAGENAME}}\" non g'esiste.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "userpage-userdoesnotexist": "'U cunde utende \"<nowiki>$1</nowiki>\" non g'è reggistrete.\nPe piacere, condrolle ce tu vuè cu ccreje/cange sta pàgene.",
        "userpage-userdoesnotexist-view": "'U cunde utende \"$1\" non g'è reggistrate.",
        "blocked-notice-logextract": "Stu utende jè correndemende bloccate.<br />\nL'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
-       "clearyourcache": "'''Vide Bbuene''' - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.\n*'''Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);\n*'''Google Chrome:''' cazze ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus a 'nu Mac)\n*'''Internet Explorer:''' cazze ''Ctrl'' e condemboraneamende cazze ''Aggiorna,'' o cazze ''Ctrl-F5''.\n*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tarandine);",
+       "clearyourcache": "<strong>Vide Bbuene</strong> - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.\n*<strong>Firefox / Safari:</strong> cazze 'u <em>Shift</em> e condemboraneamende cazze 'u buttone <em>Aggiorne</em>, o cazze 'nzieme <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> sus a 'nu Mac);\n*<strong>Google Chrome:</strong> cazze <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> sus a 'nu Mac)\n*<strong>Internet Explorer:</strong> cazze ''Ctrl'' e condemboraneamende cazze <em>Aggiorne</em> o cazze <em>Ctrl-F5</em>.\n*<strong>Opera:</strong> pulizze 'a cache da <em>Tools → Preferences</em> (in inglese) (Struminde - Preferenze in tarandine);",
        "usercssyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
        "userjsyoucanpreview": "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
        "usercsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''\n'''Non g'à state angore reggistrete ninde!'''",
        "editusergroup": "Cange le gruppe utinde",
        "editinguser": "Stè cange le deritte de {{GENDER:$1|l'utende}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Cange le gruppe d'utinde",
+       "userrights-viewusergroup": "'Ndruche le gruppe d'utinde",
        "saveusergroups": "Reggistre le gruppe d'utinde",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre imblicite de:",
        "apisandbox-examples": "Esembie",
        "apisandbox-results": "Resultate",
        "apisandbox-request-url-label": "URL richieste:",
-       "apisandbox-request-time": "Tiembe cercate: $1",
+       "apisandbox-request-time": "Tiembe cercate: {{PLURAL:$1|$1 ms}}",
        "booksources": "Sorgende de le libbre",
        "booksources-search-legend": "Cirche pe le fonde de le libbre",
        "booksources-isbn": "ISBN:",
        "tags-actions-header": "Aziune",
        "tags-active-yes": "Sìne",
        "tags-active-no": "None",
-       "tags-source-extension": "Definite da 'n'estenzione",
+       "tags-source-extension": "Definite da 'u softuer",
        "tags-source-manual": "Applicate a màne da l'utinde e da le bot",
        "tags-source-none": "No cchiù ausate",
        "tags-edit": "cange",
        "tags-delete-not-allowed": "Tag definite da 'n'estenzione non ge ponne essere scangellate senze ca l'estenzione specifiche 'u permette.",
        "tags-delete-not-found": "'U tag \"$1\" non g'esiste.",
        "tags-delete-too-many-uses": "'U tag \"$1\" jè applecate a cchiù de $2 {{PLURAL:$2|revisione|revisiune}}, ca signifeche ca non ge pò essere scangellate.",
-       "tags-delete-warnings-after-delete": "'U tag \"$1\" ha state scangellate, ma  {{PLURAL:$2|ha assute 'u seguende avvise|onne assute le seguende avvise}}:",
+       "tags-delete-warnings-after-delete": "'U tag \"$1\" ha state scangellate, ma {{PLURAL:$2|ha assute 'u seguende avvise|onne assute le seguende avvise}}:",
        "tags-activate-title": "Attive 'u tag",
        "tags-activate-question": "Tu ste attive 'u tag \"$1\".",
        "tags-activate-reason": "Mutive:",
        "tags-edit-revision-legend": "Aggiunge o live le tag da {{PLURAL:$1|sta revisione|tutte le $1 revisiune}}",
        "tags-edit-logentry-legend": "Aggiunge o live le tag da {{PLURAL:$1|sta vôsce de l'archivije|tutte le $1 vôsce de l'archivije}}",
        "tags-edit-existing-tags": "Tag esistende:",
-       "tags-edit-existing-tags-none": "\"Nisciune\"",
+       "tags-edit-existing-tags-none": "<em>isciune</em>",
        "tags-edit-new-tags": "Tag nuève:",
        "tags-edit-add": "Agigunge ste tag:",
        "tags-edit-remove": "Live ste tag:",
index e96b05f..6011dfb 100644 (file)
                        "Cat1987",
                        "SergeyButkov",
                        "Irus",
-                       "Kareyac"
+                       "Kareyac",
+                       "Mailman",
+                       "Аль-Гимравий",
+                       "Gamliel Fishkin"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "searcharticle": "Перейти",
        "history": "История",
        "history_short": "История",
+       "history_small": "история",
        "updatedmarker": "обновлено после моего последнего посещения",
        "printableversion": "Версия для печати",
        "permalink": "Постоянная ссылка",
        "pool-errorunknown": "Неизвестная ошибка",
        "pool-servererror": "Служба счётчика пула недоступна ($1).",
        "poolcounter-usage-error": "Ошибка использования: $1",
-       "aboutsite": "Описание {{grammar:genitive|{{SITENAME}}}}",
+       "aboutsite": "Описание {{GRAMMAR:prepositional|{{SITENAME}}}}",
        "aboutpage": "Project:Описание",
        "copyright": "Содержание доступно по лицензии $1 (если не указано иное).",
        "copyrightpage": "{{ns:project}}:Авторские права",
        "changepassword-success": "Ваш пароль был изменён!",
        "changepassword-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
        "botpasswords": "Пароли ботов",
-       "botpasswords-summary": "<em>Пароли бота</em> позволяют получить доступ к учётной записи пользователя через API без использования логина и пароля главной учётной записи. Права участника при входе с паролем бота могут быть ограничены.\n\nЕсли Вы не знаете, зачем вам это, вероятно, лучше этого не делайте. Никто никогда не должен просить вас, чтобы вы создали и сообщили его.",
+       "botpasswords-summary": "<em>Пароли бота</em> позволяют получить доступ к учётной записи пользователя через API без использования логина и пароля главной учётной записи. Права участника при входе с паролем бота могут быть ограничены.\n\nЕсли Вы не знаете, зачем это нужно, воздержитесь от использования этой страницы. Никто никогда не должен просить вас, чтобы вы создали и сообщили его.",
        "botpasswords-disabled": "Пароли бота отключены.",
        "botpasswords-no-central-id": "Для использования паролей бота вы должны войти в централизованную учётную запись.",
        "botpasswords-existing": "Существующие пароли бота",
        "blockedtitle": "Участник заблокирован",
        "blockedtext": "'''Ваша учётная запись или IP-адрес заблокированы.'''\n\nБлокировка произведена администратором $1.\nУказана следующая причина: «''$2''».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\nОбратите внимание, что не сможете использовать функцию «письмо участнику», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "autoblockedtext": "Ваш IP-адрес автоматически заблокирован в связи с тем, что он ранее использовался кем-то из участников, заблокированных {{GENDER:$4|участником|участницей}} $1. \nБыла указана следующая причина блокировки:\n\n: «$2».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\n\nОбратите внимание, что не сможете использовать функцию «письмо участнику», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\n\nВаш IP-адрес — $3, идентификатор блокировки — #$5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
+       "systemblockedtext": "Ваше имя участника или IP-адрес были автоматически заблокированы MediaWiki.\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
        "blockednoreason": "причина не указана",
        "whitelistedittext": "Вы должны $1 для изменения страниц.",
        "confirmedittext": "Вы должны подтвердить свой адрес электронной почты перед правкой страниц.\nПожалуйста, введите и подтвердите свой адрес электронной почты в своих [[Special:Preferences|персональных настройках]].",
        "rev-deleted-user": "(имя автора стёрто)",
        "rev-deleted-event": "(детали журнала удалены)",
        "rev-deleted-user-contribs": "[имя участника или IP-адрес удалены — правка скрыта со страницы вклада]",
-       "rev-deleted-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла '''Ñ\83далена'''.\nÐ\92озможно, Ð¾Ð±Ñ\8aÑ\8fÑ\81нениÑ\8f Ð´Ð°ны в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла <strong>Ñ\81кÑ\80Ñ\8bÑ\82а</strong>.\nÐ\9eбÑ\8aÑ\8fÑ\81нениÑ\8f Ñ\83далениÑ\8f приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
-       "rev-deleted-text-unhide": "Эта версия страницы была '''удалена'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть данную версию].",
-       "rev-suppressed-text-unhide": "Эта версия страницы была '''скрыта'''.\nОбъяснения приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть данную версию].",
-       "rev-deleted-text-view": "Эта версия страницы была '''удалена'''.\nВы можете просмотреть её. Объяснения удаления приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-text-view": "Эта версия страницы была '''скрыта'''.\nВы можете просмотреть её. Объяснения удаления приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
-       "rev-deleted-no-diff": "Вы не можете просмотреть эту разницу версий, так как одна из версий страницы была '''удалена'''.\nВозможно, подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-no-diff": "Вы не можете просмотреть различия между этими версиями страницы, так как одна из них была '''удалена'''.",
-       "rev-deleted-unhide-diff": "Одна из версий страницы была '''удалена'''.\nПодробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть разницу версий].",
-       "rev-suppressed-unhide-diff": "Одна из версий этого сравнения версий была '''скрыта'''.\nПодробности можно найти в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть эту разницу версий].",
-       "rev-deleted-diff-view": "Одна из версий этого сравнения версий была '''удалена'''.\nВы можете просмотреть это сравнение. Подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
-       "rev-suppressed-diff-view": "Одна из версий этого сравнения версий была '''скрыта'''.\nВы можете просмотреть это сравнение. Подробности можно найти в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла '''Ñ\83далена'''.\nÐ\9fодÑ\80обноÑ\81Ñ\82и Ð¿Ñ\80иведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-text-permission": "ЭÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±Ñ\8bла <strong>Ñ\81кÑ\80Ñ\8bÑ\82а</strong>.\nÐ\9fодÑ\80обноÑ\81Ñ\82и приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-text-unhide": "Эта версия страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть данную версию].",
+       "rev-suppressed-text-unhide": "Эта версия страницы была <strong>скрыта</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть данную версию].",
+       "rev-deleted-text-view": "Эта версия страницы была <strong>удалена</strong>.\nВы можете просмотреть её. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-text-view": "Эта версия страницы была <strong>скрыта</strong>.\nВы можете просмотреть её. Подробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
+       "rev-deleted-no-diff": "Вы не можете просмотреть эту разницу версий, так как одна из версий страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-no-diff": "Вы не можете просмотреть различия между этими версиями страницы, так как одна из них была <strong>удалена</strong>.",
+       "rev-deleted-unhide-diff": "Одна из версий страницы была <strong>удалена</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].\nПри желании вы можете [$1 просмотреть разницу версий].",
+       "rev-suppressed-unhide-diff": "Одна из версий этого сравнения версий была <strong>скрыта</strong>.\nПодробности приведены в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале сокрытий].\nПри желании вы можете [$1 просмотреть эту разницу версий].",
+       "rev-deleted-diff-view": "Одна из версий этого сравнения версий была <strong>удалена</strong>.\nВы можете просмотреть это сравнение. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
+       "rev-suppressed-diff-view": "Одна из версий этого сравнения версий была <strong>скрыта</strong>.\nВы можете просмотреть это сравнение. Подробности приведены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сокрытий].",
        "rev-delundel": "показать/скрыть",
        "rev-showdeleted": "показать",
        "revisiondelete": "Удалить / восстановить версии страницы",
        "revdelete-selected-text": "{{PLURAL:$1|Выбранная версия|Выбранные версии}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Выбранная версия файла|Выбранные версии файла}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|1=Выбранная запись|Выбранные записи}} журнала:",
-       "revdelete-text-text": "Удалённые версии будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
-       "revdelete-text-file": "Удалённые версии файла будут по-прежнему видны в истории страницы, но части их содержимого будут недоступны для участников.",
-       "logdelete-text": "УдалÑ\91ннÑ\8bе Ñ\81обÑ\8bÑ\82иÑ\8f Ð² Ð¶Ñ\83Ñ\80нале Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð²Ð¸Ð´Ð½Ñ\8b Ð² Ð¶Ñ\83Ñ\80налаÑ\85, Ð½Ð¾ части их содержимого будут недоступны для участников.",
+       "revdelete-text-text": "Удалённые версии будут по-прежнему видны в истории страницы, но определенные части их содержимого будут недоступны для участников.",
+       "revdelete-text-file": "Удалённые версии файла будут по-прежнему видны в истории страницы, но определенные части их содержимого будут недоступны для участников.",
+       "logdelete-text": "УдалÑ\91ннÑ\8bе Ñ\81обÑ\8bÑ\82иÑ\8f Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð²Ð¸Ð´Ð½Ñ\8b Ð² Ð¶Ñ\83Ñ\80налаÑ\85, Ð½Ð¾ Ð¾Ð¿Ñ\80еделеннÑ\8bе части их содержимого будут недоступны для участников.",
        "revdelete-text-others": "Другие администраторы по-прежнему будут иметь возможность доступа к скрытому содержимому и смогут восстановить его, если не установлены дополнительные ограничения.",
        "revdelete-confirm": "Пожалуйста, подтвердите, что вы действительно желаете совершить это действие, осознаёте последствия, делаете это в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].",
-       "revdelete-suppress-text": "Сокрытие может производиться '''только''' в следующих случаях:\n* Потенциально клеветническая информация\n* Неуместная личная информация\n*: ''домашний адрес, номера телефонов, номер паспорта и т. д.''",
+       "revdelete-suppress-text": "Сокрытие может производиться <strong>только</strong> в следующих случаях:\n* потенциально клеветническая информация\n* неуместная личная информация\n*: <em>домашний адрес, номера телефонов, номер паспорта и т. д.</em>",
        "revdelete-legend": "Установить ограничения:",
        "revdelete-hide-text": "Текст правки",
        "revdelete-hide-image": "Скрыть содержимое файла",
        "saveprefs": "Сохранить",
        "restoreprefs": "Восстановить настройки по умолчанию",
        "prefs-editing": "Редактирование",
-       "rows": "Строк:",
-       "columns": "Столбцов:",
        "searchresultshead": "Поиск",
        "stub-threshold": "Порог для определения оформления ссылок на заготовки ($1):",
        "stub-threshold-sample-link": "пример",
        "userrights-user-editname": "Введите имя учётной записи:",
        "editusergroup": "Загрузка групп участников",
        "editinguser": "Изменение прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Просмотр прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Изменение членства в группах",
+       "userrights-viewusergroup": "просмотр групп участника",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-groupsmember": "Состоит в группах:",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
        "right-createpage": "создание страниц, не являющихся обсуждениями",
        "right-createtalk": "создание страниц обсуждений",
        "right-createaccount": "создание новых учётных записей участников",
-       "right-autocreateaccount": "Ð\90втоматический вход с помощью внешней учётной записи участника",
+       "right-autocreateaccount": "автоматический вход с помощью внешней учётной записи участника",
        "right-minoredit": "простановка отметки «малое изменение»",
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
        "right-move-categorypages": "переименование страниц категорий",
        "right-movefile": "переименование файлов",
-       "right-suppressredirect": "пеÑ\80еименование Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð±ÐµÐ· Ñ\81озданиÑ\8f Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f Ñ\81о Ñ\81Ñ\82аÑ\80ого Ð¸Ð¼ÐµÐ½Ð¸",
+       "right-suppressredirect": "подавление Ð¿ÐµÑ\80енапÑ\80авлений Ð¿Ñ\80и Ð¿ÐµÑ\80еименовании Ñ\81Ñ\82Ñ\80аниÑ\86",
        "right-upload": "загрузка файлов",
        "right-reupload": "запись файлов поверх существующих",
        "right-reupload-own": "перезапись файлов тем же участником",
        "right-reupload-shared": "подмена файлов из общих хранилищ локальными",
        "right-upload_by_url": "загрузка файлов с адреса URL",
-       "right-purge": "очистка кэша страниц без страницы подтверждения",
-       "right-autoconfirmed": "неÑ\82 Ð¾Ð³Ñ\80аниÑ\87ений Ð¿Ð¾ скорости на IP-адрес",
-       "right-bot": "считаться автоматическим процессом",
+       "right-purge": "очистка кэша страниц без подтверждения",
+       "right-autoconfirmed": "обÑ\85од Ð¾Ð³Ñ\80аниÑ\87ений скорости на IP-адрес",
+       "right-bot": "автоматический процесс",
        "right-nominornewtalk": "отсутствие малых правок на страницах обсуждений включает режим новых сообщений",
-       "right-apihighlimits": "меньше ограничений на выполнение API-запросов",
+       "right-apihighlimits": "уменьшение ограничений на выполнение API-запросов",
        "right-writeapi": "использование API для записи",
        "right-delete": "удаление страниц",
        "right-bigdelete": "удаление страниц с длинными историями изменений",
        "right-editmyusercss": "редактирование своих пользовательских CSS-файлов",
        "right-editmyuserjs": "редактирование своих пользовательских JavaScript-файлов",
        "right-viewmywatchlist": "просмотр своего списка наблюдения",
-       "right-editmywatchlist": "редактирование своего списка наблюдения; обратите внимание, что некоторые действия будут добавлять страницы даже без такого права",
+       "right-editmywatchlist": "редактирование своего списка наблюдения",
        "right-viewmyprivateinfo": "просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyprivateinfo": "правка собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "right-editmyoptions": "редактирование собственных предпочтений",
-       "right-rollback": "быстрый откат правок последнего участника на определенной странице",
+       "right-rollback": "быстрый откат правок последнего участника",
        "right-markbotedits": "отметка откатываемых правок как правок бота",
-       "right-noratelimit": "неÑ\82 Ð¾Ð³Ñ\80аниÑ\87ений Ð¿Ð¾ скорости",
+       "right-noratelimit": "обÑ\85од Ð¾Ð³Ñ\80аниÑ\87ений скорости",
        "right-import": "импорт страниц из других вики",
        "right-importupload": "импорт страниц через загрузку файлов",
-       "right-patrol": "оÑ\82меÑ\82ка Ð¿Ñ\80авок ÐºÐ°Ðº Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bÑ\85",
-       "right-autopatrol": "пÑ\80авки Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ñ\82меÑ\87аÑ\8eÑ\82Ñ\81Ñ\8f ÐºÐ°Ðº Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе",
+       "right-patrol": "паÑ\82Ñ\80Ñ\83лиÑ\80ование Ð¿Ñ\80авок",
+       "right-autopatrol": "авÑ\82омаÑ\82иÑ\87еÑ\81кое Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80ование Ð¿Ñ\80авок",
        "right-patrolmarks": "просмотр отметок о патрулировании в свежих правках",
        "right-unwatchedpages": "просмотр списка ненаблюдаемых страниц",
        "right-mergehistory": "объединение историй страниц",
        "grant-basic": "Основные права",
        "grant-viewdeleted": "Просмотр удалённых файлов и страниц",
        "grant-viewmywatchlist": "Просмотр вашего списка наблюдения",
-       "grant-viewrestrictedlogs": "СмоÑ\82Ñ\80еÑ\82Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81и Ð¶Ñ\83Ñ\80нала с ограниченным доступом",
+       "grant-viewrestrictedlogs": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð·Ð°Ð¿Ð¸Ñ\81ей Ð¶Ñ\83Ñ\80налов с ограниченным доступом",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
        "action-upload_by_url": "загрузку этого файла с адреса URL",
        "action-writeapi": "использование API для правок",
        "action-delete": "удаление этой страницы",
-       "action-deleterevision": "удаление этой версии страницы",
-       "action-deletedhistory": "просмотр удалённой истории этой страницы",
+       "action-deleterevision": "удаление версий страниц",
+       "action-deletelogentry": "удаление записей журнала",
+       "action-deletedhistory": "просмотр удалённой истории страницы",
+       "action-deletedtext": "просмотр текста удалённой версии",
        "action-browsearchive": "поиск удалённых страниц",
-       "action-undelete": "воÑ\81Ñ\81Ñ\82ановление Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
-       "action-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð¸ Ð²Ð¾Ñ\81Ñ\81Ñ\82ановление Ñ\8dÑ\82ой Ñ\81кÑ\80Ñ\8bÑ\82ой Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b",
-       "action-suppressionlog": "пÑ\80оÑ\81моÑ\82Ñ\80 Ñ\8dÑ\82ого Ñ\87аÑ\81Ñ\82ного Ð¶Ñ\83Ñ\80нала",
-       "action-block": "огÑ\80аниÑ\87иваÑ\82Ñ\8c Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ñ\80едакÑ\82иÑ\80ованиÑ\8f Ð´Ð»Ñ\8f Ñ\8dÑ\82ого участника",
+       "action-undelete": "воÑ\81Ñ\81Ñ\82ановление Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "action-suppressrevision": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð¸ Ð²Ð¾Ñ\81Ñ\81Ñ\82ановление Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8bÑ\85 Ð²ÐµÑ\80Ñ\81ий Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "action-suppressionlog": "просмотр частного журнала",
+       "action-block": "блокиÑ\80овкÑ\83 участника",
        "action-protect": "изменение уровня защиты этой страницы",
-       "action-rollback": "быстрый откат изменений участника, который последним редактировал страницу",
+       "action-rollback": "быстрый откат изменений",
        "action-import": "импорт страниц из другой вики",
        "action-importupload": "импорт страниц из загруженного файла",
        "action-patrol": "отметка чужих правок как отпатрулированных",
        "action-autopatrol": "отметка своих правок как отпатрулированных",
        "action-unwatchedpages": "просмотр списка страниц, за которыми не следят",
        "action-mergehistory": "присоединение истории изменений этой страницы",
-       "action-userrights": "изменение Ð²Ñ\81еÑ\85 Ð¿Ñ\80ав Ñ\83Ñ\87аÑ\81Ñ\82ника",
+       "action-userrights": "изменение прав участника",
        "action-userrights-interwiki": "изменение прав участников в других вики",
-       "action-siteadmin": "блокировка и разблокировка базы данных",
+       "action-siteadmin": "блокировку и разблокировку базы данных",
        "action-sendemail": "отправка электронных писем",
+       "action-editmyoptions": "редактирование своих настроек",
        "action-editmywatchlist": "редактирование вашего списка наблюдения",
        "action-viewmywatchlist": "просмотр вашего списка наблюдения",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показать",
+       "rcfilters-activefilters": "Активные фильтры",
+       "rcfilters-restore-default-filters": "Восстановить фильтры по умолчанию",
+       "rcfilters-clear-all-filters": "Очистить все фильтры",
+       "rcfilters-search-placeholder": "Последние изменения фильтров (просмотрите или начните вводить)",
+       "rcfilters-invalid-filter": "Недопустимый фильтр",
+       "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
+       "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-noresults": "Фильтры не найдены",
+       "rcfilters-filtergroup-registration": "Регистрация участников",
+       "rcfilters-filter-registered-label": "Зарегистрированные",
+       "rcfilters-filter-registered-description": "Вошедшие редакторы.",
+       "rcfilters-filter-unregistered-label": "Незарегистрированные",
+       "rcfilters-filter-unregistered-description": "Редакторы, которые не вошли в систему.",
+       "rcfilters-filtergroup-authorship": "Редактировать авторство",
+       "rcfilters-filter-editsbyself-label": "Ваши собственные правки",
+       "rcfilters-filter-editsbyself-description": "Ваши правки.",
+       "rcfilters-filter-editsbyother-label": "Правки других участников",
+       "rcfilters-filter-editsbyother-description": "Правки, сделанные другими участниками (не вами).",
+       "rcfilters-filtergroup-userExpLevel": "Уровня опыта (только для зарегистрированных участников)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новички",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Менее 10 правок и 4 дней работы.",
+       "rcfilters-filter-userExpLevel-learner-label": "Учащиеся",
+       "rcfilters-filter-userExpLevel-learner-description": "Больше правок и дней работы, чем у «Новичков», но меньше, чем у «Опытных пользователей».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Опытные пользователи",
+       "rcfilters-filter-userExpLevel-experienced-description": "Более 30 дней активности и 500 правок.",
+       "rcfilters-filtergroup-automated": "Автоматизированные вклады",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Правки, сделанные с помощью автоматизированных инструментов.",
+       "rcfilters-filter-humans-label": "Человек (не бот)",
+       "rcfilters-filter-humans-description": "Правки, внесённые редакторами.",
+       "rcfilters-filtergroup-significance": "Значение",
+       "rcfilters-filter-minor-label": "Малые правки",
+       "rcfilters-filter-minor-description": "Правки, которые автор пометил как малые.",
+       "rcfilters-filter-major-label": "Обычные правки",
+       "rcfilters-filter-major-description": "Правки, не помеченные как малые.",
+       "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-categorization-description": "Записи о страницах, добавленных или удаленных из категорий.",
+       "rcfilters-filter-logactions-label": "Протоколируемые действия",
+       "rcfilters-filter-logactions-description": "Административные действия, создания учётных записей, удаления страниц, загрузки файлов…",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "backend-fail-usable": "Не удалось прочитать или записать файл «$1» из-за нехватки прав или отсутствия нужных папок.",
        "filejournal-fail-dbconnect": "Не удалось подключиться к базе данных журнала для хранилища «$1».",
        "filejournal-fail-dbquery": "Не удалось обновить базу данных журнала для хранилища «$1».",
-       "lockmanager-notlocked": "Не удалось разблокировать \"$1\"; он не заблокирован.",
+       "lockmanager-notlocked": "Не удалось разблокировать «$1»; он не заблокирован.",
        "lockmanager-fail-closelock": "Не удалось закрыть файл блокировки для  «$1».",
        "lockmanager-fail-deletelock": "Не удалось удалить файл блокировки для «$1».",
        "lockmanager-fail-acquirelock": "Не удалось добиться блокировки «$1».",
        "uncategorizedcategories": "Некатегоризованные категории",
        "uncategorizedimages": "Некатегоризованные файлы",
        "uncategorizedtemplates": "Некатегоризованные шаблоны",
+       "uncategorized-categories-exceptionlist": "# Содержит список категорий, которые не должны упоминаться на Special:UncategorizedCategories. По одной в строке, начиная их с символа «*». Строки, начинающиеся с другого символа (включая пробелы) игнорируются. Используйте «#» для комментариев.",
        "unusedcategories": "Неиспользуемые категории",
        "unusedimages": "Неиспользуемые файлы",
        "wantedcategories": "Требуемые категории",
        "listusers-blocked": "(заблокирован{{GENDER:$1||а}})",
        "activeusers": "Список активных участников",
        "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
+       "activeusers-count": "$1 {{PLURAL:$1|дейÑ\81Ñ\82вие|дейÑ\81Ñ\82виÑ\8f|дейÑ\81Ñ\82вий}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
        "activeusers-groups": "Отображать участников, принадлежащих к группам:",
        "activeusers-excludegroups": "Исключать участников, принадлежащих к группам:",
        "emailccsubject": "Копия вашего сообщения для $1: $2",
        "emailsent": "Письмо отправлено",
        "emailsenttext": "Ваше электронное сообщение отправлено.",
-       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}.",
+       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}.\n{{GENDER:$2|Письмо}} будет отослано напрямую {{GENDER:$1|отправителю}}, так что {{GENDER:$2|ваш}} адрес электронной почты станет известен {{GENDER:$1|ему|ей}}.",
        "usermessage-summary": "Оставить системное сообщение.",
        "usermessage-editor": "Системная доставка",
        "watchlist": "Список наблюдения",
        "changecontentmodel-emptymodels-title": "Нет доступных моделей содержимого",
        "changecontentmodel-emptymodels-text": "Содержимое на [[:$1]] не может быть преобразовано ни к одному типу.",
        "log-name-contentmodel": "Журнал изменения моделей содержимого",
-       "log-description-contentmodel": "СобÑ\8bÑ\82иÑ\8f, Ñ\81вÑ\8fзаннÑ\8bе Ñ\81 Ð¼Ð¾Ð´ÐµÐ»Ñ\8fми Ñ\81одеÑ\80жимого Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "log-description-contentmodel": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого Ñ\81Ñ\82Ñ\80аниÑ\86, Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð±Ñ\8bли Ñ\81озданÑ\8b Ð¿Ð¾ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого, Ð¾Ñ\82лиÑ\87ной Ð¾Ñ\82 Ñ\81Ñ\82андаÑ\80Ñ\82ной.",
        "logentry-contentmodel-new": "$1 создал{{GENDER:$2||а}} страницу $3 с использованием нестандартной модели содержимого «$5»",
        "logentry-contentmodel-change": "$1 изменил{{GENDER:$2||а}} модель содержимого страницы $3 с «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "откат",
        "sp-contributions-talk": "обсуждение",
        "sp-contributions-userrights": "управление правами участника",
        "sp-contributions-blocked-notice": "Этот участник в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
-       "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
+       "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-search": "Поиск вклада",
        "sp-contributions-username": "IP-адрес или имя участника:",
        "sp-contributions-toponly": "Показывать только правки, являющиеся последними версиями",
        "whatlinkshere-hideredirs": "$1 перенаправления",
        "whatlinkshere-hidetrans": "$1 включения",
        "whatlinkshere-hidelinks": "$1 ссылки",
-       "whatlinkshere-hideimages": "$1 файловые ссылки",
+       "whatlinkshere-hideimages": "$1 файл{{PLURAL:$1|овая ссылка|овых ссылки|овых ссылок}}",
        "whatlinkshere-filters": "Фильтры",
        "whatlinkshere-submit": "Выполнить",
        "autoblockid": "Автоблокировка #$1",
        "proxyblockreason": "Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.",
        "sorbsreason": "Ваш IP-адрес числится как открытый прокси в DNSBL.",
        "sorbs_create_account_reason": "Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.",
+       "softblockrangesreason": "Анонимные правки не разрешены с вашего IP-адреса ($1). Пожалуйста, войдите в систему.",
        "xffblockreason": "Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1",
        "cant-see-hidden-user": "Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас нет разрешения на работу по сокрытию участников, вы не можете просмотреть или изменить данную блокировку.",
        "ipbblocked": "Вы не можете блокировать или разблокировать других участников, так как вы сами заблокированы",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
+       "cant-move-subpages": "У вас нет разрешения переименовывать подстраницы.",
+       "namespace-nosubpages": "Пространство имён «$1» не разрешает создание страниц.",
        "newtitle": "Новое название:",
        "move-watch": "Добавить в список наблюдения исходную и целевую страницы",
        "movepagebtn": "Переименовать страницу",
        "pageinfo-length": "Длина страницы (в байтах)",
        "pageinfo-article-id": "Идентификатор страницы",
        "pageinfo-language": "Язык страницы",
+       "pageinfo-language-change": "изменить",
        "pageinfo-content-model": "Модель содержимого страницы",
        "pageinfo-content-model-change": "изменить",
        "pageinfo-robot-policy": "Индексация поисковыми роботами",
        "exif-exposureindex": "Индекс экспозиции",
        "exif-sensingmethod": "Тип сенсора",
        "exif-filesource": "Источник файла",
-       "exif-scenetype": "Тип Ñ\81Ñ\86енÑ\8b",
+       "exif-scenetype": "СÑ\86енан ÐºÐµÐ¿",
        "exif-customrendered": "Дополнительная обработка",
        "exif-exposuremode": "Режим выбора экспозиции",
        "exif-whitebalance": "Баланс белого",
        "logentry-move-move_redir": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
-       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3",
+       "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} «старым патрулированием» версию $4 страницы $3",
        "logentry-newusers-newusers": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create": "{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1",
        "logentry-newusers-create2": "$1 {{GENDER:$2|создал|создала}} учётную запись $3",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "Искать в {{grammar:prepositional|{{SITENAME}}}}",
        "searchsuggest-containing": "содержащие…",
-       "api-error-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.",
-       "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
        "api-error-badtoken": "Внутренняя ошибка:  некорректный токен.",
-       "api-error-blocked": "Редактирование было для вас заблокировано.",
-       "api-error-copyuploaddisabled": "Загрузка по URL-адресу отключена на этом сервере.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|существует другой файл|существуют другие файлы}} с таким же содержимым.",
-       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был файл|были файлы}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
-       "api-error-empty-file": "Отправленный вами файл пуст.",
        "api-error-emptypage": "Не допускается создание новых пустых страниц.",
-       "api-error-fetchfileerror": "Внутренняя ошибка: что-то пошло не так при получении файла.",
-       "api-error-fileexists-forbidden": "Файл с именем «$1» уже существует и не может быть перезаписан.",
-       "api-error-fileexists-shared-forbidden": "Файл с именем «$1» уже существует в хранилище общих файлов и не может быть перезаписан.",
-       "api-error-file-too-large": "Отправленный вами файл слишком велик.",
-       "api-error-filename-tooshort": "Слишком короткое имя файла.",
-       "api-error-filetype-banned": "Этот тип файлов запрещён.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=запрещённый тип файла|запрещённые типы файлов}}. {{PLURAL:$3|1=Разрешённый тип файлов —|Разрешённые типы файлов:}} $2.",
-       "api-error-filetype-missing": "У этого файла отсутствует расширение.",
-       "api-error-hookaborted": "Изменение, которые вы пытались сделать, прервано обработчиком расширения.",
-       "api-error-http": "Внутренняя ошибка: не удаётся подключиться к серверу.",
-       "api-error-illegal-filename": "Недопустимое имя файла.",
-       "api-error-internal-error": "Внутренняя ошибка: что-то пошло не так при обработке вашей загрузки в вики.",
-       "api-error-invalid-file-key": "Внутренняя ошибка: файл во временном хранилище не найден.",
-       "api-error-missingparam": "Внутренняя ошибка: отсутствуют параметры по запросу.",
-       "api-error-missingresult": "Внутренняя ошибка: не удалось определить, успешно ли завершилось копирование.",
-       "api-error-mustbeloggedin": "Вы должны представиться системе для загрузки файлов.",
-       "api-error-mustbeposted": "Внутренняя ошибка: запрос требует инструкцию HTTP POST.",
-       "api-error-noimageinfo": "Загрузка завершилась успешно, но сервер не выдал никакой информации о файле.",
-       "api-error-nomodule": "Внутренняя ошибка: не настроен модуль загрузки.",
-       "api-error-ok-but-empty": "Внутренняя ошибка: нет ответа от сервера.",
-       "api-error-overwrite": "Не допускается замена существующего файла.",
-       "api-error-ratelimited": "Вы пытаетесь загрузить несколько файлов за более короткий промежуток времени, чем это позволено.\nПожалуйста, попробуйте ещё раз через несколько минут.",
-       "api-error-stashfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
        "api-error-publishfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
-       "api-error-stasherror": "При загрузке файла во временное хранилище произошла ошибка.",
-       "api-error-stashedfilenotfound": "При попытке загрузить файл из временного хранилища исходный файл не найден.",
-       "api-error-stashpathinvalid": "Путь, по которому должен располагаться файл, загруженный во временное хранилище, некорректен.",
-       "api-error-stashfilestorage": "При загрузке файла во временное хранилище произошла ошибка.",
-       "api-error-stashzerolength": "Сервер не может сохранить файл во временное хранилище, поскольку тот имеет нулевую длину.",
-       "api-error-stashnotloggedin": "Вы должны войти в систему, чтобы иметь возможность сохранить файл во временное хранилище.",
-       "api-error-stashwrongowner": "Файл, который вы пытались открыть во временном хранилище, принадлежит не вам.",
-       "api-error-stashnosuchfilekey": "Ключ файла, к которому вы пытались получить доступ во временном хранилище, не существует.",
-       "api-error-timeout": "Сервер не отвечает в течение ожидаемого времени.",
-       "api-error-unclassified": "Произошла неизвестная ошибка",
-       "api-error-unknown-code": "Неизвестная ошибка: «$1»",
-       "api-error-unknown-error": "Внутренняя ошибка: что-то пошло не так при попытке загрузить файл.",
-       "api-error-unknown-warning": "Неизвестное предупреждение: $1",
+       "api-error-stashfailed": "Внутренняя ошибка: сервер не смог сохранить временный файл.",
+       "api-error-unknown-warning": "Неизвестное предупреждение: «$1».",
        "api-error-unknownerror": "Неизвестная ошибка: «$1».",
-       "api-error-uploaddisabled": "В этой вики отключена возможность загрузки файлов.",
-       "api-error-verification-error": "Возможно, этот файл повреждён или имеет неправильное расширение.",
-       "api-error-was-deleted": "Файл с таким именем был уже ранее загружен и впоследствии удалён.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минута|минуты|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|час|часа|часов}}",
        "pagelang-language": "Язык",
        "pagelang-use-default": "Использовать язык по умолчанию",
        "pagelang-select-lang": "Выберите язык",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Отправить",
+       "pagelang-nonexistent-page": "Страница $1 не существует.",
+       "pagelang-unchanged-language": "Странице $1 уже установлен язык $2.",
+       "pagelang-unchanged-language-default": "Странице $1 уже установлен язык, установленный по умолчанию для содержимого этой вики.",
+       "pagelang-db-failed": "Базе данных не удалось изменить язык страницы.",
        "right-pagelang": "изменение языка страницы",
        "action-pagelang": "изменять язык страницы",
        "log-name-pagelang": "Журнал изменения языка",
        "sessionprovider-nocookies": "Могут быть отключены куки. Убедитесь, что у вас включены куки и начните заново.",
        "randomrootpage": "Случайная корневая страница",
        "log-action-filter-block": "Тип блокировки:",
-       "log-action-filter-contentmodel": "Тип Ð¼Ð¾Ð´Ð¸Ñ\84икаÑ\86ии contentmodel:",
+       "log-action-filter-contentmodel": "Тип Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ\81одеÑ\80жимого:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
        "log-action-filter-managetags": "Тип тега управленческих действий:",
        "log-action-filter-block-reblock": "Изменение блокировки",
        "log-action-filter-block-unblock": "Разблокировка",
        "log-action-filter-contentmodel-change": "Изменение модели содержимого",
-       "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью Contentmodel",
+       "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью содержимого",
        "log-action-filter-delete-delete": "Удаления страницы",
        "log-action-filter-delete-delete_redir": "Перезапись перенаправления",
        "log-action-filter-delete-restore": "Восстановление страницы",
        "usercssispublic": "Обратите внимание: подстраницы CSS не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
        "restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
-       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте <br /><code>0.0.0.0/0</code><br /><code>::/0</code>"
+       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "версия $1",
+       "pageid": "ID страницы $1"
 }
index ede9988..4a5ce17 100644 (file)
        "searcharticle": "Көрдөр",
        "history": "Устуоруйата",
        "history_short": "Устуоруйа",
+       "history_small": "устуоруйата",
        "updatedmarker": "тиһэх киириим кэнниттэн уларыйбыт",
        "printableversion": "Бэчээттииргэ аналлаах барыл",
        "permalink": "Куруук баар сигэ",
        "createacct-another-username-ph": "Ааккын суруй",
        "yourpassword": "Киирии тыла:",
        "userlogin-yourpassword": "Аһарык",
-       "userlogin-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "createacct-yourpassword-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын суруй",
-       "yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа:",
-       "createacct-yourpasswordagain": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын бигэргэт",
-       "createacct-yourpasswordagain-ph": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгын хатылаа",
+       "userlogin-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "createacct-yourpassword-ph": "Ð\90һаÑ\80Ñ\8bккын суруй",
+       "yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын хатылаа:",
+       "createacct-yourpasswordagain": "Ð\90һаÑ\80Ñ\8bккын бигэргэт",
+       "createacct-yourpasswordagain-ph": "Ð\90һаÑ\80Ñ\8bккын хатылаа",
        "userlogin-remembermypassword": "Тиһиликтэн тахсыма",
        "userlogin-signwithsecure": "Бигэ холбонуу",
        "cannotlogin-title": "Киирэр сатаммат",
        "gotaccount": "Бэлиэтэммитиҥ дуо? '''$1'''.",
        "gotaccountlink": "Аатыҥ",
        "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
-       "userlogin-resetpassword-link": "Ð\9aииÑ\80ии тылгын санаттараҕын дуо?",
+       "userlogin-resetpassword-link": "Ð\90һаÑ\80Ñ\8bк тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
        "userlogin-reauth": "Тиһиккэ хат киирэн {{GENDER:$1|$1}} буоларгын бигэргэтиэхтээххин.",
        "nouserspecified": "Кыттааччы аатын киллэриэхтээххин.",
        "login-userblocked": "Бу кыттааччы бобуллубут. Тиһиккэ киирии көҥүллэммэт.",
        "wrongpassword": "Киирии тылыҥ сыыһалаах. Өссө киллэрэн көр.",
-       "wrongpasswordempty": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ó¨Ñ\81Ñ\81Ó© киирэн көр.",
+       "wrongpasswordempty": "Ð\90һаÑ\80Ñ\8bккÑ\8bн Ñ\81Ñ\83Ñ\80Ñ\83йбаÑ\82аÑ\85Ñ\85Ñ\8bн. Ð¥Ð°Ñ\82 киирэн көр.",
        "passwordtooshort": "Киирии тылыҥ наһаа кылгас.\nКырата {{PLURAL:$1|1 бэлиэлээх|$1 бэлиэлээх}} буолуохтаах.",
        "passwordtoolong": "Аһарык {{PLURAL:$1|1 бэлиэттэн|$1 бэлиэттэн}} уһун буолуо суохтаах.",
        "passwordtoopopular": "Элбэхтэ туттуллар аһарыктары туттар сатаммат. Бука диэн атын аһарыкта тал.",
        "password-name-match": "Аһарыгыҥ ааккыттан атын буолуохтаах.",
        "password-login-forbidden": "Маннык ааты уонна киирии тылы туһаныы бобуллар.",
        "mailmypassword": "Киирии тылы саҥардыы",
-       "passwordremindertitle": "{{SITENAME}} ÐºÐ¸Ð¸Ñ\80ии тылын санатыы",
-       "passwordremindertext": "Ким эрэ (бадаҕа эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккн өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
+       "passwordremindertitle": "{{SITENAME}} Ð°Ò»Ð°Ñ\80Ñ\8bк тылын санатыы",
+       "passwordremindertext": "Ким эрэ (бадаҕа Эн бу IP-аадырыстан: $1), {{SITENAME}} ($4) аһарыгын саҥаттан ыытыҥ диэбит.\n\"$2\" кыттааччы быстах аһарыга билигин маннык: \"$3\".\nӨскө маны эн чахчы көрдөөбүт буоллаххына, систиэмэҕэ саҥаттан киирэҥҥин аһарыккын уларытыаххын сөп.\nБыстах аһарык {{PLURAL:$5|биир хонук|$5 хонук устата}} үлэлиир.\n\nӨскөтүн аһарыгы саҥаттан көрдөөбөтөх буоллаххына,\nэбэтэр урукку аһарыккын өйдөөн кэлбит буоллаххына,\nбу суругу ааххайыма уонна урукку аһарыккын салгыы туһан.",
        "noemail": "\"$1\" ааттаах киһиэхэ эл. почтата ыйыллыбатах.",
        "noemailcreate": "Электроннай почтаҥ сөптөөх аадырыһын суруйуохтааххын",
        "passwordsent": "Саҥа аһарык тыл \"$1\" эл. почтатыгар ыытылынна.\nТиһиккэ киирэргэ саҥа аһарыгы туһан.",
        "accountcreated": "Саҥа аат иҥэрилиннэ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ыр.]]) бэлиэ аат оҥоһулунна.",
        "createaccount-title": "{{SITENAME}} бырайыакка саҥа аат оҥоруу",
-       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bла \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ð½Ð°Ð°Ð´Ð°.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
+       "createaccount-text": "Ð\9aим Ñ\8dÑ\80Ñ\8d {{SITENAME}} Ð±Ñ\8bÑ\80айÑ\8bакка ($4) Ñ\81аҥа $2 Ð°Ð°Ñ\82Ñ\8b Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dбиÑ\82. \"$2\" Ð°Ò»Ð°Ñ\80Ñ\8bга \"$3\". Ð\91илигин ÐºÐ¸Ð¸Ñ\80Ñ\8dн Ð°Ò»Ð°Ñ\80Ñ\8bк Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\82ааÑ\85 Ñ\8dбиккин.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
        "login-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
        "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быһынна",
        "login-migrated-generic": "Эн бэлиэ-аатыҥ көһөрүллүбүт, онон урукку аатыҥ бу биикигэ суох буолбут эбит.",
        "changepassword": "Киирии тылы уларытарга",
        "resetpass_announce": "Түмүктүүргэ саҥа киирии тылла суруй.",
        "resetpass_text": "<!-- Тиэкиһи манна эбэн суруйуҥ -->",
-       "resetpass_header": "Ð\90аÑ\82 ÐºÐ¸Ð¸Ñ\80ии тылын уларытыы",
+       "resetpass_header": "Ð\91Ñ\8dлиÑ\8d-ааÑ\82 Ð°Ò»Ð°Ñ\80Ñ\8bк тылын уларытыы",
        "oldpassword": "Эргэ аһарык:",
        "newpassword": "Саҥа аһарык:",
        "retypenew": "Саҥа киирии тылы хатылаа:",
        "passwordreset-domain": "Домен:",
        "passwordreset-email": "Электроннай почтата:",
        "passwordreset-emailtitle": "{{SITENAME}} бырайыакка аатын туһунан",
-       "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
-       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|кииÑ\80ии Ñ\82Ñ\8bл|киÑ\80ии Ñ\82Ñ\8bллаÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-ip": "Ким эрэ (баҕар Эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка аһарык тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|аһарык|аһарык тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа аһарык тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку аһарык тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку аһарык тылыҥ оннунан хаалыа.",
+       "passwordreset-emailtext-user": "$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bÑ\82.\nÐ\91Ñ\83 Ñ\8dлекÑ\82Ñ\80он Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ð±Ñ\83 {{PLURAL:$3|ааÑ\82 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85|ааÑ\82Ñ\82аÑ\80 Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85Ñ\82Ñ\8dÑ\80}}\n\n$2\n\nÐ\91Ñ\83 Ð±Ñ\8bÑ\81Ñ\82аÑ\85 ÐºÑ\8dмҥÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 {{PLURAL:$3|аһаÑ\80Ñ\8bк|аһаÑ\80Ñ\8bкÑ\82аÑ\80}} {{PLURAL:$5|бииÑ\80 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÒ\95Ñ\8d|$5 ÐºÒ¯Ð½ Ò¯Ð»Ñ\8dлиÑ\8dÑ\85Ñ\82Ñ\8dÑ\80Ñ\8d}}.\nЭн Ñ\82иһиликкÑ\8d Ð°Ð°ÐºÐºÑ\8bн Ñ\8dÑ\82Ñ\8dн Ñ\81аҥа ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b ÐºÐ¸Ð»Ð»Ñ\8dÑ\80иÑ\8dÑ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин.\nÓ¨Ñ\81кө Ð±Ñ\83 Ñ\8bйÑ\8bÑ\82Ñ\8bгÑ\8b Ñ\8bÑ\8bппаÑ\82аÑ\85 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bккÑ\8bн Ó©Ð¹Ð´Ó©Ó©Ð½ ÐºÑ\8dлбиÑ\82 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна \nбÑ\83 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иини Ð°Ð°Ñ\85Ñ\85айÑ\8bа Ñ\81Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.\nÐ\9eÑ\87Ñ\87оÒ\95о Ñ\83Ñ\80Ñ\83ккÑ\83 Ð°Ò»Ð°Ñ\80Ñ\8bгыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах аһарык тыл: \n$2",
        "passwordreset-emailsentemail": "Өскө бу Эн ааккар баайыллыбыт аадырыс буоллаҕына, аһарык тылы уларытар туһунан сурук барыа.",
        "passwordreset-emailsentusername": "Өскө бу аакка баайыллыбыт аадырыс баар буоллаҕына, аһарык тылы уларытар туһунан сурук онно барыа.",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "blockedtext": "'''Эн аатыҥ эбэтэр IP-аадырыһыҥ бобулуннулар.'''\n\nБоппут киһи $1.\nТөрүөтэ: ''«$2»''.\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] суруйан быһаарсыаххын сөп.\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]] буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\nЭн IP-аадырыһыҥ — $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
        "autoblockedtext": "Эн IP-аадырыскын ханнык эрэ бу бырайыакка кыттара бобуллубут киһи туһана сылдьыбыт, онон бу IP-аадырыс бобуулаах. Боппут администраатар ($1) ол төрүөтүн маннык суруйбут:\n\n:''$2''\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] сурук суруйан быһаарсыаххын сөп.\n\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]]  буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\n\nIP-аадырыһыҥ $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
+       "systemblockedtext": "Бэлиэ-ааккын эбэтэр IP-аадырыскын MediaWiki хааччахтаабыт.\nЫйыллыбыт төрүөтэ:\n\n:<em>$2</em>\n\n* Хааччах саҕаланыыта: $8\n* Хааччах уһуллуута: $6\n* Бүөлээһин соруга: $7\n\nЭн билиҥҥи IP-аадырыһыҥ $3.\nБыһаарсар буоллаххына, бу сибидиэнньэлэри этээр дуу.",
        "blockednoreason": "биир да биричиинэ сөп түбэспэт",
        "whitelistedittext": "Улатыаххын баҕарар буоллаххына маны $1 гын.",
        "confirmedittext": "Уларытарга эл. почтаҥ аадырыһын бигэргэтиэхтээххин. Бастаан [[Special:Preferences|манна]] киирэн бэйэн ааккын уонна эл. почтаҕын суруй. Онтон эл. аадырыскын бигэргэт.",
        "saveprefs": "Бигэргэт",
        "restoreprefs": "Туруоруулары саҥаттан (салааларга барыларыгар)",
        "prefs-editing": "Уларытыы",
-       "rows": "Строкаалара:",
-       "columns": "Колонкалара:",
        "searchresultshead": "Көрдөөһүн түмүгэ",
        "stub-threshold": "Омооннорго ыйынньыктары оҥоруу боруога ($1):",
        "stub-threshold-sample-link": "холобур",
        "prefs-help-gender": "Маны туруорар булгуччута суох. \nБырагыраамма сорох дьоҥҥо туһаайыллыбыт биллэриилэригэр эбэтэр кинилэргэ сыһыаннаах этиилэригэр кытааччы дьахтарыттан эбэтэр эр киһититтэн көрөн этии тутулун уларытан биэриэн сөп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
        "prefs-help-realname": "Сурукка киирбит аатыҥ булгуччута суох. Суруйдаххына ааптар быһыытынан ыйыллар буолуоҥ.",
-       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и ÐºÐ¸Ð¸Ñ\80ии тылгын умуннаххына санатарга көмөлөһүө.",
+       "prefs-help-email": "ЭлекÑ\82Ñ\80оннай Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Ñ\81Ñ\83Ñ\80Ñ\83йаÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ð°Ò»Ð°Ñ\80Ñ\8bк тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-help-email-others": "Эбии. Атын кыттааччылар Эйигин кытта электроннай почтаҕын билбэккэ эрэ суруйсар кыахтаныахтара.",
        "prefs-help-email-required": "E-mail баар буолуохтаах.",
        "prefs-info": "Сүрүн сибидиэнньэлэр",
        "userrights-user-editname": "Кыттааччы аата:",
        "editusergroup": "Кыттааччы бөлөхтөрүн көрдөрүү",
        "editinguser": "<strong>[[User:$1|$1]]</strong> кыттааччы $2 быраабын уларытыы",
+       "viewinguserrights": "{{GENDER:$1|Кыттааччы}} быраабын көрүү <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Кыттааччы бөлөхтөрүн уларытарга",
+       "userrights-viewusergroup": "Кыттааччы бөлөхтөрүн көрүү",
        "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-groupsmember": "Бу бөлөхтөргө киирэр:",
        "userrights-groupsmember-auto": "Көстүбэт чилиэн:",
        "action-upload_by_url": "бу билэни URL-аадырыстан киллэрии",
        "action-writeapi": "көннөрөргө API-ны туһаныы",
        "action-delete": "бу сирэйи сотуу",
-       "action-deleterevision": "бу торуму сотуу",
-       "action-deletedhistory": "бу сирэй сотуллубут историятын көрүү",
+       "action-deleterevision": "торумнары сотуу",
+       "action-deletelogentry": "сурунаал суруктарын сотуу",
+       "action-deletedhistory": "сирэй сотуллубут устуоруйатын көрүү",
+       "action-deletedtext": "сотуллубут торум тиэкиһин көрүү",
        "action-browsearchive": "сотуллубут сирэйдэри көрдөөһүн",
-       "action-undelete": "бу сирэйи төннөрүү",
-       "action-suppressrevision": "Ñ\81иÑ\80Ñ\8dй Ð±Ñ\83 ÐºÐ¸Ñ\81Ñ\82Ñ\8dммиÑ\82 Ñ\82оÑ\80Ñ\83мÑ\83н ÐºÓ©Ñ\80Ò¯Ò¯ Ñ\83онна Ñ\82өннөÑ\80Ò¯Ò¯",
+       "action-undelete": "сирэйи төннөрүү",
+       "action-suppressrevision": "сирэй кистэммит торумун көрүү уонна төннөрүү",
        "action-suppressionlog": "бу тус сурунаалы көрүү",
        "action-block": "кыттааччы уларытыыны оҥорорун бобуу",
        "action-protect": "бу сирэй харысхалын таһымын уларытыы",
        "action-userrights-interwiki": "атын биикигэ кыттыы бырааптарын уларытыы",
        "action-siteadmin": "билэ олоҕун хааччахтааһын уонна хааччахтааһынын устуу",
        "action-sendemail": "сурук ыытыы",
+       "action-editmyoptions": "бэйэ туруорууларын көрүү",
        "action-editmywatchlist": "кэтиир тиһиккин уларыт",
        "action-viewmywatchlist": "кэтиир тиһиккин көрүү",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "recentchanges-legend-heading": "<strong>Легендата:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
        "recentchanges-submit": "Көрдөр",
+       "rcfilters-activefilters": "Холбоммут сиидэлэр",
+       "rcfilters-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
+       "rcfilters-invalid-filter": "Сатаммат сиидэ",
+       "rcfilters-filterlist-title": "Сиидэ",
+       "rcfilters-filterlist-noresults": "Сиидэ көстүбэтэ",
+       "rcfilters-filtergroup-authorship": "Ааптарын уларытыы",
+       "rcfilters-filter-editsbyself-label": "Эн тус бэйэҥ уларытыыларыҥ",
+       "rcfilters-filter-editsbyself-description": "Бэйэҥ уларытыыларыҥ.",
+       "rcfilters-filter-editsbyother-label": "Атыттар уларытыылара.",
+       "rcfilters-filter-editsbyother-description": "Атыттар уларытыылара (Эйиэнэ буолбатах).",
+       "rcfilters-filtergroup-userExpLevel": "Кыттааччы уопутун таһымынан",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Саҥа киирбиттэр",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Отой саҥалар: 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
+       "rcfilters-filter-userExpLevel-learner-label": "Үөрэнээччилэр",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "changecontentmodel-emptymodels-text": "[[:$1]] иһинээҕитэ ханнык да атын көрүҥҥэ уларыйар кыаҕа суох эбит.",
        "log-name-contentmodel": "Иһинээҕитин киэбин уларытыы сурунаала",
        "log-description-contentmodel": "Сирэй иһинээҕитин киэбин кытта ситимнээх",
+       "logentry-contentmodel-new": "$1 $3 диэн сирэйи маны туһанан «$5» {{GENDER:$2|айбыт}}",
        "logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» {{GENDER:$2|уларыппыт}}",
        "logentry-contentmodel-change-revertlink": "төннөрүү",
        "logentry-contentmodel-change-revert": "төннөрүү",
        "modifiedarticleprotection": "\"[[$1]]\" сирэй уларытыытын таһыма уларыйда",
        "unprotectedarticle": "[[$1]]\" көмүскэлэ суох оҥоһулунна",
        "movedarticleprotection": "көмүскэл туруоруутун мантан \"[[$2]]\" манна \"[[$1]]\" көһөрдө",
+       "protectedarticle-comment": "Маны «[[$1]]» {{GENDER:$2|көмүскээбит}}",
+       "modifiedarticleprotection-comment": "«[[$1]]» көмүскэлин таһымын {{GENDER:$2|уларыппыт}}",
+       "unprotectedarticle-comment": "«[[$1]]» көмүскэлин {{GENDER:$2|соппут}}",
        "protect-title": "\"$1\": Уларытыы таһымын туруоруу",
        "protect-title-notallowed": "Харысхал \"$1\" таһымын көрүү",
        "prot_1movedto2": "[[$1]] аата манныкка уларытылынна: [[$2]]",
        "undeletehistorynoadmin": "Ыстатыйа сотуллубут.\nСотуу төрүөтэ уонна ыстатыйаны суруйбут кыттааччылар испииһэктэрэ манна көрдөрүлүннэ.\nСотуллубут ыстатыйа ис хоһоонун дьаһабыллар эрэ көрүөхтэрин сөп.",
        "undelete-revision": "$3 суруйбут $1 ыстатыйа сотуллубут торума (суруйуу кэмэ: $4, $5):",
        "undeleterevision-missing": "Сыыһа эбэтэр суох торум.\nАрааһа ыйынньыгыҥ сыыһа суруллубут, эбэтэр бу торум архыыптан сотуллан хаалбыт.",
+       "undeleterevision-duplicate-revid": "$1 {{PLURAL:$1|торум}} сөргүтүллэр кыаҕа суох, тоҕо диэтэххэ {{PLURAL:$1|кини|кинилэр}} <code>rev_id</code>{{PLURAL:$1|-та|-лара}} хайыы-үйэ туһаныллар эбит.",
        "undelete-nodiff": "Ханнык да иннинээҕи торум көстүбэтэ.",
        "undeletebtn": "Төннөр",
        "undeletelink": "көрүү/төннөрүү",
        "undeletedrevisions": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}} төннөрүлүннэ",
        "undeletedrevisions-files": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}}  уонна {{PLURAL:$2|1 билэ|$2 билэ}} төннөрүлүннэ",
        "undeletedfiles": "{{PLURAL:$1|1 билэ|$1 билэ}} төннөрүлүннэ",
-       "cannotundelete": "Сөргүтүү алҕаһа:\n$1",
+       "cannotundelete": "Сөргүтүү сороҕо табыллыбата:\n$1",
        "undeletedpage": "'''$1 төннөрүлүннэ (төннөрүллүбүт)'''\n\nКэнники сотуулар уонна төннөрүүлэр испииһэктэрин [[Special:Log/delete|манна]] көрүөххүн сөп.",
        "undelete-header": "Соторутааҥы [[Special:Log/delete|сотуу испииһэгин]] көрүөххүн сөп.",
        "undelete-search-title": "Сотуллубут сирэйдэри көрдөөһүн",
        "sp-contributions-newbies-sub": "Саҥа ааттартан",
        "sp-contributions-newbies-title": "Саҥа бэйэлэрин билиһиннэрбит дьон уларытыылара",
        "sp-contributions-blocklog": "Бобуу сурунаала",
-       "sp-contributions-suppresslog": "кыттааччы сотуллубут көннөрүүлэрэ",
-       "sp-contributions-deleted": "кыттааччы сотуллубут көннөрүүлэрэ",
+       "sp-contributions-suppresslog": "{{GENDER:$1|кыттааччы}} сотуллубут көннөрүүлэрэ",
+       "sp-contributions-deleted": "{{GENDER:$1|кыттааччы}} сотуллубут көннөрүүлэрэ",
        "sp-contributions-uploads": "киллэриилэр",
        "sp-contributions-logs": "сурунааллар",
        "sp-contributions-talk": "ырытыы",
        "sp-contributions-username": "IP аадырыһа эбэтэр аата:",
        "sp-contributions-toponly": "Кэнники барыллары эрэ көрдөр",
        "sp-contributions-newonly": "Саҥаттан оҥоһуллубут сирэйдэри эрэ көрдөр",
+       "sp-contributions-hideminor": "Суолтата суох уларытыылары көрдөрүмэ",
        "sp-contributions-submit": "Көрдөө",
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "unblock": "Кытааччы хааччаҕын устуу",
        "blockip": "{{GENDER:$1|Кыттааччыны}} хааччахтаа",
        "blockip-legend": "Кыттааччыны хааччахтааһын",
-       "blockiptext": "Ханнык эмит IP-ттан суруйары манна баар форманы туһанан боп.\nВандализмы утаран уонна [[{{MediaWiki:Policy-url}}]]\nбыраабылалрын тутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, вандализм баар сирэйдэриттэн\nбыһа тардан манна көрдөр).",
+       "blockiptext": "Ханнык эмит IP-ттан биитэр бэлиэ-ааттан суруйары манна баар форманы туһанан боп.\nБандааллааһыны утаран уонна [[{{MediaWiki:Policy-url}}|быраабылалары]]\nтутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, бандааллааһын баар сирэйдэриттэн\nбыһа тардан көрдөр).\nIP-аадырыс диапазонун [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] туһанан хааччахтыаххын сөп.\nХааччах муҥутуур диапазона IPv4 боротокуолга - /$1, IPv6 боротокуолга - /$2.",
        "ipaddressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
        "ipbexpiry": "Түмүктэниэ:",
        "ipbreason": "Төрүөтэ:",
        "ipb-unblock": "Кыттаачыны эбэтэр IP-ны бобуллубуттар испииһэктэриттэн таһаар",
        "ipb-blocklist": "Бобуулары көрдөр",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} суруйуута",
+       "ipb-blocklist-duration-left": "$1 хаалла",
        "unblockip": "Кыттааччыны көҥүллээ",
        "unblockiptext": "IP эбэтэр кыттааччы көннөрөр/уларытар быраабын манна баар форманы туһанан төннөр.",
        "ipusubmit": "Хааччаҕын уһул",
        "lockdbsuccesstext": "Билии олоҕун (database) уларытар бобулунна.\n<br />Үлэлээн бүттэххинэ [[Special:UnlockDB|уларытары көҥүллүүргүн]] умнума.",
        "unlockdbsuccesstext": "Билии олоҕун (database) уларытар көҥүллэннэ.",
        "lockfilenotwritable": "Бобуу билэтигэр суруйар кыаҕыҥ суох. БД уларытары көҥүллүүргэ эбэтэр боборго веб-сервер бу билэни уларытар бырааптаах буолуохтаах.",
+       "databaselocked": "Билии олоҕо хайыы-үйэ хааччахтаммыт.",
        "databasenotlocked": "БД уларытааһын бобуллубата.",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "$1 - аатын уларытыы",
        "cant-move-to-user-page": "Эн кыттааччы аатын далыгар сирэйдэри уларытар кыаҕыҥ суох (анныкы сирэйдэриттэн ураты).",
        "cant-move-category-page": "Категория сирэйин аатын уларытар кыаҕыҥ суох эбит.",
        "cant-move-to-category-page": "Сирэй аатын уларытан категория сирэйэ гынар кыаҕыҥ суох эбит.",
+       "namespace-nosubpages": "«$1» аат далыгар сирэй оҥорор табыллыбат эбит.",
        "newtitle": "Саҥа аата:",
        "move-watch": "Кэтээн көрөргө",
        "movepagebtn": "Аатын уларыт",
        "movelogpagetext": "Манна ааттара уларытыллыбыт сирэйдэр испииһэктэрэ көстөр.",
        "movesubpage": "{{PLURAL:$1|Алын сирэй|Алын сирэйдэр}}",
        "movesubpagetext": "Бу сирэй $1 {{PLURAL:$1|алын сирэйдээх|алын сирэйдэрдээх}}.",
+       "movesubpagetalktext": "Ырытыытын сирэйэ манна көстөр $1 {{PLURAL:$1|алын сирэйдээх|алын сирэйдэрдээх}}.",
        "movenosubpage": "Бу сирэй алын сирэйэ суох.",
        "movereason": "Төрүөтэ:",
        "revertmove": "төннөрүү",
        "export-download": "Билэ быһыытынан хаалларыахха диэ",
        "export-templates": "Халыыптары киллэрии",
        "export-pagelinks": "Бачча дириҥҥэ дылы ситимнээх сирэйдэри киллэр:",
+       "export-manual": "Сирэйдэри бэйэҥ киллэр:",
        "allmessages": "Систиэмэ (тиһик) биллэриилэрэ",
        "allmessagesname": "Биллэрии",
        "allmessagesdefault": "Туспа этиллибэтэҕинэ суруллар тиэкис",
        "import-nonewrevisions": "Биир да уларытыы импортаммата (бу иннинэ таҥастаммыттар, биитэр алҕастаах буолан көтүтүллүбүттэр).",
        "xml-error-string": "$1 - $2 строка, $3 колонка ($4 байт): $5",
        "import-upload": "XML-дааннайдары киллэр",
-       "import-token-mismatch": "Арахсан хаалбыт. Өссө киирэн көр.",
+       "import-token-mismatch": "Арахсан хаалбыт. \n\nБаҕар тахсан хаалбытыҥ буолуо. <strong>Бэлиэтэммит ааккынан киирэн олороргун тургутан баран хатылаан көр.</strong>.\nӨскөтө син биир көмөлөспөтөҕүнэ [[Special:UserLogout|тахсан баран]] төттөрү киирэн көр уонна браузерыҥ куукалары ыларын тургут.",
        "import-invalid-interwiki": "Бу биикиттэн импорт оҥорор сатаммат(а).",
        "import-error-edit": "«$1» сирэй көһөрүллүбэтэ, тоҕо диэтэххэ кинини уларытарыҥ көҥүллэммэт эбит.",
        "import-error-create": "«$1» сирэй киллэриллибэтэ, тоҕо диэтэххэ кинини айарыҥ сатаммат эбит.",
        "tooltip-feed-rss": "RSS бу сирэйгэ",
        "tooltip-feed-atom": "Atom бу сирэйгэ",
        "tooltip-t-contributions": "{{GENDER:$1|Бу кыттааччы}} уларыппыт сирэйдэрин тиһилигэ",
-       "tooltip-t-emailuser": "Бу киһиэхэ сурук ыытарга",
+       "tooltip-t-emailuser": "{{GENDER:$1|Бу киһиэхэ}} сурук ыытарга",
        "tooltip-t-info": "Бу сирэй туһунан сиһилии",
        "tooltip-t-upload": "Билэлэри суруттарыы",
        "tooltip-t-specialpages": "Анал сирэйдэр испииһэктэрэ",
        "tooltip-ca-nstab-category": "Категория туһунан",
        "tooltip-minoredit": "Уларытыыны суолтата кыра курдук бэлиэтээ",
        "tooltip-save": "Уларытыыны бигэргэтии",
+       "tooltip-publish": "Уларытыыларгын бэчээттээһин",
        "tooltip-preview": "Уларытыах иннинэ көрүү; бука диэн маны туһан!",
        "tooltip-diff": "Уларытыах иннинэ баар тиэкиһи кытта тэҥнээһин.",
        "tooltip-compareselectedversions": "Икки талыллыбыт торумнар ыккардыларынааҕы уратыны көрдөр.",
        "pageinfo-length": "Сирэй устата (баайтынан)",
        "pageinfo-article-id": "Сирэй нүөмэрэ",
        "pageinfo-language": "Сирэй омугун тыла",
+       "pageinfo-language-change": "уларыт",
        "pageinfo-content-model": "Сирэй иһинээҕитин модела",
+       "pageinfo-content-model-change": "уларыт",
        "pageinfo-robot-policy": "Роботтар көрдөөһүннэрин туруга",
        "pageinfo-robot-index": "Көҥүллэммит",
        "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
+       "pageinfo-user-id": "Кыттааччы нүөмэрэ",
        "markaspatrolleddiff": "Бэрэбиэркэлэммит курдук бэлиэтээ",
        "markaspatrolledtext": "Бу ыстатыйаны бэрэбиэркэлэммит курдук бэлиэтээ",
+       "markaspatrolledtext-file": "Билэ бу торумун ботуруулламмыт курдук бэлиэтээ",
        "markedaspatrolled": "Бэрэбиэркэлэммит курдук бэлиэтэннэ",
        "markedaspatrolledtext": "[[:$1]] ыстатыйа барыла ботуруулламмыт курдук бэлиэтэннэ.",
        "rcpatroldisabled": "Кэлиҥҥи уларытыылары бэрэбиэркэлиир бобулунна",
        "patrol-log-header": "Ботуруулламмыт торумнар сурунааллара.",
        "log-show-hide-patrol": "$1 ботурууллааһын сурунаала",
        "log-show-hide-tag": "$1 тиэк сурунаала",
+       "confirm-markpatrolled-button": "Сөп",
+       "confirm-markpatrolled-top": "$2 сирэй $3 торумун ботуруулламмыт курдук бэлиэтиигин дуо?",
        "deletedrevision": "$1 урукку торума сотулунна",
        "filedeleteerror-short": "Билэни сотор сатаммата: $1",
        "filedeleteerror-long": "Билэни сотуу кэмигэр кэккэ моһоллор таҕыстылар:\n\n$1",
        "newimages-showbots": "Руобаттар хачайдааһыннарын көрдөр",
        "newimages-hidepatrolled": "Кэтэммит хачайданыылары сабыы.",
        "noimages": "Ойуу суох.",
+       "gallery-slideshow-toggle": "Ойуучааннары уларыт",
        "ilsubmit": "Көрдөт",
        "bydate": "айыллыбыт кэминэн",
        "sp-newimages-showfrom": "Баччаттан киирбит саҥа ойуулары көрдөр: $2, $1",
        "confirmemail_body_set": "Ким эрэ (баҕар эн буолуо) маннык IP-ттан: $1\nбу аадырыһы «$2» диэн {{SITENAME}} кыттааччыта бэйэтин аадырыһын курдук эттэ.\n\nМаны бигэргэтэр буоллаххына,\nуонна {{SITENAME}} ситим-сириттэн эйиэхэ сурук кэлэрин сөбүлэһэр буоллаххына, аллара баар сигэни баттаа:\n\n$3\n\nӨскө бу аат эйиэхэ сыһыана *суох* буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
        "confirmemail_invalidated": "Электроннай почта аадырыһын бигэргэтиини суох оҥоһулунна",
        "invalidateemail": "Эл. почта бигэргэтээһинин араарга",
+       "notificationemail_subject_changed": "{{SITENAME}} эл. почтатын аадырыһа уларыйда",
+       "notificationemail_subject_removed": "{{SITENAME}} эл. почтатын аадырыһа сотулунна",
+       "notificationemail_body_changed": "Ким эрэ, $1 IP-аадрырыстан,\n{{SITENAME}} \"$2\" бэлиэ-аатын эл. почтатын аадырыһын манныкка уларытта \"$3\".\n\nӨскөтө бэйэҥ уларыппатах буоллаххына, суһаллык ситим-сир дьаһабылыгар тахса сырыт.",
+       "notificationemail_body_removed": "Ким эрэ, $1 IP-аадрырыстан,\n{{SITENAME}} \"$2\" бэлиэ-аатын эл. почтатын сотон кэбистэ.\n\nӨскөтө бэйэҥ соппотох буоллаххына, суһаллык ситим-сир дьаһабылыгар тахса сырыт.",
        "scarytranscludedisabled": "[Interwiki transcluding араҕыста]",
        "scarytranscludefailed": "[$1 халыыбы туһанар табыллыбата]",
        "scarytranscludefailed-httpstatus": "[Манна $1 анаммыт халыыбы холбуур сатаммата: HTTP $2]",
        "scarytranscludetoolong": "[URL наһаа уһун]",
        "deletedwhileediting": "'''Болҕой''': Сирэйи көннөрө олордоххуна ким эрэ сотон кэбистэ!",
-       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|ырытыыта]]) бу сирэйи эн уларыта олордоххуна сотон кэбистэ, төрүөтэ:\n: ''$2''\nБука диэн сирэйи төннөрөргүн бигэргэт.",
+       "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|ырыт.]]) бу сирэйи эн уларыта олордоххуна сотон кэбиспит, төрүөтэ:\n: <em>$2</em>\nБука диэн, сирэйи хат оҥорор буоллаххына бигэргэт.",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|ырытыыта]]) бу сирэйи эн уларыта олордоххуна сотон кэбиспит. Бука диэн сирэйи кырдьык төннөрүөххүн баҕараргын бигэргэт.",
        "recreate": "Саҥаттан оҥоруу",
        "confirm_purge_button": "Сөп",
        "confirm-watch-top": "Бу сирэйи кэтээһин тиһигэр киллэрэҕин дуо?",
        "confirm-unwatch-button": "Сөп",
        "confirm-unwatch-top": "Бу сирэйи кэтээһин тиһигиттэн сотоҕун дуо?",
+       "confirm-rollback-button": "Сөп",
+       "confirm-rollback-top": "Бу сирэй уларытыыларын соттороҕун дуо?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← инники сирэй",
        "imgmultipagenext": "аныгыскы сирэй →",
        "watchlistedit-raw-done": "Саҥа испииһэк бигэргэтилиннэ.",
        "watchlistedit-raw-added": "Тиһиккэ {{PLURAL:$1|1 пуун эбилиннэ|$1 пуун эбии киирдэ}}:",
        "watchlistedit-raw-removed": "Испииһэктэн {{PLURAL:$1|1 пуун|$1 пуун}} көҕүрээтэ:",
-       "watchlistedit-clear-title": "Ð\9aÑ\8dÑ\82Ñ\8dбил Ñ\82иһигÑ\8d Ñ\8bÑ\80ааÑ\81Ñ\82анна",
+       "watchlistedit-clear-title": "Ð\9aÑ\8dÑ\82Ñ\8dбил Ñ\82иһилигин Ñ\8bÑ\80ааÑ\81Ñ\82аа",
        "watchlistedit-clear-legend": "Кэтэбил тиһигин сот",
        "watchlistedit-clear-explain": "Кэтэбилиҥ тиһигиттэн бары суруктар сотуллуохтара",
        "watchlistedit-clear-titles": "Баһа:",
        "timezone-local": "Олохтоох",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
+       "restricted-displaytitle": "<strong>Болҕой:</strong> Суруллубут «$1» диэн аат ылыныллыбатах, тоҕо диэтэххэ сирэй билиҥҥи аатыгар сөп түбэспэт.",
        "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
        "version-libraries-description": "Ойуулааһын",
        "version-libraries-authors": "Ааптар",
        "redirect": "Билэттэн, кыттааччыттан, сирэйтэн эбэтэр барыл идентификаторыттан утаарыы",
-       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (барыл эбэтэр сирэй идентификааторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]] эбэтэр\n[[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (торум эбэтэр сирэй идентификаторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]],\n[[{{#Special:Redirect}}/user/101]] эбэтэр [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Толор",
        "redirect-lookup": "Көрдөт:",
        "redirect-value": "Суолтата:",
        "tag-filter-submit": "Фильтр",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тиэк|Тиэктэр}}]]: $2)",
        "tag-mw-contentmodelchange": "Иһинээҕи киэбин уларытыы сурунаала",
+       "tag-mw-contentmodelchange-description": "Сирэй [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ис тутулун уларытар] көннөрүүлэр",
        "tags-title": "Бэлиэлэр (тиэктэр)",
        "tags-intro": "Бу сирэйгэ бырагыраамма уларытыылары бэлиэтиир анал бэлиэлэрин (тиэктэрин) тиһиктэрэ уонна ол бэлиэлэр суолталара көстөр.",
        "tags-tag": "Бэлиэ (тиэк) аата",
        "tags-actions-header": "Дьайыылар",
        "tags-active-yes": "Сөп",
        "tags-active-no": "Суох",
-       "tags-source-extension": "Ð\9aÑ\8dÒ¥Ñ\8dÑ\82ииÑ\82инÑ\8dн Ð±Ñ\8bһааÑ\80Ñ\8bллаÑ\80",
+       "tags-source-extension": "ТÑ\83һанÑ\8bллаÑ\80 Ð±Ñ\8bÑ\80агÑ\8bÑ\80аамаÑ\82Ñ\82ан Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83кÑ\82ааÑ\85",
        "tags-source-manual": "Кыттааччылар уонна буоттар киллэрэллэр",
        "tags-source-none": "Аны туттуллубат",
        "tags-edit": "уларытыы",
        "tags-deactivate": "араар",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "tags-manage-no-permission": "Тиэктэри уларытар кыаҕыҥ суох эбит.",
-       "tags-manage-blocked": "Хааччахтаммыт буолаҥҥын уларытыы бэлиэлэрин уларытар кыаҕыҥ суох.",
+       "tags-manage-blocked": "Хааччахтаммыт {{GENDER:$1|буолаҥҥын}} уларытыы тиэктэрин уларытар кыаҕыҥ суох.",
        "tags-create-heading": "Саҥа тиэги оҥоруу",
        "tags-create-explanation": "Саҥа оҥоһуллубут тиэктэри кыттааччылар уонна буоттар уларытар кыахтаах буолуохтара.",
        "tags-create-tag-name": "Бэлиэ аата:",
        "tags-delete-not-found": "Маннык $1 бэлиэ суох эбит.",
        "tags-delete-too-many-uses": "«$1» тиэк $2 торумтан ордукка туттуллар, ол аата сотуллар кыаҕа суох.",
        "tags-delete-warnings-after-delete": "«$1» тиэк сотулунна, ол эрээри {{PLURAL:$2|маннык сэрэтии|маннык сэрэтиилэр}} көһүннүлэр:",
+       "tags-delete-no-permission": "Тиэги уларыппыттарын көннөрөр кыаҕыҥ суох эбит.",
        "tags-activate-title": "Тиэги холбоо",
        "tags-activate-question": "\"$1\" тиэги холбоон эрэҕин.",
        "tags-activate-reason": "Төрүөтэ:",
        "tags-deactivate-not-allowed": "\"$1\" тиэги араарар табыллыбат.",
        "tags-deactivate-submit": "араар",
        "tags-apply-no-permission": "Бэйэҥ уларытыыгар уларытыы тиэгин туруорар кыаҕыҥ суох эбит.",
-       "tags-apply-blocked": "Хатана сылдьар кэмҥитигэр көннөрүүлэргитигэр уларытыы бэлиэлэрин туттаргыт табыллыбат.",
+       "tags-apply-blocked": "Хааччахтана сылдьар {{GENDER:$1|кэмҥэр}} көннөрүүлэриҥ тиэгин уларытарыҥ табыллыбат.",
        "tags-apply-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
        "tags-apply-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
        "tags-update-no-permission": "Сурунаал тус-туспа торумнарын уонна суруктарын тиэгин эбэр уонна уларытар кыаҕыҥ суох эбит.",
-       "tags-update-blocked": "Хааччахтаммыт буолаҥҥыт уларытыы бэлиэлэрин уларытар кыаҕыҥ суох.",
+       "tags-update-blocked": "Хааччахтаммыт {{GENDER:$1|буолаҥҥын}} уларытыы тиэктэрин уларытар кыаҕыҥ суох.",
        "tags-update-add-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
        "tags-update-add-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
        "tags-update-remove-not-allowed-one": "«$1» тиэги сотор табыллыбат эбит.",
        "tags-edit-revision-legend": "{{PLURAL:$1|Бу торумҥа|Бары $1 торумҥа}} тиэги угуу эбэтэр онтон сотуу",
        "tags-edit-logentry-legend": "Сурунаал {{PLURAL:$1|суругуттан|$1 бары суруктарыттан}} тиэги сот биитэр онно киллэр",
        "tags-edit-existing-tags": "Баар тиэктэр:",
-       "tags-edit-existing-tags-none": "''Суох''",
+       "tags-edit-existing-tags-none": "<em>Суох</em>",
        "tags-edit-new-tags": "Саҥа тиэктэр:",
        "tags-edit-add": "Бу тиэктэри эп:",
        "tags-edit-remove": "Бу тиэктэри сот:",
        "tags-edit-reason": "Төрүөтэ:",
        "tags-edit-revision-submit": "Уларытыылары бу {{PLURAL:$1|торумҥа|$1 торумнарга}} тарҕат",
        "tags-edit-logentry-submit": "Уларытыылары сурунаал бу {{PLURAL:$1|суругар|$1 суруктарыгар}} тарҕат",
-       "tags-edit-success": "Уларытыы сөпкө бигэргэннэ.",
+       "tags-edit-success": "Уларытыы бигэргэннэ.",
        "tags-edit-failure": "Уларытыылары туттар табыллыбата.\n$1",
        "tags-edit-nooldid-title": "Торум чопчу ыйыллыбата",
        "tags-edit-nooldid-text": "Ханнык торумҥа туттулларын талбатаххын, биитэр талбыт торумуҥ суох эбит.",
        "htmlform-cloner-create": "Өссө эп",
        "htmlform-cloner-delete": "Сот",
        "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
+       "htmlform-date-placeholder": "СССС-ЫЫ-КК",
+       "htmlform-time-placeholder": "ЧЧ:ММ:СС",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Суруйбутуҥ күнү-дьылы бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: СССС-ЫЫ-КК.",
+       "htmlform-time-invalid": "Суруйбутуҥ кэми бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: ЧЧ-ММ-СС.",
+       "htmlform-datetime-invalid": "Суруйбутуҥ күнү-дьылы уонна кэми бэлиэтээһиҥҥэ майгыннаабат. Маннык көрүҥү туһан: СССС-ЫЫ-КК ЧЧ-ММ-СС.",
+       "htmlform-date-toolow": "Ыйбыт кэмиҥ муҥутуур кылгас кэмтэн кылгас эбит — $1.",
+       "htmlform-date-toohigh": "Ыйбыт кэмиҥ муҥутуур болдьохтон хойут эбит — $1.",
+       "htmlform-time-toolow": "Ыйбыт кэмиҥ болдьохтон кылгас — $1.",
+       "htmlform-time-toohigh": "Ыйбыт кэмиҥ болдьохтон уһун — $1.",
+       "htmlform-datetime-toolow": "Ыйбыт кэмиҥ анаммыт ыйтан-күнтэн уонна кэмтэн эрдэ буолан хаалбыт — $1.",
+       "htmlform-datetime-toohigh": "Ыйбыт кэмиҥ анаммыт күнтэн-дьылтан уонна кэмтэн хойут буолан хаалбыт — $1.",
        "htmlform-title-badnamespace": "[[:$1]] бу аат далыгар киирбэт эбит «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» оҥоһуллар сирэй аата буолбатах",
        "htmlform-title-not-exists": "$1 суох.",
        "htmlform-user-not-exists": "<strong>$1</strong> суох.",
        "htmlform-user-not-valid": "<strong>$1</strong> — маннык аат сатаммат.",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
+       "logentry-delete-delete_redir": "$1 кыттааччы $3 утаарыыны хос суруйуу көмөтүнэн {{GENDER:$2|соппут}}",
        "logentry-delete-restore": "$3 сирэйи $1 сөргүппүт",
        "logentry-delete-event": "Сурунаал $5 суругун көстүүтүн манна $3 $1 уларыппыт: $4",
        "logentry-delete-revision": "$3 сирэй $5 барылын көстүүтүн бу сирэйгэ $1 уларыппыт: $4",
        "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
        "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
        "logentry-import-upload": "$1 {{GENDER:$2|киллэрбит}} $3 билэни хачайдыыр ньыманнан",
+       "logentry-import-upload-details": "$1 билэ хачайдааһынынын көмөтүнэн $3 ($4 {{PLURAL:$4|торумун}}) {{GENDER:$2|иһирдьэ киллэрдэ}}",
        "logentry-import-interwiki": "$1 {{GENDER:$2|киллэрбит}} $3 атын биикиттэн",
+       "logentry-import-interwiki-details": "$1 кыттааччы $3 $5 торумуттан ($4 {{PLURAL:$4|торумун}}) {{GENDER:$2|иһирдьэ киллэрдэ}}",
        "logentry-merge-merge": "$1 {{GENDER:$2|холбообут}} мантан $3 манна $4 ($5 диэри торумнара)",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
        "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын (каскаадынан)",
-       "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5",
+       "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 {{GENDER:$2|уларыппыт}}: мантан $4 манныкка $5",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "logentry-upload-upload": "$1 {{GENDER:$2|укпут}} $3",
        "logentry-managetags-deactivate": "$1 \"$4\" тиэги кыттааччылар уонна буоттар туһамматтарын курдук {{GENDER:$2|гыммыт}}",
        "log-name-tag": "Тиэк сурунаала",
        "log-description-tag": "Бу сирэй кыттааччылар [[Special:Tags|тиэктэри]] хаһан эппиттэрин биитэр соппуттарын көрдөрөр. Тиэги атын уларытыы, сотуу <strong>иһинэн</strong> оҥордоххо манна көстүбэт.",
+       "logentry-tag-update-add-revision": "$6 {{PLURAL:$7|тиэги}} $3 сирэй $4 торумугар $1 {{GENDER:$2|эппит}}",
+       "logentry-tag-update-add-logentry": "$6 {{PLURAL:$7|тиэги}} $5 сурунаал $3 сирэйигэр $6  торумугар $1 {{GENDER:$2|эппит}}",
+       "logentry-tag-update-remove-revision": "$1 $3 сирэй $4 торумуттан $8 {{PLURAL:$9|тиэги}} {{GENDER:$2|соппут}}",
+       "logentry-tag-update-remove-logentry": "$1  $8 {{PLURAL:$9|тиэги}} $5 сурунаал $3 сирэйиттэн {{GENDER:$2|соппут}}",
+       "logentry-tag-update-revision": "$1 кыттааччы $4 сирэй $3 торумун {{GENDER:$2|саҥардан биэрдэ}} ($6 {{PLURAL:$7|эбилиннэ}}; $8 {{PLURAL:$9|сотулунна}})",
+       "logentry-tag-update-logentry": "$1 кыттааччы $3 сирэй $5 сурунаалын {{GENDER:$2|саҥардан биэрдэ}} ($6 {{PLURAL:$7|эбилиннэ}}; $8 {{PLURAL:$9|сотулунна}})",
        "rightsnone": "(суох)",
        "revdelete-summary": "уларытыылар туһунан",
        "feedback-adding": "Сирэй туһунан санаа этии...",
        "feedback-useragent": "Браузерым:",
        "searchsuggest-search": "{{SITENAME}} иһигэр көрдөөһүн",
        "searchsuggest-containing": "тыл баар ыстатыйалара...",
-       "api-error-badaccess-groups": "Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.",
        "api-error-badtoken": "Ис алҕас: Омсолоох токен.",
-       "api-error-copyuploaddisabled": "URL көмөтүнэн киллэрии бу сиэрбэргэ араарыллыбыт.",
-       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|атын билэ баар эбит}}",
-       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|билэ баар|билэлэр бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
-       "api-error-empty-file": "Ыыппыт билэҥ кураанах.",
        "api-error-emptypage": "Саҥа кураанах сирэйи оҥорор табыллыбат.",
-       "api-error-fetchfileerror": "Ис алҕас: билэни ыларга туох эрэ сатаммата.",
-       "api-error-fileexists-forbidden": "Маннык \"$1\" ааттаах билэ хайыы үйэ баар уонна хат суруллар кыаҕа суох эбит.",
-       "api-error-fileexists-shared-forbidden": "«$1» диэн ааттаах билэ уопсай харайар сиргэ баар уонна хат суруллар кыаҕа суох эбит.",
-       "api-error-file-too-large": "Ыыппыт билэҥ наһаа улахан эбит.",
-       "api-error-filename-tooshort": "Билэҥ аата наһаа кылгас.",
-       "api-error-filetype-banned": "Маннык көрүҥнээх билэлэр бобуулаахтар.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|билэ бобуллубут көрүҥэ|билэ бобуллубут көрүҥнэрэ}}. \nКөҥүллэммит билэ {{PLURAL:$3|көрүҥэ маннык|көрүҥнэрэ манныктар}}: $2.",
-       "api-error-filetype-missing": "Бу билэ тэнитиитэ (расширение) суох эбит.",
-       "api-error-hookaborted": "Эн киллэрбит уларытыыгын кэҥэтии таҥастааччыта оннугар төннөрбүт.",
-       "api-error-http": "Ис алҕас: Сиэрбэргэ холбонор табыллыбата.",
-       "api-error-illegal-filename": "Билэ маннык ааттанара сатаммат.",
-       "api-error-internal-error": "Ис алҕас: биикигэ угаары гыммыккар туох эрэ сатаммата.",
-       "api-error-invalid-file-key": "Ис алҕас: Быстах уурар сиргэ билэ көстүбэтэ.",
-       "api-error-missingparam": "Ис алҕас: Көрдөбүл туруоруулара суохтар эбит.",
-       "api-error-missingresult": "Ис алҕас: Хатылааһын сатаммыта-сатамматаҕа биллибэтэ.",
-       "api-error-mustbeloggedin": "Билэни киллэрэргэ бастаан ааккын этиэхтээххин.",
-       "api-error-mustbeposted": "Ис алҕас: HTTP POST алҕастаах.",
-       "api-error-noimageinfo": "Хачайдааһын сөпкө түмүктэннэ эрээри, сиэрбэр билэ туһунан тугу да биллэрбэтэ.",
-       "api-error-nomodule": "Ис алҕас: хачайдыыр муодул туруоруута суох.",
-       "api-error-ok-but-empty": "Ис алҕас: сиэрбэртэн хоруй кэлбэтэ.",
-       "api-error-overwrite": "Баар билэни уларытар сатаммат.",
-       "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-publishfailed": "Ис алҕас: сиэрбэр быстах билэни кыайан бигэргэппэтэх.",
-       "api-error-stasherror": "Билэни угарга алҕас таҕыста.",
-       "api-error-stashedfilenotfound": "Хачайданыахтаах билэ быстах уурар сиргэ көстүбэтэ.",
-       "api-error-stashpathinvalid": "Билэ сытыахтаах быстах уурар сирин суола алҕастаах.",
-       "api-error-stashfilestorage": "Билэни быстах угар сиргэ угарга алҕас таҕыста.",
-       "api-error-stashzerolength": "Сиэрбэр билэни быстах угар сиргэ харайар кыаҕа суох, тоҕо диэтэххэ уһуна нуул.",
-       "api-error-stashnotloggedin": "Билэни быстах сиргэ харайарга бастаан ааккынан киириэхтээххин.",
-       "api-error-stashwrongowner": "Арыйа сатаабыт билэҥ эйиэнэ буолбатах эбит.",
-       "api-error-stashnosuchfilekey": "Быстах уурар сиргэ сытар билэҕэ киирэ сатаабыт күлүүһүҥ суох эбит.",
-       "api-error-timeout": "Сиэрбэр кэтэһэр кэмҥэ хоруйдаабата.",
-       "api-error-unclassified": "Биллибэт алҕас таҕыста",
-       "api-error-unknown-code": "Биллибэт алҕас: «$1»",
-       "api-error-unknown-error": "Ис алҕас: билэни киллэрии кэмигэр туох эрэ сатаммата.",
+       "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-unknown-warning": "Биллибэт сэрэтии: $1",
        "api-error-unknownerror": "Биллибэт алҕас: $1",
-       "api-error-uploaddisabled": "Бу биикигэ хачайдыыр араарыллыбыт эбит.",
-       "api-error-verification-error": "Бу билэ алдьаммыт эбэтэр табыгаһа суох кэҥэтиилээх.",
        "duration-seconds": "$1 сөкүүндэ",
        "duration-minutes": "$1 мүнүүтэ",
        "duration-hours": "$1 чаас",
        "expand_templates_generate_rawhtml": "HTML-ы көрдөр",
        "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": "Эһиги ханнык эмит тиэкиһи туруор.",
-       "pagelanguage": "СиÑ\80Ñ\8dй Ñ\82Ñ\8bлÑ\8bн Ñ\82алыы",
+       "pagelanguage": "СиÑ\80Ñ\8dй Ñ\82Ñ\8bлÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82ыы",
        "pagelang-name": "Сирэй",
        "pagelang-language": "Омугун тыла",
        "pagelang-use-default": "Сүрүн тылы тутун",
        "action-pagelang": "сирэй тылын уларытар буол",
        "log-name-pagelang": "Тылы уларытыы сурунаала",
        "log-description-pagelang": "Сирэй тылын талыы сурунаала.",
-       "logentry-pagelang-pagelang": "$1 кыттааччы $3 сирэй тылын мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
+       "logentry-pagelang-pagelang": "$1 кыттааччы $3 тылы мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
+       "default-skin-not-found": "Ок-сиэ! Эн биикигэр талбатахха турар тиэмэ <code>$wgDefaultSkin</code>, <code>$1</code> сатаан турбат эбит.\n\nТуруорууҥ, арааһа {{PLURAL:$4|маннык тиэмэлээх|маннык тиэмэлэрдээх}}. Маны көр [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration], итиннэ {{PLURAL:$4|кинини|кинилэри}} хайдах туруорар туһунан суруллар.\n\n$2\n\n; Өскөтө MediaWiki-ни саҥа туруоруммут буоллаххына:\n: Баҕар, Git көмөтүнэн биитэр төрүт куод көмөтүнэн туруорбут буолуоххун сөп. Оччоҕо маннык буолуон сөп. Бу түгэҥҥэ сорох тиэмэлэри мантан туруорунан көр: [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org тимэтин каталога]:\n:* хас да тиэмэлээх [https://www.mediawiki.org/wiki/Download туруорунар билэ архыыбын] хачайдаан ылан баран; бу паапканы куопуйалыахха сөп <code>skins/</code>;\n:* биирдиилээн тиэмэ архыыбын мантан хачайдыахха сөп [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins тиэмэ хачайдыыр Git туһаныаххын сөп].\n: MediaWiki-гэ быһаарсар буоллаххына эн Git репозиторийгын бу буортулуо суохтаах. Тиэмэни холбуур уонна этиллибэтэҕинэ турар тиэмэни талар туһунан манна көр [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration].\n; Өскөтө MediaWiki-ни саҥа саҥардыбыт буоллаххына:\n: MediaWiki 1.24 торума уонна онтон үөһээҥҥилэрэ аны угуллубут тиэмэлэрэ суох (көр. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nБу {{PLURAL:$5|устуруоканы|устуорукалары}} бу иһигэр <code>LocalSettings.php</code> угуоххун сөп, оччоҕо туруорбут {{PLURAL:$5|тиэмэҥ|бары тиэмэҥ}} холбонуо: \n\n<pre dir=\"ltr\">$3</pre>\n\n; Өскөтө <code>LocalSettings.php</code> саҥа улурыппыт буоллаххына:\n: Тиэмэлэр ааттарын тургутан көр, баҕар алҕастааҕа буолуо.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (холбоммут)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>арахсыбыт</strong>)",
        "mediastatistics": "Миэдьийэ ыстатыыстыката",
        "mediastatistics-summary": "Киирбит билэ көрүҥүн ыстатыыстыката. Билэ тиһэх эрэ торумун көрдөрөр. Урукку уонна сотуллубут билэлэр ааҕыллыбаттар.",
        "mediastatistics-nbytes": "$1 баайт ($2; $3%)",
+       "mediastatistics-bytespertype": "Бу салаа билэтин бүттүүнүн кээмэйэ: $1 {{PLURAL:$1|баайт}} ($2; $3%).",
+       "mediastatistics-allbytes": "Билэлэр барыларын кээмэйэ: $1 {{PLURAL:$1|баайт}} ($2).",
        "mediastatistics-table-mimetype": "MIME көрүҥэ",
        "mediastatistics-table-extensions": "Туһаныллыан сөптөөх кэҥэтиилэр",
        "mediastatistics-table-count": "Билэ ахсаана",
        "special-characters-group-ipa": "МФА (IPA)",
        "special-characters-group-symbols": "Бэлиэлэр",
        "special-characters-group-greek": "Гириэктии",
+       "special-characters-group-greekextended": "Кэҥэтиллибит гириэк",
        "special-characters-group-cyrillic": "Кириллица",
        "special-characters-group-arabic": "Араабтыы",
        "special-characters-group-arabicextended": "Араабтыы кэҥэтиллибит",
        "special-characters-title-emdash": "уһун тире",
        "special-characters-title-minus": "минус бэлиэтэ",
        "mw-widgets-dateinput-no-date": "Күнэ-дьыла ыйыллыбатах",
+       "mw-widgets-mediasearch-input-placeholder": "Миэдьийэ билэлэри көрдөөһүн",
+       "mw-widgets-mediasearch-noresults": "Туох да көстүбэтэ.",
        "mw-widgets-titleinput-description-new-page": "сирэй суох эбит",
        "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы",
-       "randomrootpage": "Түбэһиэх төрүт сирэй."
+       "mw-widgets-categoryselector-add-category-placeholder": "Категория эбии...",
+       "sessionmanager-tie": "Тургутуу хас да көрүҥүн биирдэ туһанар сатаммат: $1.",
+       "sessionprovider-generic": "$1 сиэссийэ",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "куукаҕа олоҕурбут сиэссийэ",
+       "sessionprovider-nocookies": "Куука арахсыбыт буолуон сөп. оннук түгэҥҥэ холбоон баран хатылаа.",
+       "randomrootpage": "Түбэһиэх төрүт сирэй.",
+       "log-action-filter-block": "Хааччах көрүҥэ:",
+       "log-action-filter-contentmodel": "Contentmodel көрүҥэ:",
+       "log-action-filter-delete": "Сотуу көрүҥэ:",
+       "log-action-filter-import": "Киллэрии көрүҥэ:",
+       "log-action-filter-managetags": "Салайар тиэк көрүҥэ:",
+       "log-action-filter-move": "Аатын солбуйуу көрүҥэ:",
+       "log-action-filter-newusers": "Бэлиэ ааты оҥоруу көрүҥэ:",
+       "log-action-filter-patrol": "Ботуруул көрүҥэ:",
+       "log-action-filter-protect": "Көмүскэл көрүҥэ:",
+       "log-action-filter-rights": "Быраабы уларытыы көрүҥэ:",
+       "log-action-filter-suppress": "Кистээһин көрүҥэ:",
+       "log-action-filter-upload": "Хачайдааһын көрүҥэ:",
+       "log-action-filter-all": "Бары",
+       "log-action-filter-block-block": "Бобуу",
+       "log-action-filter-block-reblock": "Бобууну уларытыы",
+       "log-action-filter-block-unblock": "Бобууну суох гыныы",
+       "log-action-filter-contentmodel-change": "Иһинээҕитин мадьыалын уларытыы",
+       "log-action-filter-contentmodel-new": "Contentmodel диэн мадьыалынан сирэйи айыы",
+       "log-action-filter-delete-delete": "Сирэйи сотуу",
+       "log-action-filter-delete-delete_redir": "Утаарыыны хат суруйуу",
+       "log-action-filter-delete-restore": "Сирэйи сөргүтүү",
+       "log-action-filter-delete-event": "Сурунаалы сотуу",
+       "log-action-filter-delete-revision": "Торуму сотуу",
+       "log-action-filter-import-interwiki": "Трансвики импорт",
+       "log-action-filter-import-upload": "XML-ынан киллэрии",
+       "log-action-filter-managetags-create": "Тиэктэри оҥоруу",
+       "log-action-filter-managetags-delete": "Тиэги сотуу",
+       "log-action-filter-managetags-activate": "Тиээги холбооһун",
+       "log-action-filter-managetags-deactivate": "Тиэги араарыы",
+       "log-action-filter-move-move": "Утаарыыны хас суруйбакка салгыы барыы",
+       "log-action-filter-move-move_redir": "Утаарыыны солбуйан сыҕарытыы",
+       "log-action-filter-newusers-create": "Аатын эппэтэх кыттааччы оҥоруута",
+       "log-action-filter-newusers-create2": "Бэлиэтэммит кыттааччы оҥоруута",
+       "log-action-filter-newusers-autocreate": "Аптамаатынан оҥоруу",
+       "log-action-filter-newusers-byemail": "Почтанан кэлбит аһарыгы туһанан оҥоруу",
+       "log-action-filter-patrol-patrol": "Киһи ботурууллааһына",
+       "log-action-filter-patrol-autopatrol": "Аптамаат ботурууллааһына",
+       "log-action-filter-protect-protect": "Көмүскэл",
+       "log-action-filter-protect-modify": "Көмүскэли уларытыы",
+       "log-action-filter-protect-unprotect": "Көмүскэли суох гыныы",
+       "log-action-filter-protect-move_prot": "Көмүскэли көһөрүү",
+       "log-action-filter-rights-rights": "Киһи уларытыыта",
+       "log-action-filter-rights-autopromote": "Аптамаат уларытыыта",
+       "log-action-filter-suppress-event": "Сурунаалы кистээһин",
+       "log-action-filter-suppress-revision": "Торуму кистээһин",
+       "log-action-filter-suppress-delete": "Сирэйи кистээһин",
+       "log-action-filter-suppress-block": "Кыттааччыны бобуу көмөтүнэн кистээһин",
+       "log-action-filter-suppress-reblock": "Кыттааччыны хос бобуу көмөтүнэн кистээһин",
+       "log-action-filter-upload-upload": "Саҥа хачайдаан киллэрии",
+       "log-action-filter-upload-overwrite": "Хат ыытыы",
+       "authmanager-authn-not-in-progress": "Дьиҥнээҕин тургутуу оҥоһуллубат эбит, биитэр сиэссийэ быстан хаалбыт.\nБука диэн, саҥаттан тургутан көр.",
+       "authmanager-authn-no-primary": "Бэлиэ аат дьиҥнээҕэ тургутуллар кыаҕа суох эбит.",
+       "authmanager-authn-no-local-user": "Маннык бэлиэ аат бу биики ханнык да кыттааччытын кытта сөп түбэспэтэ.",
+       "authmanager-authn-no-local-user-link": "Эппит сибидиэнньэҥ ирдэбилгэ сөп түбэһэр гынан баран биир да кыттааччыны кытта ситимэ суох эбит. Атыннык киирэн баран урукку бэлиэ ааккын кытта ситимнээ.",
+       "authmanager-authn-autocreate-failed": "Олохтоох бэлиэ ааты аптамаат сатаан оҥорбото: $1",
+       "authmanager-change-not-supported": "Бэлиэ аат сибидиэнньэтэ уларыйар кыаҕа суох, тоҕо диэтэххэ туһаныллыбат.",
+       "authmanager-create-disabled": "Бэлиэтэнии арахсан турар.",
+       "authmanager-create-from-login": "Бэлиэтэнэргэ аллараа хонуулары толор дуу.",
+       "authmanager-create-not-in-progress": "Бэлиэтэнии сатаммата эбэтэр сиэссийэ быстан хаалла. Саҥаттан хатылаан көр.",
+       "authmanager-create-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэтэнэр сатаммат эбит.",
+       "authmanager-link-no-primary": "Эппит сибидиэнньэҕин туһанан бэлиэ ааттары холбуур сатаммат эбит.",
+       "authmanager-link-not-in-progress": "Бэлиэ ааттары холбуур сатаммата эбэтэр сиэссийэ быстан хаалла. Саҥаттан хатылаан көр.",
+       "authmanager-authplugin-setpass-failed-title": "Аһарыгы уларытар табыллыбата",
+       "authmanager-authplugin-setpass-failed-message": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
+       "authmanager-authplugin-create-fail": "Аутентификация былаҕыына бэлиэтэнэри бобор.",
+       "authmanager-authplugin-setpass-denied": "Аутентификация былаҕыына аһарыгы уларытары бобор.",
+       "authmanager-authplugin-setpass-bad-domain": "Алҕастаах домен.",
+       "authmanager-autocreate-noperm": "Аптамаатынан бэлиэтэнии көҥүллэммэт.",
+       "authmanager-autocreate-exception": "Аптамаатынан бэлиэтэнии урут тахсыбыт алҕастартан сылтаан араарыллыбыт.",
+       "authmanager-userdoesnotexist": "Маннык аат «$1» суох.",
+       "authmanager-userlogin-remembermypassword-help": "Аһарык сиэссийэ түмүктэммитин кэннэ долоҕойго хаалар дуо.",
+       "authmanager-username-help": "Кыттааччы аата тургутарга.",
+       "authmanager-password-help": "Аһарык тургутарга",
+       "authmanager-domain-help": "Тастан тургутар дамыан.",
+       "authmanager-retype-help": "Аһарыгы хос суруй.",
+       "authmanager-email-label": "Э-почта",
+       "authmanager-email-help": "Эл. аадырыһа",
+       "authmanager-realname-label": "Дьиҥнээх аатыҥ",
+       "authmanager-realname-help": "Кыттааччы сурукка киирбит аата",
+       "authmanager-provider-password": "Аһарык көмөтүнэн киирии",
+       "authmanager-provider-password-domain": "Дамыан уонна аһарык көмөтүнэн киирии",
+       "authmanager-provider-temporarypassword": "Быстах аһарык",
+       "authprovider-confirmlink-message": "Урут киирэ сылдьыбыт бэлиэ-ааттаргын кытта ситимниэххэ сөп. Оччоҕо ол аатынан эмиэ киириэххин сөп буолуоҕа. Ханнык бэлиэ-ааттары ситимнииргин тал дуу.",
+       "authprovider-confirmlink-request-label": "Ситимнэнэр бэлиэ-ааттар",
+       "authprovider-confirmlink-success-line": "$1: ситимнэннэ.",
+       "authprovider-confirmlink-failed": "Сороҕун эрэ ситимниир сатанна: $1",
+       "authprovider-resetpass-skip-label": "Аһар",
+       "authprovider-resetpass-skip-help": "Аһарыгы хос ыытыыны көтүт.",
+       "authform-nosession-login": "Этэҥҥэ киирдиҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+       "authform-nosession-signup": "Этэҥҥэ бэлиэтэнниҥ, ол эрээри браузерыҥ киирбиккин «долоҕойугар тохтотуо» суоҕа.\n\n$1",
+       "specialpage-securitylevel-not-allowed-title": "Көҥүллэммэт",
+       "specialpage-securitylevel-not-allowed": "Бу сирэйи туһанар кыаҕыҥ суох эбит, тоҕо диэтэххэ бу чахчы Эн буоларгын тургутар кыахпыт суох.",
+       "authpage-cannot-login": "Киириини салгыыр кыах суох.",
+       "authpage-cannot-login-continue": "Киириини салгыыр кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "authpage-cannot-create": "Бэлиэтэнэр сатаммата.",
+       "authpage-cannot-create-continue": "Бэлиэтэнэр кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "authpage-cannot-link": "Бэлиэ-ааттары ситимниир сатаммата.",
+       "authpage-cannot-link-continue": "Ситимниир кыах суох. Сиэссийэттэн тахсан хаалбыккын быһыылаах.",
+       "cannotauth-not-allowed-title": "Киирэр көҥүллэммэт",
+       "cannotauth-not-allowed": "Бу сирэйи туһанарыҥ сатаммат эбит",
+       "credentialsform-account": "Бэлиэ-аат:",
+       "cannotlink-no-provider-title": "Бэлиэ-ааттар суохтар",
+       "cannotlink-no-provider": "Бэлиэ-ааттар суохтар.",
+       "linkaccounts": "Бэлиэ-ааттары ситимнииргэ",
+       "linkaccounts-success-text": "Бэлиэ-аат ситимнэннэ.",
+       "linkaccounts-submit": "Ситимнииргэ",
+       "unlinkaccounts": "Ситими быһарга",
+       "unlinkaccounts-success": "Бэлиэ-аат ситимэ быһынна."
 }
index f711abd..737fc46 100644 (file)
@@ -12,7 +12,8 @@
                        "Samar88",
                        "Srabony90",
                        "아라",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "MtDu"
                ]
        },
        "tog-underline": "Joṛaoko latarre dag udugoḱma:",
        "navigation-heading": "Ạcurbaṛa minu",
        "errorpagetitle": "vul",
        "returnto": "$1 te ruar-rok' me",
-       "tagline": "Oka khoć",
+       "tagline": "Oka khoć {{SITENAME}}",
        "help": "Go̠ṛo̠",
        "search": "Se̠ndra",
        "searchbutton": "Se̠ndra",
        "pool-timeout": "Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana",
        "pool-queuefull": "Pul reaḱ sakam perećena",
        "pool-errorunknown": "Bań baḍayaḱ bhul",
-       "aboutsite": "babo̠tre",
+       "aboutsite": "babo̠tre {{SITENAME}}",
        "aboutpage": "Project: Babo̠t",
        "copyright": "$1 re bhitrire ńamoḱa.",
        "copyrightpage": "{{ns:project}}: Eḱteạr",
        "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.",
        "passwordreset-username": "Beoharicaḱ ńutum:",
        "passwordreset-domain": "Ḍomen:",
-       "passwordreset-capture": "Sendra fol reaḱ e-mail ńelmẽ?",
-       "passwordreset-capture-help": "Am do judi noa jacạy baksom lin lekhan, tobe nit lạgit́te em akan uku nambar são mit́ṭen e-mail ame uduḱama ar ona sãote beoharić ṭhen ona kuluḱa.",
        "passwordreset-email": "E-mail ṭhikạna:",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
        "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
index 68cbdcc..037258d 100644 (file)
        "tog-numberheadings": "سُرخين کي خودڪاراً نمبر ڏيو",
        "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
        "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
-       "tog-watchcreations": "منهنجا سرجيل صفحا ۽ منهنجا چاڙهيل فائيل منهنجي زيرِ نظر فهرست تي رکو",
-       "tog-watchdefault": "منهنجا ترميميل صفحا ۽ فائيل  منهنجي نظرھيٺ فھرست ۾ رکو",
-       "tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظرھيٺ فھرست ۾ شامل ڪريو.",
-       "tog-watchdeletion": "آءُٗ جيڪي صفحا ۽ فائيل  ڊاهيان، سي منهنجي نظرھيٺ فھرست تي رکو",
-       "tog-watchuploads": "منهنجا نوان چاڙهيل فائيلس ٽيٽ فهرست ۾ شامل ڪريو",
-       "tog-watchrollback": "انهن صفحن کي منهنجي نظرھيٺ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
+       "tog-watchcreations": "منھنجا سرجيل صفحا ۽ منھنجا چاڙھيل فائيل منھنجي نظر ۾ فھرست تي رکو",
+       "tog-watchdefault": "منھنجا ترميميل صفحا ۽ فائيل  منھنجي نظر ۾ فھرست ۾ رکو",
+       "tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tog-watchdeletion": "آءُٗ جيڪي صفحا ۽ فائيل  ڊاهيان، سي منهنجي نظر ۾ فھرست تي رکو",
+       "tog-watchuploads": "منھنجا نوان چاڙهيل فائيلس نظر ۾ فھرست ۾ شامل ڪريو",
+       "tog-watchrollback": "انهن صفحن کي منهنجي نظر ۾ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي",
        "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
        "tog-previewontop": "ترميمي دٻيءَ مٿان پيش نگاهہ ڏيکاريو",
        "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
-       "tog-enotifwatchlistpages": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ Ù\81ھرست Ø§Ù\86در Ø´Ø§Ù\85Ù\84 ÚªÙ\86Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ù\8aا Ù\81ائÙ\8aÙ\84 Û¾ ØªØ¨Ø¯Ù\8aÙ\84 Ù¾Ù\8aØ´ Ø§Ú\86Ù\8a Ù\85Ù\88Ù\86 Ú©Ù\8a Ø¨Ø±Ù\82 ٽپال اماڻيو",
-       "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
-       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
-       "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برق ٽپال پتو ظاهر ڪريو.",
+       "tog-enotifwatchlistpages": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù\86ظر Û¾ Ù\81ھرست Ø§Ù\86در Ø´Ø§Ù\85Ù\84 ÚªÙ\86Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ù\8aا Ù\81ائÙ\8aÙ\84 Û¾ ØªØ¨Ø¯Ù\8aÙ\84 Ù¾Ù\8aØ´ Ø§Ú\86Ù\8a Ù\85Ù\88Ù\86 Ú©Ù\8a Ø¨Ø±Ù\82ٽپال اماڻيو",
+       "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برقٽپال اماڻيو",
+       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برقٽپال ڪريو",
+       "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برقٽپال پتو ظاهر ڪريو",
        "tog-shownumberswatching": "ڏسندڙ يوزرس جو انگ ڏيکاريو",
        "tog-oldsig": "توھان جو موجوده دستخط:",
        "tog-fancysig": "صحيح کي وڪيٽيڪسٽ سمجھو (ڪنھن خوڪار ڳنڍڻي کانسواءِ)",
        "tog-uselivepreview": "سڌي سنئين پيش نگاھہ استعمال ڪريو",
-       "tog-watchlisthideown": "زير نظر فهرست مان منهنجون ڪيل ترميمون لڪايو",
-       "tog-watchlisthidebots": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان بوٽ جون ترميمون لڪايو",
-       "tog-watchlisthideminor": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان معمولي ترميمون لڪايو",
-       "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون زيرنظر فهرست ۾ نہ ڏيکاريو",
-       "tog-watchlisthideanons": "Ù½Ù\8aÙ½ Ù\81Ù\87رست تان اڻڄاتل يوزر جون ترميمون لڪايو",
-       "tog-watchlisthidepatrolled": "Ù½Ù\8aÙ½ فھرست مان گشت ڪيل ترميمون لڪايو",
+       "tog-watchlisthideown": "نظر ۾ فھرست مان منهنجون ڪيل ترميمون لڪايو",
+       "tog-watchlisthidebots": "Ù\86ظر Û¾ Ù\81Ú¾رست تان بوٽ جون ترميمون لڪايو",
+       "tog-watchlisthideminor": "Ù\86ظر Û¾ Ù\81Ú¾رست تان معمولي ترميمون لڪايو",
+       "tog-watchlisthideliu": "داخل ٿيل يوزرس جون ڪيل ترميمون نظر ۾ فھرست ۾ نہ ڏيکاريو",
+       "tog-watchlisthideanons": "Ù\86ظر Û¾ Ù\81Ú¾رست تان اڻڄاتل يوزر جون ترميمون لڪايو",
+       "tog-watchlisthidepatrolled": "Ù\86ظر Û¾ فھرست مان گشت ڪيل ترميمون لڪايو",
        "tog-watchlisthidecategorization": "صفحن جا زمرا لڪايو",
-       "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
+       "tog-ccmeonemails": "ٻين يوزرس ڏانھن منهنجي موڪليل برقٽپال جو پرت مون کي اماڻيو",
        "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
        "tog-norollbackdiff": "واپس ورائڻ کان پوءِ تفاوت نہ ڏيکاريو",
@@ -74,7 +74,7 @@
        "february": "فيبروري",
        "march": "مارچ",
        "april": "اپريل",
-       "may_long": "مَي",
+       "may_long": "مَئي",
        "june": "جُونِ",
        "july": "جُولاءِ",
        "august": "آگسٽ",
@@ -98,7 +98,7 @@
        "feb": "فيبروري",
        "mar": "مارچ",
        "apr": "اپريل",
-       "may": "مَي",
+       "may": "مَئي",
        "jun": "جُونِ",
        "jul": "جُولاءِ",
        "aug": "آگسٽ",
        "category-empty": "''في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.''",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
-       "category-subcat-count": "{{PLURAL:$2|هن ذمري ۾ رڳو هيٺيون ذيلي ذمرو آهي.|هن ذمري ۾ ڪل $2 مان هيٺيان {{PLURAL:$1|subcategory|$1 ذيلي ذمرا}} آهن.}}",
+       "category-subcat-count": "{{PLURAL:$2|ھن زمري ۾ رڳو ھيٺيون ذيلي زمرو آهي.|هن زمري ۾ ڪل $2 مان ھيٺيان {{PLURAL:$1|subcategory|$1 ذيلي زمرا}} آھن.}}",
        "category-subcat-count-limited": "هن زمري ۾ هيٺيان {{PLURAL:$1|ننڍا زمرا آهن|$1 subcategories}}.",
-       "category-article-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون صفحو آهي.|هيٺيان {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} هن زمري ۾, سمورن $2 مان.}}",
+       "category-article-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون صفحو آهي.|هيٺيان {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} هن زمري ۾، سمورن $2 مان.}}",
        "category-article-count-limited": "هيٺِون {{PLURAL:$1|صفحو آهي|$1 صفحا آهن}} تازي زمري ۾.",
        "category-file-count": "{{PLURAL:$2|هن زمري ۾ صرف هيٺيون فائيل آهي.|هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن زمري ۾، سمورن $2 مان.}}",
        "category-file-count-limited": "هيٺيون يا هيٺيان {{PLURAL:$1|فائيل آهي|$1 فائيل آهن}} هن تازي زمري ۾.",
        "mypage": "منهنجو صفحو",
        "mytalk": "بحث",
        "anontalk": "بحث",
-       "navigation": "رهنمائي",
+       "navigation": "رھنمائي",
        "and": "&#32؛۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "actions": "ڪارگذاريون",
        "namespaces": "نانءُپولارَ",
        "variants": "بَدَلَ",
-       "navigation-heading": "رهنما مينيو",
+       "navigation-heading": "رھنما مينيو",
        "errorpagetitle": "چُڪَ",
-       "returnto": "$1 ڏانهن وَرو.",
+       "returnto": "$1 ڏانھن وَرو.",
        "tagline": "{{SITENAME}} طرفان",
        "help": "مدد",
        "search": "ڳولا",
        "views": "ڏيٺون",
        "toolbox": "اوزارَ",
        "tool-link-userrights": "{{GENDER:$1|يوزر}} گروھ تبديل ڪريو",
+       "tool-link-userrights-readonly": "{{GENDER:$1|يوزر}} گروھ ڏسو",
        "tool-link-emailuser": "ھن {{GENDER:$1|يوزر}} ڏانھن برقٽپال موڪليو",
        "userpage": "يوزر صفحو ڏسو",
        "projectpage": "رٿائي صفحو ڏسو",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
        "redirectto": "ڏانھن چوريو:",
-       "lastmodifiedat": "هيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو هو.",
+       "lastmodifiedat": "ھيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو ھو",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "jumpto": "ڏانھن ٽپ ڏيو:",
-       "jumptonavigation": "رهنمائي",
+       "jumptonavigation": "رھنمائي",
        "jumptosearch": "ڳولا",
        "view-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر ھن صفحي کي ڏسڻ جي ڪوشش ڪري رھيا آھن.\nمهرباني ڪري ٿورو ترسو انکان اڳ جو توھان ھن صفحي تائين رسڻ لاءِ ٻيھر ڪوشش ڪريو.\n\n$1",
        "generic-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر هتي موجود آهن.\nمهرباني ڪري ٿورو ترسي پوءِ ڪوشش ڪريو.",
-       "pool-errorunknown": "اڻ ڄاتل چُڪَ",
+       "pool-errorunknown": "اڻڄاتل چُڪَ",
        "poolcounter-usage-error": "استعمال جي خرابي: $1",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
        "sort-descending": "لهندڙ ترتيب ڏيو",
        "sort-ascending": "چڙهندڙ ترتيب ڏيو",
        "nstab-main": "صفحو",
-       "nstab-user": "تعارفي صفحو",
+       "nstab-user": "يُوزر صفحو",
        "nstab-media": "ذريعاتي صفحو",
        "nstab-special": "خاص صفحو",
        "nstab-project": "رٿائي صفحو",
        "mycustomcssprotected": "توهان کي هيءُ CSS صفحو سنوارڻ جي اجازت نہ آهي.",
        "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
        "myprivateinfoprotected": "توهان کي پنهنجي ذاتي معلومات سنوارڻ جي اجازت حاصل نہ آهي.",
-       "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
+       "mypreferencesprotected": "توھان کي پنھنجون ترجيحون سنوارڻ جي اجات حاصل ڪانھي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
        "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب <em>$2</em> ڄاڻايو ويو آهي.",
        "exception-nologin": "داخل ٿيل نہ آهيو",
-       "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
-       "cannotlogoutnow-title": "ھاڻي ٻاھر نٿو نڪري سگھجي",
-       "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران ٻاھر نڪرڻ ممڪن نہ آھي.",
+       "virus-unknownscanner": "اڻڄاتل نِس وائرس:",
+       "cannotlogoutnow-title": "ھاڻي خارج نٿو ٿي سگھجي",
+       "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران خارج ٿيڻ ممڪن نہ آھي.",
        "welcomeuser": "ڀلي ڪري آيا، $1!",
        "yourname": "يُوزرنانءُ:",
        "userlogin-yourname": "يوزرنانءُ",
-       "userlogin-yourname-ph": "پنهنجو يوزرنانءُ ڄاڻايو",
+       "userlogin-yourname-ph": "پنھنجو يوزرنانءُ ڄاڻايو",
        "createacct-another-username-ph": "يُوزرنانءُ ڄاڻايو",
        "yourpassword": "ڳجھولفظ:",
        "userlogin-yourpassword": "ڳجھولفظ",
        "userlogin-yourpassword-ph": "پنهنجو ڳجھولفظ ڄاڻايو",
-       "createacct-yourpassword-ph": "ڳجھولفظ ڄاڻايو",
+       "createacct-yourpassword-ph": "ÚªÙ\88 Ú³Ø¬Ú¾Ù\88Ù\84Ù\81ظ Ú\84اڻاÙ\8aÙ\88",
        "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
-       "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
+       "createacct-yourpasswordagain": "ڳجھي لفظ جي پڪ ڪريو",
        "createacct-yourpasswordagain-ph": "ٻيھر ڳجھولفظ داخل ڪريو",
        "userlogin-remembermypassword": "مون کي داخل ٿيل رکو",
        "userlogin-signwithsecure": "محفوظ ڳانڍاپو استعمال ڪريو",
        "nav-login-createaccount": "داخل ٿيو / کاتو کوليو",
        "userlogin": "داخل ٿيو / کاتو کوليو",
        "userloginnocreate": "داخل ٿيو",
-       "logout": "ٻاھر نڪرو",
-       "userlogout": "ٻاھر نڪرو",
+       "logout": "خارج ٿيو",
+       "userlogout": "خارج ٿيو",
        "notloggedin": "داخل ٿيل نہ آهيو",
        "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
        "userlogin-reauth": "اھو پڪ ڪرڻ لاءِ ته توھان {{GENDER:$1|$1}} آھيو توھان کي ٻيھر داخل ٿيڻو پوندو.",
        "userlogin-createanother": "ٻيو کاتو کوليو",
        "createacct-emailrequired": "برق ٽپال پتو",
-       "createacct-emailoptional": "برق ٽپال پتو (مرضيءَ موجب)",
-       "createacct-email-ph": "پنهنجو برق ٽپال پتو ڄاڻايو",
+       "createacct-emailoptional": "برقٽپال پتو (مرضيءَ موجب)",
+       "createacct-email-ph": "پنھنجو برقٽپال پتو ڄاڻايو",
        "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
-       "createaccountmail": "ڪو بہ عارضي ڳجھو لفظ استعمال ڪريو ۽ ڄاڻايل برق ٽپال پتي تي اماڻيو",
+       "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
-       "createacct-submit": "پنهنجو کاتو کوليو",
+       "createacct-submit": "پنھنجو کاتو کوليو",
        "createacct-another-submit": "کاتو کوليو",
        "createacct-continue-submit": "کاتو کولڻ جاري رکو",
        "createacct-another-continue-submit": "کاتو کولڻ جاري رکو",
-       "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
+       "createacct-benefit-heading": "{{SITENAME}} توھان جھڙن سڄڻن ٺاھيو آھي.",
        "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
        "createacct-benefit-body3": "ھاڻوڪا {{PLURAL:$1|ڀاڱيدار}}",
        "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
        "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
        "loginerror": "داخل ٿيڻ ۾ چُڪَ",
-       "createacct-error": "کاٿو کولڻ ۾ چُڪَ",
+       "createacct-error": "کاتو کولڻ ۾ چُڪَ",
        "createaccounterror": "کاتو کُلي نہ سگھيو: $1",
        "nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان داخل نہ ٿيا آهيو. يُوزرس کي داخل ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. داخل ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
-       "nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "nocookieslogin": "يُوزرس کي داخل ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي.\nتوھان ڪوڪيز کي ناڪاره بڻائي رکيو آھي.\nداخل ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
        "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "داخل ٿيل",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" داخل ٿيل آهيو.'''",
        "password-name-match": "توهان جو ڳجھولفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
        "mailmypassword": "ڳجھولفظ ٻيھر مقرر ڪريو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھولفظ",
-       "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\"$2\" يوزر لاءِ هڪ ڳجھُ لفظ تخليق ڪيو ويو آهي \"$3\" تي ترتيب ڏنو ويو هو. جيڪڏهن اهو توهان جي ارادو هيو، ته هاڻي توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\nتوهان جو عارضي ڳجھو لفظ {{PLURAL:$5|هڪ ڏينهُن|$5 ڏينهَن}} ۾ ختم ٿيندو.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
-       "noemail": "يُوزر \"$1\" جي ڪو بہ برق ٽپال پتو درج ٿيل ناهي.",
-       "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
-       "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
+       "passwordremindertext": "ڪنھن (شايد توھان آءِپي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھولفظ اماڻڻ جي گُھرَ ڪئي.\"$2\" يوزر لاءِ ھڪ ڳجھولفظ تخليق ڪيو ويو آهي \"$3\" تي ترتيب ڏنو ويو ھو. جيڪڏھن اھو توھان جو ارادو ھيو، تہ ھاڻي توھان کي ھينئر ئي داخل ٿي پنھنجو ڳجھولفظ تبديل ڪرڻ گھرجي.\nتوھان جو عارضي ڳجھولفظ {{PLURAL:$5|هڪ ڏينھُن|$5 ڏينھَن}} ۾ ختم ٿيندو.\n\nجيڪڏھن اھا گُھرَ اوھان نہ ڪئي ھئي، يا ھاڻي اوھان کي پنھنجو ڳجھولفظ ياد اچي ويو آھي ۽ توھان ان کي تبديل ڪرڻ نٿا چاھيو، تہ توھان ھن نياپي کي نظر انداز ڪندي پنھنجو پراڻو ڳجھولفظ ئي استعمال ڪري سگھو ٿا.",
+       "noemail": "يُوزر \"$1\" جي ڪو بہ برقٽپال پتو درج ٿيل ناهي.",
+       "noemailcreate": "توھان کي قابلڪار برقٽپال پتو مھيا ڪرڻو پوندو.",
+       "passwordsent": "يوزر \"$1\" لاءِ ھڪ نئون ڳجھولفظ برقٽپال ذريعي اماڻيو ويو آهي.  مھرباني ڪري اھو حاصل ڪرڻ بعد داخل ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
        "acct_creation_throttle_hit": "توهان جي آءِپي پتي تان هن وڪيءَ تي پوئين $2، کان {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِپي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
-       "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
-       "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
-       "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
-       "emailconfirmlink": "پنهنجي برق ٽپال پتي جي پَڪَ ڪندا",
-       "invalidemailaddress": "Ù\87Ù\8a Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù¾ØªÙ\88 Ù\82بÙ\88Ù\84 Ù\86Ù¿Ù\88 ÚªÚªØ±Ù\8a Ø³Ú¯Ú¾Ø¬Ù\8a Ø§Ù\8aئÙ\86 Ù¿Ù\88 Ù\84Ú³Ù\8a ØªÙ\87 Ø§Ù\86جÙ\88 Ù\81ارÙ\85Ù\8aÙ½ Ù\82ابÙ\84 Ù\82بÙ\88Ù\84 Ù\86Ù\87 Ø¢Ù\87Ù\8a.\nبراءÙ\90 Ù\85Ù\87رباني هڪ قابل قبول فارميٽ وارو پتو موڪليو يا ان جڳھ کي کالي ڇڏيو.",
-       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
-       "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
+       "emailauthenticated": "توھان جي برقٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
+       "emailnotauthenticated": "توھان جو برقٽپال پتي جي تصديق اڃا ٿي نہ سگھي آھي.",
+       "noemailprefs": "انھن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحن ۾ برقٽپال پتو ڄاڻايو.",
+       "emailconfirmlink": "پنھنجي برقٽپال پتي جي پَڪَ ڪندا",
+       "invalidemailaddress": "Ù\87Ù\8a Ø¨Ø±Ù\82ٽپاÙ\84 Ù¾ØªÙ\88 Ù\82بÙ\88Ù\84 Ù\86Ù¿Ù\88 ÚªØ±Ù\8a Ø³Ú¯Ú¾Ø¬Ù\8a Ø§Ù\8aئÙ\86 Ù¿Ù\88 Ù\84Ú³Ù\8a ØªÛ\81 Ø§Ù\86جÙ\88 Ù\81ارÙ\85Ù\8aÙ½ Ù\82ابÙ\84 Ù\82بÙ\88Ù\84 Ù\86Û\81 Ø¢Ù\87Ù\8a.\nبراءÙ\90 Ù\85Ú¾رباني هڪ قابل قبول فارميٽ وارو پتو موڪليو يا ان جڳھ کي کالي ڇڏيو.",
+       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برقٽپال پتو بدلائي نہ ٿو سگھجي.",
+       "emaildisabled": "هيءَ سرزمين برقٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
        "accountcreatedtext": "يوزر کاتو [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) جي لاءِ تخليق ٿي چڪو آهي.",
        "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
        "pt-login-button": "داخل ٿيو",
        "pt-login-continue-button": "داخل ٿيڻ جاري رکو",
        "pt-createaccount": "کاتو کوليو",
-       "pt-userlogout": "ٻاھر نڪرو",
+       "pt-userlogout": "خارج ٿيو",
        "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
-       "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
+       "user-mail-no-addy": "برقٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھولفظ تبديل ڪريو",
        "resetpass_announce": "داخل ٿيڻ جو عمل پورو ڪرڻ لاءِ، توهان کي نئون ڳجھولفظ اختيار مقرر ڪرڻو پوندو.",
        "resetpass_header": "کاتي جو ڳجھولفظ بدلايو",
        "resetpass_submit": "ڳجھولفظ طَي ڪريو ۽ داخل ٿيو",
        "changepassword-success": "توهان جو ڳجھولفظ بدلايو ويو آھي!",
        "changepassword-throttled": "توهان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "botpasswords": "بوٽ جو ڳجھولفظ",
+       "botpasswords-disabled": "بوٽ ڳجھالفظ ناقابلِڪار ڪيل آھن.",
        "botpasswords-label-create": "سرجيو",
        "botpasswords-label-update": "تجديد",
        "botpasswords-label-cancel": "رد",
        "resetpass-submit-cancel": "رد",
        "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
        "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
-       "resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
+       "resetpass-temp-emailed": "توهان برقٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان داخل ٿيا آهيو. داخل ٿيڻ کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھولفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھولفظ:",
        "resetpass-expired": "توهان جو ڳجھولفظ مدي خارج ٿي چڪو آهي. نئون ڳجھولفظ مقرر ڪريو ۽ داخل ٿيو.",
        "resetpass-expired-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ڪلڪ ڪريو.",
        "resetpass-validity-soft": "توهان جو ڳجھولفظ ناقابل ڪار آهي: $1\nمهرباني ڪري نئون ڳجھولفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ڪلڪ ڪريو.",
        "passwordreset": "ڳجھولفظ مَٽايو",
-       "passwordreset-text-one": "برق ٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
+       "passwordreset-text-one": "برقٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
        "passwordreset-disabled": "هن وڪيءَ تي ڳجھولفظ ٻيھر مقرر ڪرڻ وارو چارو غير فعال بڻايو ويو آهي.",
        "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-email": "برق ٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
        "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
-       "passwordreset-invalidemail": "ناقابل ڪار برق ٽپال پتو",
-       "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
-       "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
-       "changeemail-newemail": "نئون برق ٽپال پتو:",
+       "passwordreset-invalidemail": "ناقابلڪار برقٽپال پتو",
+       "changeemail": "برقٽپال پتو مِٽايو يا بدلايو",
+       "changeemail-oldemail": "هاڻوڪو برقٽپال پتو:",
+       "changeemail-newemail": "نئون برقٽپال پتو:",
        "changeemail-none": "(ڪو بہ نہ)",
        "changeemail-password": "توهان جو {{SITENAME}} ڳجھو لفظ:",
-       "changeemail-submit": "برق ٽپال پتو بدلايو",
-       "changeemail-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
-       "changeemail-nochange": "مهرباني ڪري مختلف نئون برق ٽپال پتو ڄاڻايو.",
-       "resettokens": "ٻيهر ترتيب ڪرڻ جا ٽوڪن",
-       "resettokens-no-tokens": "ٻيهر ترتيب ڪرڻ لاءِ ڪي بہ ٽوڪن نہ آهن.",
+       "changeemail-submit": "برقٽپال پتو بدلايو",
+       "changeemail-throttled": "توھان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مھرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "changeemail-nochange": "مھرباني ڪري مختلف نئون برقٽپال پتو ڄاڻايو.",
+       "resettokens": "ٻيھر ترتيب ڪرڻ جا ٽوڪن",
+       "resettokens-no-tokens": "ٻيھر ترتيب ڪرڻ لاءِ ڪي بہ ٽوڪن نہ آھن.",
        "resettokens-tokens": "ٽوڪنس:",
        "resettokens-token-label": "$1 (حاليہ قدر: $2)",
-       "resettokens-resetbutton": "چونڊيل ٽوڪن ٻيهر ترتيب ڪريو",
+       "resettokens-resetbutton": "چونڊيل ٽوڪن ٻيھر ترتيب ڪريو",
        "bold_sample": "گھري لکت",
        "bold_tip": "گھري لکت",
        "italic_sample": "ترڇي لکت",
        "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نہ وساريندا)",
        "headline_sample": "سرخي جي لکت",
        "headline_tip": "سطح 2 جي سرخي",
+       "nowiki_sample": "غير-فارميٽڊ لکت شامل ڪريو",
        "nowiki_tip": "وڪي فارميٽڱ کي نظرانداز ڪريو",
        "image_tip": "جَڙيل فائيل",
        "media_tip": "فائيل جو ڳنڍڻو",
-       "sig_tip": "توهان جي صحيح بمع اوقاتي مهر",
-       "hr_tip": "افقي لڪير (غيرضروري استعمال کان پاسو ڪندا)",
+       "sig_tip": "توھان جي صحيح بمع اوقاتي مھر",
+       "hr_tip": "افقي لڪير (ڪفايت سان استعمال ڪريو)",
        "summary": "تَتُ:",
        "subject": "موضوع:",
-       "minoredit": "هيءَ هڪ معمولي ترميم آهي",
-       "watchthis": "هيءُ صفحو سانڍيو",
+       "minoredit": "ھيءَ ھڪ معمولي ترميم آھي",
+       "watchthis": "هيءُ صفحو نظر ۾ رکو",
        "savearticle": "صفحو سانڍيو",
        "savechanges": "تبديليون سانڍيو",
        "publishpage": "صفحو ڇاپيو",
        "preview": "پيش نگاھ",
        "showpreview": "پيش نگاھ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "<strong>خبردار:</strong> توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 داخل]</strong> ٿيو ٿا < يا strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سان منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anoneditwarning": "<strong>چتاءُ:</strong> توھان داخل ٿيل نہ آھيو. توھان جو آءِپي پتو عوامي طور ظاھر ٿيندو جي توھان ڪي ترميمون ڪريو ٿا. جيڪڏھن توھان <strong>[$1 داخل ٿيو]</strong> ٿا يا <strong>[$2 کاتو کوليو]</strong> ٿا، تہ ٻين فائدن سان گڏ توھان جون ترميمون توھان جي يوزرنانءَ سان منسوب ڪيون وينديون.",
        "anonpreviewwarning": "توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِپي پتو درج ڪيو ويندو.",
-       "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
+       "missingcommenttext": "براءِ مھرباني هيٺ پنهنجو تاثر درج ڪندا.",
        "summary-preview": "تت تي پيش نگاھ:",
        "subject-preview": "موضوع پيش نگاھ:",
        "blockedtitle": "يُوزر بندشيل آهي.",
-       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن بہ پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
+       "blockedtext": "'''توھان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آھي.'''\n\nبندش $1 ھني. جڏھن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاھڙي روڪ تي بحث ڪرڻ لاءِ توھان $1 يا ڪنھن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توھان جو درست [[Special:ترجيحون|کاتو ترجيحون]] ۾ درست برقٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برقٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توھان جو ھاڻوڪو آءِپي پتو $3 آھي، ۽ بندش سڃاڻپ $5 آهي. مھرباني ڪري ڪنھن بہ پڇا ڳاڇا يا لھوچڙ لاءِ انھن مان ڪنھن ھڪ يا ٻنھي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
-       "whitelistedittext": "صفحا سنوارڻ لاءِ مهرباني ڪري $1.",
-       "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجي ايميل پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:Preferences|use preferences]] ذريعي پنهنجو ايميل پتو ڄاڻايو ۽ تصديقيو.",
-       "nosuchsectiontitle": "سيڪشن نٿو لهي سگهي",
+       "whitelistedittext": "صفحا سنوارڻ لاءِ مھرباني ڪري $1.",
+       "confirmedittext": "صفحا سنوارڻ کان اڳ توھان کي پنھنجي برقٽپال پتي جي تصديق ڪرڻي پوندي. مھرباني ڪري [[Special:Preferences|يوزر ترجيحن]] ذريعي پنھنجو برقٽپال پتو ڄاڻايو ۽ تصديقيو.",
+       "nosuchsectiontitle": "سيڪشن نٿو لھي سگھي",
        "loginreqtitle": "داخل ٿيڻ گھربل آهي",
        "loginreqlink": "داخل ٿيو",
        "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "accmailtitle": "ڳجھولفظ اماڻجي چڪو",
        "newarticle": "(نئون)",
-       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نٿو رکي.\nاهڙو صفحو جوڙڻ لاءِ، هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا).\nجي توهان هتي غلطيءَ ۾ اچي ويا آهيو، تہ رڳو پنهنجي جهانگُوءَ جو <strong>back</strong> تي ٽڙڪ ڪريو.",
-       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "newarticletext": "توھان اھڙي صفحي جو ڳنڍڻو وٺي ھتي پھتا آھيو، جيڪو اڃا وجود نٿو رکي.\nاھڙو صفحو جوڙڻ لاءِ، ھيٺين دٻي ۾ لکڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا).\nجي توھان ھتي غلطيءَ ۾ اچي ويا آهيو، تہ رڳو پنھنجي جھانگُوءَ جي <strong>back</strong> بٽڻ تي ٽڙڪ ڪريو.",
+       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nيا [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "noarticletext-nopermission": "ھن وقت ھن صفحي ۾  ڪا بہ لکت نہ آھي.\nتوھان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|ھن صفحي جي عنوان سان ڳولا ڪري سگھو ٿا]]، يا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ڳوليو]</span>، پر توھان کي ان جي تخليق ڪرڻ جي اجازت نہ آھي.",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
        "updated": "(تجديديل)",
        "note": "<strong>نوٽ:</strong>",
        "previewnote": "<strong>هيءَ فقط پيش نگاھ آهي.</strong>\nتوھان جون ترميمون اڃان نہ سانڍيون ويون آھن!",
-       "continue-editing": "ترميم گاھ ڏانهن وڃو",
+       "continue-editing": "ترميم گاھ ڏانھن وڃو",
        "editing": "$1 سنواريندي",
        "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
        "template-protected": "(تحفظيل)",
        "template-semiprotected": "(نيم-تحفظيل)",
        "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
-       "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
+       "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آھي.\nتوھان اڳ ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|داخل ٿي يا نئون کاتو کولي سگھو ٿا]].",
        "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
        "sectioneditnotsupported-title": "سيڪشن جي سنوار ممڪن نہ آهي",
        "sectioneditnotsupported-text": "هن صفحي تي سيڪشن کي سنوارڻ ممڪن نہ آهي.",
        "permissionserrors": "اجازتنامي جي چُڪَ",
        "permissionserrorstext": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي اهو ڪرڻ جي اجازت حاصل ڪانهي.",
-       "permissionserrorstext-withaction": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي $2 جي اجازت ڪانهي.",
-       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سِر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو تہ توهان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
-       "moveddeleted-notice": "هيءُ صفحو ڊهي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ هيٺ ڏجي ٿو.",
+       "permissionserrorstext-withaction": "ھيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توھان کي $2 جي اجازت ڪانھي.",
+       "recreate-moveddeleted-warn": "'''خبردار: توھان اھڙو صفحو نئين سِر سرجي رھيا آھيو جيڪو اڳ ڊاٺو ويو آھي.'''\n\nبھتر ٿيندو تہ توھان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهان جي سھولت خاطر ھتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "moveddeleted-notice": "ھيءُ صفحو ڊھي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ ھيٺ ڏجن ٿا.",
        "moveddeleted-notice-recent": "معاف ڪندا، هيءُ صفحو تازو ئي ڊاٺو ويو آهي (پوين 24 ڪلاڪن اندر). حوالي طور ڊاٺ ۽ چور لاگ هيٺ پيش ڪجي ٿو:",
        "log-fulllog": "پُورو لاگ ڏسو",
        "edit-conflict": "سنوار تڪرار",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
-       "diff-empty": "(ڪو بہ تفاوت ڪونهي)",
+       "diff-empty": "(ڪو بہ تفاوت ڪونھي)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
-       "titlematches": "صفحي جو عنوان مشابهت رکي ٿو",
-       "textmatches": "صفحي جو متن مشابهت رکي ٿو",
+       "titlematches": "صفحي جو عنوان مشابھت رکي ٿو",
+       "textmatches": "صفحي جو متن مشابھت رکي ٿو",
        "notextmatches": "ڪنهن به صفحي جو متن مشابهت نٿو رکي",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
        "nextn-title": "{{PLURAL:$1|ٻيو|ٻيا}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
        "shown-title": "$1 {{PLURAL:$1|نتيجو|نتيجا}} في صفحو ڏيکاريو",
        "viewprevnext": "ڏسو ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ھن وڪيءَ تي صفحو تخليق ڪريو \"[[:$1]]\"!</strong> {{PLURAL:$2|0=|توھان جي ڳولا سان لڌل صفحو ڏسو.|لڌل ڳولا نتيجا پڻ ڏسو.}}",
        "searchprofile-articles": "موادي صفحا",
        "searchprofile-images": "گھڻذريعات",
-       "searchprofile-everything": "هر شَي",
+       "searchprofile-everything": "ھر شَيءِ",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "$1 ۾ ڳوليو",
        "searchprofile-images-tooltip": "فائيلن جي ڳولا",
-       "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو",
+       "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو (بحث صفحن سميت)",
        "searchprofile-advanced-tooltip": "مرضيءَ جي نانءُپولارن ۾ ڳوليو",
        "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
        "search-redirect": "($1 کان چوريو)",
        "searchrelated": "لاڳاپيل",
        "searchall": "سڀ",
        "search-showingresults": "{{PLURAL:$4|نتيجو <strong>$1</strong> of <strong>$3</strong>|نتيجا <strong>$1 - $2</strong> of <strong>$3</strong>}}",
-       "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
+       "search-nonefound": "توھان جي ڳولا جي نتيجي ۾ ڪجھہ بہ نہ لڌو.",
        "powersearch-legend": "اعليٰ ڳولا",
        "powersearch-togglelabel": "چڪاسيو:",
        "powersearch-toggleall": "سڀ",
        "powersearch-togglenone": "ڪو بہ نہ",
        "search-external": "خارجي ڳولا",
        "search-error": "$1 ۾ ڳولا ڪندي چُڪَ ٿي.",
-       "preferences": "ترجيحات",
-       "mypreferences": "ترجيحات",
+       "preferences": "ترجيحون",
+       "mypreferences": "ترجيحون",
        "prefs-edits": "ترميمن جو تعداد:",
-       "prefsnologintext2": "پنهنجون ترجيحات بدلائڻ لاءِ داخل ٿيو.",
+       "prefsnologintext2": "پنھنجون ترجيحون بدلائڻ لاءِ داخل ٿيو.",
        "prefs-skin": "چَمَ",
        "skin-preview": "پيش نگاهہ",
-       "datedefault": "بلا ترجيحا",
+       "datedefault": "بلا ترجيح",
        "prefs-user-pages": "يُوزر صفحو",
        "prefs-personal": "يُوزر جو خدوخال",
        "prefs-rc": "تازيون تبديليون",
-       "prefs-watchlist": "نظرھيٺ فھرست",
-       "prefs-editwatchlist": "نظرھيٺ فھرست کي سنواريو",
-       "prefs-editwatchlist-label": "پنهنجي نظرھيٺ فھرست ۾ درج ٿيل شين کي سنواريو:",
-       "prefs-editwatchlist-edit": "پنھنجي نظرھيٺ فھرست ۾ موجود عنوان ڏسو ۽ مٽايو",
-       "prefs-editwatchlist-raw": "ڪچي نظرھيٺ فھرست سنواريو",
-       "prefs-editwatchlist-clear": "پنهنجي نظرھيٺ فھرست ڊاهيو",
-       "prefs-watchlist-days": "نظرھيٺ فھرست ۾ ڏيکارڻ لاءِ ڏينهن:",
-       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-watchlist": "نظر ۾ فھرست",
+       "prefs-editwatchlist": "نظر ۾ فھرست کي سنواريو",
+       "prefs-editwatchlist-label": "پنهنجي نظر ۾ فھرست ۾ درج ٿيل شين کي سنواريو:",
+       "prefs-editwatchlist-edit": "پنھنجي نظر ۾ فھرست ۾ موجود عنوان ڏسو ۽ مٽايو",
+       "prefs-editwatchlist-raw": "ڪچي نظر ۾ فھرست سنواريو",
+       "prefs-editwatchlist-clear": "پنهنجي نظر ۾ فھرست ڊاهيو",
+       "prefs-watchlist-days": "نظر ۾ فھرست ۾ ڏيکارڻ لاءِ ڏينهن:",
+       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينھن}}",
        "prefs-watchlist-edits-max": "وڌ ۾ وڌ تعداد: 1000",
-       "prefs-watchlist-token": "نظرھيٺ فھرست جو ٽوڪن:",
+       "prefs-watchlist-token": "نظر ۾ فھرست جو ٽوڪن:",
        "prefs-misc": "متفرق",
        "prefs-resetpass": "ڳجھولفظ بدلايو",
-       "prefs-changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
-       "prefs-setemail": "ڪو برق ٽپال پتو ڄاڻايو",
-       "prefs-email": "برق ٽپال چارا",
+       "prefs-changeemail": "برقٽپال پتو مِٽايو يا بدلايو",
+       "prefs-setemail": "ڪو برقٽپال پتو ڄاڻايو",
+       "prefs-email": "برقٽپال چارا",
        "prefs-rendering": "حليو",
        "saveprefs": "سانڍيو",
        "prefs-editing": "سنوارڻ",
        "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
        "recentchangescount": "عدم پيروي جي صورت ۾ ڏيکارڻ جي لاءِ ترميمون:",
        "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
-       "savedprefs": "توهان جون ترجيحات سانڍجي چڪيون آهن.",
+       "savedprefs": "توھان جون ترجيحون سانڍجي چڪيون آھن.",
        "savedrights": "{{GENDER:$1|$1}} جا يوزر گروھ سانڍجي چڪا آھن.",
        "timezonelegend": "اوقاتي زون:",
        "localtime": "مقامي وقت:",
        "timezoneregion-europe": "يُورپ",
        "timezoneregion-indian": "سنڌي ساگر",
        "timezoneregion-pacific": "ماٺو ساگر",
-       "allowemail": "ٻين يُوزرس کان ايندڙ برق ٽپال بحال ڪريو",
+       "allowemail": "ٻين يُوزرس کان ايندڙ ٽپال بحال ڪريو",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
        "default": "ڏنل",
        "prefs-files": "فائيلس",
-       "prefs-emailconfirm-label": "برق ٽپال جي خاطري:",
-       "youremail": "برق ٽپال:",
+       "prefs-emailconfirm-label": "برقٽپال خاطري:",
+       "youremail": "برقٽپال:",
        "username": "{{GENDER:$1|يُوزرنانءُ}}",
        "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
        "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
        "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
        "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
-       "email": "برق ٽپال",
+       "email": "برقٽپال",
        "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
-       "prefs-help-email": "برق ٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھو لفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھو لفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
-       "prefs-help-email-required": "برق ٽپال پتو گھربل آهي.",
+       "prefs-help-email": "برقٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھولفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھولفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
+       "prefs-help-email-required": "برقٽپال پتو گھربل آهي.",
        "prefs-info": "بنيادي ڄاڻ",
        "prefs-i18n": "بين‌الاقوامڪاري",
        "prefs-signature": "صحيح",
        "right-undelete": "ڪو صفحو اڻڊاهيو",
        "right-unblockself": "ڪنهن تان بندش ختم ڪريو",
        "right-editinterface": "يُوزر باهمرُو کي سنواريو",
-       "right-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
-       "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
+       "right-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو",
+       "right-editmyoptions": "پنهنجون ترجيحون سنواريو",
        "right-import": "ٻين وڪيز کان صفحا درآمديو",
        "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
        "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو",
        "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
        "right-managechangetags": "[[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.",
-       "grant-group-email": "برق ٽپال اماڻيو",
+       "grant-group-email": "برقٽپال اماڻيو",
        "grant-blockusers": "يُوزرس کي بندشيو ۽ اڻبندشيو",
        "grant-createaccount": "نئون کاتو کوليو",
-       "grant-editmywatchlist": "پنھنجي نظرھيٺ فھرست سنواريو",
+       "grant-editmywatchlist": "پنھنجي نظر ۾ فھرست سنواريو",
        "grant-editprotected": "تحفظيل صفحا سنواريو",
        "grant-rollback": "صفحن ۾ ڪيل تبديليون واپس ورايو",
-       "grant-sendemail": "Ù»Ù\8aÙ\86 Ù\8aÙ\88زرس Ú\8fاÙ\86Ù\87Ù\86 Ø§Ù\8aÙ\85Ù\8aل موڪليو",
+       "grant-sendemail": "Ù»Ù\8aÙ\86 Ù\8aÙ\88زرس Ú\8fاÙ\86Ù\87Ù\86 Ø¨Ø±Ù\82ٽپال موڪليو",
        "grant-uploadeditmovefile": "فائيل چاڙهيو، مَٽايو، ۽ ڊاهيو",
        "grant-uploadfile": "نئون فائيل چاڙهيو",
        "grant-basic": "بنيادي حقَ",
        "grant-viewdeleted": "ڊَٺَلَ فائيلَ ۽ صفحا ڏسو",
        "grant-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
-       "newuserlogpage": "يوزر کاتن جو لاگ",
+       "newuserlogpage": "يوزر تخليق لاگ",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "action-edit": "هن صفحي کي سسنواريو",
        "action-movefile": "هيءُ فائيل چوريو",
        "action-upload": "هيءُ فائيل چاڙهيو",
        "action-delete": "هيءُ صفحو ڊاهيو",
-       "action-deleterevision": "هيءُ ڀيرو ڊاهيو",
-       "action-deletedhistory": "هن صفحي جي ڊاٺ سوانح ڏسو",
+       "action-deleterevision": "ڀيرا ڊاھيو",
+       "action-deletedhistory": "ڪنھن صفحي جي ڊاھ سوانح ڏسو",
        "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
-       "action-undelete": "هيءُ صفحو اڻڊاهيو",
-       "action-suppressrevision": "Ù\87Ù\86 Ù\84ÚªÙ\8aÙ\84 Ú\80Ù\8aرÙ\8a تي نظرثاني ڪريو ۽ بحاليو",
+       "action-undelete": "صفحا اڻڊاھيو",
+       "action-suppressrevision": "Ù\84ÚªÙ\8aÙ\84 Ú\80Ù\8aرÙ\86 تي نظرثاني ڪريو ۽ بحاليو",
        "action-suppressionlog": "هيءُ ذاتي لاگ ڏسو",
        "action-block": "هن يُوزر کي سنوارڻ کان روڪيو",
        "action-protect": "هن صفحي جي تحفظاتي سطح بدلايو",
        "action-userrights": "سڀ يوزر حق ترميم ڪريو",
        "action-userrights-interwiki": "ٻين وڪيز جي يوزرس جا حق ترميم ڪريو",
        "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
-       "action-sendemail": "برق ٽپال اماڻيو",
-       "action-editmywatchlist": "پنھنجي نظرھيٺ فھرست سنواريو",
-       "action-viewmywatchlist": "پنهنجي نظرھيٺ فھرست ڏسو",
+       "action-sendemail": "برقٽپال اماڻيو",
+       "action-editmywatchlist": "پنھنجي نظر ۾ فھرست سنواريو",
+       "action-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو",
        "action-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو",
        "action-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو",
        "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}",
        "enhancedrc-history": "سوانح",
        "recentchanges": "تازيون تبديليون",
        "recentchanges-legend": "تازين تبديلين جا چارا",
-       "recentchanges-summary": "هن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
+       "recentchanges-summary": "ھن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
        "recentchanges-feed-description": "ۡهن روان رسد ۾ آيل تازيون تبديليون لهو",
        "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو",
-       "recentchanges-label-minor": "هيء هڪ معمولي ترميم آهي",
-       "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
+       "recentchanges-label-minor": "ھيءَ ھڪ معمولي ترميم آھي",
+       "recentchanges-label-bot": "ھيءَ ترميم بوٽ عمل ۾ آندي",
        "recentchanges-label-unpatrolled": "ھن ترميم جو اڃان گشت نہ ڪيو ويو آھي",
-       "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين بائيٽس جو ڦير آيو آهي",
+       "recentchanges-label-plusminus": "ھن صفحي جي ماپ ۾ ھيترين بائيٽس جو ڦير آيو آھي",
        "recentchanges-legend-heading": "<strong>ڪنجي:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فهرست]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فھرست]])",
        "recentchanges-submit": "ڏيکاريو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$2، $3 کان شروع ٿيندڙ نيون تبديليون ڏيکاريو",
        "rcshowhidecategorization": "$1 صفحاتي زمراڪاري",
        "rcshowhidecategorization-show": "ڏيکاريو",
        "rcshowhidecategorization-hide": "لڪايو",
-       "rclinks": "پوين $2 ڏينهن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
+       "rclinks": "پوين $2 ڏينھن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
        "diff": "تفاوت",
        "hist": "سوانح",
        "hide": "لڪايو",
        "boteditletter": "گ",
        "number_of_watching_users_pageview": "[$1، {{PLURAL:$1|يُوزر|يُوزرس}} کي ٽيٽيندي]",
        "rc_categories_any": "چونڊيلن مان ڪو بہ",
-       "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کانپوءِ",
        "newsectionsummary": "/* $1 */ نئون سيڪشن",
        "rc-enhanced-expand": "تفصيل ڏيکاريو",
        "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked-title": "\"$1\" سان لاڳاپيل تبديليون",
        "recentchangeslinked-page": "صفحي جو نالو:",
        "recentchangeslinked-to": "رڳو ڄاڻايل صفحي سان ڳانڍيل صفحن ۾ ٿيل تبديليون نمايو",
-       "upload": "فائيل چاڙهيو",
+       "upload": "فائيل چاڙھيو",
        "uploadbtn": "فائيل چاڙهيو",
        "uploadnologin": "داخل ٿيل ناھيو",
        "uploadnologintext": "فائيل چاڙهڻ لاءِ $1.",
        "uploaderror": "چاڙھ چُڪَ",
        "uploadlogpage": "چاڙھ لاگ",
        "filename": "فائيل نانءُ",
-       "filedesc": "Ø®Ù\84اصÙ\88",
+       "filedesc": "تÙ\8eتÙ\8f",
        "fileuploadsummary": "خلاصو:",
        "filereuploadsummary": "فائيل تبديليون:",
        "filesource": "ذريعو:",
-       "ignorewarnings": "وارنڱس کي نظرانداز ڪريو",
+       "ignorewarnings": "چتائن کي نظرانداز ڪريو",
        "badfilename": "فائيل‌نانءُ بدلائي \"$1\" رکيو ويو آهي.",
        "empty-file": "توهان جو جمع ڪرايل فائيل خالي آهي.",
        "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
        "filehist-revert": "واپس ورايو",
        "filehist-current": "حاليہ",
        "filehist-datetime": "تاريخ/وقت",
-       "filehist-thumb": "آڱوٺي ننهن",
+       "filehist-thumb": "آڱوٺي ننھن",
        "filehist-thumbtext": "$1 جي نظرثاني لاءِ تصويري نشان",
        "filehist-nothumb": "ٽِڪِلِي اڻموجود",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
-       "filehist-comment": "تاثرات",
+       "filehist-comment": "تاثر",
        "imagelinks": "فائيل جو استعمال",
-       "linkstoimage": "هن فائيل سان {{PLURAL:$1|هيٺيون صفحو ڳنڍيل آهي |$1 هيٺيان صفحا ڳنڍيل آهن}}:",
+       "linkstoimage": "ھن فائيل سان {{PLURAL:$1|ھيٺيون صفحو ڳنڍيل آھي |$1 ھيٺيان صفحا ڳنڍيل آھن}}:",
        "nolinkstoimage": "هن فائيل سان ڪي بہ صفحا ڳنڍيل ناهن.",
        "sharedupload": "هيءَ فائيل $1 کان آهي ۽ ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
-       "sharedupload-desc-here": "هي فائيل $1 مان آهي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگهي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] هيٺان ڏنل آهي.",
+       "sharedupload-desc-here": "ھي فائيل $1 مان آھي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگھي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] ھيٺان ڏنل آھي.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
        "shared-repo-from": "$1 کان",
-       "upload-disallowed-here": "توهان هن فائيل مٿان لکي نہ ٿا سگھو.",
+       "upload-disallowed-here": "توھان ھن فائيل مٿان لکي نہ ٿا سگھو.",
        "filerevert-comment": "سبب:",
        "filerevert-submit": "واپس ورايو",
        "filedelete": "$1 کي ڊاهيو",
        "sp-deletedcontributions-contribs": "ڀاڱيداريون",
        "linksearch-ns": "نانءُپولار",
        "linksearch-ok": "ڳوليو",
+       "listusersfrom": "تي شروع ڪندڙ يوزر ڏيکاريو:",
        "listusers-submit": "ڏيکاريو",
        "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
        "listusers-blocked": "(بندشيل)",
        "activeusers": "سرگرم يُوزرس جي فهرست",
+       "activeusers-groups": "گروھن سان تعلق رکندڙ يوزرس ڏيکاريو:",
+       "activeusers-excludegroups": "گروھن سان تعلق رکندڙ گروھ ڇڏيو:",
        "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
        "activeusers-submit": "سرگرم يُوزرس ڏيکاريو",
        "listgrouprights": "يوزر گروپ جا حق",
        "listgrouprights-group": "گروهہ:",
        "listgrouprights-rights": "حق",
-       "listgrouprights-members": "(رڪÙ\86Ù\86 Ø¬Ù\8a Ù\84سٽ)",
+       "listgrouprights-members": "(رڪÙ\86Ù\86 Ø¬Ù\8a Ù\81ھرست)",
        "listgrouprights-addgroup-all": "سڀ گروپَ شامل ڪريو",
        "listgrouprights-removegroup-all": "سڀ گروپ هٽايو",
        "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
        "emailsubject": "موضوع:",
        "emailmessage": "نياپو:",
        "emailsend": "اماڻيو",
-       "emailccme": "نياپي جو پرت مون کي برق ٽپال ڪريو.",
-       "emailsent": "برق ٽپال اماڻجي چڪي",
-       "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
-       "watchlist": "نظرھيٺ فھرست",
-       "mywatchlist": "نظرھيٺ فھرست",
-       "addwatch": "نظرھيٺ فھرست ۾ شامل ڪريو",
-       "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|نظرھيٺ فھرست]] ۾ شامل ڪيو ويو آهي.",
-       "removewatch": "نظرھيٺ فھرست مان ھٽايو",
-       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|نظرھيٺ فھرست]] مان هٽي چڪو آهي.",
-       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي نظرھيٺ فھرست مان هٽي چڪو آهي.\"",
-       "watch": "نظرھيٺ رکو",
-       "watchthispage": "هيءُ صفحو نظرھيٺ رکو",
-       "unwatch": "نظرھيٺ نہ رکو",
-       "unwatchthispage": "نظرھيٺ رکڻ ڇڏيو",
+       "emailccme": "نياپي جو پرت مون کي برقٽپال ڪريو.",
+       "emailsent": "برقٽپال اماڻجي چڪي",
+       "emailsenttext": "توهان جو برقٽپال نياپو اماڻجي چڪو آهي.",
+       "watchlist": "نظر ۾ فھرست",
+       "mywatchlist": "نظر ۾ فھرست",
+       "addwatch": "نظر ۾ فھرست ۾ شامل ڪريو",
+       "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|نظر ۾ فھرست]] ۾ شامل ڪيو ويو آهي.",
+       "removewatch": "نظر ۾ فھرست مان ھٽايو",
+       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|نظر ۾ فھرست]] مان هٽي چڪو آهي.",
+       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي نظر ۾ فھرست مان هٽي چڪو آهي.\"",
+       "watch": "نظر ۾ رکو",
+       "watchthispage": "هيءُ صفحو نظر ۾ رکو",
+       "unwatch": "نظر ۾ نہ رکو",
+       "unwatchthispage": "نظر ۾ رکڻ ڇڏيو",
        "notanarticle": "غير موادي صفحو",
        "watchlist-details": "{{PLURAL:$1|$1 صفحو|$1 صفحا}} توهان جي ٽيٽ فهرست، ڳالھ ٻولھ جا صفحا الڳ شمار نٿا ٿين.",
        "wlshowlast": "گذريل $1 ڪلاڪ $2 ڏينهن ڏيکاريو",
        "wlshowhideliu": "کاتيدار يُوزرس",
        "wlshowhideanons": "گمنام يُوزرس",
        "wlshowhidemine": "منهنجون ترميمون",
-       "watchlist-options": "نظرھيٺ فھرست جا چارا",
-       "watching": "نظرھيٺ رکندي...",
-       "unwatching": "نظرھيٺان ڪڍندي...",
+       "watchlist-options": "نظر ۾ فھرست جا چارا",
+       "watching": "نظر ۾ رکندي...",
+       "unwatching": "نظر مان ڪڍندي...",
        "enotif_reset": "سڀ گھميل صفحن تي نشان لڳايو",
        "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
        "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ $1 ڏسو",
        "delete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
        "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
-       "rollbacklinkcount": "اڻ ڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "rollbacklinkcount": "اڻڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
        "changecontentmodel-title-label": "صفحي جو عنوان",
        "changecontentmodel-reason-label": "سبب:",
        "logentry-contentmodel-change-revertlink": "واپس ورايو",
        "undelete-search-submit": "ڳوليو",
        "undelete-error-short": "هيءُ فائيل اڻڊاهيندي چُڪَ ٿي آهي: $1",
        "undelete-show-file-submit": "ها",
-       "namespace": "نانءُ پولار:",
+       "namespace": "نانءُپولار:",
        "invert": "چونڊ ابتيو",
-       "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نيم اسپيس مان (۽ لاڳاپيل نيم اسپيس جيڪڏهن نشان لڳل)",
+       "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نانءَپولار مان (۽ لاڳاپيل نانءُپولار جيڪڏهن نشان لڳل)",
        "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
        "contributions": "{{GENDER:$1|يوزر}} جون ڀاڱيداريون",
        "contribsub2": "{{GENDER:$3|$1}} ($2) لاءِ",
        "contributions-userdoesnotexist": "يُوزر کاتو \"$1\" درج ٿيل نہ آهي.",
        "uctop": "(هاڻوڪو)",
-       "month": "مهيني کان (۽ اڳوڻيون):",
+       "month": "مھيني کان (۽ اڳوڻيون):",
        "year": "سال کان (۽ اڳوڻيون):",
        "sp-contributions-newbies": "صرف نون کاتن جون ڀاڱيداريون ڏيکاريو",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
        "sp-contributions-username": "آءِپي پتو يا يوزرنانءُ:",
        "sp-contributions-submit": "ڳوليو",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
-       "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
+       "whatlinkshere-title": "\"$1\" سان ڳنڍيندڙ صفحا",
        "whatlinkshere-page": "صفحو:",
        "linkshere": "هيٺيان صفحا <strong>[[:$1]]</strong> سان ڳنڍيل آهن:",
        "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "blocklink": "بندشيو",
        "unblocklink": "اڻبندشيو",
        "contribslink": "ڀاڱيداريون",
-       "emaillink": "برق ٽپال اماڻيو",
+       "emaillink": "برقٽپال اماڻيو",
        "blocklogpage": "بندش لاگ",
        "blocklogentry": "\"[[$1]]\" کي بندشيو ويو $2 $3 جي عرصي لاء",
        "unblocklogentry": "$1 تان بندش هٽائي وئي",
        "block-log-flags-anononly": "فقط نامعلوم يوزرس",
-       "block-log-flags-noemail": "برق ٽپال غير فعال",
+       "block-log-flags-noemail": "برقٽپال غير فعال",
        "block-log-flags-hiddenname": "لڪل يُوزرنانءُ",
        "ipb_already_blocked": "\"$1\" اڳ ۾ ئي بندشيل آهي.",
        "ipbnounblockself": "توهان پنهنجو پاڻ تان بندش هٽائي نہ ٿا سگھو.",
        "importlogpage": "درآمد لاگ",
        "tooltip-pt-userpage": "{{GENDER:|توھانجو يوزر}} صفحو",
        "tooltip-pt-mytalk": "{{GENDER:|توھانجو}} يوزر صفحو",
-       "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحات",
-       "tooltip-pt-watchlist": "تÙ\88ھاÙ\86 Ø¬Ù\8a ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\86 Ø¬Ù\8a Ù\86ظرھÙ\8aÙº ØµÙ\81Ø­Ù\86 Ø¬Ù\8a Ù\81ھرست",
+       "tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحون",
+       "tooltip-pt-watchlist": "صÙ\81Ø­Ù\86 Ø¬Ù\8a Ù\81ھرست Ø¬Ù\8aÚªÙ\8a ØªÙ\88ھاÙ\86 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\86 Ù\84اءÙ\90 Ù\86ظر Û¾ Ø±Ú©Ù\8aا Ø¢Ú¾Ù\86",
        "tooltip-pt-mycontris": "{{GENDER:|توھانجي}} ڀاڱيدارين جي فھرست",
        "tooltip-pt-login": "توھان کي ھمٿائجي ٿو تہ توهان داخل ٿيو؛ بھرحال، اھو لازمي ناھي",
-       "tooltip-pt-logout": "ٻاھر نڪرو",
+       "tooltip-pt-logout": "خارج ٿيو",
        "tooltip-pt-createaccount": "کاتو کولڻ ۽ داخل ٿيڻ تي توھان کي ھمٿايو وڃي ٿو؛  جيتوڻيڪ، اهو ضروري ناھي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "هيءُ صفحو سنواريو",
        "tooltip-ca-addsection": "نئون سيڪشن شروع ڪريو",
-       "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي.\nتوهان ان جو ذريعو ڏسي سگھو ٿا",
-       "tooltip-ca-history": "هن صفحي جا اڳوڻا ڀيرا",
+       "tooltip-ca-viewsource": "ھيءُ صفحو تحفظيل آھي.\nتوھان ان جو ذريعو ڏسي سگھو ٿا",
+       "tooltip-ca-history": "ھن صفحي جا اڳوڻا ڀيرا",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
-       "tooltip-ca-move": "هيءُ صفحو چوريو",
-       "tooltip-ca-watch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪريو",
-       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست تان هٽايو",
+       "tooltip-ca-move": "ھيءُ صفحو چوريو",
+       "tooltip-ca-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي نظر ۾ فھرست تان هٽايو",
        "tooltip-search": "{{SITENAME}} ۾ ڳوليو",
-       "tooltip-search-go": "تز ان ئي نالي سان ڪو صفحو موجود آهي تہ کوليو",
-       "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
+       "tooltip-search-go": "تز ان ئي نالي سان ڪو صفحو موجود آھي تہ کوليو",
+       "tooltip-search-fulltext": "ھن متن لاءِ صفحا ڳوليو",
        "tooltip-p-logo": "مک صفحو گھمو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
        "tooltip-n-mainpage-description": "مک صفحو گھمو",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
        "tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
        "tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
-       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\8aÙ\88زر}} Ú\8fاÙ\86Ú¾Ù\86 Ø§Ù\8aÙ\85Ù\8aل موڪليو",
+       "tooltip-t-emailuser": "{{GENDER:$1|Ú¾Ù\86 Ù\8aÙ\88زر}} Ú\8fاÙ\86Ú¾Ù\86 Ø¨Ø±Ù\82ٽپال موڪليو",
        "tooltip-t-upload": "فائيل چاڙهيو",
-       "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
+       "tooltip-t-specialpages": "سڀني خاص صفحن جي فھرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
-       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانهن مستقل ڳنڍڻو",
+       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانھن مستقل ڳنڍڻو",
        "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
-       "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
-       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نٿي سگھجي",
+       "tooltip-ca-nstab-user": "ھن جو يُوزر صفحو ڏسو",
+       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم نٿي ڪري سگھجي",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
-       "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
+       "tooltip-ca-nstab-image": "ھن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-ca-nstab-help": "امدادي صفحو ڏسو",
        "tooltip-ca-nstab-category": "هن زمري جو صفحو ڏسو",
        "tooltip-minoredit": "ان کي هڪ معمولي ترميم ڄاڻايو",
-       "tooltip-save": "پنهنجون تبديليون سانڍيو",
+       "tooltip-save": "پنھنجون تبديليون سانڍيو",
        "tooltip-preview": "پنھنجي تبديلين تي نگاھ وجھو. براءِ مھرباني اھو سانڍڻ کان اڳ ڪندا.",
-       "tooltip-diff": "لکت ۾ ڪيل پنهنجون تبديليون ڏسو",
+       "tooltip-diff": "لکت ۾ ڪيل پنھنجون تبديليون ڏسو",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
-       "tooltip-watch": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪريو",
-       "tooltip-rollback": "\"Ù\88اپس Ù¾Ø±Ø§Ù\8aÙ\88\" Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Û¾ Ù¾Ù\88ئÙ\8aÙ\86 Ú\80اڱÙ\8aدار Ø¬Ù\8a ÚªÙ\8aÙ\84 ØªØ±Ù\85Ù\8aÙ\85 (ترÙ\85Ù\8aÙ\85Ù\86) Ú©Ù\8a Ù\87Úª ÚªÙ\84Úª Ø³Ø§Ù\86 Ø§Ú»ÚªØ±Ù\8a Ù¿Ù\88.",
+       "tooltip-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو",
+       "tooltip-rollback": "\"Ù\88اپس Ù\88راÙ\8aÙ\88\" Ú¾Ù\86 ØµÙ\81Ø­Ù\8a Û¾ Ù¾Ù\88ئÙ\8aÙ\86 Ú\80اڱÙ\8aدار Ø¬Ù\8a ÚªÙ\8aÙ\84 ØªØ±Ù\85Ù\8aÙ\85\86) Ú©Ù\8a Ú¾Úª Ù½Ú\99Úª Ø³Ø§Ù\86 Ø§Ú»ÚªØ±Ù\8a Ù¿Ù\88",
        "tooltip-summary": "ننڍو خلاصو ڏيو",
        "anonymous": "گمنام {{PLURAL:$1|يوزر|يوزرس}} جو {{SITENAME}}",
+       "simpleantispam-label": "اينٽي-اسپام روڪ.\nھن کي <strong>نہ</strong> ڀريو!",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
        "pageinfo-contentpage-yes": "ها",
        "pageinfo-protect-cascading-yes": "ها",
        "pageinfo-category-subcats": "ذيلي زمرن جو تعداد",
        "pageinfo-category-files": "صفحن جو تعداد",
        "previousdiff": "← اڳوڻي ترميم",
-       "nextdiff": "نئين ترميم-->",
+       "nextdiff": "نئين تر ترميم →",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
-       "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
-       "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
+       "file-nohires": "اڃان سنھو تحلل ميسر ناھي.",
+       "svg-long-desc": "ايسويجي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
        "show-big-image": "اصلوڪو فائيل",
        "show-big-image-preview": "هن پيش نگاھ جي ماپ: $1",
        "show-big-image-other": "ٻيا {{PLURAL:$2|تحلل}}:$1",
        "metadata": "اعدادِ اعداد",
        "metadata-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
-       "metadata-fields": "اÙ\85Ù\8aج Ø¬Ù\8a Ù\85Ù\8aٽا Ú\8aÙ\8aٽا Ù\81Ù\8aÙ\84Ú\8a Ù\84سٽ ÚªÙ\8aÙ\84 Ø¢Ù\87Ù\8a Ù\87Ù\86 Ù¾Ù\8aغاÙ\85 Û¾ Ø¬Ù\8aÚªÙ\88 Ø´Ø§Ù\85Ù\84 ÚªÙ\8aÙ\88 Ù\88Ù\8aÙ\86دÙ\88 Ø§Ù\85Ù\8aج جي صفحي جي ڊسپلي تي، جڏهن ميٽا ڊيٽا جي ٽيبل ختم ٿيندي، ٻيا طئي ٿيل طريقي سان لڪل هوندا. \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": "عڪس Ø¬Ù\8a Ù\85Ù\8aٽا Ú\8aÙ\8aٽا Ù\81Ù\8aÙ\84Ú\8a Ù\84سٽ ÚªÙ\8aÙ\84 Ø¢Ù\87Ù\8a Ù\87Ù\86 Ù¾Ù\8aغاÙ\85 Û¾ Ø¬Ù\8aÚªÙ\88 Ø´Ø§Ù\85Ù\84 ÚªÙ\8aÙ\88 Ù\88Ù\8aÙ\86دÙ\88 Ø¹ÚªØ³ جي صفحي جي ڊسپلي تي، جڏهن ميٽا ڊيٽا جي ٽيبل ختم ٿيندي، ٻيا طئي ٿيل طريقي سان لڪل هوندا. \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": "ٻٽڻيون في جُز",
        "exif-disclaimer": "غيرجوابدارينامو",
        "exif-copyrighted-true": "حق ۽ واسطا محفوظيل",
        "exif-unknowndate": "نامعلوم تاريخ",
-       "exif-orientation-1": "نارمل",
+       "exif-orientation-1": "رواجي",
        "exif-orientation-3": "180° موڙيل",
        "exif-componentsconfiguration-0": "وجود نہ ٿو رکي",
        "exif-exposureprogram-1": "دستينامو",
        "exif-saturation-0": "نارمل",
        "exif-saturation-1": "ننڍ رچاءُ",
        "exif-saturation-2": "وَڏ رچاءُ",
-       "exif-sharpness-0": "نارمل",
+       "exif-sharpness-0": "رواجي",
        "exif-subjectdistancerange-0": "نامعلوم",
        "exif-subjectdistancerange-3": "ڏورانهين نگاهہ",
        "exif-gpslatitude-s": "ڏاکڻي ويڪرائي ڦاڪَ",
        "exif-iimcategory-wea": "موسم",
        "namespacesall": "سڀ",
        "monthsall": "سڀ",
-       "confirmemail": "برق ٽپال پتي جي پَڪَ ڪندا",
+       "confirmemail": "برقٽپال پتي جي پَڪَ ڪندا",
        "confirmemail_send": "خاطري ڪوڊ اماڻيو",
-       "confirmemail_sent": "خاطري برق ٽپال اماڻي وئي.",
-       "confirmemail_success": "توهان جي برق ٽپال پتي جي تصديق ڪئي وئي آهي.\nهاڻ توهان [[Special:UserLogin|لاگ اِن]] ٿي ۽ وڪي جو مزو وٺي سگھو ٿا.",
-       "confirmemail_loggedin": "توهان جي برق ٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
-       "confirmemail_subject": "{{SITENAME}} برق ٽپال پتي جي تصديق",
+       "confirmemail_sent": "خاطري برقٽپال اماڻي وئي.",
+       "confirmemail_success": "توهان جي برقٽپال پتي جي تصديق ڪئي وئي آهي.\nهاڻ توهان [[Special:UserLogin|داخل ٿي]] ۽ وڪي جو مزو وٺي سگھو ٿا.",
+       "confirmemail_loggedin": "توهان جي برقٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
+       "confirmemail_subject": "{{SITENAME}} برقٽپال پتي جي تصديق",
        "recreate": "ورسرجيو",
        "confirm-watch-button": "ٺيڪ",
-       "confirm-watch-top": "هيءُ صفحو پنهنجي نظرھيٺ فھرست ۾ شامل ڪندا؟",
+       "confirm-watch-top": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪندا؟",
        "confirm-unwatch-button": "ٺيڪ",
-       "confirm-unwatch-top": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ فهرست مان هٽائيندا؟",
+       "confirm-unwatch-top": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ù¾Ù\86Ù\87Ù\86جÙ\8a Ù\86ظر Û¾ فهرست مان هٽائيندا؟",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← اڳوڻو صفحو",
        "imgmultipagenext": "ايندڙ صفحو →",
        "table_pager_limit_label": "وَٿُون في صفحو:",
        "table_pager_limit_submit": "ھلو",
        "table_pager_empty": "ڪو بہ نتيجو نہ مليو",
-       "watchlistedit-normal-title": "نظرھيٺ فھرست کي سنواريو",
+       "watchlistedit-normal-title": "نظر ۾ فھرست کي سنواريو",
        "watchlistedit-raw-titles": "عنوانَ:",
        "watchlistedit-clear-titles": "عنوانَ:",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
-       "watchlisttools-edit": "Ù½Ù\8aÙ½ فهرست ڏسو ۽ سنواريو",
-       "watchlisttools-raw": "ÚªÚ\86Ù\8a Ù½Ù\8aÙ½ Ù\81Ù\87رست سنواريو",
+       "watchlisttools-edit": "Ù\86ظر Û¾ فهرست ڏسو ۽ سنواريو",
+       "watchlisttools-raw": "ÚªÚ\86Ù\8a Ù\86ظر Û¾ Ù\81Ú¾رست سنواريو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالھ]])",
        "version": "ڀيرو",
        "version-extensions": "تنصيب شده توسيعات",
        "fileduplicatesearch-submit": "ڳوليو",
        "specialpages": "خاص صفحا",
        "specialpages-note-top": "ڪُنجي",
-       "specialpages-group-login": "لاگ اِن ٿيو / کاتو کوليو",
+       "specialpages-group-login": "داخل ٿيو / کاتو کوليو",
        "specialpages-group-users": "يوزرس ۽ حق",
        "blankpage": "خالي صفحو",
        "intentionallyblankpage": "هيءُ صفحو ڄاڻي خالي ڇڏيو ويو آهي.",
        "htmlform-cloner-create": "ٻيا بہ شامل ڪريو",
        "htmlform-cloner-delete": "هٽايو",
        "htmlform-title-not-exists": "$1 وجود نٿو رکي.",
-       "logentry-delete-delete": "$1 {{GENDER:$2|Ú\8aاٺو}} صفحو $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|Ú\8aاٿو}} صفحو $3",
        "revdelete-uname-hid": "يُوزرنانءُ لڪل",
        "logentry-move-move": "$1 {{GENDER:$2|چوريو}} صفحو $3 ڏانهن $4",
        "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
index 0da808b..12051ab 100644 (file)
@@ -49,7 +49,7 @@
        "tog-diffonly": "Neruodītė poslapė torėnė puo skėrtomās",
        "tog-showhiddencats": "Ruodītė pakavuotas kateguorėjės",
        "tog-norollbackdiff": "Nekrēptė diemesė i skėrtoma atlėkus atmetėma",
-       "tog-useeditwarning": "Monėi dout žėnuot, kāp ėšēno ėš poslapė anon naėšsauguojis",
+       "tog-useeditwarning": "Monėi doutė žėnuotė, kap ėšēno ėš poslapė anon naėšsauguojė̄s",
        "tog-prefershttps": "Vėsūmet nauduotė saugu rīši kap būno prisijongė̄s",
        "underline-always": "Vėsūmet",
        "underline-never": "Nikūmet",
        "saveprefs": "Ėšsauguotė",
        "restoreprefs": "Grōžintė vėsus nustatīmus kāp bova pradiuo",
        "prefs-editing": "Redagavėms",
-       "rows": "Eilotės:",
-       "columns": "Štolpalē:",
        "searchresultshead": "Paėiškuos nustatīmā",
        "stub-threshold": "Minimums <a href=\"#\" class=\"stub\">nabėngta poslapė</a> fuormatavėmō:",
        "stub-threshold-sample-link": "pavīzdīs",
index 6e3d91c..389398d 100644 (file)
        "passwordreset-emaildisabled": "Postavke E-maila su deaktivirane na ovoj wiki.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Pogledati krajnji e-mail?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-mail s privremenom lozinkom će biti prikazana i poslata korisniku.",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Detalji računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Netko (vjerovatno Vi, s IP adrese $1) je zatražio resetiranje vaše lozinke/zaporke {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "minoredit": "Ovo je manje uređenje",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Spremi stranicu",
+       "savechanges": "Sačuvaj - Сачувај",
        "publishpage": "Objavi stranicu",
        "publishchanges": "Objavi izmjene",
        "preview": "Pregled",
        "saveprefs": "Snimi postavke",
        "restoreprefs": "Vrati sve na podrazumijevano (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona:",
        "searchresultshead": "Postavke rezultata pretrage",
        "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
        "stub-threshold-sample-link": "uzorak",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
+       "gender-unknown": "Kad Vas spominje, softver će pokušati izbjegavati rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
-       "userrights-removed-self": "Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Potvrđeni korisnici",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
-       "right-passwordreset": "Pregled e-maila za obnavljanje lozinke",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
        "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
        "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
        "searchsuggest-search": "Traži",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
-       "api-error-copyuploaddisabled": "Postavljanja putem URL-a su onemogućena na ovom serveru.",
-       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Datoteka koju ste poslali je bila prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.",
-       "api-error-fileexists-forbidden": "Već postoji datoteka s imenom „$1“ i ne može da se zamijeni.",
-       "api-error-fileexists-shared-forbidden": "Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zamijeni.",
-       "api-error-file-too-large": "Datoteka koju ste poslali je bila prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmjena koji ste pokušali načiniti je otkazana preko \"kuke\" proširenja mediawiki softvera.",
-       "api-error-http": "Unutrašnja greška: ne može se spojiti na server.",
-       "api-error-illegal-filename": "Ime datoteke nije dopušteno.",
-       "api-error-internal-error": "Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.",
-       "api-error-invalid-file-key": "Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtjevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste postavljali datoteke.",
-       "api-error-mustbeposted": "Unutrašnja greška: ne koristi se ispravan HTTP metod.",
-       "api-error-noimageinfo": "Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za postavljanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: nema odgovora od servera.",
-       "api-error-overwrite": "Pisanje preko postojeće datoteke nije dopušteno.",
-       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
-       "api-error-timeout": "Server nije odgovorio unutar očekivanog vremena.",
-       "api-error-unclassified": "Desila se nepoznata greška",
-       "api-error-unknown-code": "Nepoznata greška: \"$1\"",
-       "api-error-unknown-error": "Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.",
+       "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata greška: \"$1\"",
-       "api-error-uploaddisabled": "Postavljanje je onemogućeno na ovoj wiki.",
-       "api-error-verification-error": "Ova datoteka je možda oštećenja ili ima pogrešan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sati}}",
index 8e8c7fb..c8103b6 100644 (file)
        "recentchangeslinked-page": "Názov stránky:",
        "recentchangeslinked-to": "Zobraziť zmeny na stránkach, ''ktoré odkazujú na'' zadanú stránku",
        "recentchanges-page-added-to-category": "[[:$1]] zaradená do kategórie",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] zaradená do kategórie. [[Special:WhatLinksHere/$1|Táto stránka je vložená do iných stránok.]",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] zaradená do kategórie, [[Special:WhatLinksHere/$1|táto stránka je vložená do iných stránok]]",
        "recentchanges-page-removed-from-category": "[[:$1]] vyradená z kategórie",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] odstránená z kategórie. [[Special:WhatLinksHere/$1|Táto stránka je vložená do iných stránok.]",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] odstránená z kategórie, [[Special:WhatLinksHere/$1|táto stránka je vložená do iných stránok]]",
        "autochange-username": "Automatická úprava MediaWiki",
        "upload": "Nahrať súbor",
        "uploadbtn": "Nahrať súbor",
index 6154b85..fae2cb6 100644 (file)
@@ -12,7 +12,8 @@
                        "MaGa",
                        "Skalcaa",
                        "Janezdrilc",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "NegativeTwelveDollars"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "searcharticle": "Pojdi na",
        "history": "Zgodovina strani",
        "history_short": "Zgodovina",
+       "history_small": "zgodovina",
        "updatedmarker": "Posodobljeno od mojega zadnjega obiska",
        "printableversion": "Različica za tisk",
        "permalink": "Trajna povezava",
        "blockedtitle": "Uporabnik je blokiran",
        "blockedtext": "'''Urejanje z vašim uporabniškim imenom oziroma IP-naslovom je onemogočeno.'''\n\nBlokiral vas je $1.\nPodani razlog je ''$2''.\n\n* začetek blokade: $8\n* potek blokade: $6\n* blokirani uporabnik: $7\n\nO blokiranju se lahko pogovorite z uporabnikom/-co $1 ali katerim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorjem]].\nVedite, da lahko ukaz »Pošlji uporabniku e-pismo« uporabite le, če ste v [[Special:Preferences|nastavitvah]] vpisali in potrdili svoj elektronski naslov in ta ni blokiran.\nVaš IP-naslov je $3, številka blokade pa #$5.\nProsimo, vključite ju v vse morebitne poizvedbe.",
        "autoblockedtext": "Vaš IP-naslov je bil samodejno blokiran, saj je bil uporabljen s strani drugega uporabnika, ki ga je blokiral $1.\nRazlog za to je bil naslednji:\n\n:''$2''\n\n* Začetek blokade: $8\n* Konec blokade: $6\n* Blokirani uporabnik: $7\n\nKontaktirate lahko $1 ali katerega od drugih [[{{MediaWiki:Grouppage-sysop}}|administratorjev]], da razpravljate o blokadi.\n\nVedite, da lahko funkcijo »{{:MediaWiki:Emailuser/sl}}« uporabljate le, če ste v svoje [[Special:Preferences|uporabniške nastavitve]] vnesli veljaven e-poštni naslov, in vam njena uporaba ni bila preprečena.\n\nVaš trenutni IP-naslov je $3, ID blokiranja pa #$5. Prosimo, vključite ta ID v vsako zastavljeno vprašanje.",
+       "systemblockedtext": "Vaše uporabniško ime ali IP-naslov je MediaWiki samodejn blokiral.\nPodani razlog je:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Potek blokade: $6\n* Blokirani uporabnik: $7\n\nVaš trenutni IP-naslov je $3.\nProsimo, da v svoje poizvedbe vključite vse zgornje podatke.",
        "blockednoreason": "razlog ni podan",
        "whitelistedittext": "Za urejanje strani se morate $1.",
        "confirmedittext": "Pred urejanjem strani morate potrditi svoj e-poštni naslov.\nProsimo, da ga z uporabo [[Special:Preferences|uporabniških nastavitev]] vpišete in potrdite.",
        "saveprefs": "Shrani",
        "restoreprefs": "obnova vseh privzetih nastavitev (v vseh razdelkih)",
        "prefs-editing": "Urejanje",
-       "rows": "Vrstic:",
-       "columns": "Stolpcev:",
        "searchresultshead": "Nastavitve poizvedovanja",
        "stub-threshold": "Prag označevanja škrbin ($1):",
        "stub-threshold-sample-link": "primer",
        "userrights-user-editname": "Vpišite uporabniško ime:",
        "editusergroup": "Naloži uporabniške skupine",
        "editinguser": "Urejanje pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Ogledovanje uporabniških pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Urejanje uporabniških skupin",
+       "userrights-viewusergroup": "Ogled skupin uporabnikov",
        "saveusergroups": "Shrani {{GENDER:$1|uporabnikove|uporabničine}} skupine",
        "userrights-groupsmember": "Član skupine:",
        "userrights-groupsmember-auto": "Posreden član:",
        "action-upload_by_url": "nalaganje te datoteke iz URL-naslova",
        "action-writeapi": "uporabo API-ja za pisanje",
        "action-delete": "brisanje te strani",
-       "action-deleterevision": "brisanje te redakcije",
-       "action-deletedhistory": "pregled zgodovine izbrisanih redakcij te strani",
+       "action-deleterevision": "brisanje redakcij",
+       "action-deletelogentry": "brisanje dnevniških vnosov",
+       "action-deletedhistory": "ogled zgodovine izbrisanih redakcij strani",
+       "action-deletedtext": "ogled besedila izbrisanih redakcij",
        "action-browsearchive": "iskanje izbrisanih strani",
-       "action-undelete": "obnavljanje te strani",
-       "action-suppressrevision": "vpogled in obnavljanje te skrite redakcije",
+       "action-undelete": "Obnovi strani",
+       "action-suppressrevision": "vpogled in obnavljanje skritih redakcij",
        "action-suppressionlog": "vpogled tega zasebnega dnevnika",
        "action-block": "blokiranje urejanja s tega uporabniškega računa",
        "action-protect": "spremembo stopnje zaščite te strani",
        "action-userrights-interwiki": "upravljanje uporabniških pravic za uporabnike drugih wikijev",
        "action-siteadmin": "zaklenitev ali odklepanje podatkovne baze",
        "action-sendemail": "pošiljanje e-sporočil",
+       "action-editmyoptions": "urejanje svojih nastavitev",
        "action-editmywatchlist": "urejanje svojega spiska nadzorov",
        "action-viewmywatchlist": "ogleda svojega spiska nadzorov",
        "action-viewmyprivateinfo": "ogled svojih zasebnih informacij",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-activefilters": "Dejavni filtri",
+       "rcfilters-restore-default-filters": "Obnovi privzete filtre",
+       "rcfilters-clear-all-filters": "Počisti vse filtre",
+       "rcfilters-search-placeholder": "Zadnje spremembe filtrov (prebrskajte ali začnite vnašati)",
+       "rcfilters-invalid-filter": "Neveljaven filter",
+       "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-filtergroup-registration": "Registracija uporabnika",
+       "rcfilters-filter-registered-label": "Registriran",
+       "rcfilters-filter-registered-description": "Prijavljeni uredniki.",
+       "rcfilters-filter-unregistered-label": "Neregistriran",
+       "rcfilters-filter-unregistered-description": "Uredniki, ki niso prijavljeni.",
+       "rcfilters-filtergroup-authorship": "Uredi avtorstvo",
+       "rcfilters-filter-editsbyself-label": "Vaša lastna urejanja",
+       "rcfilters-filter-editsbyself-description": "Vaša urejanja.",
+       "rcfilters-filter-editsbyother-label": "Urejanja drugih",
+       "rcfilters-filter-editsbyother-description": "Urejanja, ki so jih naredili drugi uporabniki (ne vi).",
+       "rcfilters-filtergroup-userExpLevel": "Stopnja izkušenosti (samo za registrirane uporabnike)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novinci",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Manj kot 10 urejanj in 4 dni dejavnosti.",
+       "rcfilters-filter-userExpLevel-learner-label": "Učenci",
+       "rcfilters-filter-userExpLevel-learner-description": "Več dni dejavnosti in urejanj kot »Novinci«, vendar manj kot »Izkušeni uporabniki«.",
+       "rcfilters-filter-userExpLevel-experienced-label": "Izkušeni uporabniki",
+       "rcfilters-filter-userExpLevel-experienced-description": "Več kot 30 dni dejavnosti in 500 urejanj.",
+       "rcfilters-filtergroup-automated": "Samodejni prispevki",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Urejanja, narejena s samodejnimi orodji.",
+       "rcfilters-filter-humans-label": "Človek (ne bot)",
+       "rcfilters-filter-humans-description": "Urejanja, ki so jih izvedli uredniki ljudje.",
+       "rcfilters-filtergroup-significance": "Pomembnost",
+       "rcfilters-filter-minor-label": "Manjše urejanje",
+       "rcfilters-filter-minor-description": "Urejanja, ki jih je avtor označil kot manjša.",
+       "rcfilters-filter-major-label": "Nemanjša urejanja",
+       "rcfilters-filter-major-description": "Urejanja, ki niso označena kot manjša.",
+       "rcfilters-filtergroup-changetype": "Vrsta spremembe",
+       "rcfilters-filter-pageedits-label": "Urejanja strani",
+       "rcfilters-filter-pageedits-description": "Urejanja vsebine wikija, razprave, opisi kategorij ...",
+       "rcfilters-filter-newpages-label": "Ustvarjanja strani",
+       "rcfilters-filter-newpages-description": "Urejanja, ki ustvarijo nove strani.",
+       "rcfilters-filter-categorization-label": "Spremembe kategorij",
+       "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bila dodana ali odstranjena iz kategorij.",
+       "rcfilters-filter-logactions-label": "Zabeležena dejanja",
+       "rcfilters-filter-logactions-description": "Administrativna dejanja, ustvarjanja računov, izbrisi strani, nalaganja ...",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "uncategorizedcategories": "Nekategorizirane kategorije",
        "uncategorizedimages": "Nekategorizirane datoteke",
        "uncategorizedtemplates": "Nekategorizirane predloge",
+       "uncategorized-categories-exceptionlist": " # Contains a list of catgeories, which shouldn't be mentioned on Special:UncategorizedCategories. One per line, starting with \"*\". Lines starting with another character (including whitespaces) are ignored. Use \"#\" for comments.",
        "unusedcategories": "Osirotele kategorije",
        "unusedimages": "Osirotele datoteke",
        "wantedcategories": "Želene kategorije",
        "changecontentmodel-emptymodels-title": "Na voljo ni noben model vsebine",
        "changecontentmodel-emptymodels-text": "Vsebine na [[:$1]] ni mogoče pretvoriti v katero koli vrsto.",
        "log-name-contentmodel": "Dnevnik sprememb modela vsebine",
-       "log-description-contentmodel": "Dogodki, povezani z modeli vsebin strani",
+       "log-description-contentmodel": "Stran navaja spremembe modela vsebine strani in strani, ki so bile ustvarjene z neprivzetim modelom vsebine.",
        "logentry-contentmodel-new": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} stran $3 z neprivzetim modelom vsebine »$5«",
        "logentry-contentmodel-change": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} model vsebine strani $3 z »$4« na »$5«",
        "logentry-contentmodel-change-revertlink": "vrni",
        "proxyblockreason": "Ker uporabljate odprti posredniški strežnik, je urejanje z vašega IP-naslova preprečeno.\nGre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehnično podporo.",
        "sorbsreason": "Vaš IP-naslov je v DNSBL uvrščen med odprte posredniške strežnike.",
        "sorbs_create_account_reason": "Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).\nRačuna žal ne morete ustvariti.",
+       "softblockrangesreason": "Brezimni prispevki z vašega IP-naslova ($1) niso dovoljeni. Prosimo, prijavite se.",
        "xffblockreason": "IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1",
        "cant-see-hidden-user": "Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.\nKer nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.",
        "ipbblocked": "Ne morete blokirati ali deblokirati drugih uporabnikov, saj ste sami blokirani",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
        "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
        "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
+       "cant-move-subpages": "Za prestavljanje podstrani nimate dovoljenja.",
+       "namespace-nosubpages": "Imenski prostor »$1« ne dovoljuje podstrani.",
        "newtitle": "Nov naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "pageinfo-length": "Dolžina strani (v bajtih)",
        "pageinfo-article-id": "ID strani",
        "pageinfo-language": "Jezik vsebine strani",
+       "pageinfo-language-change": "spremeni",
        "pageinfo-content-model": "Model vsebine strani",
        "pageinfo-content-model-change": "spremeni",
        "pageinfo-robot-policy": "Robotsko indeksiranje",
        "feedback-useragent": "Uporabniški agent:",
        "searchsuggest-search": "Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}}",
        "searchsuggest-containing": "vsebujoč ...",
-       "api-error-autoblocked": "Vaš IP-naslov smo samodejno blokirali, saj ga je uporabljal blokiran uporabnik.",
-       "api-error-badaccess-groups": "Nalaganje datotek na ta wiki vam ni dovoljeno.",
        "api-error-badtoken": "Notranja napaka: slab žeton.",
-       "api-error-blocked": "Urejanje vam je preprečeno.",
-       "api-error-copyuploaddisabled": "Nalaganje preko URL je na tem strežniku onemogočeno.",
-       "api-error-duplicate": "Na strani že {{PLURAL:$1|obstaja druga datoteka|obstajata drugi datoteki|obstajajo druge datoteke}} z enako vsebino.",
-       "api-error-duplicate-archive": "Na strani {{PLURAL:$1|je že bila druga datoteka|sta že bili drugi datoteki|so že bile nekatere druge datoteke}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.",
-       "api-error-empty-file": "Poslana datoteka je prazna.",
        "api-error-emptypage": "Ustvarjanje novih, praznih strani ni dovoljeno.",
-       "api-error-fetchfileerror": "Notranja napaka: pri pridobivanju datoteke je nekaj šlo narobe.",
-       "api-error-fileexists-forbidden": "Datoteka »$1« že obstaja in je ni mogoče prepisati.",
-       "api-error-fileexists-shared-forbidden": "Datoteka »$1« že obstaja v skupnem skladišču datotek in je ni mogoče prepisati.",
-       "api-error-file-too-large": "Poslana datoteka je prevelika.",
-       "api-error-filename-tooshort": "Ime datoteke je prekratko.",
-       "api-error-filetype-banned": "Ta vrsta datoteke je prepovedana.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ni dovoljena datotečna vrsta|nista dovoljeni datotečni vrsti|niso dovoljene datotečne vrste}}. {{PLURAL:$3|Dovoljena datotečna vrsta je|Dovoljeni datotečni vrsti sta|Dovoljene datotečne vrste so}} $2.",
-       "api-error-filetype-missing": "Datoteki manjka končnica.",
-       "api-error-hookaborted": "Spremembo, ki ste jo poskušali narediti, je prekinila razširitev.",
-       "api-error-http": "Notranja napaka: ni mogoče vzpostaviti povezave s strežnikom.",
-       "api-error-illegal-filename": "Ime datoteke ni dovoljeno.",
-       "api-error-internal-error": "Notranja napaka: pri obdelovanju vaše datoteke, naložene na wiki, je nekaj šlo narobe.",
-       "api-error-invalid-file-key": "Notranja napaka: datoteke ni bilo mogoče najti v začasni hrambi.",
-       "api-error-missingparam": "Notranja napaka: manjkajoči parametri ob zahtevi.",
-       "api-error-missingresult": "Notranja napaka: ni bilo mogoče določiti, če je kopiranje uspelo.",
-       "api-error-mustbeloggedin": "Za nalaganje datotek morate biti prijavljeni.",
-       "api-error-mustbeposted": "V tem programju je hrošč; ne uporablja pravilne metode HTTP.",
-       "api-error-noimageinfo": "Nalaganje je uspelo, vendar nam strežnik ni dal nobenih informacij o datoteki.",
-       "api-error-nomodule": "Notranja napaka: modul nalaganja ni izbran.",
-       "api-error-ok-but-empty": "Notranja napaka: strežnik se ne odziva.",
-       "api-error-overwrite": "Prepisovanje obstoječe datoteke ni dovoljeno.",
-       "api-error-ratelimited": "Poskušate naložiti več datotek v kratkem časovnem obdobju kot to dovoljuje ta wiki. Prosimo, poskusite znova čez nekaj minut.",
-       "api-error-stashfailed": "Notranja napaka: strežnik ni uspel shraniti začasne datoteke.",
        "api-error-publishfailed": "Notranja napaka: strežnik ni uspel objaviti začasne datoteke.",
-       "api-error-stasherror": "Pri nalaganju datoteke v hrambo je prišlo do napake.",
-       "api-error-stashedfilenotfound": "Datoteke iz skrite shrambe med poskusom nalaganja iz skrite shrambe nismo našli.",
-       "api-error-stashpathinvalid": "Pot, na kateri naj bi bila datoteka iz skrite shrambe, ni veljavna.",
-       "api-error-stashfilestorage": "Pri shranjevanju datoteke v skrito shrambo je prišlo do napake.",
-       "api-error-stashzerolength": "Strežnik ni mogel dati datoteke v skrito shrambo, ker ima ničelno dolžino.",
-       "api-error-stashnotloggedin": "Da lahko shranite datoteke v skrito shrambo nalaganja, morate biti prijavljeni.",
-       "api-error-stashwrongowner": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne pripada vam.",
-       "api-error-stashnosuchfilekey": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne obstaja.",
-       "api-error-timeout": "Strežnik se ni odzval v pričakovanem času.",
-       "api-error-unclassified": "Prišlo je do neznane napake",
-       "api-error-unknown-code": "Neznana napaka: »$1«",
-       "api-error-unknown-error": "Notranja napaka: pri poskusu nalaganja vaše datoteke je nekaj šlo narobe.",
-       "api-error-unknown-warning": "Neznano opozorilo: $1",
+       "api-error-stashfailed": "Notranja napaka: strežnik ni uspel shraniti začasne datoteke.",
+       "api-error-unknown-warning": "Neznano opozorilo: »$1«.",
        "api-error-unknownerror": "Neznana napaka: »$1«.",
-       "api-error-uploaddisabled": "Nalaganje je onemogočeno na tem wikiju.",
-       "api-error-verification-error": "Ta datoteka je morda poškodovana ali ima napačno končnico.",
-       "api-error-was-deleted": "Datoteko s tem imenom je v preteklosti nekdo že naložil, ampak je bila nato izbrisana.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuti|minute|minut}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uri|ure|ur}}",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Uporabi privzeti jezik",
        "pagelang-select-lang": "Izberite jezik",
+       "pagelang-reason": "Razlog",
        "pagelang-submit": "Potrdi",
+       "pagelang-nonexistent-page": "Stran $1 ne obstaja.",
+       "pagelang-unchanged-language": "Stran $1 že ima nastavljen jezik $2.",
+       "pagelang-unchanged-language-default": "Stran $1 že ima nastavljen wikijev privzeti jezik vsebine.",
+       "pagelang-db-failed": "Zbirka podatkov ni uspela spremeniti jezika strani.",
        "right-pagelang": "Spreminjanje jezika strani",
        "action-pagelang": "spreminjanje jezika strani",
        "log-name-pagelang": "Dnevnik sprememb jezika",
        "sessionprovider-nocookies": "Piškotki so morda onemogočeni. Prepričaje se, da imate piškotke omogočene, in začnite znova.",
        "randomrootpage": "Naključna korenska stran",
        "log-action-filter-block": "Vrsta blokade:",
-       "log-action-filter-contentmodel": "Vrsta spremembe modelastrani:",
+       "log-action-filter-contentmodel": "Vrsta spremembe modela vsebine:",
        "log-action-filter-delete": "Vrsta izbrisa:",
        "log-action-filter-import": "Vrsta uvoza:",
        "log-action-filter-managetags": "Vrsta dejanja upravljanja oznak:",
        "log-action-filter-block-block": "Blokada",
        "log-action-filter-block-reblock": "Sprememba blokade",
        "log-action-filter-block-unblock": "Odstranitev blokade",
-       "log-action-filter-contentmodel-change": "Sprememba Modelastrani",
-       "log-action-filter-contentmodel-new": "Ustvarjanje strani z nestandardnim Modelomstrani",
+       "log-action-filter-contentmodel-change": "Sprememba modela vsebine",
+       "log-action-filter-contentmodel-new": "Ustvarjanje strani z neprivzetim modelom vsebine",
        "log-action-filter-delete-delete": "Izbris strani",
        "log-action-filter-delete-delete_redir": "Prepis preusmeritve",
        "log-action-filter-delete-restore": "Obnovitev strani",
        "usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
        "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<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "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>",
+       "revid": "redakcija $1",
+       "pageid": "ID strani $1"
 }
index f3f52f1..bc98608 100644 (file)
        "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
        "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
        "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
-       "tog-watchcreations": "Shtoi faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
+       "tog-watchcreations": "Shto faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
-       "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve  nën mbikqyrje",
+       "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchuploads": "Shtoni fotografitë e rreja që ngarkoj në listën mbikëqyrëse",
        "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
-       "tog-previewontop": "Trego se si do të duket faqja mbi kutinë redaktimit",
-       "tog-previewonfirst": "Trego se si do të duket faqja posa ta filloj redaktimin",
-       "tog-enotifwatchlistpages": "Më njofto me email kur ndryshohet një faqe apo skedë nga lista ime e faqeve nën vëzhgim",
+       "tog-previewontop": "Trego parapamjen para kutisë së redaktimit",
+       "tog-previewonfirst": "Trego parapamjen në redaktimin e parë",
+       "tog-enotifwatchlistpages": "Më njofto me email kur ndryshohet një faqe apo skedë nga lista ime mbikëqyrëse",
        "tog-enotifusertalkpages": "Më dërgo email kur ndryshohet faqja ime e diskutimeve",
        "tog-enotifminoredits": "Më njofto me email edhe kur ka redaktime të vogla të faqeve dhe skedave",
        "tog-enotifrevealaddr": "Trego adresën time të emailit në emailet njoftuese",
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
        "tog-oldsig": "Nënshkrimi juaj ekzistues:",
        "tog-fancysig": "Mbaje nënshkrimin si wikitekst (pa lidhje automatike)",
-       "tog-uselivepreview": "Trego parapamjen drejtpërdrejt",
+       "tog-uselivepreview": "Përdor parapamjen e drejtpërdrejtë",
        "tog-forceeditsummary": "Më njofto kur përmbledhjen e redaktimit e lë bosh",
        "tog-watchlisthideown": "Fshih redaktimet e mia nga lista e faqeve të vëzhguara",
        "tog-watchlisthidebots": "Fshih redaktimet e robotëve nga lista e faqeve të vëzhguara",
        "talk": "Diskutimet",
        "views": "Shikime",
        "toolbox": "Mjete",
+       "tool-link-emailuser": "Dërgo email {{GENDER:$1|user}}",
        "userpage": "Shfaq faqen e përdoruesit",
        "projectpage": "Shfaq faqen e projektit",
        "imagepage": "Shfaq faqen e skedës",
        "passwordreset-emaildisabled": "Karakteristikat e  Email janë të paaftë në këtë wiki.",
        "passwordreset-username": "Nofka:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Dëshiron të shikosh e-mail-in që rezulton?",
-       "passwordreset-capture-help": "Nëse shënoni këtë kuti, e-mail-i (dhe fjalekalimi i përkohshëm) që do t'i dërgohen përdoruesit, do të të tregohen edhe ty.",
        "passwordreset-email": "Posta elektronike",
        "passwordreset-emailtitle": "Detajet e llogarisë në {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për \ndetajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:\n\n$2\n\n{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.\n\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "blockedtitle": "Përdoruesi është bllokuar",
        "blockedtext": "'''Llogaria juaj ose adresa e IP është bllokuar'''\n\nBllokimi u bë nga $1 dhe arsyeja e dhënë ishte '''$2'''.\n\n*Fillimi i bllokimit: $8\n*Skadimi i bllokimit: $6\n*I bllokuari i shënjestruar: $7\n\nMund të kontaktoni $1 ose një nga [[{{MediaWiki:Grouppage-sysop}}|administruesit]] e tjerë për të diskutuar bllokimin.\n\nVini re se nuk mund t'i dërgoni email përdoruesit nëse nuk keni një adresë të saktë të dhënë tek [[Special:Preferences|parapëlqimet e përdoruesit]] ose nëse kjo është një nga mundësitë që ju është bllokuar.\n\nAdresa e IP-së që keni është $3 dhe numri i identifikimit të bllokimit është #$5. Përfshini këto dy të dhëna në çdo ankesë.",
        "autoblockedtext": "IP adresa juaj është bllokuar automatikisht sepse ishte përdorur nga një përdorues tjetër i cili ishte bllokuar nga $1.\nArsyeja e dhënë për këtë është:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nJu mund të kontaktoni $1 ose një tjetër [[{{MediaWiki:Grouppage-sysop}}|administrues]] për ta diskutuar bllokimin.\n\nVini re : që nuk mund ta përdorni mundësinë \"dërgo porosi elektronike\" përveç nëse keni një postë elektronike të vlefshme të regjistruar në [[Special:Preferences|preferencat tuaja]] dhe nuk jeni bllokuar nga përdorimi i saj.\n\nIP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.",
-       "blockednoreason": "nuk është dhënë ësnje arsye",
+       "blockednoreason": "nuk është dhënë asnjë arsye",
        "whitelistedittext": "Ju duhet të $1 për të redaktuar faqet.",
        "confirmedittext": "Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj  te [[Special:Preferences|parapëlqimet]] e juaja.",
        "nosuchsectiontitle": "Paragrafi nuk mund të gjendet",
        "userrights-reason": "Arsyeja:",
        "userrights-no-interwiki": "Nuk keni leje për të ndryshuar privilegjet e përdoruesve në wiki të tjera.",
        "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.",
-       "userrights-nologin": "Duhet të [[Special:UserLogin|hyni brenda]] me një llogari administrative për të ndryshuar privilegjet e përdoruesve.",
-       "userrights-notallowed": "Ju nuk keni leje për të shtuar ose hequr privilegjet e përdoruesve.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
        "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "right-siteadmin": "Mbyll ose hap bazën e të dhënave",
        "right-override-export-depth": "Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5",
        "right-sendemail": "Dërgo e-mail tek përdoruesit e tjerë",
-       "right-passwordreset": "Shiko e-mail-et e rivendosjes së fjalëkalimit",
        "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
        "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
        "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
index 77dce6f..54de80a 100644 (file)
        "searcharticle": "Иди",
        "history": "Историја странице",
        "history_short": "Историја",
+       "history_small": "историја",
        "updatedmarker": "ажурирано од моје последње посете",
        "printableversion": "За штампање",
        "permalink": "Трајна веза",
        "views": "Прегледи",
        "toolbox": "Алатке",
        "tool-link-userrights": "Уреди {{GENDER:$1|корисничке}} групе",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Корисничке}} групе",
        "tool-link-emailuser": "Пошаљи {{GENDER:$1|имејл}}",
        "userpage": "Погледај корисничку страницу",
        "projectpage": "Погледај страницу пројекта",
        "createacct-another-realname-tip": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.",
        "pt-login": "Пријави ме",
        "pt-login-button": "Пријави ме",
+       "pt-login-continue-button": "Настави пријављивање",
        "pt-createaccount": "Отвори налог",
        "pt-userlogout": "Одјави ме",
        "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
        "saveprefs": "Сачувај",
        "restoreprefs": "Врати све на подразумевано (у свим одељцима)",
        "prefs-editing": "Уређивање",
-       "rows": "Редова:",
-       "columns": "Колона",
        "searchresultshead": "Претрага",
        "stub-threshold": "Праг за обликовање везе као клице ($1):",
        "stub-threshold-sample-link": "пример",
        "userrights-user-editname": "Корисничко име:",
        "editusergroup": "Уреди {{GENDER:$1|корисничке}} групе",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Промена корисничких група",
+       "userrights-viewusergroup": "Преглед корисничких група",
        "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
        "userrights-groupsmember": "Члан:",
        "userrights-groupsmember-auto": "Подразумевано члан и:",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "recentchanges-submit": "Прикажи",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новајлије",
+       "rcfilters-filter-userExpLevel-experienced-label": "Искусни корисници",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "reuploaddesc": "Назад на образац за отпремање",
        "upload-tryagain": "Пошаљи измењени опис датотеке",
        "uploadnologin": "Нисте пријављени",
-       "uploadnologintext": "$1 да бисте отпремали датотеке.",
+       "uploadnologintext": "Морате бити $1 да бисте отпремали датотеке.",
        "upload_directory_missing": "Фасцикла за слање ($1) недостаје и сервер је не може направити.",
        "upload_directory_read_only": "Сервер не може да пише по фасцикли за слање ($1).",
        "uploaderror": "Грешка при отпремању",
        "autoredircomment": "Преусмерење на [[$1]]",
        "autosumm-new": "Нова страница: $1",
        "autosumm-newblank": "Направљена празна страница",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|бајт|бајта|бајтова}}",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "feedback-thanks-title": "Хвала вам!",
        "searchsuggest-search": "Претрага",
        "searchsuggest-containing": "садржи...",
-       "api-error-badaccess-groups": "Није вам дозвољено да отпремате датотеке на овај вики.",
        "api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
-       "api-error-copyuploaddisabled": "Отпремање путем адресе је онемогућено на овом серверу.",
-       "api-error-duplicate": "Већ {{PLURAL:$1|1=постоји друга датотека|постоје друге датотеке}} с истим садржајем.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је друга датотека|Постојале су друге датотеке}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
-       "api-error-empty-file": "Послата датотека је празна.",
        "api-error-emptypage": "Стварање нових празних страница није дозвољено.",
-       "api-error-fetchfileerror": "Унутрашња грешка: дошло је до грешке при добављању датотеке.",
-       "api-error-fileexists-forbidden": "Већ постоји датотека с именом „$1“ и не може да се замени.",
-       "api-error-fileexists-shared-forbidden": "Већ постоји датотека с именом „$1“ у заједничкој ризници и не може да се замени.",
-       "api-error-file-too-large": "Послата датотека је превелика.",
-       "api-error-filename-tooshort": "Назив датотеке је прекратак.",
-       "api-error-filetype-banned": "Ова врста датотеке је забрањена.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}. {{PLURAL:$3|Дозвољена је|Дозвољене су}} $2.",
-       "api-error-filetype-missing": "Датотеци недостаје наставак.",
-       "api-error-hookaborted": "Измена је одбачена од куке за проширења.",
-       "api-error-http": "Унутрашња грешка: не могу да се повежем са сервером.",
-       "api-error-illegal-filename": "Назив датотеке је забрањен.",
-       "api-error-internal-error": "Унутрашња грешка: дошло је до грешке при обрађивању датотеке на викију.",
-       "api-error-invalid-file-key": "Унутрашња грешка: не могу да пронађем датотеку у привременом складишту.",
-       "api-error-missingparam": "Унутрашња грешка: недостају параметри у захтеву.",
-       "api-error-missingresult": "Унутрашња грешка: не могу да утврдим да ли је умножавање успело.",
-       "api-error-mustbeloggedin": "Морате бити пријављени да бисте отпремали датотеке.",
-       "api-error-mustbeposted": "Унутрашња грешка: не користи се исправан HTTP метод.",
-       "api-error-noimageinfo": "Отпремање је успело, али сервер није дао никакав податак о датотеци.",
-       "api-error-nomodule": "Унутрашња грешка: није постављен модул за отпремање.",
-       "api-error-ok-but-empty": "Унутрашња грешка: сервер не одговара.",
-       "api-error-overwrite": "Замењивање постојеће датотеке је забрањено.",
-       "api-error-stashfailed": "Унутрашња грешка: сервер не може да сачува привремену датотеку.",
        "api-error-publishfailed": "Унутрашња грешка: сервер није успео да објави привремену датотеку.",
-       "api-error-timeout": "Сервер није одговорио у очекивано време.",
-       "api-error-unclassified": "Дошло је до непознате грешке",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Унутрашња грешка: дошло је до грешке при отпремању датотеке.",
+       "api-error-stashfailed": "Унутрашња грешка: сервер не може да сачува привремену датотеку.",
        "api-error-unknown-warning": "Непознато упозорење: $1",
        "api-error-unknownerror": "Непозната грешка: „$1“.",
-       "api-error-uploaddisabled": "Отпремање је онемогућено на овом викију.",
-       "api-error-verification-error": "Датотека је оштећена или има неисправан наставак.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд|секунде|секунди}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минута|минута}}",
        "duration-hours": "$1 {{PLURAL:$1|сат|сата|сати}}",
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
+       "pagelang-reason": "Разлог",
        "pagelang-submit": "Пошаљи",
+       "pagelang-nonexistent-page": "Страница $1 не постоји.",
        "right-pagelang": "мењање језика странице",
        "action-pagelang": "промену језика странице",
        "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
        "log-action-filter-upload-overwrite": "промена постојећег",
        "authmanager-email-label": "Имејл",
        "authmanager-email-help": "Имејл адреса",
-       "changecredentials": "Промјена акредитива"
+       "authprovider-resetpass-skip-label": "Прескочи",
+       "changecredentials": "Промјена акредитива",
+       "changecredentials-submit": "Промени",
+       "credentialsform-provider": "Врста акредитива:",
+       "credentialsform-account": "Назив налога:"
 }
index 3fad564..fc2858e 100644 (file)
        "saveprefs": "Sačuvaj",
        "restoreprefs": "Vrati sve na podrazumevano (u svim odeljcima)",
        "prefs-editing": "Uređivanje",
-       "rows": "Redova:",
-       "columns": "Kolona",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za oblikovanje veze kao klice ($1):",
        "stub-threshold-sample-link": "primer",
        "reuploaddesc": "Nazad na obrazac za otpremanje",
        "upload-tryagain": "Pošalji izmenjeni opis datoteke",
        "uploadnologin": "Niste prijavljeni",
-       "uploadnologintext": "$1 da biste otpremali datoteke.",
+       "uploadnologintext": "Morate biti $1 da biste otpremali datoteke.",
        "upload_directory_missing": "Fascikla za slanje ($1) nedostaje i server je ne može napraviti.",
        "upload_directory_read_only": "Server ne može da piše po fascikli za slanje ($1).",
        "uploaderror": "Greška pri otpremanju",
        "autoredircomment": "Preusmerenje na [[$1]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "feedback-thanks-title": "Hvala vam!",
        "searchsuggest-search": "Pretraga",
        "searchsuggest-containing": "sadrži...",
-       "api-error-badaccess-groups": "Nije vam dozvoljeno da otpremate datoteke na ovaj viki.",
        "api-error-badtoken": "Unutrašnja greška: neispravan žeton.",
-       "api-error-copyuploaddisabled": "Otpremanje putem adrese je onemogućeno na ovom serveru.",
-       "api-error-duplicate": "Već {{PLURAL:$1|1=postoji druga datoteka|postoje druge datoteke}} s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su druge datoteke}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-empty-file": "Poslata datoteka je prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
-       "api-error-fetchfileerror": "Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.",
-       "api-error-fileexists-forbidden": "Već postoji datoteka s imenom „$1“ i ne može da se zameni.",
-       "api-error-fileexists-shared-forbidden": "Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zameni.",
-       "api-error-file-too-large": "Poslata datoteka je prevelika.",
-       "api-error-filename-tooshort": "Naziv datoteke je prekratak.",
-       "api-error-filetype-banned": "Ova vrsta datoteke je zabranjena.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.",
-       "api-error-filetype-missing": "Datoteci nedostaje nastavak.",
-       "api-error-hookaborted": "Izmena je odbačena od kuke za proširenja.",
-       "api-error-http": "Unutrašnja greška: ne mogu da se povežem sa serverom.",
-       "api-error-illegal-filename": "Naziv datoteke je zabranjen.",
-       "api-error-internal-error": "Unutrašnja greška: došlo je do greške pri obrađivanju datoteke na vikiju.",
-       "api-error-invalid-file-key": "Unutrašnja greška: ne mogu da pronađem datoteku u privremenom skladištu.",
-       "api-error-missingparam": "Unutrašnja greška: nedostaju parametri u zahtevu.",
-       "api-error-missingresult": "Unutrašnja greška: ne mogu da utvrdim da li je umnožavanje uspelo.",
-       "api-error-mustbeloggedin": "Morate biti prijavljeni da biste otpremali datoteke.",
-       "api-error-mustbeposted": "Unutrašnja greška: ne koristi se ispravan HTTP metod.",
-       "api-error-noimageinfo": "Otpremanje je uspelo, ali server nije dao nikakav podatak o datoteci.",
-       "api-error-nomodule": "Unutrašnja greška: nije postavljen modul za otpremanje.",
-       "api-error-ok-but-empty": "Unutrašnja greška: server ne odgovara.",
-       "api-error-overwrite": "Zamenjivanje postojeće datoteke je zabranjeno.",
-       "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
        "api-error-publishfailed": "Unutrašnja greška: server nije uspeo da objavi privremenu datoteku.",
-       "api-error-timeout": "Server nije odgovorio u očekivano vreme.",
-       "api-error-unclassified": "Došlo je do nepoznate greške",
-       "api-error-unknown-code": "Nepoznata greška: „$1“",
-       "api-error-unknown-error": "Unutrašnja greška: došlo je do greške pri otpremanju datoteke.",
+       "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
        "api-error-unknown-warning": "Nepoznato upozorenje: $1",
        "api-error-unknownerror": "Nepoznata greška: „$1“.",
-       "api-error-uploaddisabled": "Otpremanje je onemogućeno na ovom vikiju.",
-       "api-error-verification-error": "Datoteka je oštećena ili ima neispravan nastavak.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunde|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuta|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
index c24dcb6..d1b7ee6 100644 (file)
        "searcharticle": "Gå till",
        "history": "Sidhistorik",
        "history_short": "Historik",
+       "history_small": "historik",
        "updatedmarker": "uppdaterad sedan senaste besöket",
        "printableversion": "Utskriftsvänlig version",
        "permalink": "Permanent länk",
        "views": "Visningar",
        "toolbox": "Verktyg",
        "tool-link-userrights": "Ändra {{GENDER:$1|användargrupper}}",
+       "tool-link-userrights-readonly": "Visa {{GENDER:$1|användargrupper}}",
        "tool-link-emailuser": "Skicka e-post till denna {{GENDER:$1|användare}}",
        "userpage": "Visa användarsida",
        "projectpage": "Visa projektsida",
        "blockedtitle": "Användaren är blockerad",
        "blockedtext": "'''Din IP-adress eller ditt användarnamn är blockerat.'''\n\nBlockeringen utfördes av $1 med motiveringen: ''$2''.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6.\n* Blockeringen var avsedd för: $7.\n\nDu kan kontakta $1 eller någon annan av [[{{MediaWiki:Grouppage-sysop}}|administratörerna]] för att diskutera blockeringen.\nOm du är inloggad och har uppgivit en e-postadress i dina [[Special:Preferences|inställningar]] så kan du använda funktionen 'Skicka e-post till den här användaren', såvida du inte blivit blockerad från funktionen.\n\nDin IP-adress är $3 och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "autoblockedtext": "Din IP-adress har blockerats automatiskt eftersom den har använts av en annan användare som blockerats av $1.\nMotiveringen av blockeringen var:\n\n:''$2''\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDu kan kontakta $1 eller någon annan [[{{MediaWiki:Grouppage-sysop}}|administratör]] för att diskutera blockeringen.\n\nObservera att du inte kan använda dig av funktionen \"skicka e-post till användare\" om du inte har registrerat en giltig e-postadress i [[Special:Preferences|dina inställningar]] eller om du har blivit blockerad från att skicka e-post.\n\nDin nuvarande IP-adress är $3, och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
+       "systemblockedtext": "Ditt användarnamn eller IP-adress h    ar blockerats automatiskt av MediaWiki.\n\nMotiveringen av blockeringen var:\n\n:<em>$2</em>\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDin nuvarande IP-adress är $3.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "blockednoreason": "ingen motivering angavs",
        "whitelistedittext": "Vänligen $1 för att redigera sidor.",
        "confirmedittext": "Du måste bekräfta din e-postadress innan du kan redigera sidor. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].",
        "search-external": "Extern sökning",
        "searchdisabled": "Sökfunktionen på {{SITENAME}} är avstängd.\nDu kan istället göra sökningar med hjälp av Google.\nNotera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.",
        "search-error": "Ett fel uppstod under sökningen: $1",
+       "search-warning": "En varning uppstod under sökning: $1",
        "preferences": "Inställningar",
        "mypreferences": "Inställningar",
        "prefs-edits": "Antal redigeringar:",
        "saveprefs": "Spara",
        "restoreprefs": "Återgå till standardinställningar (i alla delar)",
        "prefs-editing": "Redigering",
-       "rows": "Rader:",
-       "columns": "Kolumner:",
        "searchresultshead": "Sökning",
        "stub-threshold": "Gräns för formatering av stubblänk ($1):",
        "stub-threshold-sample-link": "exempel",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
        "userrights": "Hantering av användarrättigheter",
-       "userrights-lookup-user": "Hantera användargrupper",
+       "userrights-lookup-user": "Välj en användare",
        "userrights-user-editname": "Skriv in ett användarnamn:",
-       "editusergroup": "Ändra {{GENDER:$1|användargrupper}}",
+       "editusergroup": "Läs in användargrupper",
        "editinguser": "Ändrar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Visar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Ändra användargrupper",
+       "userrights-viewusergroup": "Visa användargrupper",
        "saveusergroups": "Spara {{GENDER:$1|användargrupper}}",
        "userrights-groupsmember": "Medlem i:",
        "userrights-groupsmember-auto": "Implicit medlem av:",
        "action-upload_by_url": "ladda upp denna fil från en URL-adress",
        "action-writeapi": "använda skriv-API:t",
        "action-delete": "radera denna sida",
-       "action-deleterevision": "radera denna version",
-       "action-deletedhistory": "se denna sidas raderade historik",
+       "action-deleterevision": "radera sidversioner",
+       "action-deletelogentry": "radera loggposter",
+       "action-deletedhistory": "se en sidas raderade historik",
+       "action-deletedtext": "visa raderad sidversionstext",
        "action-browsearchive": "söka raderade sidor",
-       "action-undelete": "avradera denna sida",
-       "action-suppressrevision": "granska och återställa denna dolda version",
+       "action-undelete": "återställ sidor",
+       "action-suppressrevision": "granska och återställ dolda sidversioner",
        "action-suppressionlog": "se denna privata logg",
        "action-block": "blockera denna användare från redigering",
        "action-protect": "ändra skyddsnivå för denna sida",
        "action-userrights-interwiki": "ändra rättigheter för användare på andra wikier",
        "action-siteadmin": "låsa eller låsa upp databasen",
        "action-sendemail": "skicka e-post",
+       "action-editmyoptions": "redigera dina inställningar",
        "action-editmywatchlist": "redigera din bevakningslista",
        "action-viewmywatchlist": "visa din bevakningslista",
        "action-viewmyprivateinfo": "visa din privata information",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Visa",
+       "rcfilters-activefilters": "Aktiva filter",
+       "rcfilters-search-placeholder": "Filtrera senaste ändringar (bläddra eller börja skriva)",
+       "rcfilters-invalid-filter": "Ogiltigt filter",
+       "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-noresults": "Inga filter hittades",
+       "rcfilters-filtergroup-registration": "Användarregistrering",
+       "rcfilters-filter-registered-label": "Registrerade",
+       "rcfilters-filter-registered-description": "Inloggade redigerare.",
+       "rcfilters-filter-unregistered-label": "Oregistrerade",
+       "rcfilters-filter-unregistered-description": "Redigerare som inte är inloggade.",
+       "rcfilters-filtergroup-authorship": "Redigera författarskap",
+       "rcfilters-filter-editsbyself-label": "Dina egna redigeringar",
+       "rcfilters-filter-editsbyself-description": "Redigeringar av dig.",
+       "rcfilters-filter-editsbyother-label": "Redigeringar av andra",
+       "rcfilters-filter-editsbyother-description": "Redigeringar som har skapats av andra användare (inte dig).",
+       "rcfilters-filtergroup-userExpLevel": "Erfarenhetsnivå (endast för registrerade användare)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Nykomlingar",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-userExpLevel-learner-label": "Nybörjare",
+       "rcfilters-filter-userExpLevel-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Erfarna användare",
+       "rcfilters-filter-userExpLevel-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
+       "rcfilters-filtergroup-automated": "Automatiserade bidrag",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redigeringar gjorda av automatiserade verktyg.",
+       "rcfilters-filter-humans-label": "Människa (inte bot)",
+       "rcfilters-filter-humans-description": "Redigeringar gjorda av mänskliga redigerare.",
+       "rcfilters-filtergroup-significance": "Betydelse",
+       "rcfilters-filter-minor-label": "Mindre redigeringar",
+       "rcfilters-filter-minor-description": "Redigeringar som är märkta som mindre.",
+       "rcfilters-filter-major-label": "Icke-mindre redigeringar",
+       "rcfilters-filter-major-description": "Redigeringar som inte är märkta som mindre.",
+       "rcfilters-filtergroup-changetype": "Typ av ändring",
+       "rcfilters-filter-pageedits-label": "Sidredigeringar",
+       "rcfilters-filter-pageedits-description": "Redigeringar till wikiinnehåll, diskussioner, kategoribeskrivningar...",
+       "rcfilters-filter-newpages-label": "Sidskapande",
+       "rcfilters-filter-newpages-description": "Redigeringar som skapade nya sidor.",
+       "rcfilters-filter-categorization-label": "Kategoriändringar",
+       "rcfilters-filter-categorization-description": "Poster av sidor som läggs till eller tas bort från kategorier.",
+       "rcfilters-filter-logactions-label": "Loggade åtgärder",
+       "rcfilters-filter-logactions-description": "Administrativa åtgärder, kontoskapande, sidraderingar, uppladdningar....",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa nya ändringar från och med $2 $3",
        "rcshowhideminor": "$1 mindre ändringar",
        "uncategorizedcategories": "Ej kategoriserade kategorier",
        "uncategorizedimages": "Ej kategoriserade filer",
        "uncategorizedtemplates": "Ej kategoriserade mallar",
+       "uncategorized-categories-exceptionlist": " # Innehåller en lista över kategorier, som inte bör nämnas på Special:UncategorizedCategories. En per rad, börjar med \"*\". Rader som börjar med ett annat tecken (inklusive mellanslag) ignoreras. Använd \"#\" för kommentarer.",
        "unusedcategories": "Oanvända kategorier",
        "unusedimages": "Oanvända filer",
        "wantedcategories": "Önskade kategorier",
        "emailccsubject": "Kopia av ditt meddelande till $1: $2",
        "emailsent": "E-post har nu skickats",
        "emailsenttext": "Ditt e-postmeddelande har skickats",
-       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}. {{GENDER:$2|Ditt}} e-postmeddelande kommer att skickas direkt till {{GENDER:$1|den ursprungliga avsändaren}}, vilket kommer avslöja {{GENDER:$2|din}} e-postadress för {{GENDER:$1|honom|henne|hen}}.",
        "usermessage-summary": "Lämnar systemmeddelande.",
        "usermessage-editor": "Systemmeddelare",
        "watchlist": "Bevakningslista",
        "changecontentmodel-emptymodels-title": "Inget innehållsmodeller finns tillgängliga",
        "changecontentmodel-emptymodels-text": "Innehållet på [[:$1]] kan inte konverteras till någon typ.",
        "log-name-contentmodel": "Ändringslogg för innehållsmodellen",
-       "log-description-contentmodel": "Händelser som är relaterade till en sidas innehållsmodeller",
+       "log-description-contentmodel": "Denna sida listar ändringar i innehållsmodellen för sidor och sidor som skapades med en annan innehållsmodell än den som är standard.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|skapade}} sidan $3 med den icke-standardiserade innehållsmodellen \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ändrade}} innehållsmodellen för sidan $3 från \"$4\" till \"$5\"",
        "logentry-contentmodel-change-revertlink": "återställ",
        "proxyblockreason": "Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.",
        "sorbsreason": "Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.",
        "sorbs_create_account_reason": "Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.\nDu får inte skapa ett användarkonto",
+       "softblockrangesreason": "Anonyma bidrag tillåts inte från din IP-adress ($1). Var god logga in.",
        "xffblockreason": "En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1",
        "cant-see-hidden-user": "Användaren du försöker blockera är redan blockerad och dold. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.",
        "ipbblocked": "Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
        "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
        "cant-move-to-category-page": "Du har inte behörighet att flytta en sida till en kategorisida.",
+       "cant-move-subpages": "Du har inte behörighet att flytta undersidor.",
+       "namespace-nosubpages": "Namnrymden \"$1\" tillåter inte undersidor.",
        "newtitle": "Ny titel:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "pageinfo-length": "Sidlängd (i byte)",
        "pageinfo-article-id": "Sid-ID",
        "pageinfo-language": "Språk för sidinnehåll",
+       "pageinfo-language-change": "ändra",
        "pageinfo-content-model": "Sidinnehållsmodell",
        "pageinfo-content-model-change": "ändra",
        "pageinfo-robot-policy": "Indexering av robotar",
        "feedback-useragent": "Användaragent:",
        "searchsuggest-search": "Sök på {{SITENAME}}",
        "searchsuggest-containing": "innehåller...",
-       "api-error-autoblocked": "Din IP-adress har blockerats automatiskt eftersom den har använts av en blockerad användare.",
-       "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
        "api-error-badtoken": "Internt fel: felaktig nyckel.",
-       "api-error-blocked": "Du har blockerats från att redigera.",
-       "api-error-copyuploaddisabled": "Uppladdning via URL är inaktiverat på den här servern.",
-       "api-error-duplicate": "Det finns redan {{PLURAL:$1|en annan fil|andra filer}} på webbplatsen med samma innehåll.",
-       "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|en annan fil|några andra filer}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
-       "api-error-empty-file": "Filen du skickade var tom.",
        "api-error-emptypage": "Det är inte tillåtet att skapa nya, tomma sidor.",
-       "api-error-fetchfileerror": "Internt fel: något gick fel vid hämtningen av filen.",
-       "api-error-fileexists-forbidden": "En fil med namnet \"$1\" finns redan och kan inte skrivas över.",
-       "api-error-fileexists-shared-forbidden": "En fil med namnet \"$1\" finns redan i det delade filarkivet och kan inte skrivas över.",
-       "api-error-file-too-large": "Filen du skickade var för stor.",
-       "api-error-filename-tooshort": "Filnamnet är för kort.",
-       "api-error-filetype-banned": "Denna typ av fil är förbjuden.",
-       "api-error-filetype-banned-type": "$1 är inte {{PLURAL:$4|en tillåten filtyp|tillåtna filtyper}}. {{PLURAL:$3|Tillåten filtyp|Tillåtna filtyper}} är $2.",
-       "api-error-filetype-missing": "Filnamnet saknar en filändelse.",
-       "api-error-hookaborted": "Ändringen du försökte göra avbröts av en extension hook.",
-       "api-error-http": "Internt fel: Det gick inte att ansluta till servern.",
-       "api-error-illegal-filename": "Filnamnet är inte tillåtet.",
-       "api-error-internal-error": "Internt fel: Något gick fel med bearbetningen av din uppladdning på wikin.",
-       "api-error-invalid-file-key": "Internt fel: filen hittades inte i tillfällig lagring.",
-       "api-error-missingparam": "Internt fel: Det saknas parametrar i begäran.",
-       "api-error-missingresult": "Internt fel: Kunde inte avgöra om kopieringen lyckades.",
-       "api-error-mustbeloggedin": "Du måste vara inloggad för att kunna ladda upp filer.",
-       "api-error-mustbeposted": "Det finns en bugg i detta program, det använder inte rätt HTTP-metod.",
-       "api-error-noimageinfo": "Uppladdningen lyckades, men servern gav oss inte någon information om filen.",
-       "api-error-nomodule": "Internt fel: Ingen uppladdningsmodul uppsatt.",
-       "api-error-ok-but-empty": "Internt fel: Inget svar från servern.",
-       "api-error-overwrite": "Det är inte tillåtet att skriva över en befintlig fil.",
-       "api-error-ratelimited": "Du försöker ladda upp fler filer inom en kortare tidsrymd än denna wiki tillåter.\nFörsök igen om några minuter.",
-       "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
-       "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
-       "api-error-stashedfilenotfound": "Den temporära filen kunde inte hittas när den skulle laddas upp från den temporära lagringsytan.",
-       "api-error-stashpathinvalid": "Den sökväg där den temporära filen skulle ha hittats var ogiltig.",
-       "api-error-stashfilestorage": "Ett fel uppstod under lagringen av filen i den temporära lagringsytan.",
-       "api-error-stashzerolength": "Servern kunde inte lagra filen temporärt eftersom den har noll längd.",
-       "api-error-stashnotloggedin": "Du måste vara inloggad för att spara filer till den temporära ytan för uppladdningar.",
-       "api-error-stashwrongowner": "Filen du försöker komma åt i det temporära lagringsutrymmet tillhör inte dig.",
-       "api-error-stashnosuchfilekey": "Filnyckeln som du försökte komma åt i den temporära lagringsytan existerar inte.",
-       "api-error-timeout": "Servern svarade inte inom förväntad tid.",
-       "api-error-unclassified": "Ett okänt fel uppstod.",
-       "api-error-unknown-code": "Okänt fel: \"$1\".",
-       "api-error-unknown-error": "Internt fel: något gick fel när vi försökte ladda upp din fil.",
+       "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-unknown-warning": "Okänd varning: \"$1\".",
        "api-error-unknownerror": "Okänt fel: \"$1\".",
-       "api-error-uploaddisabled": "Uppladdning är inaktiverad på denna wiki.",
-       "api-error-verification-error": "Denna fil kan vara skadad eller har fel filändelse.",
-       "api-error-was-deleted": "En fil med detta namn har tidigare laddats upp och sedan raderats.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuter}}",
        "duration-hours": "$1 {{PLURAL:$1|timme|timmar}}",
        "pagelang-language": "Språk",
        "pagelang-use-default": "Använd standardspråk",
        "pagelang-select-lang": "Välj språk",
+       "pagelang-reason": "Orsak",
        "pagelang-submit": "Skicka",
+       "pagelang-nonexistent-page": "Sidan $1 finns inte.",
+       "pagelang-unchanged-language": "Sidan $1 har redan språket $2.",
+       "pagelang-unchanged-language-default": "Sidan $1 har redan wikins standardinnehållsspråk.",
+       "pagelang-db-failed": "Databasen misslyckades med att ändra sidans språk.",
        "right-pagelang": "Ändra sidspråk",
        "action-pagelang": "ändra sidspråket",
        "log-name-pagelang": "Språkändringslogg",
        "mw-widgets-dateinput-no-date": "Inget valt datum",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Sök efter media",
+       "mw-widgets-mediasearch-noresults": "Inga resultat hittades.",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
        "usercssispublic": "Observera: CSS-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
        "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>"
+       "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>",
+       "revid": "sidversion $1",
+       "pageid": "sid-ID $1"
 }
index 7fd903d..bf05552 100644 (file)
@@ -50,7 +50,8 @@
                        "Nemo bis",
                        "JAaron95",
                        "Info-farmer",
-                       "Rakeshonwiki"
+                       "Rakeshonwiki",
+                       "Kaartic"
                ]
        },
        "tog-underline": "அடிக்கோடிட்டத்தை இணை:",
        "searcharticle": "செல்",
        "history": "பக்க வரலாறு",
        "history_short": "வரலாறு",
+       "history_small": "வரலாறு",
        "updatedmarker": "எனது கடைசி வருகைக்குப் பின் இற்றைப்படுத்தப்பட்டது",
        "printableversion": "அச்சுக்குகந்த பதிப்பு",
        "permalink": "நிலையான இணைப்பு",
        "passwordreset-emaildisabled": "மின்னஞ்சல் வசதி இந்த விக்கியில் முடக்கப்பட்டுள்ளது.",
        "passwordreset-username": "பயனர் பெயர்:",
        "passwordreset-domain": "இணையதள முகவரி:",
-       "passwordreset-capture": "விளைவு மின்னஞ்சலை காண்",
-       "passwordreset-capture-help": "நீங்கள் இந்த பெட்டியை தெரிவு செய்தால் ,இந்த மின்னஞ்சல் (தற்காலிக கடவுச்சொல்லுடன்) உங்களுக்கு தெரியும் . அதேபோல இது பயனருக்கும் அனுப்பப்படும்.",
        "passwordreset-email": "மின்னஞ்சல் முகவரி:",
        "passwordreset-emailtitle": "{{SITENAME}} ல் கணக்கு விவரங்கள்",
        "passwordreset-emailtext-ip": "யாராவது (அநேகமாக நீங்கள், IP முகவரி   $1 ல் இருந்து ), நினைவுபடுத்தி கோரிய உங்கள் கணக்கு\n விவரங்கள் நினைவுபடுத்தி {{SITENAME}} ( $4 ).பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
        "saveprefs": "சேமி",
        "restoreprefs": "எல்லோருக்கும் பொதுவான வடிவமைப்பைத் திரும்பக்கொண்டுவரவும் (எல்லா பிரிவுகளிலும்).",
        "prefs-editing": "தொகுத்தல்",
-       "rows": "நிரைகள் (கிடை வரிசைகள்):",
-       "columns": "நிரல்கள்",
        "searchresultshead": "தேடுக",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> சீர்படுத்தலுக்கான எல்லை (பைட்டுகள்):",
        "stub-threshold-sample-link": "மாதிரி",
        "editusergroup": "{{GENDER:$1|பயனர்}} குழுக்களை தொகு",
        "editinguser": "பயனர் {{GENDER:$1|பயனர்}} <strong>[[User:$1|$1]]</strong> $2  பயனருக்கான அனுமதிகளை மாற்றல்",
        "userrights-editusergroup": "பயனர் குழுக்களை தொகு",
+       "userrights-viewusergroup": "பயனர் குழுக்களைப் பார்வையிடுக",
        "saveusergroups": "{{GENDER:$1|பயனர்}} குழுக்களை சேமி",
        "userrights-groupsmember": "உறுப்பினர்:",
        "userrights-groupsmember-auto": "தானகவே உடன்வரும் உறுப்பினர்:\n\nகூடவே வரும் உறுப்பினர்:",
        "userrights-reason": "காரணம்:",
        "userrights-no-interwiki": "ஏனைய விக்கிகளில் பயனர் உரிமைகளை மாற்றும் அனுமதி உங்களுக்குக் கிடையாது.",
        "userrights-nodatabase": "$1 தரவுத்தளம் கிடையாது அல்லது உள்ளக விக்கியில் கிடையாது.",
-       "userrights-nologin": "பயனர் உரிமைகளை வழங்குவதற்கு நீங்கள் நிர்வாகி கணக்கில் [[Special:UserLogin|புகுபதிகை]] செய்ய வேண்டும்.",
-       "userrights-notallowed": "பயனர் உரிமைகளை மாற்றும் அனுமதி உங்களுக்கு கிடையாது.",
        "userrights-changeable-col": "நீங்கள் மாற்றக்கூடிய குழுக்கள்",
        "userrights-unchangeable-col": "நீங்கள் மாற்ற முடியாத குழுக்கள்",
        "userrights-conflict": "பயனர் உரிமைகளின் மாற்றங்களில் முரண்பாடு உள்ளது! மறு ஆய்வு செய்து, உங்கள் மாற்றங்களை உறுதி செய்க.",
-       "userrights-removed-self": "நீங்கள் உங்களது சொந்த உரிமைகளை வெற்றிகரமாக நீக்கியுள்ளீர்கள். இதனால் நீங்கள் இனி இந்தப்பக்கத்தினை பார்க்க இயலாது.",
        "group": "குழு:",
        "group-user": "பயனர்கள்",
        "group-autoconfirmed": "தானாக உறுதியளிக்கப்பட்ட பயனர்கள்",
        "right-siteadmin": "தரவுத்தளத்தை பூட்டல் திறத்தல்",
        "right-override-export-depth": "பக்கங்களை ஏற்றுமதி செய் அத்துடன் இணைத்த பக்கங்கள் ஆழம் 5 வரை சேர்த்து ஏற்றுமதி செய்",
        "right-sendemail": "மற்ற பயனர்களுக்கு மின்னஞ்சல் அனுப்பு",
-       "right-passwordreset": "கடவுச்சொல் மீட்டமை மின்னஞ்சல்களை காண்.",
        "right-managechangetags": "தரவுதளத்திலிருந்து [[Special:Tags|அடையாளங்களை]] உருவாக்கு மற்றும் நீக்கு",
        "right-applychangetags": "ஒருவரின் மாற்றத்துடன் [[Special:Tags|அடையாளங்களை]] செயற்படுத்து",
        "right-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில்  [[Special:Tags|அடையாளங்களை]] சேர் அல்லது நீக்கு",
        "action-upload_by_url": "இக்கோப்பை ஓர் உரலியிலிருந்துப் பதிவேற்றவும்",
        "action-writeapi": "எழுது API பயன்படுத்தவும்",
        "action-delete": "இந்தப் பக்கத்தை நீக்கவும்",
-       "action-deleterevision": "à®\87நà¯\8dத à®®à®¾à®±à¯\8dறதà¯\8dதை நீக்கவும்",
-       "action-deletedhistory": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\95à®\9fà¯\88à®\9aியாà®\95 à®¨à¯\80à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®µà®°à®²à®¾à®±à¯\81 à®\95ாணà¯\8d",
+       "action-deleterevision": "மாறà¯\8dà®±à®\99à¯\8dà®\95ளை நீக்கவும்",
+       "action-deletedhistory": "à®\92à®°à¯\81 à®ªà®\95à¯\8dà®\95தà¯\8dதினà¯\8d à®¨à¯\80à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®µà®°à®²à®¾à®±à¯\81 à®\95ாணà¯\8dà®\95",
        "action-browsearchive": "அழிக்கப்பட்ட பக்கங்களைத் தேடு",
        "action-undelete": "அழித்த பக்கத்தை மறுபடியும் கொண்டு வா",
-       "action-suppressrevision": "à®\87நà¯\8dத à®®à®±à¯\88à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®ªà®°à®¿à®\9aà¯\80லனà¯\88யà¯\88 à®\86யà¯\8dவà¯\81à®\9aà¯\86யà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d  மீட்டெடு",
+       "action-suppressrevision": "மறà¯\88à®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®®à¯\80ளாயà¯\8dவà¯\81à®\95ளà¯\88 à®\86யà¯\8dவà¯\81à®\9aà¯\86யà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d மீட்டெடு",
        "action-suppressionlog": "இத்தனிப் பதிகையைக் காணவும்",
        "action-block": "இப்பயனரை மேலும் தொகுக்க அனுமதிக்க வேண்டாம்",
        "action-protect": "இந்த பக்கத்திற்கான பாதுகாப்பு நிலைகளை மாற்றவும்",
        "recentchanges-legend-heading": "<strong>குறியீட்டு விளக்கம்:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
+       "rcfilters-filterlist-title": "வடிப்பான்கள்",
+       "rcfilters-filtergroup-registration": "பயனர் பதிகை",
+       "rcfilters-filter-registered-label": "பதிவுசெய்யப்பட்டது",
+       "rcfilters-filter-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது",
+       "rcfilters-filter-editsbyself-label": "தங்களின் சொந்த தொகுப்புகள்",
+       "rcfilters-filter-userExpLevel-newcomer-label": "புது வரவுகள்",
+       "rcfilters-filter-userExpLevel-learner-label": "கற்போர்",
+       "rcfilters-filter-bots-label": "தானியங்கி",
+       "rcfilters-filter-humans-label": "மனிதன் (தானியங்கி அல்ல)",
+       "rcfilters-filtergroup-changetype": "மாற்ற வகை",
+       "rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhideminor": "சிறிய தொகுப்புகளை $1",
        "pageinfo-length": "பக்க நீளம் (எண்ணுண்மிகளில்)",
        "pageinfo-article-id": "பக்க அடையாள இலக்கம்",
        "pageinfo-language": "பக்க உள்ளடக்க மொழி",
+       "pageinfo-language-change": "மாற்று",
        "pageinfo-content-model": "பக்கள உள்ளடக்க மாதிரி",
        "pageinfo-content-model-change": "மாற்று",
        "pageinfo-robot-policy": "தானியங்கி மூலம் அட்டவணைப்படுத்தல்",
        "feedback-useragent": "பயனர் முகவர்:",
        "searchsuggest-search": "தேடு",
        "searchsuggest-containing": "கொண்டுள்ளது...",
-       "api-error-badaccess-groups": "இந்த விக்கிக்குக் கோப்புகளைப் பதிவேற்றுவதற்கு நீங்கள் அனுமதிக்கப்படவில்லை.",
        "api-error-badtoken": "உள்ளகப் பிழை: தவறான அடையாளம்.",
-       "api-error-copyuploaddisabled": "உரலி மூலம் பதிவேற்றுவது இந்த வழங்கியில் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-duplicate": "There {{PLURAL:$1|is another file|are some other files}} already on the site with the same content.",
-       "api-error-duplicate-archive": "ஏற்கனவே இத்தளத்தில் இதே உள்ளடக்கத்தைக் கொண்ட {{PLURAL:$1|கோப்பு இருந்தது|கோப்புகள் இருந்தன}}, ஆனால் {{PLURAL:$1|அது நீக்கப்பட்டுவிட்டது|அவை நீக்கப்பட்டுவிட்டன.}}",
-       "api-error-empty-file": "நீங்கள் அளித்த கோப்பு காலியாக உள்ளது.",
        "api-error-emptypage": "புதிய, காலி பக்கங்கள் உருவாக்கல் அனுமதிக்கப்படவில்லை.",
-       "api-error-fetchfileerror": "உள்ளகப் பிழை: கோப்பைப் பெறுகையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
-       "api-error-fileexists-forbidden": "\"$1\" என்ற பெயருள்ள கோப்பு ஏற்கனவே உள்ளது.  மேலெழுத முடியாது.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" என்ற பெயருள்ள கோப்பு ஏற்கனவே கோப்பு பகிர்மானப் பெட்டகத்தில்  உள்ளது. மேலெழுத முடியாது.",
-       "api-error-file-too-large": "நீங்கள் அளித்த கோப்பு மிகவும் பெரியதாக உள்ளது.",
-       "api-error-filename-tooshort": "கோப்புப் பெயர் மிகவும் சிறியதாக உள்ளது.",
-       "api-error-filetype-banned": "இக்கோப்பு வகை தடைசெய்யப்பட்டுள்ளது.",
-       "api-error-filetype-banned-type": "$1  {{PLURAL:$4|அனுமதிக்கப்படாத கோப்பு வகையாகும் | அனுமதிக்கப்படாத கோப்பு வகைகளாகும்}}.. அனுமதிக்கப்பட்ட {{PLURAL:$3|கோப்புவகை|கோப்புவகைகள்}} $2 என்பது(வை) ஆகும்.",
-       "api-error-filetype-missing": "கோப்பில் ஒரு விரிவு விடுபடுகிறது.",
-       "api-error-hookaborted": "நீங்கள் செய்ய முயன்ற மாற்றம் ஒரு விரிவாக்கத்தால் புறக்கணிக்கப்பட்டது.",
-       "api-error-http": "உள்ளகப் பிழை: வழங்கியுடன் இணைக்க முடியவில்லை",
-       "api-error-illegal-filename": "இக்கோப்புப் பெயர் அனுமதிக்கப்படமாட்டாது.",
-       "api-error-internal-error": "உள்ளகப் பிழை: உங்கள் பதிவேற்றத்தை விக்கியில் செயல்படுத்தும்போது ஏதோ தவறு நேர்ந்துவிட்டது.",
-       "api-error-invalid-file-key": "உள்ளகப் பிழை: தற்காலிகச் சேமிப்பில் கோப்பு காணப்படவில்லை.",
-       "api-error-missingparam": "உள்ளகப் பிழை: கோரிக்கையில் அளபுருக்கள் விடுபடுகின்றன.",
-       "api-error-missingresult": "உள்ளகப் பிழை: நகல் வெற்றியடைந்ததா என்று தீர்மாணிக்க முடியவில்லை.",
-       "api-error-mustbeloggedin": "கோப்புகளைப் பதிவேற்ற நீங்கள் கண்டிப்பாகப் புகுபதிகை செய்திருக்க வேண்டும்.",
-       "api-error-mustbeposted": "உள்ளகப் பிழை: கோரிக்கைக்கு HTTP POST தேவை.",
-       "api-error-noimageinfo": "பதிவேற்றம் வெற்றியடைந்தது, ஆனால் வழங்கி கோப்பைப் பற்றிய எந்த ஒரு தகவலையும் எங்களுக்குத் தரவில்லை.",
-       "api-error-nomodule": "உள்ளகப் பிழை: பதிவேற்றப் பகுதி அமைக்கப்படவில்லை.",
-       "api-error-ok-but-empty": "உள்ளகப் பிழை: வழங்கியிலிருந்து பதில் வரவில்லை",
-       "api-error-overwrite": "ஏற்கனவே உள்ள கோப்பின் மேலெழுதுவது அனுமதிக்கப்படமாட்டாது.",
-       "api-error-stashfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் தேக்கத் தவறிவிட்டது.",
        "api-error-publishfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் பதிப்பிக்க தவறிவிட்டது.",
-       "api-error-stasherror": "பரணில் ஒரு கோப்பை ஏற்றும் போது பிழை ஏற்பட்டது.",
-       "api-error-stashedfilenotfound": "பரணிலிருந்து கோப்பே ஏற்றும் போது பரணேற்றப்பட்ட கோப்பை காணவில்லை.",
-       "api-error-stashpathinvalid": "பரணேற்றபட்ட கோப்பு காணப்பட வேண்டிய பாதை செல்லாதது.",
-       "api-error-stashfilestorage": "பரணில் ஒரு கோப்பை சேமிக்கும் போது பிழை ஏற்பட்டது.",
-       "api-error-stashzerolength": "வழங்கி கோப்பை பரணேற்ற இயலாது, ஏனெனில் அது சுழி நீளம் கொண்டது.",
-       "api-error-stashnotloggedin": "ஏற்று பரணில் கோப்பை சேமிக்க நீங்கள் புகுபதிய வேண்டும்.",
-       "api-error-stashwrongowner": "நீங்கள் பரணில் அணுக முயற்சிக்கும் கோப்பு உங்களுக்கு உரியதல்ல.",
-       "api-error-stashnosuchfilekey": "நீங்கள் பரணில் அணுக முயற்சிக்கும் கோப்புக் குறி காணக்கிடைக்கவில்லை.",
-       "api-error-timeout": "எதிர்பார்க்கப்பட்ட நேரத்தில் வழங்கி பதிலளிக்கவில்லை.",
-       "api-error-unclassified": "அறியாப் பிழை ஏற்பட்டது",
-       "api-error-unknown-code": "அறியாப் பிழை: \"$1\"",
-       "api-error-unknown-error": "உள்ளகப் பிழை: உங்கள் கோப்பைப் பதிவேற்ற முயல்கையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
+       "api-error-stashfailed": "உள்ளகப் பிழை: வழங்கி தற்காலிகக் கோப்பைத் தேக்கத் தவறிவிட்டது.",
        "api-error-unknown-warning": "அறியப்படா எச்சரிக்கை: \"$1\".",
        "api-error-unknownerror": "அறியப்படாத பிழை: \"$1\".",
-       "api-error-uploaddisabled": "இந்த விக்கியில் பதிவேற்றல் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-verification-error": "இக்கோப்பு பிழையுடனோ தவறான விரிவுடனோ இருக்கலாம்.",
        "duration-seconds": "$1 {{PLURAL:$1|நொடி|நொடிகள்}}",
        "duration-minutes": "{{PLURAL:$1|நிமிடம்|நிமிடங்கள்}}",
        "duration-hours": "$1 {{PLURAL:$1|மணி|மணிகள்}} முன்பு",
        "pagelang-language": "மொழி",
        "pagelang-use-default": "இயல்பு நிலை மொழி",
        "pagelang-select-lang": "மொழியைத் தேர்ந்தெடு",
+       "pagelang-reason": "காரணம்",
        "pagelang-submit": "சமர்ப்பி",
        "right-pagelang": "பக்க மொழியை மாற்றுக",
        "action-pagelang": "பக்க மொழியை மாற்றுக",
index 9277032..97dba56 100644 (file)
        "searcharticle": "ಪೋಲೆ",
        "history": "ಪುಟೊತ ಚರಿತ್ರೆ",
        "history_short": "ಇತಿಹಾಸೊ",
+       "history_small": "ಇತಿಹಾಸೊ",
        "updatedmarker": "ಎನ್ನ ಅಕೇರಿದ ವೀಕ್ಷಣೆ ಡ್ದ್ ಬುಕ್ಕ ಆಯಿನ ಬದಲಾವಣೆಲು",
        "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
        "permalink": "ಸ್ತಿರೊ ಕೊಂಡಿ",
        "prefs-rendering": "ಗೋಚರೊ",
        "saveprefs": "ಒರಿಪಾಲೆ",
        "prefs-editing": "ಸಂಪೊಲಿಪು",
-       "rows": "ಸಾಲ್‘ಲು",
-       "columns": "ಸಾಲ್‍ಕುಲು:",
        "searchresultshead": " \nನಾಡ್’ಲೆ",
        "stub-threshold-sample-link": "ಸಾಂಪಲ್",
        "stub-threshold-disabled": "ಕ್ರಿಯೆ ಉಂತ್‍ದ್ಂಡ್",
        "recentchanges-legend-heading": "<strong>ಲೆಜೆಂಡ್:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
+       "rcfilters-filter-userExpLevel-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
        "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
-       "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ"
+       "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
+       "pagelang-reason": "ಕಾರಣೊ"
 }
index f45a897..2ab4a98 100644 (file)
        "saveprefs": "భద్రపరచు",
        "restoreprefs": "అప్రమేయ అమరికలను పునఃస్థాపించు (అన్ని విభాగాల్లోనూ)",
        "prefs-editing": "దిద్దుబాట్లు",
-       "rows": "అడ్డు వరుసలు:",
-       "columns": "నిలువు వరుసలు:",
        "searchresultshead": "వెతుకు",
        "stub-threshold": "మొలక లింకు ఫార్మాటింగు కొరకు హద్దు ($1):",
        "stub-threshold-sample-link": "నమూనా",
        "action-writeapi": "వ్రాసే APIని ఉపయోగించే",
        "action-delete": "ఈ పేజీని తొలగించే",
        "action-deleterevision": "ఈ కూర్పుని తొలగించే",
-       "action-deletedhistory": "ఈ పేజీ యొక్క తొలగించిన చరిత్రని చూసే",
+       "action-deletelogentry": "చిట్టా పద్దులను తొలగించే",
+       "action-deletedhistory": "పేజీల తొలగించిన చరిత్రని చూసే",
+       "action-deletedtext": "తొలగించిన కూర్పుల పాఠ్యాన్ని చూసే",
        "action-browsearchive": "తొలగించిన పేజీలలో వెతికే",
-       "action-undelete": "à°\88 à°ªà±\87à°\9cà±\80ని పునఃస్థాపించే",
+       "action-undelete": "à°ªà±\87à°\9cà±\80లనà±\81 పునఃస్థాపించే",
        "action-suppressrevision": "ఈ దాచిన కూర్పుని సమీక్షించి పునఃస్థాపించే",
        "action-suppressionlog": "ఈ అంతరంగిక చిట్టాను చూసే",
        "action-block": "ఈ వాడుకరిని మార్పులు చేయడం నుండి నిరోధించే",
        "action-userrights-interwiki": "ఇతర వికీలలో వాడుకరుల యొక్క హక్కులను మార్చే",
        "action-siteadmin": "డాటాబేసుకి తాళం వేసే లేదా తీసే",
        "action-sendemail": "ఈమెయిళ్ళు పంపించే",
+       "action-editmyoptions": "మీ అభిరుచులను మార్చుకునే",
        "action-editmywatchlist": "మీ వీక్షణ జాబితాను సరిదిద్దండి",
        "action-viewmywatchlist": "మీ వీక్షణ జాబితాను చూడండి",
        "action-viewmyprivateinfo": "మీ గోపనీయ సమాచారాన్ని చూడండి",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
        "log-edit-tags": "ఎంచుకున్న చిట్టా ప్రవేశాల ట్యాగులను సవరించు",
+       "checkbox-select": "ఎంచుకోండి: $1",
        "checkbox-all": "అన్నీ",
        "checkbox-none": "దేన్నీ వద్దు",
        "checkbox-invert": "తిరగవెయ్యి",
        "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ ప్రవేశపు సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\n\"back\" కొట్టి, ఎక్కడి నుండి వచ్చారో ఆ పేజీని మళ్ళీ లోడు చేసి, తిరిగి ప్రయత్నించండి.",
+       "changecontentmodel-title-label": "పేజీ శీర్షిక",
        "changecontentmodel-reason-label": "కారణం:",
        "changecontentmodel-submit": "మార్చు",
        "protectlogpage": "సంరక్షణల చిట్టా",
        "sp-contributions-username": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "sp-contributions-toponly": "చిట్టచివరి కూర్పులను మాత్రమే చూపించు",
        "sp-contributions-newonly": "పేజీని సృష్టించిన మార్పులను మాత్రమే చూపించు",
+       "sp-contributions-hideminor": "చిన్న మార్పులను దాచు",
        "sp-contributions-submit": "వెతుకు",
        "whatlinkshere": "ఇక్కడికి లింకైనవి",
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "ipb-unblock": "వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి",
        "ipb-blocklist": "అమల్లో ఉన్న నిరోధాలను చూపించు",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} మార్పులు-చేర్పులు",
+       "ipb-blocklist-duration-left": "$1 మిగిలివున్నాయి",
        "unblockip": "సభ్యునిపై నిరోధాన్ని తొలగించు",
        "unblockiptext": "కింది ఫారం ఉపయోగించి, నిరోధించబడిన ఐ.పీ. చిరునామా లేదా సభ్యునికి తిరిగి రచనలు చేసే అధికారం ఇవ్వవచ్చు.",
        "ipusubmit": "ఈ నిరోధాన్ని తొలగించు",
        "pageinfo-length": "పేజీ నిడివి (బైట్లలో)",
        "pageinfo-article-id": "పేజీ ఐడీ",
        "pageinfo-language": "పేజీ విషయపు భాష",
+       "pageinfo-language-change": "మార్చు",
        "pageinfo-content-model": "పేజీ కంటెంటు మోడల్",
        "pageinfo-robot-policy": "రోబోట్లచే ఇండెక్సింగు",
        "pageinfo-robot-index": "అనుమతించబడింది",
index 77ac744..f4ddfcc 100644 (file)
        "prefs-rendering": "Намуд",
        "saveprefs": "Захираи тарҷиҳот",
        "prefs-editing": "Дар ҳоли вироиш",
-       "rows": "Теъдоди сатрҳо:",
-       "columns": "Теъдоди сутунҳо:",
        "searchresultshead": "Ҷустуҷӯ",
        "stub-threshold": "Остонаи вироиши пайвандҳои <a href=\"#\" class=\"stub\">ноқис</a>:",
        "stub-threshold-disabled": "Ғайрифаъолшуда",
        "userrights-reason": "Сабаб:",
        "userrights-no-interwiki": "Шумо иҷозати тағйири ихтиёроти корбарони дигар викиҳоро надоред.",
        "userrights-nodatabase": "Пойгоҳи дода $1 вуҷуд надорад ё маҳаллӣ нест.",
-       "userrights-nologin": "Шумо бояд бо як ҳисоби корбарӣ дорои ихтиёроти мудириятӣ [[Special:UserLogin|ба систем вуруд кунед]], то битавонед ихтиёроти корбаронро таъйид кунед.",
-       "userrights-notallowed": "Ҳисоби корбарии шумо иҷозати тағйири ихтиёроти корбариро надорад.",
        "userrights-changeable-col": "Гурӯҳҳое, ки шумо метавонед тағйир диҳед",
        "userrights-unchangeable-col": "Гурӯҳҳое, ки шумо наметавонед тағйир диҳед",
        "group": "Гурӯҳ:",
index bf81066..a1eb2ae 100644 (file)
@@ -39,7 +39,7 @@
        "tog-usenewrc": "จัดกลุ่มการเปลี่ยนแปลงแบ่งตามหน้าในรายการปรับปรุงล่าสุดและรายการเฝ้าดู",
        "tog-numberheadings": "กำหนดเลขหัวเรื่องอัตโนมัติ",
        "tog-showtoolbar": "แสดงแถบเครื่องมือแก้ไข",
-       "tog-editondblclick": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\80มืà¹\88อà¸\94ัà¸\9aà¹\80à¸\9aิลà¸\84ลิà¸\81",
+       "tog-editondblclick": "à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¹\80มืà¹\88อà¸\84ลิà¸\81สอà¸\87à¸\84รัà¹\89à¸\87",
        "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น",
        "tog-watchcreations": "เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู",
        "tog-watchdefault": "เพิ่มหน้าและไฟล์ที่ฉันแก้ไขเข้ารายการเฝ้าดู",
@@ -50,9 +50,9 @@
        "tog-minordefault": "กำหนดการแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
        "tog-previewontop": "แสดงตัวอย่างก่อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างในการแก้ไขครั้งแรก",
-       "tog-enotifwatchlistpages": "อีà¹\80มลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
-       "tog-enotifusertalkpages": "อีà¹\80มลหาเมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
-       "tog-enotifminoredits": "อีà¹\80มลหาเช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
+       "tog-enotifwatchlistpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อหน้าหรือไฟล์ในรายการเฝ้าดูเปลี่ยนแปลง",
+       "tog-enotifusertalkpages": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เมื่อมีการเปลี่ยนแปลงหน้าคุยกับผู้ใช้ของฉัน",
+       "tog-enotifminoredits": "อีà¹\80มลà¸\9aอà¸\81à¸\89ัà¸\99เช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย",
        "tog-enotifrevealaddr": "เปิดเผยที่อยู่อีเมลของฉันในอีเมลแจ้งเตือน",
        "tog-shownumberswatching": "แสดงจำนวนผู้ใช้ที่เฝ้าดู",
        "tog-oldsig": "ลายเซ็นที่คุณมีอยู่:",
@@ -75,9 +75,9 @@
        "tog-prefershttps": "ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อเข้าสู่ระบบแล้ว",
        "underline-always": "ทุกครั้ง",
        "underline-never": "ไม่",
-       "underline-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของหน้าตาหรือเบราว์เซอร์",
+       "underline-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของหน้าตาหรือเบราว์เซอร์",
        "editfont-style": "รูปแบบชุดแบบอักษรในพื้นที่แก้ไข:",
-       "editfont-default": "à¸\84à¹\88าà¹\82à¸\94ยà¸\9bริยายของเบราว์เซอร์",
+       "editfont-default": "à¸\84à¹\88าà¹\80ริà¹\88มà¸\95à¹\89à¸\99ของเบราว์เซอร์",
        "editfont-monospace": "ชุดอักษรแบบความกว้างคงที่",
        "editfont-sansserif": "ชุดอักษรแบบไม่มีเชิง",
        "editfont-serif": "ชุดอักษรแบบมีเชิง",
        "qbedit": "แก้ไข",
        "qbpageoptions": "หน้านี้",
        "qbmyoptions": "หน้าของฉัน",
-       "faq": "คำถามพบบ่อย",
-       "faqpage": "Project:คำถามพบบ่อย",
+       "faq": "à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
+       "faqpage": "Project:à¸\84ำà¸\96ามà¸\97ีà¹\88à¸\9eà¸\9aà¸\9aà¹\88อย",
        "actions": "ปฏิบัติการ",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
        "searcharticle": "ไป",
        "history": "ประวัติหน้า",
        "history_short": "ประวัติ",
+       "history_small": "ประวัติ",
        "updatedmarker": "ถูกปรับตั้งแต่การเยี่ยมชมครั้งสุดท้ายของฉัน",
        "printableversion": "รุ่นพร้อมพิมพ์",
        "permalink": "ลิงก์ถาวร",
        "delete": "ลบ",
        "deletethispage": "ลบหน้านี้",
        "undeletethispage": "กู้คืนหน้านี้",
-       "undelete_short": "กู้คืน $1 การแก้ไข",
+       "undelete_short": "กู้คืนการแก้ไข $1 ครั้ง",
        "viewdeleted_short": "ดู $1 การแก้ไขที่ถูกลบ",
        "protect": "ล็อก",
        "protect_change": "เปลี่ยน",
        "imagepage": "ดูหน้าไฟล์",
        "mediawikipage": "ดูหน้าข้อความ",
        "templatepage": "ดูหน้าแม่แบบ",
-       "viewhelppage": "à¸\94ูหà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aาย",
+       "viewhelppage": "à¸\94ูหà¸\99à¹\89าวิà¸\98ีà¹\83à¸\8aà¹\89",
        "categorypage": "ดูหน้าหมวดหมู่",
        "viewtalkpage": "ดูการพูดคุย",
        "otherlanguages": "ในภาษาอื่น",
        "redirectto": "เปลี่ยนทางไป:",
        "lastmodifiedat": "ดัดแปรหน้านี้ล่าสุดเมื่อวันที่ $1 เวลา $2",
        "viewcount": "มีการเข้าถึงหน้านี้ $1 ครั้ง",
-       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81ลà¹\87อà¸\81",
+       "protectedpage": "หà¸\99à¹\89าà¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
        "jumpto": "ข้ามไป:",
        "jumptonavigation": "การนำทาง",
        "jumptosearch": "ค้นหา",
        "databaseerror-query": "คำสั่ง: $1",
        "databaseerror-function": "ฟังก์ชัน: $1",
        "databaseerror-error": "ข้อผิดพลาด: $1",
-       "laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับล่าสุด",
+       "laggedslavemode": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸«à¸\99à¹\89าà¸\99ีà¹\89อาà¸\88à¹\84มà¹\88มีà¸\81ารà¸\9bรัà¸\9aà¸\82à¹\89อมูลลà¹\88าสุà¸\94",
        "readonly": "ฐานข้อมูลถูกล็อก",
        "enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
        "readonlytext": "ขณะนี้ฐานข้อมูลถูกล็อกรายการใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
-       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้าซีเอสเอสนี้",
+       "mycustomcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้",
        "mycustomjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้",
        "myprivateinfoprotected": "คุณไม่มีสิทธิแก้ไขข้อมูลส่วนตัวของคุณ",
        "mypreferencesprotected": "คุณไม่มีสิทธิแก้ไขการตั้งค่าของคุณ",
-       "ns-specialprotected": "ไม่สามารถแก้ไขหน้าพิเศษ",
+       "ns-specialprotected": "ไม่สามารถแก้ไขหน้าพิเศษได้",
        "titleprotected": "ชื่อเรื่องนี้ถูก [[User:$1|$1]] ป้องกันมิให้สร้าง\nเหตุผลที่ให้ไว้คือ <em>$2</em>",
        "filereadonlyerror": "ไม่สามารถแก้ไขไฟล์ \"$1\" เพราะที่เก็บไฟล์ \"$2\" อยู่ในภาวะอ่านอย่างเดียว\n\nผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: \"$3\"",
        "invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง",
        "password-change-forbidden": "คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้",
        "externaldberror": "มีข้อผิดพลาดของฐานข้อมูลการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ",
        "login": "ล็อกอิน",
+       "login-security": "ยืนยันตัวตนของคุณ",
        "nav-login-createaccount": "ล็อกอิน / สร้างบัญชี",
        "userlogin": "ล็อกอิน / สร้างบัญชี",
        "userloginnocreate": "ล็อกอิน",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
+       "userlogin-reauth": "คุณต้องเข้าสู่ระบบอีกครั้งเพื่อยืนยันว่าคุณคือ{{GENDER:$1|$1}}",
        "userlogin-createanother": "สร้างอีกบัญชี",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ก็ได้)",
        "createacct-email-ph": "กรอกที่อยู่อีเมลของคุณ",
        "createacct-another-email-ph": "กรอกที่อยู่อีเมล",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
+       "createaccountmail-help": "สามารถใช้สร้างบัญชีสำหรับบุคคลอื่นๆ โดยที่ไม่ต้องเรียนรู้รหัสผ่านก็ได้",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createaccountreason": "เหตุผล:",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
+       "createacct-reason-help": "ข้อความที่แสดงในล็อกการสร้างบัญชี",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
+       "createacct-continue-submit": "ทำการสร้างบัญชีต่อไป",
+       "createacct-another-continue-submit": "ทำการสร้างบัญชีต่อไป",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
        "nocookiesnew": "สร้างบัญชีผู้ใช้แล้ว แต่ยังไม่ได้ล็อกอิน \n{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nโปรดเปิดใช้งาน แล้วล็อกอินพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
        "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
+       "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "ล็อกอินสำเร็จ",
        "loginsuccess": "<strong>ขณะนี้คุณล็อกอินสู่ {{SITENAME}} ในชื่อ \"$1\"</strong>",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "pt-login": "ล็อกอิน",
        "pt-login-button": "ล็อกอิน",
+       "pt-login-continue-button": "ทำการเข้าสู่ระบบต่อไป",
        "pt-createaccount": "สร้างบัญชี",
        "pt-userlogout": "ล็อกเอาต์",
        "php-mail-error-unknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี",
        "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!",
        "changepassword-throttled": "ล่าสุดคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "botpasswords": "รหัสผ่านบอต",
+       "botpasswords-disabled": "รหัสผ่านสำหรับบอตถูกปิดใช้",
+       "botpasswords-no-central-id": "หากต้องการใช้รหัสผ่านบอต คุณต้องล็อกอินในชื่อบัญชีผู้ใช้ที่เป็นกลาง",
+       "botpasswords-existing": "รหัสผ่านบอตที่มีอยู่",
+       "botpasswords-createnew": "สร้างรหัสผ่านบอตใหม่",
+       "botpasswords-editexisting": "แก้ไขรหัสผ่านบอตที่มีอยู่เดิม",
        "botpasswords-label-appid": "ชื่อบอต:",
        "botpasswords-label-create": "สร้าง",
        "botpasswords-label-update": "อัปเดต",
        "botpasswords-label-cancel": "ยกเลิก",
        "botpasswords-label-delete": "ลบ",
        "botpasswords-label-resetpassword": "ตั้งรหัสผ่านใหม่",
+       "botpasswords-label-grants": "การอนุญาตที่นำไปใช้ได้:",
+       "botpasswords-label-grants-column": "อนุญาตแล้ว",
+       "botpasswords-bad-appid": "ชื่อบอต \"$1\" ไม่ถูกต้อง",
+       "botpasswords-insert-failed": "การเพิ่มชื่อบอต \"$1\" ล้มเหลว คุณได้เพิ่มมันไว้แล้วหรือเปล่า?",
+       "botpasswords-update-failed": "การอัปเดตชื่อบอต \"$1\" ล้มเหลว คุณลบมันออกไปหรือเปล่า?",
        "resetpass_forbidden": "ไม่สามารถเปลี่ยนรหัสผ่านได้",
        "resetpass-no-info": "คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "resetpass-submit-loggedin": "เปลี่ยนรหัสผ่าน",
        "previewnote": "<strong>พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่าง</strong>\nยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณ!",
        "continue-editing": "ไปพื้นที่แก้ไข",
        "previewconflict": "ตัวอย่างนี้สะท้อนข้อความในพื้นที่แก้ไขข้อความส่วนบนซึ่งจะปรากฏหากคุณเลือกบันทึก",
-       "session_fail_preview": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\nโปรดลองอีกครั้ง \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
-       "session_fail_preview_html": "<strong>ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย</strong>\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา",
+       "session_fail_preview": "ขออภัย! เราไม่สามารถดำเนินการแก้ไขของคุณได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\nคุณอาจล็อกเอาต์ไปแล้ว <strong>โปรดตรวจดูให้แน่ใจว่าคุณล็อกอินอยู่ แล้วลองอีกครั้ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
+       "session_fail_preview_html": "ขออภัย! ไม่สามารถดำเนินการแก้ไขของคุณต่อได้ เนื่องจากข้อมูลช่วงเวลาสื่อสารสูญหาย\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
        "token_suffix_mismatch": "<strong>การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายของคุณทำให้อักขระเครื่องหมายวรรคตอนในโทเค็นการแก้ไขเสีย</strong>\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีจุดบกพร่อง",
        "edit_form_incomplete": "<strong>แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง</strong>",
        "editing": "กำลังแก้ไข $1",
        "saveprefs": "บันทึก",
        "restoreprefs": "คืนการตั้งค่าโดยปริยายทั้งหมด (ในทุกส่วน)",
        "prefs-editing": "การแก้ไข",
-       "rows": "แถว:",
-       "columns": "คอลัมน์:",
        "searchresultshead": "ค้นหา",
        "stub-threshold": "ขีดแบ่งสำหรับการจัดรูปแบบลิงก์โครง ($1):",
        "stub-threshold-sample-link": "ตัวอย่าง",
        "prefswarning-warning": "คุณเปลี่ยนแปลงการตั้งค่าของคุณที่ยังไม่ได้บันทึก\nหากคุณออกจากหน้านี้โดยไม่คลิก \"$1\" จะไม่ปรับการตั้งค่าของคุณ",
        "prefs-tabs-navigation-hint": "แนะนำ: คุณสามารถใช้แป้นลูกศรซ้ายและขวาเพื่อนำทางระหว่างแถบในรายการแถบได้",
        "userrights": "การบริหารสิทธิผู้ใช้",
-       "userrights-lookup-user": "à¸\9aริหารà¸\81ลุà¹\88มผู้ใช้",
+       "userrights-lookup-user": "à¹\80ลือà¸\81ผู้ใช้",
        "userrights-user-editname": "ใส่ชื่อผู้ใช้:",
-       "editusergroup": "à¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ลุà¹\88ม{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}",
+       "editusergroup": "à¹\82หลà¸\94à¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89",
        "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
        "saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "rightslogtext": "นี่คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้",
        "action-read": "อ่านหน้านี้",
        "action-edit": "แก้ไขหน้านี้",
-       "action-createpage": "สร้างหน้า",
-       "action-createtalk": "สร้างหน้าอภิปราย",
+       "action-createpage": "สร้างหน้านี้",
+       "action-createtalk": "สร้างหน้าอภิปรายนี้",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
        "action-history": "ดูประวัติหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-upload_by_url": "อัปโหลดไฟล์นี้จากยูอาร์แอล",
        "action-writeapi": "ใช้การเขียนเอพีไอ",
        "action-delete": "ลบหน้านี้",
-       "action-deleterevision": "ลบรุ่นปรับปรุงนี้",
-       "action-deletedhistory": "à¸\94ูà¸\9bระวัà¸\95ิà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89",
+       "action-deleterevision": "ลบรุ่นปรับปรุง",
+       "action-deletedhistory": "à¸\94ูà¸\9bระวัà¸\95ิà¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9aà¸\82อà¸\87หà¸\99à¹\89าà¹\83à¸\94หà¸\99à¹\89าหà¸\99ึà¹\88à¸\87",
        "action-browsearchive": "ค้นหาหน้าที่ถูกลบ",
-       "action-undelete": "กู้คืนหน้านี้",
-       "action-suppressrevision": "à¸\97à¸\9aà¸\97วà¸\99à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88à¸\99ีà¹\89",
+       "action-undelete": "กู้คืนหน้า",
+       "action-suppressrevision": "à¸\95รวà¸\88à¸\97าà¸\99à¹\81ละà¸\81ูà¹\89à¸\84ืà¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ีà¹\88à¸\8bà¹\88อà¸\99อยูà¹\88",
        "action-suppressionlog": "ดูปูมส่วนตัวนี้",
        "action-block": "บล็อกผู้ใช้นี้มิให้แก้ไข",
        "action-protect": "เปลี่ยนระดับการล็อกสำหรับหน้านี้",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
        "recentchanges-page-added-to-category": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¹\81ละ $2 à¸«à¸\99à¹\89าà¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89าหมวà¸\94หมูà¹\88",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¸\96ูà¸\81à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89าหมวà¸\94หมูà¹\88à¹\81ลà¹\89ว [[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\99ีà¹\89รวมà¸\96ึà¸\87ภายà¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99à¹\86 à¸\94à¹\89วย]]",
        "recentchanges-page-removed-from-category": "[[:$1]] ถูกลบจากหมวดหมู่",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¹\81ละ $2 à¸«à¸\99à¹\89าà¸\96ูà¸\81ลà¸\9aà¸\88าà¸\81หมวà¸\94หมูà¹\88",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¸\96ูà¸\81ลà¸\9aà¸\88าà¸\81หมวà¸\94หมูà¹\88à¹\81ลà¹\89ว [[Special:WhatLinksHere/$1|หà¸\99à¹\89าà¸\99ีà¹\89รวมà¸\96ึà¸\87ภายà¹\83à¸\99หà¸\99à¹\89าอืà¹\88à¸\99à¹\86 à¸\94à¹\89วย]]",
        "autochange-username": "การเปลี่ยนแปลงอัตโนมัติมีเดียวิกิ",
        "upload": "อัปโหลดไฟล์",
        "uploadbtn": "อัปโหลดไฟล์",
        "filedelete-maintenance": "ปิดใช้งานการลบและกู้คืนไฟล์ชั่วคราวระหว่างการบำรุงรักษา",
        "filedelete-maintenance-title": "ไม่สามารถลบไฟล์",
        "mimesearch": "ค้นหาไมม์",
-       "mimesearch-summary": "หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ของแต่ละไฟล์ \nใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>",
+       "mimesearch-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87à¹\84à¸\9fลà¹\8cà¸\95ามà¸\81ารà¹\81à¸\9aà¹\88à¸\87à¸\82อà¸\87à¸\8aà¸\99ิà¸\94à¹\84มมà¹\8cà¸\82อà¸\87à¹\81à¸\95à¹\88ละà¹\84à¸\9fลà¹\8c \nà¹\83สà¹\88à¸\84à¹\88า: contenttype/subtype à¸«à¸£à¸·à¸­ contenttype/* à¹\80à¸\8aà¹\88à¸\99 <code>image/jpeg</code>",
        "mimetype": "ชนิดไมม์:",
        "download": "ดาวน์โหลด",
        "unwatchedpages": "หน้าที่ไม่มีผู้เฝ้าดู",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
        "emailsenttext": "ส่งสารอีเมลของคุณแล้ว",
-       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}}",
+       "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}} อีเมลของคุณจะถูกส่งไปที่ผู้ส่งคนเดิมโดยตรง โดยจะเปิดเผยที่อยู่อีเมลให้พวกเขาเห็น",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเยี่ยมชมครั้งสุดท้าย",
        "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_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",
        "created": "ถูกสร้าง",
        "changed": "ถูกเปลี่ยนแปลง",
        "deletepage": "ลบหน้า",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
        "searchsuggest-search": "ค้นหา {{SITENAME}}",
        "searchsuggest-containing": "มี...",
-       "api-error-badaccess-groups": "คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้",
-       "api-error-empty-file": "ไฟล์ที่คุณส่งมานั้นว่าง",
        "api-error-emptypage": "ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง",
-       "api-error-file-too-large": "ไฟล์ที่คุณส่งมาใหญ่เกินไป",
-       "api-error-filename-tooshort": "ชื่อไฟล์สั้นเกินไป",
-       "api-error-filetype-banned": "ไฟล์ประเภทนี้ถูกห้าม",
-       "api-error-mustbeloggedin": "กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์",
-       "api-error-ratelimited": "คุณกำลังพยายามอัปโหลดไฟล์ภายในระยะห่างเวลาที่สั้นเกินกว่าที่วิกินี้อนุญาต\nโปรดรอสักครู่แล้วลองใหม่อีกครั้ง",
-       "api-error-uploaddisabled": "การอัปโหลดถูกปิดใช้งานบนวิกินี้",
        "duration-seconds": "$1 วินาที",
        "duration-minutes": "$1 นาที",
        "duration-hours": "$1 ชั่วโมง",
index a37a699..bcab524 100644 (file)
@@ -89,7 +89,9 @@
                        "Basak",
                        "Ece Alpdeniz",
                        "Superyetkin",
-                       "Alikaan"
+                       "Alikaan",
+                       "By erdo can",
+                       "1917 Ekim Devrimi"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "searcharticle": "Git",
        "history": "Sayfa geçmişi",
        "history_short": "Geçmiş",
+       "history_small": "geçmiş",
        "updatedmarker": "son ziyaretimden sonra güncellenmiş",
        "printableversion": "Yazdırılabilir sürüm",
        "permalink": "Kalıcı bağlantı",
        "views": "Görünümler",
        "toolbox": "Araçlar",
        "tool-link-userrights": "{{GENDER:$1|Kullanıcı}} gruplarını değiştir",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Kullanıcı}} gruplarını gör",
        "tool-link-emailuser": "Bu {{GENDER:$1|kullanıcıya}} e-posta gönder",
        "userpage": "Kullanıcı sayfasını görüntüle",
        "projectpage": "Proje sayfasını görüntüle",
        "missingarticle-rev": "(revizyon#: $1)",
        "missingarticle-diff": "(Fark: $1, $2)",
        "readonly_lag": "Yedek sunucular ana sunucu ile güncellenirken veritabanı otomatik olarak kilitlendi.",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP üstbilgisi gönderildi, ancak istek bir API yazma modülüne yapıldı.",
        "internalerror": "Dahili hata",
        "internalerror_info": "Dahili hata: $1",
        "internalerror-fatal-exception": "\"$1\" tipinde hayati istisna",
        "createacct-email-ph": "E-posta adresinizi girin",
        "createacct-another-email-ph": "E-posta adresinizi girin",
        "createaccountmail": "Geçici bir rastgele şifre kullanabilir ve bu şifreyi belirtilen e-posta adresine gönderebilirsiniz",
+       "createaccountmail-help": "Parolayı öğrenmeden başka bir kişi için hesap oluşturmak amacıyla kullanılabilir.",
        "createacct-realname": "Gerçek adı (isteğe bağlı)",
        "createaccountreason": "Sebep:",
        "createacct-reason": "Gerekçe",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
+       "createacct-reason-help": "Hesap oluşturma günlüğünde gösterilen mesaj",
        "createacct-submit": "Hesabınızı oluşturun",
        "createacct-another-submit": "Hesap oluşturun",
        "createacct-continue-submit": "Hesap oluşturmaya devam et",
        "eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
        "throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
        "mailerror": "E-posta gönderim hatası: $1",
-       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son günde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
+       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler $2 içinde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
        "emailauthenticated": "E-posta adresiniz $2 $3 tarihinde onaylandı.",
        "emailnotauthenticated": "E-posta adresiniz henüz onaylanmadı.\nAşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.",
        "noemailprefs": "Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.",
        "changepassword-success": "Parolanız değiştirildi!",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "botpasswords": "Bot şifreleri",
+       "botpasswords-summary": "<em>Bot şifreleri,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
        "botpasswords-disabled": "Bot şifreleri devre dışı.",
        "botpasswords-no-central-id": "Bot şifresini kullanmak için, merkezi bir hesap ile giriş yapmalısınız.",
        "botpasswords-existing": "Mevcut bot şifreleri",
        "saveprefs": "Kaydet",
        "restoreprefs": "Tüm varsayılan ayarları geri yükle (tüm bölümlerde)",
        "prefs-editing": "Sayfa yazma alanı",
-       "rows": "Satır",
-       "columns": "Sütun",
        "searchresultshead": "Arama",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Taslak bağlantısı</a> formatı için baraj (bayt):",
        "stub-threshold-sample-link": "örnek",
        "editusergroup": "Kullanıcı grupları düzenle",
        "editinguser": "<strong>'''[[User:$1|$1]]'''</strong> $2 kullanıcısının yetkileri değiştiriliyor",
        "userrights-editusergroup": "Kullanıcı grupları düzenle",
+       "userrights-viewusergroup": "Kullanıcının gruplarını gör",
        "saveusergroups": "Kullanıcı grupları kaydet",
        "userrights-groupsmember": "İçinde olduğu gruplar:",
        "userrights-groupsmember-auto": "Saklı olarak içinde olduğu gruplar:",
        "recentchanges-legend-heading": "<strong>Gösterge:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
        "recentchanges-submit": "Göster",
+       "rcfilters-filter-minor-label": "Küçük değişiklikler",
+       "rcfilters-filter-major-label": "Küçük olmayan değişiklikler",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "changecontentmodel-submit": "Değiştir",
        "changecontentmodel-success-title": "İçerik modeli değiştirildi",
        "changecontentmodel-success-text": "İçerik türü [[:$1]] olarak değiştirildi.",
+       "log-name-contentmodel": "İçerik modeli değiştirme günlüğü",
        "logentry-contentmodel-change-revertlink": "Eski haline döndür",
        "logentry-contentmodel-change-revert": "Eski haline döndür",
        "protectlogpage": "Koruma kayıtları",
        "modifiedarticleprotection": "\"[[$1]]\" için koruma düzeyi değiştirildi",
        "unprotectedarticle": "koruma kaldırıldı: \"[[$1]]\"",
        "movedarticleprotection": "koruma ayarları \"[[$2]]\" sayfasından \"[[$1]]\" sayfasına taşındı",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" için {{GENDER:$2|koruma düzeyini değiştirdi}}",
        "protect-title": "\"$1\" için bir koruma seviyesi seçiniz",
        "protect-title-notallowed": "\"$1\" için koruma seviyesini görüntüleyin",
        "prot_1movedto2": "[[$1]] sayfasının yeni adı: [[$2]]",
        "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
        "htmlform-user-not-valid": "<strong>$1</strong> geçerli bir kullanıcı ismi değildir.",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
+       "logentry-delete-delete_redir": "$1, $3 yönlendirmesini üzerine yazılması için {{GENDER:$2|sildi}}",
        "logentry-delete-restore": "$1 $3 sayfasını {{GENDER:$2|geri getirdi}}",
        "logentry-delete-event": "$1, $3 sayfasında {{PLURAL:$5|bir günlük girdisinin |$5 günlük girdisinin}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "logentry-delete-revision": "$1, $3 sayfasında {{PLURAL:$5|bir sürümün|$5 sürümün}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "feedback-useragent": "Kullanıcı temsilcisi",
        "searchsuggest-search": "Ara",
        "searchsuggest-containing": "içeren...",
-       "api-error-badaccess-groups": "Bu wiki için dosya yüklemenize izin verilmiyor.",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
-       "api-error-copyuploaddisabled": "URL ile yükleme bu sunucuda devre dışı bırakılmıştır.",
-       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} mevcut.",
-       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
-       "api-error-empty-file": "Gönderdiğiniz dosya boş.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
-       "api-error-fetchfileerror": "İç hata: Dosya alınırken bir hata oluştu.",
-       "api-error-fileexists-forbidden": "\"$1\" adıyla bir dosya zaten mevcut dolayısıyla üzerine yazamazsınız.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" adında bir dosya ortak havuzda zaten var, ve üzerine yazılamaz.",
-       "api-error-file-too-large": "Gönderdiğiniz dosya çok büyük.",
-       "api-error-filename-tooshort": "Dosya adı çok kısa.",
-       "api-error-filetype-banned": "Bu dosya biçimi yasaklanmıştır.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|izin verilen bir dosya türü değil|izin verilen dosya türleri değil}}. İzin verilen {{PLURAL:$3|dosya türü|dosya türleri}} $2.",
-       "api-error-filetype-missing": "Dosya uzantısı eksik.",
-       "api-error-hookaborted": "Yapmaya çalıştığınız değişiklik bir eklenti tarafından iptal edildi.",
-       "api-error-http": "İç hata: sunucu ile bağlantı kurulamıyor.",
-       "api-error-illegal-filename": "Bu dosya adına izin verilmiyor.",
-       "api-error-internal-error": "İç hata: Wiki'ye yükleme yapma işleminizde bir şeyler ters gitti.",
-       "api-error-invalid-file-key": "İç hata: geçici depolama dosyası bulunamadı.",
-       "api-error-missingparam": "İç hata: İstenilen parametreler eksik.",
-       "api-error-missingresult": "İç hata: Kopyalamanın başarılı olup olmadığı belirlenemedi.",
-       "api-error-mustbeloggedin": "Dosya yükleyebilmek için oturum açmanız gereklidir.",
-       "api-error-mustbeposted": "İç hata: İstek HTTP POST gerektiriyor.",
-       "api-error-noimageinfo": "Yükleme başarılı oldu, ancak sunucu, bize dosya hakkında herhangi bir bilgi vermedi.",
-       "api-error-nomodule": "İç hata: Yükleme modülü ayarı yapılmadı.",
-       "api-error-ok-but-empty": "İç hata: Sunucu yanıt vermiyor.",
-       "api-error-overwrite": "Varolan dosyanın üzerine yazmaya izin verilmiyor.",
-       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-publishfailed": "İç hata: Sunucu geçici dosyayı yayınlarken başarısız oldu.",
-       "api-error-stasherror": "Dosya zulaya yüklenirken hata oluştu.",
-       "api-error-stashedfilenotfound": "Saklandığı yerden yüklenmeye çalışılan dosya bu yerde bulunamadı.",
-       "api-error-stashpathinvalid": "Saklanan dosyanın bulunması beklenen yer bilgisi geçersiz.",
-       "api-error-stashfilestorage": "Dosya zulaya saklanmaya çalışılırken hata ile karşılaşıldı.",
-       "api-error-stashzerolength": "Sunucu dosyayı zulada saklayamadı; çünkü dosya boyutu sıfır uzunlukta.",
-       "api-error-stashnotloggedin": "Dosya yükleme zulasına dosya kaydetmek için oturum açmış olmanız gerekiyor.",
-       "api-error-stashwrongowner": "Zulada erişmeye çalıştığınız belge size ait değil.",
-       "api-error-stashnosuchfilekey": "Zulaya erişmeye çalışırken kullanılan dosya anahtarı mevcut değil.",
-       "api-error-timeout": "Sunucu beklenen süre içinde yanıt vermedi.",
-       "api-error-unclassified": "Bilinmeyen bir hata oluştu.",
-       "api-error-unknown-code": "Bilinmeyen hata: \"$1\"",
-       "api-error-unknown-error": "İç hata: Dosya yüklemeye çalışırken bir şeyler ters gitti.",
+       "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "api-error-uploaddisabled": "Yükleme bu vikide devre dışı bırakılmıştır.",
-       "api-error-verification-error": "Dosya bozuk veya yanlış uzantıya sahip olabilir.",
        "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
index 205bf3c..d0060fd 100644 (file)
                        "Selimcan",
                        "Исмаил Садуев",
                        "Matma Rex",
-                       "Irus"
+                       "Irus",
+                       "Ifs"
                ]
        },
-       "tog-underline": "Сылтамаларның астына сызу:",
+       "tog-underline": "Сылтамаларны сызымлау:",
        "tog-hideminor": "Соңгы үзгәртүләр исемлегендә кече үзгәртүләр яшерелсен",
-       "tog-hidepatrolled": "Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен.",
+       "tog-hidepatrolled": "Тикшерелгән үзгәртүләр яңа үзгәртүләр исемлегеннән яшерелсен",
        "tog-newpageshidepatrolled": "Тикшерелгән битләр яңа битләр исемлегеннән яшерелсен",
        "tog-hidecategorization": "Битләрне төркемләшүне ябу",
        "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәртүләрне эченә алган, киңәйтелгән күзәтү исемлеге",
        "searcharticle": "Күчү",
        "history": "Битнең тарихы",
        "history_short": "Тарих",
+       "history_small": "тарих",
        "updatedmarker": "соңгы керүемнән соң яңартылган",
        "printableversion": "Басма юрама",
        "permalink": "Даими сылтама",
        "pool-queuefull": "Сорауларны саклау  бите тулы",
        "pool-errorunknown": "Билгесез  хата",
        "pool-servererror": "Пул санау хезмәте эшләми ($1).",
-       "poolcounter-usage-error": "$1: куллану хатасы",
+       "poolcounter-usage-error": "Куллану хатасы: $1",
        "aboutsite": "{{SITENAME}} турында",
        "aboutpage": "Project:Тасвирлама",
        "copyright": "Мәгълүмат $1 буенча таратыла (әгәр башкасы күрсәтелмәсә).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Сезгә}} {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
        "youhavenewmessagesmanyusers": "Сез бик күп кулланучыдан $1 алдыгыз ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|яңа хәбәр|999=яңа хәбәрләр}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|1=соңгы үзгәртү|соңгы үзгәртүләр}}\nсоңгы {{PLURAL:$1|үзгәртү|999=үзгәртү}}",
-       "youhavenewmessagesmulti": "Сезгә монда яңа хәбәрләр бар: $1",
+       "newmessagesdifflinkplural": "соңгы {{PLURAL:$1|үзгәртү|үзгәртүләр}}",
+       "youhavenewmessagesmulti": "$1 эчендә яңа хат бар",
        "editsection": "үзгәртү",
        "editold": "үзгәртү",
-       "viewsourceold": "башлангыч кодны карау",
+       "viewsourceold": "чыганак кодны карау",
        "editlink": "үзгәртү",
        "viewsourcelink": "чыганак кодны карау",
        "editsectionhint": "$1 бүлеген үзгәртү",
        "toc": "Эчтәлек",
        "showtoc": "күрсәтү",
        "hidetoc": "яшерү",
-       "collapsible-collapse": "Төрү",
+       "collapsible-collapse": "төрү",
        "collapsible-expand": "Ачу",
        "confirmable-confirm": "{{GENDER:$1|Шулаймы}}?",
        "confirmable-yes": "Әйе",
        "createacct-reason-ph": "Нигә сез яңа зисап язмасы төзисез",
        "createacct-submit": "Хисап язмасы төзү",
        "createacct-another-submit": "Хисап язмасын төзү",
+       "createacct-continue-submit": "Хисап язмасын ясауны дәвам итү",
+       "createacct-another-continue-submit": "Хисап язмасын ясауны дәвам итү",
        "createacct-benefit-heading": "{{SITENAME}} — сезнең шикелле кешеләрнең хезмәте.",
        "createacct-benefit-body1": "{{PLURAL:$1|төзәтмә}}",
        "createacct-benefit-body2": "{{PLURAL:$1|мәкалә}}",
        "createacct-benefit-body3": "Соңгы вакытта {{PLURAL:$1|кулланучы}}",
        "badretype": "Кертелгән серсүзләр бер үк түгел.",
+       "usernameinprogress": "Бу кулланучы исеме хисап язмасы булдыру башланды инде. Зинһар көтегез.",
        "userexists": "Кертелгән исем кулланыла.\nЗинһар, башка исем сайлагыз.",
        "loginerror": "Керү хатасы",
        "createacct-error": "Хисап язмазын булдыруда хата китте",
        "eauthentsent": "Күрсәтелгән электрон почта адресына үзгәртүләрне раслау өчен хат җибәрелде. Киләчәктәдә хатлар кабул итү өчен, раслауны үтегез.",
        "throttled-mailpassword": "Серсүзне электрон почтага җибәрү гамәлен сез {{PLURAL:$1|1=соңгы $1 сәгать}} эчендә кулландыгыз инде. Бу гамәлне явызларча куллануны кисәтү максатыннан аны $1 {{PLURAL:$1|сәгать}} аралыгында бер генә тапкыр башкарып була.",
        "mailerror": "Хат җибәрү хатасы: $1",
-       "acct_creation_throttle_hit": "Сезнең IP адресыннан бу тәүлек эчендә {{PLURAL:$1|$1 хисап язмасы}} төзелде инде. Шунлыктан бу IP-адрес буенча сезнең өчен әлеге гамәл вакытлыча ябык.",
+       "acct_creation_throttle_hit": "Сезнең IP адресыннан  $2 эчендә {{PLURAL:$1|$1 хисап язмасы}} төзелде инде. Шунлыктан бу IP-адрес буенча сезнең өчен әлеге гамәл вакытлыча ябык.",
        "emailauthenticated": "Сезнең электрон почта адресыгыз $2 $3 расланды.",
        "emailnotauthenticated": "Электрон почта адресыгыз әле дәлилләнмәгән.\nХатлар әлеге мөмкинлекләргә җибәрелмәячәк.",
        "noemailprefs": "Электрон почта адресыгыз күрсәтелмәгән, шуңа викиның электрон почта белән эшләү гамәлләре сүндерелгән.",
        "emailconfirmlink": "Электрон почта адресыгызны дәлилләгез.",
        "invalidemailaddress": "Электрон почта адресы кабул ителә алмый, чөнки ул дөрес форматка туры килми. Зинһар, дөрес адрес кертегез яки юлны буш калдырыгыз.",
        "cannotchangeemail": "Бу хисап язмасының электрон почта адресы бу викида үзгәртелә алмый",
+       "emaildisabled": "Бу сайт электрон хатлар җибәрә алмый.",
        "accountcreated": "Хисап язмасы төзелде",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|бәхәс]]) кулланучысы өчен хисап язмасы төзелде.",
        "createaccount-title": "{{SITENAME}}: теркәлү",
        "preview": "Алдан карау",
        "showpreview": "Алдан карау",
        "showdiff": "Кертелгән үзгәртүләр",
-       "anoneditwarning": "<strong>Игътибар!</strong> Сез сайтта теркәлмәдегез. Әгәрдә сез нинди дә булсә төзәтмәләр  яисә үзгәртүләр кертсәгез, сезне IP-адрес башкаларга да курсәтеләчәк. Сайтка <strong>[$1 керсәгез]</strong> яки <strong>[$2 кулланучы язмасын төзесәгез]</strong>, сез керткән үзгәртүләр яезнен кулланучы язмагызга бәйләнгән була, шулай ук башка мөмкинлекләр дә туачак.",
+       "anoneditwarning": "<strong>Игътибар!</strong> Сез сайтта теркәлмәдегез. Әгәрдә сез нинди дә булсә төзәтмәләр яисә үзгәртүләр кертсәгез, сезнең IP-адрес башка кулланучыларга да билгеле булачак. Сайтка <strong>[$1 керсәгез]</strong> яисә <strong>[$2 кулланучы язмасын төзесәгез]</strong>, сез керткән үзгәртүләр сезнең кулланучы язмагызга бәйләнгән булачак, шулай ук башка мөмкинлекләр дә туачак.",
        "anonpreviewwarning": "''Сез системада теркәлмәдегез.Сезнең тарафтан эшләнгән барлык үзгәртүләр дә сезнең IP-юлламагызны саклауга китерә.''",
        "missingsummary": "'''Искәртү.''' Сез үзгәртүгә кыскача тасвирлау язмадыгыз. Сез «Битне саклау» төймәсенә тагын бер тапкыр бассагыз, үзгәртүләр тасвирламасыз сакланачак.",
        "missingcommenttext": "Аска тасвирлама язуыгыз сорала.",
        "missingcommentheader": "<strong>Искәртү:</strong> Сез шәрехнең темасын күрсәтмәгәнсез.\n«{{int:savearticle}}» төймәсенә кабат бассагыз, үзгәртүләр темасыз язылачак.",
        "summary-preview": "Тасвирламаны алдан карау:",
-       "subject-preview": "Башисемне болай булачак:",
+       "subject-preview": "Башисем шушындый булачак:",
        "blockedtitle": "Кулланучы тыелды",
        "blockedtext": "'''Сезнең хисап язмагыз яки IP адресыгыз тыелган.'''\n\nТыючы идарәче: $1.\nКүрсәтелгән сәбәп: ''$2''.\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:''$2''\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Буш объект",
        "content-json-empty-array": "Буш массив",
+       "deprecated-self-close-category": "Үзлегеннән ябылучы HTML-тегларны кулланучы битләр",
        "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
        "expensive-parserfunction-warning": "<strong>Игътибар:</strong>  бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nБиттә {{PLURAL:$2|$2 эш куллану}} рөхсәт ителгән очракта, монда $1 {{PLURAL:$1|эш башкарыла}}.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "mergehistory-from": "Чыганак:",
        "mergehistory-into": "Төп бит:",
        "mergehistory-submit": "Төзәтмәләрне берләштерү",
+       "mergehistory-comment": "[[:$1]] [[:$2]] битенә күчерелде: $3",
        "mergehistory-reason": "Сәбәп:",
        "mergelog": "Берләштерүләр көндәлеге",
        "revertmerge": "Бүлү",
        "prefs-editwatchlist-label": "Күзәтү исемлеге язмаларын үзгәртү:",
        "prefs-editwatchlist-edit": "Күзәтү исемлегеннән исемнәрне карау һәм сөртү",
        "prefs-editwatchlist-raw": "Күзәтү исемлеген текстсыман үзгәртү",
-       "prefs-editwatchlist-clear": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлеген Ñ\82азарту",
+       "prefs-editwatchlist-clear": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлеген Ñ\87иÑ\81Ñ\82арту",
        "prefs-watchlist-days": "Күзәтү исемлегендә көннәр санын күрсәтергә:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
        "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
        "saveprefs": "Саклау",
        "restoreprefs": "Башлангыч көйләнмәләрне кире кайтару",
        "prefs-editing": "Төзәтү",
-       "rows": "Юллар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Эзләү",
        "stub-threshold": "Ясалма сылтамаларның бизәлеше буенча чикләүләр ($1):",
        "stub-threshold-sample-link": "мисал",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Юрамалар аермасы",
        "userrights": "Кулланучы хокуклары белән идарә итү",
-       "userrights-lookup-user": "Кулланучы төркемнәре белән идарә итү",
+       "userrights-lookup-user": "Кулланучыны сайлау",
        "userrights-user-editname": "Кулланучының исемен кертегез:",
-       "editusergroup": "{{GENDER:$1|Кулланучының}} төркемнәрен алмаштыру",
+       "editusergroup": "Кулланучының төркемнәрен кую",
        "editinguser": "{{GENDER:$1|Кулланучы}} <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
        "userrights-editusergroup": "Кулланучының төркемнәрен алмаштыру",
        "saveusergroups": "{{GENDER:$1|Кулланучы}} төркемнәрен саклау",
        "filename-prefix-blacklist": " #<!-- ничек бар шулай калдырыгыз --> <pre>\n# Синтаксис төбәндәгечә:\n#   *  «#» дип башланган барлык нәрсә дә комментарий дип аталачак\n#   * Һәрбер буш рәт — файлның исеменең префиксы, цифрлы камера бирүче исем\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # кайсыбер кәрәзле телефоннар\nIMG # барлык\nJD # Jenoptik\nMGP # Pentax\nPICT # төрле\n #</pre> <!-- ничек бар шулай калдырыгыз -->",
        "upload-dialog-title": "Файл йөкләү",
        "upload-dialog-button-cancel": "Баш тарту",
+       "upload-dialog-button-back": "Артка",
        "upload-dialog-button-done": "Әзер",
        "upload-dialog-button-save": "Саклау",
        "upload-dialog-button-upload": "Йөкләү",
        "suppress": "Яшерү",
        "apihelp": "API ярдәм",
        "apihelp-no-such-module": "«$1» модуле табылмады.",
+       "apisandbox": "API комлыгы",
+       "apisandbox-unfullscreen": "Битне күрсәтү",
        "apisandbox-reset": "Чистарту",
        "apisandbox-retry": "Кабатлау",
        "apisandbox-examples": "Мисаллар",
        "apisandbox-dynamic-parameters": "Өстәмә параметрлар",
        "apisandbox-results": "Нәтиҗәләр",
+       "apisandbox-continue": "Дәвам итү",
+       "apisandbox-continue-clear": "Чистарту",
        "booksources": "Китап чыганаклары",
        "booksources-search-legend": "Китап чыганакларыны эзләү",
        "booksources-search": "Эзләү",
        "booksources-text": "Әлеге биттә күрсәтелгән сылтамалар ярәмендә сезнең кызыксындырган китап буенча өстәмә мәгълүматлар табарга мөмкин. Болар интернет-кибетләр һәм китапханә җыентыгында эзләүче системалар.",
        "booksources-invalid-isbn": "Бирелгән ISBN саны бәлки хаталдыр. Зинһар, бирелгән саннарны яңадан тикшерегез.",
+       "magiclink-tracking-rfc": "Тылсымлы RFC сылтамаларын кулланучы битләр",
+       "magiclink-tracking-pmid": "Тылсымлы PMID сылтамаларын кулланучы битләр",
+       "magiclink-tracking-isbn": "Тылсымлы ISBN сылтамаларын кулланучы битләр",
        "specialloguserlabel": "Башкаручы:",
        "speciallogtitlelabel": "Максат (атама яисә {{ns:user}}:кулланучы исеме):",
        "log": "Көндәлекләр",
        "pageinfo-length": "Бит озынлыгы (байтларда)",
        "pageinfo-article-id": "Бит идентификаторы",
        "pageinfo-language": "Битнең теле",
+       "pageinfo-language-change": "үзгәртү",
        "pageinfo-content-model-change": "үзгәртү",
        "pageinfo-robot-index": "Рөхсәт",
        "pageinfo-robot-noindex": "Рөхсәтсез",
        "pageinfo-edits": "Гомуми төзәтүләр саны",
        "pageinfo-authors": "Гомуми авторлар саны",
        "pageinfo-toolboxlink": "Бит турында мәгълүмат",
+       "pageinfo-redirectsto": "Юнәлтү",
        "pageinfo-redirectsto-info": "мәгълүмат",
        "pageinfo-contentpage-yes": "Әйе",
        "pageinfo-protect-cascading-yes": "Әйе",
        "patrol-log-page": "Тикшерү көндәлеге",
        "patrol-log-header": "Бу тикшерелгән битләрнең көндәлеге.",
        "log-show-hide-patrol": "$1 тикшерү көндәлеге",
+       "confirm-markpatrolled-button": "Ярый",
        "deletedrevision": "$1 битенең иске юрамасы бетерелде",
        "filedeleteerror-short": "Файлны бетерү хатасы: $1",
        "filedeleteerror-long": "Файлны бетерү вакытында хаталар чыкты:\n\n$1",
        "exif-meteringmode-1": "Уртача",
        "exif-meteringmode-3": "Нокталы",
        "exif-meteringmode-4": "Мультинокталы",
+       "exif-meteringmode-5": "Паттернлы",
+       "exif-meteringmode-6": "Өлешләтә",
        "exif-meteringmode-255": "Башка",
        "exif-lightsource-0": "Билгесез",
        "exif-lightsource-4": "Яктылык",
        "exif-dc-type": "Медиа төре",
        "exif-rating-rejected": "Кире кагылды",
        "exif-isospeedratings-overflow": "65535-тән күп",
+       "exif-iimcategory-hth": "Сәламәтлек",
+       "exif-iimcategory-lab": "Хезмәт",
+       "exif-iimcategory-wea": "Һава тырышы",
+       "exif-urgency-normal": "Гадәти ($1)",
+       "exif-urgency-low": "Түбән ($1)",
+       "exif-urgency-high": "Югары ($1)",
        "namespacesall": "барлык",
        "monthsall": "барлык",
        "recreate": "Яңадан ясау",
        "autoredircomment": "[[$1]] битенә юнәлтү",
        "autosumm-new": "Яңа бит: «$1»",
        "watchlistedit-raw-titles": "Язмалар:",
+       "watchlistedit-clear-titles": "Башлык:",
+       "watchlisttools-clear": "Күзәтү исемлеген чистарту",
        "watchlisttools-view": "Соңгы үзгәртүләрне күрсәтү",
        "watchlisttools-edit": "Күзәтү исемлегене карау һәм үзгәртү",
        "watchlisttools-raw": "Текст сыман үзгәртү",
        "version-libraries-license": "Лицензия",
        "version-libraries-description": "Тасвирлама",
        "version-libraries-authors": "Авторлар",
+       "redirect-submit": "Күчү",
        "fileduplicatesearch": "Бер үк файлларны эзләү",
        "fileduplicatesearch-submit": "Эзләү",
        "specialpages": "Махсус битләр",
        "tags-source-header": "Чыганак",
        "tags-active-yes": "Әйе",
        "tags-active-no": "Юк",
+       "tags-source-extension": "Тәэминат тарафыннан билгеләнә",
        "tags-edit": "үзгәртү",
+       "tags-delete": "бетерү",
+       "tags-activate": "активлаштыру",
+       "tags-deactivate": "сүндерү",
+       "tags-create-submit": "Төзү",
        "comparepages": "Битләрне чагыштыру",
        "compare-page1": "Беренче сәхифә",
        "compare-page2": "Икенче сәхифә",
        "htmlform-no": "Юк",
        "htmlform-yes": "Әйе",
        "htmlform-cloner-delete": "Бетерү",
+       "htmlform-date-placeholder": "ЕЕЕЕ-АА-КК",
+       "htmlform-time-placeholder": "СС:ММ:СС",
+       "htmlform-datetime-placeholder": "ЕЕЕЕ-АА-КК СС:ММ:СС",
        "logentry-delete-delete": "$1 $3 битен {{GENDER:$2|бетерә}}",
        "revdelete-content-hid": "эчтәлек яшерелгән",
        "revdelete-summary-hid": "төзәтмәнең тасвирламасы яшерелгән",
        "feedback-thanks-title": "Рәхмәт!",
        "searchsuggest-search": "{{SITENAME}} эчендә эзләү",
        "searchsuggest-containing": "эчтәлек...",
-       "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
        "api-error-badtoken": "Эчке хата: дөрес булмаган токен.",
-       "api-error-copyuploaddisabled": "URL-адрес буенча йөкләү бу серверда сүндерелгән.",
-       "api-error-duplicate": "Мондый эчтәлекле {{PLURAL:$1|башка файл}} да бар.",
-       "api-error-duplicate-archive": "Элек сайтта мондый эчтәлекле {{PLURAL:$1|башка файл}} бар иде инде, ләкин {{PLURAL:$1|1=аны бетерделәр|аларны бетерделәр}}.",
-       "api-error-empty-file": "Сезнең тарафтан җибәрелгән файл буш.",
        "api-error-emptypage": "Яңа буш сәхифәләр төзү рөхсәт ителми",
-       "api-error-unknown-code": "Билгесез хата: \"$1\"",
-       "api-error-unknown-error": "Эчке хата: файлны йөкләргә тырышканда нәрсәдер ялгыш китте.",
-       "api-error-unknown-warning": "Билгесез кисәтү: $1",
+       "api-error-unknown-warning": "Билгесез кисәтү: \"$1\".",
        "api-error-unknownerror": "Билгесез хата: \"$1\".",
-       "api-error-uploaddisabled": "Бу викидә файллар йөкләү мөмкинлеге сүндерелгән.",
-       "api-error-verification-error": "Бәлки, бу файл бозылгандыр яки дөрес түгел киңәйтелмәгә ия.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сәгать}}",
        "special-characters-group-ipa": "ХФӘ (IPA)",
        "special-characters-group-symbols": "Тамгалар",
        "special-characters-group-greek": "Грек",
+       "special-characters-group-greekextended": "Грек (киңәйтелгән)",
        "special-characters-group-cyrillic": "Кирилл",
        "special-characters-group-arabic": "Гарәп",
+       "special-characters-group-arabicextended": "Гарәп (киңәйтелгән)",
        "special-characters-group-persian": "Фарсы",
        "special-characters-group-hebrew": "Яхүд",
        "special-characters-group-bangla": "Бенгаль",
-       "special-characters-group-tamil": "Тамиль",
+       "special-characters-group-tamil": "Тамил",
        "special-characters-group-telugu": "Телугу",
-       "special-characters-group-sinhala": "Сингаль",
+       "special-characters-group-sinhala": "Сингал",
        "special-characters-group-gujarati": "Гуҗарати",
        "special-characters-group-devanagari": "Деванагари",
-       "special-characters-group-thai": "Таиланд",
+       "special-characters-group-thai": "Тай",
        "special-characters-group-lao": "Лаос",
-       "special-characters-group-khmer": "Кһмер"
+       "special-characters-group-khmer": "Кһмер",
+       "log-action-filter-all": "Барысы",
+       "log-action-filter-block-block": "Тыю",
+       "authmanager-email-label": "Электрон почта",
+       "authmanager-email-help": "Электрон почта адресы",
+       "authmanager-realname-label": "Чын исеме",
+       "authprovider-resetpass-skip-label": "Калдыру"
 }
index b3c63d3..8a61fb5 100644 (file)
@@ -11,7 +11,8 @@
                        "Irus",
                        "Shklyaev",
                        "Wadorgurt",
-                       "Zpizza"
+                       "Zpizza",
+                       "Mouse21"
                ]
        },
        "tog-underline": "Чӧлсконъёсыз ултӥз гожен сызоно",
        "variants": "Вариантъёс",
        "navigation-heading": "Навигация",
        "errorpagetitle": "Янгыш",
-       "returnto": "Берыктон борды бам $1.",
+       "returnto": "$1 баме берытскон.",
        "tagline": "{{SITENAME}}-ысь материал",
        "help": "Валэктонъёс",
        "search": "Утчан",
        "create-this-page": "Та бамез кылдытыны",
        "delete": "Быдтыны",
        "deletethispage": "Та бамез быдтыны",
-       "undeletethispage": "Та Ð±Ð°Ð¼ÐµÐ· Ð±Ñ\8bдÑ\82Ñ\8bнÑ\8b",
+       "undeletethispage": "Ð\91еÑ\80ен Ñ\81Ñ\91Ñ\82Ñ\8bнÑ\8b Ñ\82а Ð±Ð°Ð¼ÐµÐ·",
        "protect": "Утьыны",
        "protect_change": "воштыны",
        "protectthispage": "Та бамез утьыны",
        "categorypage": "Категорилэсь бамзэ учкыны",
        "viewtalkpage": "Вераськонэз учкыны",
        "otherlanguages": "Мукет кылъёсын",
-       "redirectedfrom": "(Ð\9fеÑ\80енапÑ\80авлÑ\8fÑ\82Ñ\8c $1)",
+       "redirectedfrom": "(ЫÑ\81Ñ\82Ñ\8dмÑ\8bн Â«$1» Ð±Ð°Ð¼Ñ\8bÑ\81Ñ\8c)",
        "redirectpagesub": "Ыстӥсь бам",
-       "redirectto": "Ð\92Ñ\8bжÑ\8bÑ\82он:",
+       "redirectto": "ЫÑ\81Ñ\82он Ð±Ð°Ð¼Ðµ:",
        "lastmodifiedat": "Та бамлэн берпуметӥ воштонэз: $2, $1.",
        "protectedpage": "Утем бам",
        "jumpto": "Выжон:",
        "portal-url": "Project:Портал сообщества",
        "privacy": "Конфиденциальностья политика",
        "privacypage": "Project:Конфиденциальностья политика",
-       "badaccess": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ñ\8eаÑ\81Ñ\8cке",
-       "badaccess-group0": "Ð\91Ñ\8bдÑ\8dÑ\81Ñ\82Ñ\8dм Ñ\83жез Ñ\82онÑ\8d Ñ\83г Ð»Ñ\8dзÑ\8cÑ\8b, ÐºÐ¸Ð½ Ñ\82онÑ\8d ÐºÑ\83Ñ\80озы.",
-       "badaccess-groups": "УжÑ\8aÑ\91Ñ\81Ñ\8bн Ð½Ð¾, ÐºÑ\83даз Ñ\82ӥледÑ\8bз ÐºÑ\83Ñ\80иÑ\81Ñ\8cко Ð¿Ð¾Ñ\86иенÑ\82 {{PLURAL:$2|Ñ\82Ñ\83Ñ\80кÑ\8bм|гÑ\80Ñ\83ппа Ð¾Ð´Ó¥Ð³}}: $1.",
-       "versionrequired": "MediaWiki доллар кулэ версия $1",
+       "badaccess": "Ð\9bÑ\8dзÑ\91н Ñ\8fнгÑ\8bÑ\88",
+       "badaccess-group0": "Тӥ Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке Ñ\82ӥледÑ\8bн ÐºÑ\83Ñ\80ем Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fны.",
+       "badaccess-groups": "Ð\9aÑ\83Ñ\80ем Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fнÑ\8b Ð±Ñ\8bгаÑ\82о {{PLURAL:$2|1=«$1» Ð³Ñ\80Ñ\83ппаÑ\8bÑ\81Ñ\8c Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d\82а Ð³Ñ\80Ñ\83ппаоÑ\81 Ð¿Ó§Ð»Ñ\8bÑ\81Ñ\8c Ð¾Ð³ÐµÐ·Ð»Ñ\8dн Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81Ñ\8bз Ð³Ð¸Ð½Ñ\8d: $1}}.",
+       "versionrequired": "$1 номеро MediaWiki версия кулэ",
        "ok": "OK",
        "retrievedfrom": "«$1»-лэсь басьтэмын",
        "editsection": "тупатыны",
        "hidetoc": "ватоно",
        "collapsible-collapse": "ватоно",
        "collapsible-expand": "возьматоно",
-       "confirmable-yes": "Ð\9cед",
+       "confirmable-yes": "Ð\91ен",
        "confirmable-no": "Ӧвӧл",
        "viewdeleted": "Учкыны $1",
        "site-rss-feed": "$1 — RSS-лента",
        "badtitle": "Умойтэм ним",
        "badtitletext": "Курем бам ним луэ мыдлань, буш либо кылъёс куспын яке викиос куспын нимыз умойтэм герӟамын.\nНимын, вылды, ярантэм символъёс вань.",
        "viewsource": "Кодзэ учкыны",
-       "viewsource-title": "Кодзэ учкыны бам $1",
-       "actionthrottled": "Ð\9aекаÑ\82Ñ\8bнÑ\8b Ñ\83жÑ\8aÑ\91Ñ\81",
-       "actionthrottledtext": "УжÑ\80адлÑ\8dн Ó\9fеÑ\87лÑ\8bкез Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебление-нÑ\8eÑ\80Ñ\8aÑ\8fÑ\81Ñ\8cкон, Ñ\82а Ñ\83жÑ\80ад Ñ\82Ó¥ Ð¿Ð¾Ð½Ð½Ð° Ñ\83кÑ\8bÑ\80 Ñ\82Ñ\80оÑ\81 Ð¿Ð¾Ð»Ð»Ñ\8b Ñ\81Ñ\8eбегамÑ\8bн Ð±Ñ\8bдÑ\8dÑ\81Ñ\82он Ð²Ð°ÐºÑ\87и Ð´Ñ\8bÑ\80 ÐºÑ\83Ñ\81Ñ\8bпÑ\8aÑ\91Ñ\81, Ð»Ð¸Ð¼Ð¸Ñ\82Ñ\8aÑ\91Ñ\81, Ñ\82а Ñ\82ӥлÑ\8fд Ð½Ð¾ Ñ\82Ñ\83бе.\nÐ\9fожалÑ\83йÑ\81Ñ\82а, ÐºÓ§Ð½Ñ\8f ÐºÐµ Ð¼Ð¸Ð½Ñ\83Ñ\82 Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\81а, Ð½Ð¾Ñ\88 Ð¸Ðº Ñ\83Ñ\82Ñ\87аÑ\81Ñ\8cко.",
-       "protectedpagetext": "Та бамез утьыны луэ шуыса, яке мукет уже предотвращать редактировать карон.",
-       "viewsourcetext": "Та бамез учкыны быгатӥськоды тӥ но потон кӧчыро.",
-       "viewyourtext": "Ð\9eÑ\88меÑ\81 Ð½Ð¾, Ñ\82онÑ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b ÐºÓ§Ñ\87Ñ\8bÑ\80Ñ\8bнÑ\8b <strong>Ñ\82он Ñ\88онеÑ\80Ñ\82он</strong> Ñ\82а Ð±Ð°Ð¼Ð°Ð¼.",
-       "protectedinterface": "Та текст бам вайытиськом, та программаын вики интерфейсъёс, но дурбасьтэ, мед злоупотребление предотвращать.\nВика ватсаса, ваньзэ воштыны яке берыктон понна, пожалуйста, [https://translatewiki.net/ translatewiki.net] MediaWiki локализация проект.",
-       "editinginterface": "<strong>Юа:</strong> Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b Ð±Ð°Ð¼Ð·Ñ\8d Ñ\82он, Ð¿Ñ\80огÑ\80аммное Ð¾Ð±ÐµÑ\81пеÑ\87ение Ð¿Ð¾Ð½Ð½Ð° Ñ\81о Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ñ\82екÑ\81Ñ\82овÑ\8bе ÐºÑ\8bлдÑ\8bÑ\82он Ð¿Ð¾Ð½Ð½Ð° ÐºÑ\83Ñ\82Ñ\8bнÑ\8b.\nТа Ð²Ð¸ÐºÐ¸Ð»Ñ\8dн Ð¼Ñ\83кеÑ\82 Ð±Ð°Ð¼Ð°Ð· Ð»Ñ\83иÑ\81Ñ\8c Ñ\82Ñ\83Ñ\81Ñ\81Ñ\8d Ð²Ð¾Ñ\88Ñ\82он Ð¿Ð¾Ð½Ð½Ð° Ñ\82а Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81Ñ\8dз Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8cÑ\81кий Ð¿ÐµÐ´Ð¿Ð°Ð» Ð±Ñ\8bгаÑ\82онлÑ\8bкÑ\8aÑ\91Ñ\81Ñ\81Ñ\8dÑ\81.",
+       "viewsource-title": "$1 бамлэсь кодзэ учкон",
+       "actionthrottled": "Уж Ð´Ñ\83гдÑ\8bÑ\82Ñ\8dмÑ\8bн",
+       "actionthrottledtext": "СпамлÑ\8b Ð¿Ñ\83миÑ\82 Ð½Ñ\8eÑ\80Ñ\8aÑ\8fÑ\81Ñ\8cкемен Ñ\82Ó¥ Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке Ñ\82а Ñ\83жез Ð±Ñ\8bдÑ\8dÑ\81Ñ\8aÑ\8fнÑ\8b Ñ\83кÑ\8bÑ\80 Ñ\82Ñ\80оÑ\81 Ð¿Ð¾Ð» Ð²Ð°ÐºÑ\87и Ð´Ñ\8bÑ\80 ÐºÑ\83Ñ\81пÑ\8bн â\80\94 Ð½Ð¾ Ñ\82Ó¥ Ñ\82а Ð»Ð¸Ð¼Ð¸Ñ\82лÑ\8dÑ\81Ñ\8c Ð²Ñ\8bлÑ\82Ó¥ Ð»Ñ\83идÑ\8b.\nТаÑ\83на, Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c Ð¾Ñ\81калÑ\82Ñ\8d ÐºÓ§Ð½Ñ\8f ÐºÐµ Ð¼Ð¸Ð½Ñ\83Ñ\82 ÐºÑ\83Ñ\81паÑ\82Ñ\8bÑ\81а.",
+       "protectedpagetext": "Та бам утемын вал сое тупатъянэз яке мукет ужъёсты палэнтон понна.",
+       "viewsourcetext": "Тӥ быгатӥськоды та бамлэсь кодзэ учкыны но кӧчырыны.",
+       "viewyourtext": "Тӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ñ\82а Ð±Ð°Ð¼ÐµÐ· <strong>Ñ\82ӥлÑ\8fд Ñ\82Ñ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\82Ñ\8bлÑ\8dÑ\81Ñ\8c</strong> ÐºÐ¾Ð´Ð·Ñ\8dÑ\81 Ñ\83Ñ\87кÑ\8bнÑ\8b Ð½Ð¾ ÐºÓ§Ñ\87Ñ\8bÑ\80Ñ\8bнÑ\8b.",
+       "protectedinterface": "Та бам возе интерфейс текстэз та викилэн программной обеспечениезлы. Вандализмез палэнтон понна со утемын воштонъёслэсь.\nВань викиослы берыктэмъёсты ватсалляны яке вошъяны вылысь, тауна, MediaWiki локализацияя сайтэ выжелэ — [https://translatewiki.net/ translatewiki.net].",
+       "editinginterface": "<strong>Сак Ð»Ñ\83Ñ\8d:</strong> Ð¢Ó¥ Ñ\82Ñ\83паÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ð±Ð°Ð¼ÐµÐ·, ÐºÑ\83дӥз Ð²Ð¾Ð·Ðµ Ð¿Ñ\80огÑ\80аммной Ð¾Ð±ÐµÑ\81пеÑ\87енилÑ\8dÑ\81Ñ\8c Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ñ\82екÑ\81Ñ\82Ñ\81Ñ\8d.\nТа Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82он Ð²Ð¾Ñ\88Ñ\82оз Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81Ñ\8dз Ð²Ð¾Ð·Ñ\8cмаÑ\82онÑ\8dз Ð¼Ñ\83кеÑ\82 Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8b Ñ\82а Ð²Ð¸ÐºÐ¸Ñ\8bн.",
        "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <кужмо>$1</strong> инты нимъёс.",
        "exception-nologin": "Тон эн тусбуяськыны сӧзнэтэз",
-       "logouttext": "<strong>Тон али потэ.</strong>\n\nУчком, мар быгатозы бам куд-ог сямъёсты тӥледыз кадь возьматӥсько ке луысал, азьвыл сямен азьвыл системая пыртэмын, тон ӧд сузя, дыр кеш браузер.",
-       "welcomeuser": "Гажаса, $1!",
-       "welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
-       "yourname": "Ð\9fÑ\8bÑ\80он Ð½Ð¸Ð¼:",
-       "userlogin-yourname": "Ð\9fÑ\8bÑ\80он Ð½Ð¸Ð¼:",
+       "logouttext": "<strong>Тӥ ужан сеансэз йылпумъяды.</strong>\n\nКуд-огез бамъёс возьматӥськыны на быгато озьы, тӥ авторизовать каремын на кадь. Талы пумит нюръяськон понна бушатэ браузерлэсь кэшсэ.",
+       "welcomeuser": "Гажаса ӧтиськом, $1!",
+       "welcomecreation-msg": "Тӥляд учётной записьты кылдытэмын.\nТӥ быгатӥськоды воштыны асьтэлэсь [[Special:Preferences|настройкаостэс]] {{SITENAME}} сайтлы, потэ ке.",
+       "yourname": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cлÑ\8dн Ð½Ð¸Ð¼Ñ\8bз:",
+       "userlogin-yourname": "Ð\92икиавÑ\82оÑ\80 Ð½Ð¸Ð¼",
        "userlogin-yourname-ph": "Гожтэ учётной записьтылэсь нимзэ",
-       "createacct-another-username-ph": "УÑ\87Ñ\91Ñ\82ной ÐºÐ½Ð¸Ð³Ð° нимъёс пыртэмын",
+       "createacct-another-username-ph": "Ð\92ики-авÑ\82оÑ\80лÑ\8dн нимъёс пыртэмын",
        "yourpassword": "Лушкемкыл:",
        "userlogin-yourpassword": "Лушкемкыл",
        "userlogin-yourpassword-ph": "Гожтэ асьтэлэсь парольдэс",
        "createacct-yourpasswordagain": "Пароль юнматэ",
        "createacct-yourpasswordagain-ph": "Гожтэ паролез эшшо одӥг пол",
        "userlogin-remembermypassword": "Кылем сӧзнэтэз",
-       "cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
-       "yourdomainname": "Тӥ доменэн:",
+       "cannotcreateaccount-title": "Учётной записьёсты кылдытыны уг луы",
+       "yourdomainname": "Тӥляд доменды:",
        "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
        "userlogin": "Нимдэс вераны / Регистрациез ортчытыны",
        "userlogout": "Потыны",
        "notloggedin": "Тон эн тусбуяськыны сӧзнэтэз",
        "userlogin-noaccount": "Ас учётной записьты ӧвӧл?",
-       "nologin": "Учётной книга ӧвӧл-а? $1.",
-       "nologinlink": "Выль вики-авторлэн регистрациез",
-       "createaccount": "выль вики-авторлэн регистрациез",
-       "gotaccountlink": "Пырыны",
+       "userlogin-joinproject": "Проектэ пыриськоно",
+       "nologin": "Учётной запись ӧвӧл? $1.",
+       "nologinlink": "Учётной записез кылдытыны",
+       "createaccount": "Выль вики-авторлэн регистрациез",
+       "gotaccountlink": "Пырелэ",
        "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
        "userlogin-helplink2": "Пыронъя юрттэт",
-       "createacct-emailrequired": "Электронной почталэн адресэз",
+       "createacct-emailrequired": "Электрон почталэн адресэз",
        "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
        "createacct-email-ph": "Гожтэ асьтэлэн электрон почтадылэсь адрессэ",
        "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
-       "createacct-submit": "Ð\92Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸-авÑ\82оÑ\80лÑ\8dн Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иез",
-       "createacct-another-submit": "Ð\92Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸-авÑ\82оÑ\80лÑ\8dн Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иез",
+       "createacct-submit": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\82Ñ\8dÑ\81 ÐºÑ\8bлдÑ\8bÑ\82оно",
+       "createacct-another-submit": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81ез ÐºÑ\8bлдÑ\8bÑ\82оно",
        "createacct-benefit-heading": "{{SITENAME}} — тӥ выллем адямиослэн валче ужамзы.",
        "createacct-benefit-body1": "{{PLURAL:$1|тупатон}}",
        "createacct-benefit-body2": "{{PLURAL:$1|бам}}",
        "createacct-benefit-body3": "{{PLURAL:$1|викиавтор}} берло дыре",
-       "loginerror": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ð¿Ñ\8bÑ\80он",
-       "createacct-error": "ЯнгÑ\8bÑ\88Ñ\8aÑ\91Ñ\81 Ð±Ð¾Ñ\80дÑ\8bн Ñ\83Ñ\87Ñ\91Ñ\82ной ÐºÐ½Ð¸Ð³Ð° ÐºÑ\8bлдÑ\8bÑ\82Ñ\8bнÑ\8b",
-       "createaccounterror": "Уг быгатиськы гожъян учётной кылдоз: $1",
-       "nocookiesnew": "Ð\9aнига ÐºÑ\8bлдÑ\8bÑ\82Ñ\8bнÑ\8b Ñ\83Ñ\87Ñ\91Ñ\82ной Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c Ð²Ð°Ð», Ð½Ð¾Ñ\88 Ñ\81иÑ\81Ñ\82ема Ñ\82он Ñ\83д Ð¿Ñ\8bÑ\80Ñ\8b.\n{{SITENAME}} Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c cookies Ð¿Ñ\8bÑ\80он Ð¿Ð¾Ð½Ð½Ð° ÐºÑ\83Ñ\82Ñ\8bнÑ\8b.\nDisconnect cookies Ñ\82онÑ\8d Ð´Ð¾Ñ\80ам.\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ñ\81о Ð³Ð¾Ð¶Ñ\82Ó¥Ñ\81Ñ\8cке, Ð½Ð¾Ñ\88 Ñ\81обеÑ\80е Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c Ð¿Ñ\8bÑ\80Ñ\8bнÑ\8b Ð»Ð¾Ð³Ð¸Ð½ Ð½Ð¾ Ð¿Ð°Ñ\80олÑ\8c.",
-       "nocookieslogin": "{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, соосты утчано, выльысь гожтыны.",
-       "blocked-mailpassword": "Тон IP-адрес заблокировать-ысь редактировать карон. Злоупотребление предотвращение понна, та понна кутыны ӧз лэзиське пароль-ысь восстановление IP-адрес.",
+       "loginerror": "Ð\9fÑ\8bÑ\80он Ñ\8fнгÑ\8bÑ\88",
+       "createacct-error": "УÑ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81ез ÐºÑ\8bлдÑ\8bÑ\82он Ñ\8fнгÑ\8bÑ\88",
+       "createaccounterror": "Учётной запись кылдытыны уг луы: $1",
+       "nocookiesnew": "Ð\92икиавÑ\82оÑ\80 Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн, Ð½Ð¾Ñ\88 Ñ\82Ó¥ Ñ\81айÑ\82Ñ\8d Ó§Ð´ Ð¿Ñ\8bÑ\80елÑ\8d.\n{{SITENAME}} Â«cookies» Ñ\83же ÐºÑ\83Ñ\82Ñ\8d Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\81айÑ\82Ñ\8d Ð»Ñ\8dзÑ\8cÑ\8bлÑ\8bнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c.\nТӥлÑ\8fд Â«cookies-Ñ\82Ñ\8b» Ó§Ð²Ó§Ð».\nТаÑ\83на Ð»Ñ\8dзе Ñ\81ооÑ\81Ñ\82Ñ\8b, Ñ\81обеÑ\80е Ð¿Ñ\8bÑ\80е Ñ\81айÑ\82Ñ\8d Ð°Ñ\81Ñ\8cÑ\82Ñ\8dлÑ\8dн Ð²Ñ\8bлÑ\8c Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð½Ð¸Ð¼ÐµÐ½Ñ\8bдÑ\8b Ð½Ð¾ Ð¿Ð°Ñ\80оленÑ\8bдÑ\8b.",
+       "nocookieslogin": "{{SITENAME}} «cookies» уже кутэ викиавторъёсты сайтэ лэзьылыны вылысь.\nТӥляд «cookies-ты» ӧвӧл.\nТауна лэзе соосты но оскалтэ выльысь.",
+       "blocked-mailpassword": "Тӥляд IP-адресысьтыды бамъёсыз тупатъян дугдытэмын. Урод ужъёслы пумит нюръяськон понна паролез тупатон но уг лэзиськы та IP-адресысь.",
        "loginlanguagelabel": "Кыл: $1",
        "pt-login": "Пырыны",
        "pt-login-button": "Пырыны",
        "pt-userlogout": "Потыны",
        "oldpassword": "Вуж лушкемкыл:",
        "newpassword": "Выль лушкемкыл:",
+       "passwordreset": "Пароль куштыны",
        "passwordreset-username": "Пырон ним:",
+       "bold_sample": "Зӧк шрифт",
+       "bold_tip": "Зӧк шрифт",
        "italic_sample": "Бекырес текст",
        "italic_tip": "Бекырес текст",
        "link_sample": "Чӧлсконлэн йыръянэз",
        "showpreview": "Бамез эскерон",
        "showdiff": "Пыртэм воштонъёс",
        "anoneditwarning": "<strong>Сак луэ!</strong> Тӥ сайтэ ӧд пырелэ. Тӥ котькыӵе тупатонъёсыз лэсьтоды бере, тӥляд IP-адресты ваньмызлы адӟытӥськоз. Тӥ <strong>[$1 пыроды]</strong> яке <strong>[$2 учётной записез кылдытоды]</strong> бере, тӥляд тупатонъёсты герӟаськозы нимдылы, мукет пайдаосын ӵош.",
-       "blockedtitle": "Ð\97аблокиÑ\80оваÑ\82Ñ\8c Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "blockedtext": "<strong>Ð\9aнигае Ñ\8fке Ñ\83Ñ\87Ñ\91Ñ\82ной IP-адÑ\80еÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован.</strong>\n\nÐ\91локиÑ\80овка Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð¿Ð¾Ñ\82ӥз $1.\nÐ\92озÑ\8cмалÑ\8d Ð²Ñ\83оно Ð¼Ñ\83гез: \"\"$2\"\".\n\n* Ð\9aÑ\83Ñ\82Ñ\81кон Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка: $8\n* Ð\91локиÑ\80овка Ð¾Ñ\80Ñ\82Ñ\87из: $6\n* Ð\91локиÑ\80овка Ð¼ÐµÑ\80еÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз: $7\n\nÐ\91Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкод-а Ñ\82он Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкемÑ\8bн $1 Ñ\8fке Ð¼Ñ\83кеÑ\82 ÐºÐ¾Ñ\82Ñ\8cкÑ\83дӥнÑ\8bз [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81]], Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¼ÐµÐ´ Ñ\8dÑ\81кеÑ\80озÑ\8b.\nУÑ\87ком, Ð¼Ð°Ñ\80 ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ñ\83г Ð±Ñ\8bгаÑ\82о Ñ\84Ñ\83нкÑ\86изÑ\8dÑ\81 \"гожÑ\82Ñ\8dÑ\82\", Ð°Ñ\81 ÐºÐµ [[Special:Preferences|наÑ\81Ñ\82Ñ\80ойка Ð¿ÐµÑ\80Ñ\81оналÑ\8cной]] Ð·Ñ\83Ñ\80каÑ\82Ó¥Ñ\81Ñ\8c Ñ\8fке Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82аезлÑ\8dн Ð°Ð´Ñ\80еÑ\81Ñ\8dз Ñ\8dн Ñ\87Ñ\83Ñ\80Ñ\82на Ñ\83г ÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй, Ñ\8fке Ð³Ð¾Ð¶Ñ\82Ó¥Ñ\81Ñ\8cкод ÐºÐµ, Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он Ñ\83кÑ\88аÑ\81Ñ\8c Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð°Ð»Ð¾Ð½.\nТон IP-адÑ\80еÑ\81 â\80\94 $3, Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80лÑ\8dн â\80\94 $5.\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð°Ñ\81лÑ\8dÑ\81Ñ\8cÑ\82Ñ\8bм Ñ\82одон-Ñ\82а Ð²Ð°Ð·Ð¸Ñ\81Ñ\8cконÑ\8dз ÐºÐ¾Ñ\82Ñ\8cкÑ\83 Ð²Ð¾Ð·Ñ\8cмано.",
-       "autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $1. \nБлокировка возьмано луоз вуоно мугез:\n\n: \"$2\" - лы.\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\n\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\n\nТон IP-адрес — $3, блокировка идентификаторлэн — #$5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
-       "blockednoreason": "мÑ\83гезлÑ\8b Ñ\8dн Ð²Ð¾Ð·Ñ\8cмалÑ\8d",
+       "blockedtitle": "Ð\92икиавÑ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн",
+       "blockedtext": "<strong>ТӥлÑ\8fд Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\82Ñ\8b Ñ\8fке IP-адÑ\80еÑ\81Ñ\82Ñ\8b Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн Ð²Ð°Ð».</strong>\n\nÐ\91локиÑ\80овкаез Ð»Ñ\8dÑ\81Ñ\8cÑ\82ӥз $1.\nÐ\9fÑ\83Ñ\81Ñ\8aем Ð¼Ñ\83гез: <em>$2</em>.\n\n* Ð\91локиÑ\80овка ÐºÑ\83Ñ\82Ñ\81киз: $8\n* Ð\91локиÑ\80овка Ð¹Ñ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкоз: $6\n* Ð\91локиÑ\80овкалÑ\8dн Ñ\83жпÑ\83мез: $7\n\nТӥ Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c Ð²ÐµÑ\80аÑ\81Ñ\8cкÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b $1 Ñ\8fке ÐºÐ¾Ñ\82Ñ\8cкин Ð¼Ñ\83кеÑ\82 [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80]] Ð´Ð¾Ñ\80Ñ\8b Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкÑ\8bÑ\81а.\n[[Special:Preferences|Ð\9dаÑ\81Ñ\82Ñ\80ойкаоÑ\81адÑ\8b]] Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82алÑ\8dн Ñ\83жаÑ\81Ñ\8c Ð°Ð´Ñ\80еÑ\81Ñ\8dз Ó§Ð²Ó§Ð» Ð´Ñ\8bÑ\80Ñ\8aÑ\8f, Ñ\82Ó¥ Â«Ð\92икиавÑ\82оÑ\80лÑ\8b Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82» Ñ\84Ñ\83нкÑ\86иез Ñ\83же ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ñ\83д Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cке, Ñ\81ое Ñ\82ӥленÑ\8bдÑ\8b Ñ\83же ÐºÑ\83Ñ\82он Ð´Ñ\83гдÑ\8bÑ\82Ñ\8dмÑ\8bн Ó§Ð²Ó§Ð» ÐºÐµ.\nТӥлÑ\8fд Ð°Ð»Ð¸ IP-адÑ\80еÑ\81Ñ\82Ñ\8b Ð»Ñ\83Ñ\8d $3, Ð½Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 â\80\94 #$5.\nТаÑ\83на Ð¿Ñ\8bÑ\80Ñ\82Ñ\8d Ð²Ð°Ð½Ñ\8c Ñ\82а Ð¿Ñ\8bÑ\80-поÑ\87 Ñ\81ведениоÑ\81Ñ\8bз Ð°Ñ\81Ñ\8cÑ\82Ñ\8dлÑ\8dн ÐºÑ\83Ñ\80онÑ\8aÑ\91Ñ\81адÑ\8b.",
+       "autoblockedtext": "Тӥляд IP-адресты автоматически заблокировать каремын вал, малы ке шуоно со кутӥськиз вал мукет викиавторен, кинзэ $1 заблокировать кариз.\nБлокировкалэн пусъем мугез:\n\n:<em>$2</em>\n\n* Блокировка кутскиз: $8\n* Блокировка йылпумъяськоз: $6\n* Блокировкалэн ужпумез: $7\n\nТӥ блокировка сярысь вераськыны быгатӥськоды $1 яке мукет [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]] пӧлысь огез доры герӟаськыса.\n\nСак луэ, тӥ «Викиавторлы гожтэт» функциез уже кутыны уд быгатӥське [[Special:Preferences|асьтэлэн настройкаосады]] электрон почталэсь шонер адрессэ гожтытозь яке юнматытозь, либо блокировкады сыӵе амалэн гожтэтъёсыз ыстыны уг лэзьы ке.\n\nТӥляд али IP-адресты луэ $3, но блокировка идентификатор — #$5.\nТауна пыртэ вань та пыр-поч сведениосыз асьтэлэн куронъёсады.",
+       "blockednoreason": "пÑ\83кÑ\82Ñ\8dм Ð¼Ñ\83г Ó§Ð²Ó§Ð»",
        "whitelistedittext": "Тон кулэ $1 бам воштон понна.",
        "loginreqtitle": "Авторизация кулэ",
        "loginreqlink": "пырыны",
        "loginreqpagetext": "Тон кулэ $1-ысь, сое мукет бамез учкыны шуыса.",
        "newarticletext": "Тон бам ссылкаос вылэ выжыса, со кема уз улы.\nСоос мед кылдозы, текст бичась укноос, улазы интыяськемын (умой-умой см. [$1 бам справочной]).\nЯнгыш-а тон татын луысалыд ке, кнопказэ зӥбиз гинэ <strong>берлань</strong> асьтэлэсь браузеръёстэс.",
        "noarticletext": "Али дыре та бамын текст ӧвӧл. \nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз], \nяке [{{fullurl:{{FULLPAGENAME}}|action=edit}} сыӵе нимын бам кылдытыны]</span>.",
-       "noarticletext-nopermission": "Али дыре та бам вылын кылкуэт ӧвӧл.\nТон быгатӥськод [[Special:Search/{{PAGENAME}}|сётэм йыръянъёс шедьто упоминание]] мукет бам вылын,\nяке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} соответствующий журнал книгаез шедьтыны].</span> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
-       "blocked-notice-logextract": "Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ован Ñ\81Ñ\91Ñ\82ӥз Ñ\82а Ñ\83Ñ\87Ñ\8bÑ\80лÑ\8b.\nСпÑ\80авка Ð¿Ð¾Ð½Ð½Ð° Ñ\80адÑ\8aÑ\8fÑ\81Ñ\8cкÑ\8bлӥÑ\81Ñ\8c Ð¶Ñ\83Ñ\80нал Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð»Ð°Ð¿ÐµÐ³ Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82:",
+       "noarticletext-nopermission": "Али дыре та бамын текст ӧвӧл.\nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь, яке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз]</span>, нош та бамез кылдытыны тӥляд лэзёнды ӧвӧл.",
+       "blocked-notice-logextract": "Та Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð°Ð»Ð¸ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\91локиÑ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80пÑ\83м Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
        "continue-editing": "Тупатъянэз азьланьтоно",
        "editing": "Тупатон: $1",
-       "creating": "«$1» бамез кылдытон",
+       "creating": "Кылдытон: $1",
        "editingsection": "Тупатон: $1 (люкет)",
        "templatesused": "Та бам пушкы пыртэм {{PLURAL:$1|шаблон|шаблонъёс}}:",
        "template-protected": "(утемын)",
-       "template-semiprotected": "(полуутемын)",
+       "template-semiprotected": "(ӧжытак утемын)",
        "hiddencategories": "Та бам пыре {{PLURAL:$1|$1 ватэм категорие}}:",
        "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
-       "nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
-       "permissionserrors": "Янгышъёс юаське",
-       "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
-       "permissionserrorstext-withaction": "Правоез ӧвӧл, тон дорын $2 тӥ {{PLURAL:$1/1=мугез вуоно|мугез вуоно}}:",
+       "nocreate-loggedin": "Выль бамъёсты кылдытъяны тӥляд лэзёнды ӧвӧл.",
+       "permissionserrors": "Лэзён янгыш",
+       "permissionserrorstext": "Тӥляд тае быдэстыны лэзёнды ӧвӧл та {{PLURAL:$1|1=муген|мугъёсын}} сэрен:",
+       "permissionserrorstext-withaction": "Тӥляд $2 лэзёнды ӧвӧл та {{PLURAL:$1|1=муген|мугъёсын}} сэрен:",
+       "moveddeleted-notice": "Та бам быдтэмын вал.\nБыдтонъёсын но ним воштонъёсын журналъёсысь ярано записьёс чӧлсконлы улӥ возьматэмын.",
        "content-model-wikitext": "викитекст",
-       "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
-       "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<strong>$1</strong>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
-       "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <strong>$1</strong>, Тон пыриське со IP-адрес (<strong>$4</strong>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|вераськон]]) викиавторлэн $1 номеро тупатонэз палэнтэмын",
+       "cantcreateaccount-text": "Та IP-адресысь (<strong>$1</strong>) учётной записьёсты кылдытон заблокировать каремын вал [[User:$3|$3]] викиавторен.\n\n$3 пусйиз таӵе мугез: <em>$2</em>.",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] викиавтор дугдытӥз учётной записьёсты кылдытыны <strong>$1</strong> радлэн IP-адресъёсысьтыз, кудъёсыз пӧлы пыре тӥляд IP-адресты (<strong>$4</strong>).\n\n$3 пусйиз таӵе мугез: <em>$2</em>.",
        "viewpagelogs": "Та бамлы журналъёсыз возьматыны",
        "currentrev-asof": "Алиез версия $1",
        "revisionasof": "Версия $1",
        "currentrevisionlink": "Алиез версия",
        "cur": "али",
        "last": "азьв.",
+       "history-fieldset-title": "Историез учкыны",
        "history-show-deleted": "Ӵушылэмъёссэ гинэ",
        "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
        "revdelete-show-file-submit": "да",
        "revdelete-radio-set": "Ватэм",
        "revdelete-radio-unset": "Адӟымон",
-       "revdelete-reason-dropdown": "*Ð\92ӧлÑ\81кем Ð¿Ð°Ð»Ñ\8dнÑ\81кон Ð¼Ñ\83гÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b\n** Ð\90вÑ\82оÑ\80Ñ\81кой Ð¿Ñ\80авооÑ\81Ñ\82Ñ\8b Ñ\82Ó¥Ñ\8fн\n** Ð¯ÐºÐµ ÐºÑ\83лÑ\8dÑ\82Ñ\8dм Ð¸Ð½Ñ\84оÑ\80маÑ\86иез Ð»Ð¸Ñ\87ной ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ий\n** Ð\9bогин Ð½ÐµÑ\81ооÑ\82веÑ\82Ñ\81Ñ\82воваÑ\82Ñ\8c\n** Ð\9aÑ\83Ñ\80ла Ð¸Ð½Ñ\84оÑ\80маÑ\86иез Ð\9fоÑ\82енÑ\86иалÑ\8cно",
+       "revdelete-reason-dropdown": "*Ð\9eгÑ\88оÑ\80Ñ\8b Ð±Ñ\8bдÑ\82он Ð¼Ñ\83гÑ\8aÑ\91Ñ\81\n** Ð\90вÑ\82оÑ\80 Ð¿Ñ\80авооÑ\81Ñ\82Ñ\8b Ñ\82Ó¥Ñ\8fн\n** Ð¯Ñ\80анÑ\82Ñ\8dм ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ий Ñ\8fке Ð»Ð¸Ñ\87ной Ñ\81ведениоÑ\81\n** Ð\92икиавÑ\82оÑ\80лÑ\8dн Ñ\8fÑ\80анÑ\82Ñ\8dм Ð½Ð¸Ð¼Ñ\8bз\n** Ð\9bÑ\83оно Ð»ÐµÐºÐ°Ñ\82Ó¥Ñ\81Ñ\8c Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f",
        "history-title": "$1 — воштонъёслэн историзы",
        "difference-title": "$1 — версиосыз куспын пӧртэмлык",
        "lineno": "$1-тӥ чур:",
        "compareselectedversions": "Быръем версиосыз ӵошатыны",
        "showhideselectedversions": "Возьматыны/ватыны быръем версиосыз",
        "editundo": "берытсконо",
+       "diff-multi-sameuser": "(таизлэн ик викиавторлэн {{PLURAL:$1|вискын шедьтэм $1 версиез}} возьматэмын ӧвӧл)",
        "searchresults": "Шедьтэмын",
        "searchresults-title": "утчан \"$1\"",
        "prevn": "{{PLURAL:$1|$1-лы}} берлань",
        "nextn": "{{PLURAL:$1|$1-лы}} азьлань",
+       "nextn-title": "$1 {{PLURAL:$1|шедьтэмлы}} азьлань",
        "shown-title": "Адӟытылоно $1 {{PLURAL:$1|шедьтэмез}} бамлы быдэ",
        "viewprevnext": "Учкыны ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>Кылдытыны «[[:$1]]» бамез та вики-проектын!</strong> {{PLURAL:$2|0=|Со сяна утчанэныды шедьтэм бамез учке.|Со сяна шедьтэм бамъёсты учке.}}",
        "prefs-editing": "Тупатон",
        "yourlanguage": "Интерфейслэн кылыз:",
        "prefs-preview": "Бамез эскерон",
+       "userrights": "Пыриськисьлэн правоосыныз кивалтон",
        "editusergroup": "Викиавторлэсь группаоссэ возьматыны",
-       "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
-       "group-bot": "Ð\91оÑ\82Ñ\8b",
+       "group-autoconfirmed": "Авто-юнматэм викиавторъёс",
+       "group-bot": "Ð\91оÑ\82Ñ\8aÑ\91Ñ\81",
        "group-sysop": "Администраторъёс",
        "group-all": "(ваньзэ)",
-       "right-read": "лыдӟыны бам",
-       "right-edit": "правка бам",
-       "right-createpage": "бам кылдытон-а, уг-возьматэмзэ эскерон",
-       "right-createtalk": "создание бамлэн обсуждениосаз",
-       "right-createaccount": "выль книга кылдытон пыриськизы учётной",
-       "right-writeapi": "гожтэтъёсты кутон понна API",
+       "grouppage-sysop": "{{ns:project}}:Администраторъёс",
+       "right-read": "Бамъёсты учкон",
+       "right-edit": "Бамъёсты тупатъян",
+       "right-createpage": "Бамъёсты кылдытон (вераськон бамъёс сяна)",
+       "right-createtalk": "Вераськон бамъёсты кылдытон",
+       "right-createaccount": "Викиавторъёслэсь выль учётной записьёссэс кылдытон",
+       "right-writeapi": "Гожъясь API уже кутон",
        "right-block": "мукет пыриськисьёслэсь курон-косон вылэ установкаосты редактировать",
        "newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
        "action-read": "та лыдӟонъёс бам",
-       "action-edit": "Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c",
+       "action-edit": "Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82Ñ\8bнÑ\8b",
        "action-block": "пыриськисьёс та понна луонлыкъёссы сюбегам редактировать",
        "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
        "recentchanges-legend": "Выль тупатонъёслы настройкаос",
        "recentchanges-summary": "Та бамын викилэн дыръя радъям выль воштонъёсыз возьматэмын.",
        "recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
-       "recentchanges-label-minor": "Ð\9fичи воштон",
-       "recentchanges-label-bot": "Та Ñ\82Ñ\83паÑ\82онÑ\8dз ÐºÐ°Ñ\80из Ð±Ð¾Ñ\82",
+       "recentchanges-label-minor": "Та Ñ\82Ñ\83паÑ\82он Ð»Ñ\83Ñ\8d Ð¿ичи воштон",
+       "recentchanges-label-bot": "Та Ñ\82Ñ\83паÑ\82онÑ\8dз Ð±Ð¾Ñ\82 ÐºÐ°Ñ\80из",
        "recentchanges-label-unpatrolled": "Та тупатонэз нокин но ӧз эскеры на",
        "recentchanges-label-plusminus": "Бамлэн быдӟалаез сомында байтъёслы воштӥськиз",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "filehist-current": "алиез",
        "filehist-datetime": "Дата/дыр",
        "filehist-thumb": "Миниатюра",
+       "filehist-thumbtext": "$1 лэсьтэм версилэн миниатюраез",
        "filehist-user": "Викиавтор",
        "filehist-dimensions": "Быдӟала",
        "filehist-comment": "Валэктон",
        "categories-submit": "Возьматыны",
        "sp-deletedcontributions-contribs": "тупатонъёсыз",
        "listusers-submit": "Возьматыны",
-       "listusers-blocked": "(заблокиÑ\80оваÑ\82Ñ\8c{{GENDER:$1||а}})",
-       "listgrouprights": "Ð\9fÑ\80аво Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "listgrouprights-summary": "Та Ð³Ñ\80Ñ\83ппае Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cÑ\91Ñ\81 Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8bнÑ\8b ÐºÑ\83лÑ\8d Ð²Ð¸ÐºÐ¸ Ñ\81пиÑ\81ок Ñ\83лӥзÑ\8b, Ð¿Ñ\80аво Ñ\81ооÑ\82веÑ\82Ñ\81Ñ\82вÑ\83Ñ\8eÑ\89ийгеÑ\81 Ñ\81олÑ\8b Ð²Ð¾Ð·Ñ\8cмаÑ\82оно ÐºÐ°Ñ\80иÑ\81Ñ\8cкиз. Ð\9eло, Ð°Ñ\81 [[{{MediaWiki:Listgrouprights-helppage}}|кожазÑ\8b Ð²Ð°Ñ\82Ñ\81аÑ\81а Ð¸Ð²Ð¾Ñ\80Ñ\82одÑ\8dÑ\82]] Ñ\83лÑ\8bнÑ\8b Ñ\8dÑ\80икÑ\80адÑ\8dз Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81ь.",
-       "listgrouprights-members": "(список пыриськисьёс)",
+       "listusers-blocked": "(блокиÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн)",
+       "listgrouprights": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
+       "listgrouprights-summary": "Улӥ Ñ\81пиÑ\81ок Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8dн Ñ\82а Ð²Ð¸ÐºÐ¸Ñ\8bн ÐºÑ\8bлдÑ\8bÑ\82Ñ\8dм Ð³Ñ\80Ñ\83ппаоÑ\81Ñ\81Ñ\8bлÑ\8b, Ñ\81ооÑ\81Ñ\8bн Ð³ÐµÑ\80Ó\9fаÑ\81Ñ\8cкем Ð»Ñ\8dзÑ\91н Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b ÓµÐ¾Ñ\88ен.\nÐ\9dимаз Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b Ñ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, Ð¾Ð»Ð¾, [[{{MediaWiki:Listgrouprights-helppage}}|Ñ\8dÑ\88Ñ\88о Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f]] Ð²Ð°Ð½ь.",
+       "listgrouprights-members": "(викиавторъёсызлэн списоксы)",
        "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
        "watchlist": "Чаклан список",
        "enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
        "historyaction-submit": "Возьматыны",
        "dellogpage": "Быдтонъёсын журнал",
-       "deletionlog": "палÑ\8dнÑ\8d журнал",
+       "deletionlog": "бÑ\8bдÑ\82онÑ\8aÑ\91Ñ\81Ñ\8bн журнал",
        "rollbacklink": "ӝог берыктыны",
        "rollbacklinkcount": "$1 {{PLURAL:$1|тупатонэз}} ӝог берыктыны",
        "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
        "revertpage-nouser": "Откат шонертон (пыриськисьёс ватэм нимъёссы) доры версия {{GENDER:$1|[[User:$1|$1]]}}",
+       "protectlogpage": "Утёнъёсын журнал",
        "restriction-edit": "Тупатон",
-       "undeletehistory": "Ð\92Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c ÐºÐµ Ñ\82он Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8d, Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fз Ð»Ñ\83Ñ\8dм Ð²Ð¾Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cконÑ\8aÑ\91Ñ\81 Ð²Ð°Ð½Ñ\8c.\nÐ\91Ó§Ñ\80Ñ\8bÑ\81Ñ\8c ÐºÑ\8bлдӥзÑ\8b Ð²Ñ\8bлÑ\8c Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81 Ð¿Ð°Ð»Ñ\8dнÑ\8d ÐºÐ¾Ñ\88коно Ð»Ñ\83Ñ\8d ÐºÐµ, Ñ\81Ñ\8bӵе Ð¸Ðº Ð½Ð¸Ð¼Ñ\8bз, Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fз Ð²Ð¾Ñ\88Ñ\8aÑ\8fÑ\81Ñ\8cконÑ\8aÑ\91Ñ\81 Ð¿Ñ\80едÑ\88еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ий Ð²Ñ\8bлÑ\8cÑ\8bÑ\81Ñ\8c ÐºÑ\8bлдозÑ\8b.",
-       "undeletehistorynoadmin": "СÑ\82аÑ\82Ñ\8cÑ\8fоÑ\81 Ð¿Ð°Ð»Ñ\8dнÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð». Ð\9cÑ\83гез Ð½Ð¾ Ð¿Ð°Ð»Ñ\8dнÑ\8d Ñ\81пиÑ\81ок Ð¿Ñ\8bÑ\80идÑ\8b, Ñ\81о Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fе Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c-озÑ\8c Ð¿Ð°Ð»Ñ\8dнÑ\8dгеÑ\81, Ð·Ó§Ðº Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8d. Ð¢ÐµÐºÑ\81Ñ\82 Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fез Ñ\83даленнÑ\8bй Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82од.",
+       "undeletehistory": "Ð\91амез Ð±ÐµÑ\80ен Ñ\81Ñ\91Ñ\82одÑ\8b ÐºÐµ, Ñ\81ое Ð²Ð¾Ñ\88Ñ\82онÑ\8aÑ\91Ñ\81лÑ\8dн Ð¸Ñ\81Ñ\82оÑ\80изÑ\8b Ð±ÐµÑ\80Ñ\8bÑ\82Ñ\81коз Ð½Ð¾.\nÐ\91Ñ\8bдÑ\82он Ð±ÐµÑ\80е Ñ\82аӵе Ð¸Ðº Ð½Ð¸Ð¼ÐµÐ½ Ð²Ñ\8bлÑ\8c Ð±Ð°Ð¼ ÐºÑ\8bлдÑ\8bÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð» ÐºÐµ, Ð±ÐµÑ\80ен Ñ\81Ñ\91Ñ\82Ñ\8dм Ð²ÐµÑ\80Ñ\81иоÑ\81 Ð°Ð´Ó\9fиÑ\81Ñ\8cкозÑ\8b Ð²Ð¾Ñ\88Ñ\82онÑ\8aÑ\91Ñ\81лÑ\8dн Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fзÑ\8b Ð²Ñ\8bлÑ\8c Ð²ÐµÑ\80Ñ\81иоÑ\81лÑ\8dÑ\81Ñ\8c Ð°Ð·Ñ\8cло.",
+       "undeletehistorynoadmin": "Та Ð±Ð°Ð¼ Ð±Ñ\8bдÑ\82Ñ\8dмÑ\8bн Ð²Ð°Ð».\nÐ\91Ñ\8bдÑ\82онлÑ\8dн Ð¼Ñ\83гез Ð½Ð¾ Ñ\81пиÑ\81ок Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81лÑ\8b, ÐºÐ¸Ð½Ñ\8aÑ\91Ñ\81 Ñ\82а Ð±Ð°Ð¼ÐµÐ· Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fзÑ\8b Ñ\81ое Ð±Ñ\8bдÑ\82он Ð´Ñ\8bÑ\80озÑ\8c, Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн.\nÐ\91Ñ\8bдÑ\82Ñ\8dм Ð±Ð°Ð¼Ð»Ñ\8dÑ\81Ñ\8c Ñ\82екÑ\81Ñ\82Ñ\81Ñ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b Ð±Ñ\8bгаÑ\82о Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð³Ð¸Ð½Ñ\8d.",
        "invert": "Ватыны быръемез",
        "blanknamespace": "(Валтӥсез)",
        "contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
        "contributions-title": "$1 викиавтор гожтэмъёсы",
        "mycontris": "Гожтэмъёс",
        "anoncontribs": "Гожтэмъёс",
-       "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
+       "contribsub2": "{{GENDER:$3|$1}} гожтэмъёсы ($2)",
+       "nocontribs": "Та критериослы кельшись воштонъёс шедьтэмын ӧвӧл.",
        "month": "Толэзьысен (вазен но):",
        "year": "Арысен (вазен но):",
-       "sp-contributions-blocklog": "блокировка",
-       "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
-       "sp-contributions-blocked-notice": "Пользователь заблокирован сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
+       "sp-contributions-blocklog": "блокировкаосыз",
+       "sp-contributions-deleted": "{{GENDER:$1|викиавторлэн}} быдтэм тупатонъёсыз",
+       "sp-contributions-userrights": "пыриськисьлэн правоосыныз кивалтон",
+       "sp-contributions-blocked-notice": "Пользователь заблокировать сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
        "sp-contributions-blocked-notice-anon": "Со ip-адрес вие заблокировать сётӥзы. Блокировка журналъёсты вайытэк улӥзы берпуметӥ книгаысь:",
+       "sp-contributions-submit": "Шедьтыны",
        "whatlinkshere": "Татчы чӧлсконъёс",
        "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
        "whatlinkshere-page": "Бам:",
        "linkshere": "Та бамъёс <strong>[[:$1]]</strong> вылэ чӧлско:",
        "isredirect": "ыстӥсь бам",
        "istemplate": "пыртон",
+       "isimage": "файл линк",
        "whatlinkshere-prev": "{{PLURAL:$1|берлань|$1-лы берлань}}",
        "whatlinkshere-next": "{{PLURAL:$1|азьлань|$1-лы азьлань}}",
        "whatlinkshere-links": "← чӧлсконъёс",
+       "whatlinkshere-hideredirs": "$1 ыстӥсь бамъёсты",
        "whatlinkshere-hidetrans": "$1 пыртонъёсты",
        "whatlinkshere-hidelinks": "$1 чӧлсконъёсты",
        "whatlinkshere-filters": "Фильтръёс",
-       "block": "Блокировка пыриськисьёс",
-       "blockip": "Заблокировать {{GENDER:$1|пыриськисьёс}}",
+       "block": "Викиавторез заблокировать карыны",
+       "blockip": "{{GENDER:$1|Викиавторез}} заблокировать карыны",
+       "blockip-legend": "Блокировка пыриськисьёс",
+       "blockiptext": "Формазэ уже кутыса, кулэ луэмезъя мед заблокировать гожъян IP-адрес яке пыриськисьёслэн нимъёссы.\nТа понна гинэ но соя гинэ лэсьтэмын луыны быгатоз вандализм предотвращение с [[{{MediaWiki:Policy-url}}|правилоосты]].\nМугез возьматись улӥзы членъёсын (кылсярысь, куд-ог тодметъёссэ вандализм цитировать кароно бам).\nТӥ быгатӥськоды диапазонэз заблокировать IP-адрес, уже кутыны [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-синтаксис. Максимально диапазонэз допустимый — /$1 протокол понна IPv4 но /$2 протокол понна IPv6.",
        "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
-       "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",
-       "unblocked": "[[User:$1|$1]] разблокировать",
-       "unblocked-id": "Блокировка $1 басьтоно луиз",
-       "blocklist-target": "Ужпумъёс",
+       "ipbsubmit": "Адресъёсын та заблокировать/пыриськисьёс",
+       "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",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} гожтэмъёсы",
+       "unblocked": "[[User:$1|$1]] разблокировать каремын.",
+       "unblocked-id": "$1 номеро блокировка палэнтэмын вал.",
+       "blocklist-target": "Ужпумез",
        "blocklist-reason": "Мугез",
-       "infiniteblock": "беÑ\81Ñ\81Ñ\80оÑ\87но",
-       "expiringblock": "йÑ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкиз $1-Ñ\8bÑ\81Ñ\8c $2",
-       "anononlyblock": "аноним гинэ",
-       "noautoblockblock": "disconnect автоблокировка",
-       "createaccountblock": "гожъямъёстэс лэзьыны кылдытон учётной",
-       "emailblock": "лÑ\8dзÑ\8cÑ\8bмÑ\82Ñ\8d Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он",
-       "blocklist-nousertalk": "Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнÑ\8b Ð°Ñ\87из Ñ\83ггеÑ\81 Ð±Ñ\8bгаÑ\82Ñ\8b Ð±Ð°Ð¼Ð»Ñ\8dн Ð¾Ð±Ñ\81Ñ\83ждениоÑ\81аз",
+       "infiniteblock": "нокÑ\83",
+       "expiringblock": "йÑ\8bлпÑ\83мÑ\8aÑ\8fÑ\81Ñ\8cкоз $1 $2",
+       "anononlyblock": "анонимъёс гинэ",
+       "noautoblockblock": "автоблокировка ӧвӧл",
+       "createaccountblock": "учётной записьёсыз кылдытон дугдытэмын",
+       "emailblock": "гожÑ\82Ñ\8dÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз Ñ\8bÑ\81Ñ\82Ñ\8bлÑ\8bнÑ\8b Ñ\83г Ð»Ñ\83Ñ\8b",
+       "blocklist-nousertalk": "Ñ\83г Ð±Ñ\8bгаÑ\82Ñ\8b Ð°Ñ\81 Ð²ÐµÑ\80аÑ\81Ñ\8cкон Ð±Ð°Ð¼Ð·Ñ\8d Ð²Ð¾Ñ\88Ñ\8aÑ\8fнÑ\8b",
        "blocklink": "блокировать карыны",
-       "unblocklink": "разблокировать",
+       "unblocklink": "разблокировать карыны",
        "change-blocklink": "блокировка воштыны",
        "contribslink": "тупатонъёсыз",
-       "autoblocker": "Автоблокировка-со понна, мае тӥ IP-адрес кутыны али \"[[User:$1|$1]]\". \nБлокировка мугез $1: \"$2\"",
-       "blocklogentry": "заблокировать [[$1]] дыр $2 $3",
-       "reblock-logentry": "блокировка воштӥз [[$1]] дыр $2 $3",
-       "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[Special:BlockList|сьӧд списокын]], бан список блокъёс лэсьтыны.",
-       "unblocklogentry": "разблокировать $1",
-       "block-log-flags-anononly": "пользователь гинэ нимтултэм",
+       "autoblocker": "Автоблокировка, малы ке шуоно «[[User:$1|$1]]» тӥлесьтыд IP-адрестэс алигес уже кутӥз.\n$1 блокировкалэн мугез: «$2»",
+       "blocklogpage": "Блокировкаосын журнал",
+       "blocklogentry": "заблокировать кариз [[$1]] дырлы: $2 $3",
+       "reblock-logentry": "воштӥз блокировкалэсь йылпумъянзэ [[$1]] понна дырлы: $2 $3",
+       "blocklogtext": "Викиавторъёсты блокировкаосын но разблокировкаосын журнал.\nАвтоматически блокировать кариськись IP-адресъёс татын уг адӟытӥсько.\nУчке [[Special:BlockList|списокез али кутӥськись блокировкаослы]].",
+       "unblocklogentry": "разблокировать кариз $1",
+       "block-log-flags-anononly": "аноним викиавторъёс гинэ",
        "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
        "block-log-flags-noemail": "лэзьымтэ гожтэт ыстон",
-       "block-log-flags-nousertalk": "Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнÑ\8b Ð°Ñ\87из Ñ\83ггеÑ\81 Ð±Ñ\8bгаÑ\82Ñ\8b Ð±Ð°Ð¼Ð»Ñ\8dн Ð¾Ð±Ñ\81Ñ\83ждениоÑ\81аз",
-       "range_block_disabled": "Администратор диапазонэз блокировать али.",
+       "block-log-flags-nousertalk": "Ñ\83г Ð±Ñ\8bгаÑ\82Ñ\8b Ð°Ñ\81 Ð²ÐµÑ\80аÑ\81Ñ\8cкон Ð±Ð°Ð¼Ð·Ñ\8d Ð²Ð¾Ñ\88Ñ\8aÑ\8fнÑ\8b",
+       "range_block_disabled": "Администраторъёслэн диапазонъёсыз блокировать карыны луонлыксы дугдытэмын.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
        "movelogpage": "Нимъёсты воштонъёсын журнал",
        "export": "Бамъёсты поттон",
        "tooltip-t-whatlinkshere": "Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань",
        "tooltip-t-recentchangeslinked": "Выль тупатонъёс бамъёсын, кудъёссэ та бам чӧлске",
        "tooltip-feed-atom": "Та бамлэн Atom-е трансляциез",
+       "tooltip-t-contributions": "{{GENDER:$1|Та викиавторен}} тупатэм бамъёслы список",
        "tooltip-t-upload": "Файл поныны",
        "tooltip-t-specialpages": "Специальной бамъёслэн списоксы",
        "tooltip-t-print": "Та бамысь печатламон версия",
        "metadata": "Метаданнойёс",
        "metadata-help": "Файл пушкын информация вань на, кудзэ лыдпусо камераос яке сканеръёс файлэз кылдытыку огшоры ватсалляло.\nКылдытон бере файл воштӥськиз ке, куд-огез параметръёс воштэм суредлы ярантэм луыны быгато.",
        "metadata-fields": "Суредысь метаданнойёслэн та списоке пыртэм полеоссы адӟытӥськозы суред бам вылын, метаданнойёслэн таблицазы бинемын дыръя.\nМукет полеоссы ватскозы.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Ориентация",
        "exif-xresolution": "Горизонтальной разрешение",
        "exif-yresolution": "Вертикальной разрешение",
        "exif-datetime": "Файлэз воштонлэн датаез но дырыз",
+       "exif-make": "Камера лэсьтӥсь",
        "exif-model": "Камералэн моделез",
        "exif-software": "Компьютер программаос",
        "exif-exifversion": "Exif версия",
        "exif-colorspace": "Буёлъёслэн пространствозы",
+       "exif-datetimeoriginal": "Нырысь дата но дыр",
+       "exif-datetimedigitized": "Цифраослы пӧрмытонлэн датаез но дырыз",
        "exif-disclaimer": "Кыл кутыны пумит луон",
+       "exif-orientation-1": "Огшоры",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
-       "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
+       "confirmrecreate-noreason": "Тӥ та бам тупатыны кутскиды бере, [[User:$1|$1]] ([[User talk:$1|вер]]) викиавтор сое {{GENDER:$1|быдтӥз}}. Тауна, юнматэ, та бамез выльысь кылдытэмды зэм но потэ шуыса.",
        "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
        "autosumm-new": "Выль бам: «$1»",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|вераськон]])",
        "version": "Версия",
        "specialpages": "Ваньмыз панельёс",
-       "specialpages-group-login": "ТÑ\83Ñ\81бÑ\83Ñ\8fÑ\81Ñ\8cкÑ\8bнÑ\8b / Ð\93ожÑ\82Ó¥Ñ\81Ñ\8cконо",
-       "specialpages-group-users": "Ð\9fÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8dÑ\81 Ð½Ð¾",
+       "specialpages-group-login": "СиÑ\81Ñ\82емае Ð¿Ñ\8bÑ\80он / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f",
+       "specialpages-group-users": "Ð\92икиавÑ\82оÑ\80Ñ\8aÑ\91Ñ\81 Ð½Ð¾ Ð¿Ñ\80авооÑ\81Ñ\81Ñ\8b",
        "tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
-       "logentry-delete-delete": "$1 {{GENDER:$2|палÑ\8dнÑ\82Ñ\8bнÑ\8b|палÑ\8dнÑ\82Ñ\8bнÑ\8b}} Ð±Ð°Ð¼ $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|бÑ\8bдÑ\82ӥз}} $3 Ð±Ð°Ð¼ÐµÐ·",
        "logentry-delete-restore": "$1 {{GENDER:$2|выльысь}} бам $3",
+       "logentry-block-block": "$1 {{GENDER:$2|заблокировать}} {{GENDER:$4|$3}} ын дыраз $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|воштыны}} блокировка дыръя {{GENDER:$4|$3}} ын дыраз $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|заблокировать}} {{GENDER:$4|$3}} ын дыраз $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|воштыны}} блокировка дыръя {{GENDER:$4|$3}} ын дыраз $5 $6",
        "logentry-move-move": "$1 $3 бамлы $4 выль ним {{GENDER:$2|сётӥз}}",
        "logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
        "logentry-upload-upload": "$1 {{GENDER:$2|понӥз}} $3",
        "searchsuggest-search": "Утчано {{SITENAME}}",
        "searchsuggest-containing": "кудъёсаз вань...",
-       "api-error-autoblocked": "Тон IP-адрес заблокировать эрказ луи, малы ке шуоно со заблокировать пользователь кутыны луоз.",
-       "api-error-blocked": "Редактирование заблокировать вал тӥлесьтыд.",
        "expand_templates_preview": "Эскерон",
        "log-action-filter-all": "Ваньзэ"
 }
index 18d73a6..de19903 100644 (file)
        "searcharticle": "Перейти",
        "history": "Історія сторінки",
        "history_short": "Історія",
+       "history_small": "історія",
        "updatedmarker": "оновлено після мого останнього перегляду",
        "printableversion": "Версія до друку",
        "permalink": "Постійне посилання",
        "talk": "Обговорення",
        "views": "Перегляди",
        "toolbox": "Інструменти",
-       "tool-link-userrights": "Змінити групи {{GENDER:$1|користувачів}}",
+       "tool-link-userrights": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
        "tool-link-userrights-readonly": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
-       "tool-link-emailuser": "Ð\9dадÑ\96Ñ\81лаÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онного Ð»Ð¸Ñ\81Ñ\82а {{GENDER:$1|Ñ\86Ñ\8cомÑ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87евÑ\96\86Ñ\96й користувачці}}",
+       "tool-link-emailuser": "Ð\9bиÑ\81Ñ\82 {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87евÑ\96|користувачці}}",
        "userpage": "Переглянути сторінку користувача",
        "projectpage": "Переглянути сторінку проекту",
        "imagepage": "Переглянути сторінку файлу",
        "blockedtitle": "Користувача заблоковано",
        "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.",
+       "systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
        "blockednoreason": "не вказано причини",
        "whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
        "confirmedittext": "Ви повинні підтвердити вашу адресу електронної пошти перед редагуванням сторінок.\nБудь-ласка вкажіть і підтвердіть вашу електронну адресу на [[Special:Preferences|сторінці налаштувань]].",
        "revdelete-hide-image": "Приховати вміст файлу",
        "revdelete-hide-name": "Приховати цілі та параметри",
        "revdelete-hide-comment": "Коментар редагування",
-       "revdelete-hide-user": "Ім'я автора/IP адреса",
+       "revdelete-hide-user": "Ім'я редактора/IP-адреса",
        "revdelete-hide-restricted": "Приховати дані також і від адміністраторів",
        "revdelete-radio-same": "(не змінювати)",
        "revdelete-radio-set": "Приховано",
        "saveprefs": "Зберегти",
        "restoreprefs": "Відновити всі стандартні налаштування (у всіх розділах)",
        "prefs-editing": "Редагування",
-       "rows": "Рядків:",
-       "columns": "Стовпців:",
        "searchresultshead": "Пошук",
        "stub-threshold": "Поріг для визначення оформлення посилань на стаби ($1):",
        "stub-threshold-sample-link": "зразок",
        "userrights-user-editname": "Введіть ім'я користувача:",
        "editusergroup": "Завантажити групи користувачів",
        "editinguser": "Зміна прав {{GENDER:$1|користувача}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Перегляд прав {{GENDER:$1|користувача|користувачки}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
+       "userrights-viewusergroup": "Перегляд груп користувача",
        "saveusergroups": "Зберегти групи {{GENDER:$1|користувачів}}",
        "userrights-groupsmember": "Член груп:",
        "userrights-groupsmember-auto": "Неявний член:",
        "action-upload_by_url": "завантаження цього файлу з адреси URL",
        "action-writeapi": "використання API для редагувань",
        "action-delete": "вилучення цієї сторінки",
-       "action-deleterevision": "вилучення цієї версії сторінки",
-       "action-deletedhistory": "перегляд вилученої історії редагувань цієї сторінки",
+       "action-deleterevision": "вилучення версій",
+       "action-deletelogentry": "вилучення записів журналу",
+       "action-deletedhistory": "перегляд вилученої історії редагувань сторінки",
+       "action-deletedtext": "перегляд тексту вилученої версії",
        "action-browsearchive": "пошук вилучених сторінок",
-       "action-undelete": "вÑ\96дновленнÑ\8f Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки",
-       "action-suppressrevision": "перегляд і відновлення цієї прихованої версії",
+       "action-undelete": "вÑ\96дновленнÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок",
+       "action-suppressrevision": "перегляд і відновлення прихованих версій",
        "action-suppressionlog": "перегляд цього приватного журналу",
        "action-block": "блокування цього дописувача",
        "action-protect": "зміну рівня захисту цієї сторінки",
        "action-userrights-interwiki": "зміну прав користувачів у інших вікі",
        "action-siteadmin": "блокування і розблоковування баз даних",
        "action-sendemail": "відправка електронної пошти",
+       "action-editmyoptions": "редагування власних налаштувань",
        "action-editmywatchlist": "редагування Вашого списку спостереження",
        "action-viewmywatchlist": "перегляд власного списку спостереження",
        "action-viewmyprivateinfo": "перегляд своєї приватної інформації",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показати",
+       "rcfilters-activefilters": "Активні фільтри",
+       "rcfilters-search-placeholder": "Фільтруйте нові редагування (переглядайте або почніть вводити)",
+       "rcfilters-invalid-filter": "Недійсний фільтр",
+       "rcfilters-filterlist-title": "Фільтри",
+       "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "rcfilters-filtergroup-authorship": "Авторство редагувань",
+       "rcfilters-filter-editsbyself-label": "Ваші власні редагування",
+       "rcfilters-filter-editsbyself-description": "Редагування, зроблені Вами.",
+       "rcfilters-filter-editsbyother-label": "Редагування, зроблені іншими",
+       "rcfilters-filter-editsbyother-description": "Редагування, виконані іншими користувачами (не Вами)",
+       "rcfilters-filtergroup-userExpLevel": "Рівень досвіду користувачів",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новачки",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Дуже нові редактори: менш ніж 10 редагувань і 4 дні активності.",
+       "rcfilters-filter-userExpLevel-learner-label": "Учні",
+       "rcfilters-filter-userExpLevel-learner-description": "Більше днів активності та більше редагувань, ніж у «новачків», але менше, ніж у «досвідчених користувачів».",
+       "rcfilters-filter-userExpLevel-experienced-label": "Досвідчені користувачі",
+       "rcfilters-filter-userExpLevel-experienced-description": "Більше 30 днів активності і понад 500 редагувань.",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "uncategorizedcategories": "Некатегоризовані категорії",
        "uncategorizedimages": "Некатегоризовані зображення",
        "uncategorizedtemplates": "Некатегоризовані шаблони",
+       "uncategorized-categories-exceptionlist": " # Містить список категорій, які не мають згадуватись на сторінці Special:UncategorizedCategories. Одна категорія на рядок, починається з «*». Рядки, що починаються з іншого символу (включно з пробілом) ігноруються. Використовуйте «#» для коментарів.",
        "unusedcategories": "Категорії, що не використовуються",
        "unusedimages": "Файли, що не використовуються",
        "wantedcategories": "Необхідні категорії",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. {{GENDER:$2|Ваш}} електронний лист потрапить безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "changecontentmodel-emptymodels-title": "Немає доступних моделей коментарів",
        "changecontentmodel-emptymodels-text": "Вміст сторінки [[:$1]] не може бути перетворений до будь якого типу.",
        "log-name-contentmodel": "Журнал змін моделі вмісту",
-       "log-description-contentmodel": "Ð\9fодÑ\96Ñ\97, Ð¿Ð¾Ð²'Ñ\8fзанÑ\96 Ð· Ð¼Ð¾Ð´ÐµÐ»Ñ\8fми Ð²Ð¼Ñ\96Ñ\81Ñ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нки",
+       "log-description-contentmodel": "Ð\9dа Ñ\86Ñ\96й Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¿ÐµÑ\80елÑ\96Ñ\87енÑ\96 Ð·Ð¼Ñ\96ни Ð´Ð¾ ÐºÐ¾Ð½Ñ\82енÑ\82ниÑ\85 Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ Ñ\81Ñ\82оÑ\80Ñ\96нок, Ð° Ñ\82акож Ñ\81Ñ\82оÑ\80Ñ\96нки, Ñ\81Ñ\82воÑ\80енÑ\96 Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|створив|створила}} сторінку $3, використовуючи нестандартну модель вмісту «$5»",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|змінив|змінила}} модель вмісту сторінки $3 з «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "відкинути",
        "sorbs": "DNSBL",
        "sorbsreason": "Ваша IP-адреса числиться як відкритий проксі в DNSBL.",
        "sorbs_create_account_reason": "Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.",
+       "softblockrangesreason": "Анонімний внесок заборонений з Вашої IP-адреси ($1). Будь ласка, увійдіть у систему.",
        "xffblockreason": "IP-адреса в X-Forwarded-For полі заголовка, або ваша, або проксі сервера, що використовується вами, заблокована. Початкова причина блокування була:$1",
        "cant-see-hidden-user": "Користувача, якого ви хочете заблокувати, вже заблоковано та приховано. Оскільки у вас немає прав щодо приховання користувачів, ви не можете переглянути або змінити дане блокування.",
        "ipbblocked": "Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані",
        "cant-move-to-user-page": "У вас нема дозволу перейменовувати сторінки на сторінки простору «Користувач» (окрім підсторінок)",
        "cant-move-category-page": "У вас немає прав перейменовувати сторінки категорій.",
        "cant-move-to-category-page": "У вас немає дозволу перейменовувати сторінку на сторінку категорії.",
+       "cant-move-subpages": "У Вас немає прав на перейменування підсторінок.",
+       "namespace-nosubpages": "Простір назв «$1» не дозволяє використання підсторінок.",
        "newtitle": "Нова назва:",
        "move-watch": "Спостерігати за цією сторінкою",
        "movepagebtn": "Перейменувати сторінку",
        "pageinfo-length": "Довжина сторінки (в байтах)",
        "pageinfo-article-id": "ID сторінки",
        "pageinfo-language": "Мова вмісту сторінки",
+       "pageinfo-language-change": "Змінити",
        "pageinfo-content-model": "Модель вмісту сторінки",
        "pageinfo-content-model-change": "змінити",
        "pageinfo-robot-policy": "Індексація пошуковими системами",
        "timezone-local": "Місцеві",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
-       "restricted-displaytitle": "<strong>Увага:</strong> Ð\92Ñ\96добÑ\80ажÑ\83ванÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Â«$1» Ð±Ñ\83ло Ð¿Ñ\80оÑ\96гноÑ\80овано, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ð¾Ð½Ð¾ Ð½Ðµ Ð²Ñ\96дповÑ\96даÑ\94 Ð²Ð»Ð°Ñ\81не назві сторінки.",
+       "restricted-displaytitle": "<strong>Увага:</strong> Ð\92Ñ\96добÑ\80ажÑ\83ванÑ\83 Ð½Ð°Ð·Ð²Ñ\83 Â«$1» Ð±Ñ\83ло Ð¿Ñ\80оÑ\96гноÑ\80овано, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ð¾Ð½Ð° Ð½Ðµ Ð²Ñ\96дповÑ\96даÑ\94 Ñ\87иннÑ\96й назві сторінки.",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
        "version": "Версія MediaWiki",
        "version-extensions": "Установлені розширення",
        "tags": "Чинні мітки змін",
        "tag-filter": "Фільтр&nbsp;[[Special:Tags|міток]]:",
        "tag-filter-submit": "Відфільтрувати",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки|Міток}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки}}]]: $2)",
        "tag-mw-contentmodelchange": "зміна контентної моделі",
        "tag-mw-contentmodelchange-description": "Редагування, якими була здійснена [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel зміна контентної моделі] сторінки",
        "tags-title": "Мітки",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Пошук {{GRAMMAR:locative|{{SITENAME}}}}",
        "searchsuggest-containing": "що містять...",
-       "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
-       "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
        "api-error-badtoken": "Внутрішня помилка: некоректний токен.",
-       "api-error-blocked": "Можливість редагування для вас заблоковано.",
-       "api-error-copyuploaddisabled": "На цьому сервері вимкнене завантаження за URL-адресою.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|1=існує інший файл|існують інші файли}} з таким самим вмістом.",
-       "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був файл|були файли}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
-       "api-error-empty-file": "Файл, який ви надіслали, порожній.",
        "api-error-emptypage": "Створення нової порожньої сторінки неприпустиме.",
-       "api-error-fetchfileerror": "Внутрішня помилка: щось пішло не так під час отримання файлу.",
-       "api-error-fileexists-forbidden": "Файл з назвою «$1» вже існує і його не можна перезаписати.",
-       "api-error-fileexists-shared-forbidden": "Файл з назвою «$1» вже існує в сховищі спільних файлів, його не можна перезаписати.",
-       "api-error-file-too-large": "Файл, який ви надіслали, завеликий.",
-       "api-error-filename-tooshort": "Назва файлу занадто коротка.",
-       "api-error-filetype-banned": "Цей тип файлів заборонений.",
-       "api-error-filetype-banned-type": "$1 — {{PLURAL:$4|1=недозволений тип файлів|недозволені типи файлів}}. {{PLURAL:$3|1=Дозволений тип файлів|Дозволені типи файлів}}: $2.",
-       "api-error-filetype-missing": "У цього файла відсутнє розширення.",
-       "api-error-hookaborted": "Зміну, що Ви намагалися зробити, відкинуто обробником.",
-       "api-error-http": "Внутрішня помилка: Не вдається підключитися до сервера.",
-       "api-error-illegal-filename": "Неприпустиме ім'я файлу.",
-       "api-error-internal-error": "Внутрішня помилка: Щось пішло не так під час обробки вашого завантаження на вікі.",
-       "api-error-invalid-file-key": "Внутрішня помилка: Файл не знайдено в тимчасовому сховищі.",
-       "api-error-missingparam": "Внутрішня помилка: Відсутні параметри за запитом.",
-       "api-error-missingresult": "Внутрішня помилка: не вдалося визначити, чи пройшло копіювання вдало.",
-       "api-error-mustbeloggedin": "Ви повинні увійти в систему для завантаження файлів.",
-       "api-error-mustbeposted": "Внутрішня помилка: Запит вимагає HTTP POST.",
-       "api-error-noimageinfo": "Завантаження завершено, але сервер не надав ніякої інформації про файл.",
-       "api-error-nomodule": "Внутрішня помилка: Відсутній модуль завантажень.",
-       "api-error-ok-but-empty": "Внутрішня помилка: сервер не відповідає.",
-       "api-error-overwrite": "Заміну існуючого файлу не дозволено.",
-       "api-error-ratelimited": "Ви намагаєтесь завантажити більше файлів за короткий проміжок часу, ніж дозволено у цій вікі. Будь ласка, спробуйте за декілька хвилин.",
-       "api-error-stashfailed": "Внутрішня помилка: сервер не зміг зберегти тимчасовий файл.",
        "api-error-publishfailed": "Внутрішня помилка: сервер не зміг опублікувати тимчасовий файл.",
-       "api-error-stasherror": "Сталася помилка при завантаженні файлу у сховище.",
-       "api-error-stashedfilenotfound": "Неможливо знайти прихований файл, під час спроби його надсилання зі схованки.",
-       "api-error-stashpathinvalid": "Шлях, за яким повинен знаходитись прихований файл, є хибним.",
-       "api-error-stashfilestorage": "Сталася помилка під час збереження файлу в схованці.",
-       "api-error-stashzerolength": "Сервер не може зберегти файл, тому що він має нульовий розмір.",
-       "api-error-stashnotloggedin": "Ви повинні увійти в систему, аби мати змогу зберігати файли у сховку завантажень.",
-       "api-error-stashwrongowner": "Файл, до якого ви намагалися отримати доступ в схованці, не належить вам.",
-       "api-error-stashnosuchfilekey": "Ключ файлу, до якого Ви намагались отримати доступ у сховку, не існує.",
-       "api-error-timeout": "Сервер не відповідає протягом очікуваного часу.",
-       "api-error-unclassified": "Сталася невідома помилка.",
-       "api-error-unknown-code": "Невідома помилка: «$1»",
-       "api-error-unknown-error": "Внутрішня помилка: щось пішло не так, при спробі завантажити файл.",
-       "api-error-unknown-warning": "Невідоме попередження: $1",
+       "api-error-stashfailed": "Внутрішня помилка: сервер не зміг зберегти тимчасовий файл.",
+       "api-error-unknown-warning": "Невідоме попередження: «$1».",
        "api-error-unknownerror": "Невідома помилка: \"$1\".",
-       "api-error-uploaddisabled": "Завантаження вимкнуто у цій вікі.",
-       "api-error-verification-error": "Цей файл можливо пошкоджено, або він має неправильне розширення.",
-       "api-error-was-deleted": "Файл із цією назвою раніше було завантажено і згодом вилучено.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунди|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|хвилина|хвилини|хвилин}}",
        "duration-hours": "$1 {{PLURAL:$1|година|години|годин}}",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Мова за замовчуванням",
        "pagelang-select-lang": "Оберіть мову",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Відправити",
+       "pagelang-nonexistent-page": "Сторінка $1 не існує.",
+       "pagelang-unchanged-language": "Мова сторінки $1 вже визначена як «$2».",
+       "pagelang-unchanged-language-default": "Мова сторінки $1 вже визначена як стандартна мова вмісту.",
+       "pagelang-db-failed": "База даних не змогла змінити мову сторінки.",
        "right-pagelang": "зміна мови сторінки",
        "action-pagelang": "змінити мову сторінки",
        "log-name-pagelang": "Журнал змін мови",
        "sessionprovider-nocookies": "Куки можуть бути відключені. Переконайтеся, що у Вас включені cookies і почніть знову.",
        "randomrootpage": "Випадкова коренева сторінка",
        "log-action-filter-block": "Тип блокування:",
-       "log-action-filter-contentmodel": "Тип Ð¼Ð¾Ð´Ð¸Ñ\84Ñ\96каÑ\86Ñ\96Ñ\97 contentmodel:",
+       "log-action-filter-contentmodel": "Тип Ð·Ð¼Ñ\96ни ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\97 Ð¼Ð¾Ð´ÐµÐ»Ñ\96:",
        "log-action-filter-delete": "Тип вилучення:",
        "log-action-filter-import": "Тип імпорту:",
        "log-action-filter-managetags": "Тип дії з управління тегами:",
        "log-action-filter-block-block": "Блокування",
        "log-action-filter-block-reblock": "Зміна блокування",
        "log-action-filter-block-unblock": "Розблокування",
-       "log-action-filter-contentmodel-change": "Зміна Contentmodel",
-       "log-action-filter-contentmodel-new": "СÑ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e Contentmodel",
+       "log-action-filter-contentmodel-change": "Зміна контентної моделі",
+       "log-action-filter-contentmodel-new": "СÑ\82воÑ\80еннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð· Ð½ÐµÑ\81Ñ\82андаÑ\80Ñ\82ноÑ\8e ÐºÐ¾Ð½Ñ\82енÑ\82ноÑ\8e Ð¼Ð¾Ð´ÐµÐ»Ð»Ñ\8e",
        "log-action-filter-delete-delete": "Видалення сторінки",
        "log-action-filter-delete-delete_redir": "Перезапис перенаправлення",
        "log-action-filter-delete-restore": "Відновлення сторінки",
        "usercssispublic": "Будь ласка, зверніть увагу: підсторінки CSS не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
        "restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
-       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "версія $1",
+       "pageid": "ID сторінки $1"
 }
index de2ee22..c688878 100644 (file)
@@ -29,7 +29,8 @@
                        "Hindustanilanguage",
                        "امین اکبر",
                        "Jdforrester",
-                       "قیصرانی"
+                       "قیصرانی",
+                       "Junaid Ahmad"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "views": "مشاہدات",
        "toolbox": "آلات",
        "tool-link-userrights": "حلقہ ہائے {{GENDER:$1|صارف}} میں تبدیلی",
+       "tool-link-userrights-readonly": "حلقے{{GENDER:$1|}}دیکھیں",
        "tool-link-emailuser": "اس {{GENDER:$1|صارف}} کو برقی خط لکھیں",
        "userpage": "صارف کا صفحہ دیکھیے",
        "projectpage": "منصوبہ کا صفحہ دیکھیے",
        "passwordreset-emaildisabled": "اس ویکی پر برقی خط کی سہولت غیر فعال ہیں۔",
        "passwordreset-username": "اسمِ صارف:",
        "passwordreset-domain": "ساحہ:",
-       "passwordreset-capture": "برقی خط کی حتمی شکل دیکھیں؟",
-       "passwordreset-capture-help": "اس خانے کو نشان زد کرنے کی صورت میں (عارضی پاس ورڈ کا حامل) برقی خط آپ کو بھی نظر آئے گا اور صارف کو بھی روانہ کیا جائے گا۔",
        "passwordreset-email": "برقی ڈاک پتہ:",
        "passwordreset-emailtitle": "{{SITENAME}} کھاتہ کی تفصیلات",
        "passwordreset-emailelement": "صارف نام:\n$1\n\nعارضی پاس ورڈ: \n$2",
        "passwordreset-emailsentemail": "اگر یہ برقی ڈاک پتا آپ کے کھاتے سے منسلک ہے تو پاس ورڈ کی ترتیب نو کا برقی خط بھیج دیا جائے گا۔",
        "passwordreset-emailsentusername": "اگر کوئی برقی ڈاک پتا آپ کے کھاتے سے منسلک ہے تو پاس ورڈ کی ترتیب نو کا برقی خط بھیج دیا جائے گا۔",
-       "passwordreset-emailsent-capture2": "پاس ورڈ کی ترتیب نو {{PLURAL:$1|کا برقی خط بھیج دیا گیا ہے|کے برقی خطوط بھیج دیے گئے ہیں}}۔ {{PLURAL:$1|صارف نام اور پاس ورڈ|صارف ناموں اور ان کے پاس ورڈ کی فہرست}} یہاں ملاحظہ فرمائیں۔",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|صارف}} کو برقی خط بھیجنے میں ناکامی: $1\n{{PLURAL:$3|صارف نام اور پاس ورڈ|صارف ناموں کی فہرست اور ان کے پاس ورڈ}} یہاں ملاحظہ فرمائیں۔",
        "passwordreset-nocaller": "کالر کا فراہم کیا جانا لازمی ہے",
        "passwordreset-nosuchcaller": "کالر موجود نہیں: $1",
        "passwordreset-ignored": "پاس ورڈ کی ترتیب نو مکمل نہیں ہو سکی۔ شاید کوئی پرووائڈر فراہم نہیں کیا گیا؟",
        "continue-editing": "خانہ ترمیم میں جائیں",
        "previewconflict": "اس نمائش میں خانہ ترمیم کے اوپر موجود متن جس انداز میں ظاہر ہو رہا ہے، محفوظ کرنے کے بعد اسی طرح نظر آئے گا۔",
        "session_fail_preview": "معذرت! نشست کے مواد میں خامی کی وجہ سے آپ کی  ترمیم مکمل نہیں ہو سکی۔\n\nشاید آپ اپنے کھاتے سے خارج ہو گئے ہیں۔ <strong>براہ کرم اس بات کی تصدیق کر لیں کہ آپ داخل ہیں اور دوبارہ کوشش کریں۔</strong> اگر آپ کو پھر بھی مشکل پیش آرہی ہو تو ایک بار [[Special:UserLogout|خارج ہو کر]] واپس داخل ہو جائیں اور اپنے براؤزر کو جانچ لیں کہ آیا وہ اس سائٹ کی کوکیز اخذ کر رہا ہے یا نہیں۔",
+       "session_fail_preview_html": "معاف کیجیے گا!سیشن ڈاٹا کے نقصان کی وجہ سے ہم آپ کی تبدیلی نافذنہیں کرسکتے.\n<em>چونکہ{{SITENAME}}نے نامکملHTMLکوفعال کررکھاہے,اس لئےنمائش کوجاوااسکرپٹ کےحملوں سےحفاظت کےلئےپوشیدہ کردیاگیاہے.</em>\n<strong>اگرتبدیلی کی یہ جدوجہدقانونی ہےتوبرائےمہربانی دوبارہ کوشش کریں.<strong>\nاگراس کےبعدبھی کام نہ کرے تو[[Special:UserLogout|logging out]]لاگ آؤٹ ہوکردوبارہ لاگ ان کیجیے.اورجانچ کیجیے کہ آپ کابراؤزراس سائٹ کےکوکیزکی اجأزت دیتاہےیانہیں.",
        "edit_form_incomplete": "<strong>خانہ ترمیم سے کچھ حصے سرور تک نہیں پہنچ سکے ہیں؛ براہ کرم اپنی ترامیم کو دوبارہ جانچ لیں کہ آیا وہ برقرار ہیں یا نہیں اور دوبارہ کوشش کریں۔</strong>",
        "editing": "آپ \"$1\" میں ترمیم کر رہے ہیں۔",
        "creating": "زیر تخلیق $1",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.",
        "userrights-nodatabase": "ڈیٹابیس $1 موجود نہیں یا مقامی نہیں۔",
-       "userrights-nologin": "اختیارات تفویض کرنے کے لیے آپ کا کسی منتظم کھاتے سے [[Special:UserLogin|داخل ہونا]] ضروری ہے۔",
-       "userrights-notallowed": "آپ کو  اختیارات تفویض کرنے یا انہیں واپس لینے کی اجازت نہیں ہے۔",
        "userrights-changeable-col": "مجموعات جو آپ تبدیل کرسکتے ہیں",
        "userrights-unchangeable-col": "مجموعات جو آپ تبدیل نہیں کرسکتے",
        "userrights-conflict": "اختیارات کی تبدیلی میں تنازعہ! براہ کرم نظر ثانی کریں اور اپنی تبدیلیوں کی تصدیق کریں۔",
-       "userrights-removed-self": "آپ نے اپنے اختیارات ختم کر لیے ہیں، چنانچہ اب یہ صفحہ آپ کی دسترس سے باہر ہو گیا ہے۔",
        "group": "حلقہ:",
        "group-user": "صارفین",
        "group-autoconfirmed": "خود توثیق شدہ صارفین",
        "right-siteadmin": "ڈیٹابیس کو مقفل یا غیر مقفل کرنا",
        "right-override-export-depth": "پانچویں سطح کی گہرائی تک مربوط صفحات پر مشتمل صفحات کی برآمد",
        "right-sendemail": "دیگر صارفین کو برقی ڈاک بھیجیں",
-       "right-passwordreset": "پاس ورڈ کی ترتیب نو کے حامل برقی خطوط کا معائنہ",
        "right-managechangetags": "[[Special:Tags|ٹیگوں]] کی تخلیق اور (غیر)فعالی",
        "right-applychangetags": "کسی کی تبدیلیوں کے ساتھ [[Special:Tags|ٹیگوں]] کا اطلاق",
        "right-changetags": "انفرادی نسخوں اور نوشتہ کے اندراج پر [[Special:Tags|ٹیگوں]] کا حذف و اضافہ",
        "action-writeapi": "اے پی آئی تحریر کے استعمال کرنے",
        "action-delete": "یہ صفحہ حذف کرنے",
        "action-deleterevision": "یہ نسخہ حذف کرنے",
-       "action-deletedhistory": "اس صفحہ کا حذف شدہ تاریخچہ دیکھنے",
+       "action-deletedhistory": "اس صفحہ کا حذف شدہ تاریخچہ دیکھیں",
        "action-browsearchive": "حذف شدہ صفحات میں تلاش کرنے",
-       "action-undelete": "اس صفحہ کو بحال کرنے",
+       "action-undelete": "یہ صفحہ بحال کرنے",
        "action-suppressrevision": "اس پوشیدہ ترمیم کی نظرثانی اور بحال کرنے",
        "action-suppressionlog": "نجی نوشتہ کے دیکھنے",
        "action-block": "اس صارف پر پابندی لگانے",
index 9a4f66e..9ca5fde 100644 (file)
        "nstab-template": "Batakan",
        "nstab-help": "Pakli hin pabulig",
        "nstab-category": "Kaarangay",
-       "mainpage-nstab": "Panguna nga pakli",
+       "mainpage-nstab": "Syahan nga Pakli",
        "nosuchaction": "Waray sugad nga buhat",
        "nosuchactiontext": "An buhat nga gin-ispisipikar han URL diri puyde.\nBangin la, nagsayop ka pagmakinilya han URL, o sinmunod hin sayop nga sumpay.\nBangin liwat ini usa nga bug dida han software nga ginagamit han {{SITENAME}}.",
        "nosuchspecialpage": "Waray sugad nga pinaurog nga pakli",
        "passwordreset-emaildisabled": "Mga mga higamit ha email in waray pinaandar hini nga wiki.",
        "passwordreset-username": "Agnay hiton gumaramit:",
        "passwordreset-domain": "Dominyo:",
-       "passwordreset-capture": "Kikitaon mo an resulta nga e-mail?",
-       "passwordreset-capture-help": "Kun imo igtsek ini nga kahon, an email (lakip an temporaryo nga tigaman-panakob) in igpapakita ha imo labot la han ginpadangat ha gumaramit.",
        "passwordreset-email": "E-mail adres:",
        "passwordreset-emailtitle": "Mga detalye han akawnt ha {{SITENAME}}",
        "passwordreset-emailtext-ip": "Mayda gumaramit (bangin hi ikaw, tikang han IP adres nga $1) nga naghangyo hin reset han imo tigaman-pansulod han {{SITENAME}} ($4). An nasunod nga gumaramit {{PLURAL:$3|nga akawnt|nga mga akawnt}} nahanungod hini nga email nga adres: \n\n$2\n\n{{PLURAL:$3|Iní nga temporaryo nga tigaman-pansulod|Iní nga mga temporaryo nga tigaman-pansulod}} ma-waray bali hin {{PLURAL:$5|usa ka adlaw|$5 nga mga adlaw}}.\nAngay ka sumakob ngan pumílì hin bag-o nga tigaman-pansulod ha yanâ.  Kun mayda lain nga naghatag hini nga hangyo, o kun nahinumdoman mo an imo orihinal nga tigaman-pansulod, ngan nadírì ka na pagbalyo hiní, puyde mo pasagdan ini nga sumat ngan magpadayon hin paggamit han imo daan nga tigaman-pansulod.",
        "searchprofile-advanced-tooltip": "Pamilnga ha mga nabatasan nga ngaran-lat'ang",
        "search-result-size": "$1 ({{PLURAL:$2|1 nga pulong|$2 nga mga pulong}})",
        "search-result-category-size": "{{PLURAL:$1|1 nga api|$1 nga mga api}} ({{PLURAL:$2|1 nga ubos-nga-kaarangay|$2 nga mga ubos-nga-kaarangay}}, {{PLURAL:$3| 1 nga fayl|$3 nga mga fayl}})",
-       "search-redirect": "(redirekta $1)",
+       "search-redirect": "(Ginredirekta tikang ha $1)",
        "search-section": "(bahin $1)",
        "search-category": "(kaarangay $1)",
        "search-suggest": "Buot sidngon mo ba: $1",
        "saveprefs": "Igtipig",
        "restoreprefs": "Igbalik an ngatanan ngada nga aada-nga-daan nga settings (ha ngatanan nga mga bahin)",
        "prefs-editing": "Ginliliwat",
-       "rows": "Mga rumbay pahigda:",
-       "columns": "Mga rumbay patindog:",
        "searchresultshead": "Bilnga",
        "stub-threshold-sample-link": "pananglitan",
        "stub-threshold-disabled": "Waray ginpagana",
        "userrights-reason": "Katadungan:",
        "userrights-no-interwiki": "\nDiri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki.",
        "userrights-nodatabase": "Waray kaaagii an Database $1 o diri ini aada ha lokal.",
-       "userrights-notallowed": "Waray nim pagtugot hin pagdugang o pagtanggal hin mga katungod han gumaramit.",
        "userrights-changeable-col": "Mga hugpo nga puydi mo labtan",
        "userrights-unchangeable-col": "Mga hugpo nga diri mo puydi labtan",
-       "userrights-removed-self": "Imo gintanggal an imo kalugaringon mga katungod. Tungod hito, diri kana makaka-access hinin nga pakli.",
        "group": "Hugpo:",
        "group-user": "Mga gumaramit",
        "group-autoconfirmed": "Mga gumaramit nga lugaring nakokonpirma",
        "right-userrights-interwiki": "Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki",
        "right-siteadmin": "Igtrangka ngan igrangka an database",
        "right-sendemail": "Padad-i hin e-mail ngada ha iba nga mga gumaramit",
-       "right-passwordreset": "Pakit-a an mga password reset email",
        "right-deletechangetags": "Igpara an [[Special:Tags|tags]] tikang han database",
        "grant-generic": "mga katungod nga katitirok han \"$1\"",
        "grant-group-page-interaction": "Pakig-interact han mga pakli",
        "whatlinkshere-links": "← mga sumpay",
        "whatlinkshere-hideredirs": "$1 nga mga redirek",
        "whatlinkshere-hidetrans": "$1 nga mga transklusyon",
-       "whatlinkshere-hidelinks": "$1 an mga sumpay",
+       "whatlinkshere-hidelinks": "$1 nga mga sumpay",
        "whatlinkshere-hideimages": "$1 an mga sumpay han paypay",
        "whatlinkshere-filters": "Mga panara",
        "whatlinkshere-submit": "Kadto-a",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Himangrawon:",
        "feedback-thanks-title": "Salamat!",
-       "searchsuggest-search": "Pamilnga",
+       "searchsuggest-search": "Bilnga ha {{SITENAME}}",
        "searchsuggest-containing": "nagsusulod. . .",
-       "api-error-badaccess-groups": "Diri ka gintutugotan pagkarga paigbaw ha dinhi nga wiki.",
        "api-error-badtoken": "Sayop ha sulod: Maraot nga token.",
-       "api-error-copyuploaddisabled": "Pagkarga paigbaw pinaagi han URL in diri mahihimo ha dinhi nga serbidor.",
-       "api-error-empty-file": "An paypay nga isinumite nimo in waray sulod.",
        "api-error-emptypage": "Naghihimo hin bag-o, diri gintutugotan an waray sulod nga mga pakli.",
-       "api-error-filename-tooshort": "An ngaran han paypay in halipot hin duro.",
-       "api-error-filetype-banned": "Diri gintutugotan ini nga klase nga paypay.",
-       "api-error-filetype-missing": "Ini nga ngaran han paypay in nawawad-an hin ekstensyon.",
-       "api-error-http": "Sayop ha sulod: Diri nakakasumpay ha serbidor.",
-       "api-error-illegal-filename": "Diri gintutugotan an ngaran-han-paypay.",
-       "api-error-mustbeloggedin": "Diri ka nakalog-in para makapagkarga-pasaka hin mga paypay.",
-       "api-error-mustbeposted": "Sayop ha sulod: Iton paalayon in nagkikinahanglan hin HTTP POST.",
-       "api-error-overwrite": "Pagsasapaw in aada nga paypay in diri gintutugotan.",
        "api-error-stashfailed": "Sayop ha sulod:  An serbidor in waray makatipig han temporaryo nga paypay.",
-       "api-error-timeout": "An serbidor in diri nabaton ha sulod han ginaasahan nga oras.",
-       "api-error-unclassified": "Nahitabo an waray kasabti nga sayop.",
-       "api-error-unknown-code": "Waray kasabti nga sayop: \"$1\".",
-       "api-error-unknown-error": "Sayop ha sulod: May-ada nagkasayop han pagkakarga paigbaw han imo paypay.",
        "api-error-unknown-warning": "Waray kasabti nga pahimatngon: \"$1\".",
        "api-error-unknownerror": "Waray kasabti nga sayop: \"$1\".",
-       "api-error-uploaddisabled": "Diri ginpapakarga paigbaw ha dinhi nga wiki.",
-       "api-error-verification-error": "Ini nga paypay in bangin naraot, o may-ada iba nga ekstensyon.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|mga segundo}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|mga minuto}}",
        "duration-hours": "$1 {{PLURAL:$1|oras|mga oras}}",
index 5197c00..5f342a8 100644 (file)
@@ -50,7 +50,7 @@
        "tog-enotifminoredits": "頁搭文件細編也用電子信通知我",
        "tog-enotifrevealaddr": "電子信通知單裏顯示我個電子信地址",
        "tog-shownumberswatching": "顯示關注人數",
-       "tog-oldsig": "原生个签名:",
+       "tog-oldsig": "原生个签名:",
        "tog-fancysig": "拿签名当成维基文本(弗自动链接)",
        "tog-uselivepreview": "使用实时预览",
        "tog-forceeditsummary": "朆写编辑摘要个辰光提醒我",
        "newwindow": "(用新窗口开)",
        "cancel": "取消",
        "moredotdotdot": "還多...",
-       "morenotlisted": "ç®\87張表é\82\84æ\9c\86å®\8cæ\88\90。",
+       "morenotlisted": "ç®\87å¼ æ¸\85å\8d\95ä½\9cå\85´å¼\97å®\8cæ\95´。",
        "mypage": "页面",
        "mytalk": "讲张",
        "anontalk": "讲张",
        "botpasswords-label-create": "建立",
        "botpasswords-label-update": "更新",
        "resetpass_forbidden": "密码弗好更改",
+       "resetpass_forbidden-reason": "密码弗好更改:$1",
        "resetpass-no-info": "侬必须登录著才好直接进入箇只页面。",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "resetpass-expired": "侬个密码到期哉。请设置新个登录密码。",
        "passwordreset": "重置密码",
        "passwordreset-username": "用戶名",
-       "passwordreset-capture": "啊要看生成个电子邮件?",
        "passwordreset-email": "电子邮件地址:",
        "passwordreset-emailtitle": "{{SITENAME}}上个账号详细信息",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
        "minoredit": "箇是小变化",
        "watchthis": "关注箇页",
        "savearticle": "保存页面",
+       "savechanges": "保存改动",
+       "publishpage": "发布页面",
+       "publishchanges": "发布改动",
        "preview": "望望相",
        "showpreview": "显示预览",
        "showdiff": "显示变化",
        "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索",
        "search-result-size": "$1($2个字)",
        "search-result-category-size": "$1个成员($2个儿分类,$3个文件)",
-       "search-redirect": "(重定向 $1)",
+       "search-redirect": "(从$1重定向过来)",
        "search-section": "(段落 $1)",
        "search-category": "(分类$1)",
        "search-file-match": "(匹配文件内容)",
        "recentchangescount": "默认显示个编辑数:",
        "prefs-help-recentchangescount": "迭个包括近段辰光个改动、页面历史搭著日志。",
        "savedprefs": "倷个偏好已经保存哉。",
-       "savedrights": "{{GENDER:$1|$1}}个用户权限已经畀保存。",
+       "savedrights": "{{GENDER:$1|$1}}个用户组已经保存哉。",
        "timezonelegend": "时区:",
        "localtime": "当地辰光:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-tabs-navigation-hint": "提示:侬可以用左、右箭头键来选项卡之间切换。",
        "userrights-user-editname": "输入用户名:",
-       "editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "editusergroup": "加载用户组",
        "editinguser": "改动{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>个用户权限$2",
+       "userrights-editusergroup": "编辑用户组",
+       "userrights-viewusergroup": "望用户组",
+       "saveusergroups": "保存{{GENDER:$1|用户}}组",
+       "userrights-reason": "理由:",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
        "action-reupload": "箇文件以舊換新",
        "action-upload_by_url": "從URL傳文件",
        "action-delete": "刪箇頁",
-       "action-deleterevision": "å\88ªç®\87ç\89\88æ\9c¬",
-       "action-deletedhistory": "望箇页删脱个历史",
+       "action-deleterevision": "å\88 è\84±ä¿®è®¢",
+       "action-deletedhistory": "望页面删脱个历史",
        "action-browsearchive": "尋已刪頁",
-       "action-undelete": "弗刪箇頁",
+       "action-undelete": "还原页面",
        "action-patrol": "拿别人家个编辑标记成已巡查",
        "action-userrights": "編全部用戶權",
        "action-userrights-interwiki": "編用戶徠各許維基個權",
        "brokenredirects-delete": "删除",
        "withoutinterwiki": "嘸語言鏈接個頁面",
        "withoutinterwiki-summary": "下向許頁面朆鏈接到別樣語言版本。",
+       "fewestrevisions": "版本顶少个页面",
        "nbytes": "$1字节",
        "nmembers": "$1只成员",
        "unusedimages": "朆用着个文件",
        "prefixindex": "全部带前缀个页面",
        "shortpages": "短页面",
        "longpages": "长页面",
-       "protectedpages": "受保护页面",
-       "protectedtitles": "保护个标题",
+       "protectedpages": "畀保护个页面",
+       "protectedtitles": "保护个标题",
        "listusers": "用户列表",
        "listusers-creationsort": "照建個日子排",
        "newpages": "新页",
        "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",
        "badipaddress": "无效 IP 地址",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已经畀查封。<br />\n参看[[Special:BlockList|查封列表]]来复审查封。",
+       "blocklist": "封脱个用户",
        "ipblocklist": "封脱个用户",
        "infiniteblock": "永远",
        "blocklist-nousertalk": "弗准编辑自家个讨论页",
        "interlanguage-link-title": "̩$1 - $2",
        "anonymous": "{{SITENAME}}上个匿名{{PLURAL:$1|用户}}",
        "simpleantispam-label": "反垃圾检查。<strong>弗要</strong>填伊个!",
+       "pageinfo-title": "“$1”个信息",
+       "pageinfo-display-title": "显示题目头",
+       "pageinfo-language": "页面内容闲话",
+       "pageinfo-redirects-name": "指向箇页个重定向数目",
+       "pageinfo-firstuser": "页面建立者",
+       "pageinfo-firsttime": "页面建立日脚",
+       "pageinfo-lastuser": "阿末位编辑者",
+       "pageinfo-lasttime": "阿末趟编辑日脚",
+       "pageinfo-recent-authors": "最近作者数",
        "pageinfo-toolboxlink": "页面信息",
+       "pageinfo-contentpage": "算成内容页面",
        "deletedrevision": "拨删脱个旧修订 $1",
        "previousdiff": "←老版",
        "nextdiff": "新版→",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
        "feedback-thanks-title": "谢谢侬!",
-       "searchsuggest-search": "搜寻",
+       "searchsuggest-search": "搜寻{{SITENAME}}",
        "pagelang-language": "闲话"
 }
index 8a9f6f1..91a3ad8 100644 (file)
@@ -46,7 +46,7 @@
        "tog-enotifminoredits": "שיקט מיר ע-פאסט אויך פֿאַר מינערדיקע רעדאַקטירונגען פֿון בלעטער",
        "tog-enotifrevealaddr": "דעק אויף מיין בליצפאסט אדרעס אין פאסט מודעות",
        "tog-shownumberswatching": "ווייזן דעם נומער פון בלאט אויפֿפאסערס",
-       "tog-oldsig": "איצטיגער אונטערשריפֿט:",
+       "tog-oldsig": "×\90×\99×\99ער ×\90×\99צ×\98×\99×\92ער ×\90×\95× ×\98ערשר×\99פֿ×\98:",
        "tog-fancysig": "באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)",
        "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג",
        "tog-forceeditsummary": "ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג",
@@ -62,7 +62,7 @@
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
        "tog-norollbackdiff": "נישט ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי",
        "tog-useeditwarning": "שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען",
-       "tog-prefershttps": "ניצט שטענדיק א זיכערע פארבינדונג ווען ארײַנגלאגירט",
+       "tog-prefershttps": "ניצט שטענדיק א זיכערע פארבינדונג ווען ארײנגלאגירט",
        "underline-always": "אייביג",
        "underline-never": "קיינמאל",
        "underline-default": "בלעטערער גרונטשטעלונג",
        "newwindow": "(עפֿנט זיך אין א נײַעם פענסטער)",
        "cancel": "אַנולירן",
        "moredotdotdot": "נאך…",
-       "morenotlisted": "די ליסטע איז נישט פֿולשטענדיק.",
+       "morenotlisted": "×\93×\99 ×\9c×\99ס×\98×¢ ×\90×\99×\96 ×\90פשר × ×\99ש×\98 ×¤Ö¿×\95×\9cש×\98×¢× ×\93×\99ק.",
        "mypage": "מיין בלאַט",
        "mytalk": "שמועס",
        "anontalk": "שמועס",
        "talk": "שמועס",
        "views": "קוקן",
        "toolbox": "געצייג",
+       "tool-link-userrights": "ענדערן {{GENDER:$1|באַניצער}} גרופעס",
+       "tool-link-userrights-readonly": "באקוקן {{GENDER:$1|באַניצער}} גרופעס",
+       "tool-link-emailuser": "שיקן {{GENDER:$1|דעם באניצער|די באניצערין}} ע־פאסט",
        "userpage": "זען באַניצער בלאַט",
        "projectpage": "זען פראיעקט בלאַט",
        "imagepage": "זען טעקע בלאט",
        "createacct-yourpasswordagain-ph": "ארײַנגעבן פאסווארט נאכאמאל",
        "userlogin-remembermypassword": "לאז מיך בלײַבן ארײַנלאגירט",
        "userlogin-signwithsecure": "ניצן זיכערן סארווער",
+       "cannotlogin-title": "קען נישט אריינלאגירן",
+       "cannotlogin-text": "אריינלגירן נישט מעגלעך.",
        "cannotloginnow-title": "קען נישט אריינלאגירן אצינד",
        "cannotloginnow-text": "אריינלאגירן נישט מעגלעך ווען מען ניצט $1.",
+       "cannotcreateaccount-title": "מען קען נישט באשאפֿן קאנטעס",
+       "cannotcreateaccount-text": "דירעקטע קאנטע־שאפֿונג נישט אקטיווירן אויף דער וויקי.",
        "yourdomainname": "אײַער געביט:",
        "password-change-forbidden": "איר קען נישט ענדערן פאסווערטער אויף דער וויקי.",
        "externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
        "eauthentsent": "א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס.",
        "throttled-mailpassword": "מ'האט שוין געשיקט א בליצבריוו צוריקצושטעלן דאס פאסווארט, אין {{PLURAL:$1|דער לעצטער שעה|די לעצטע $1 שעה'ן}}. כדי צו פארמײַדן שלעכט באניצן, נאר איין פאסווארט צוריקשטעלן בליצבריוו וועט געשיקט ווערן אין {{PLURAL:$1|א שעה |$1 שעה'ן}}.",
        "mailerror": "פעלער ביים שיקן פּאָסט: $1",
-       "acct_creation_throttle_hit": "באַזוכער צו דער וויקי וואס באַניצן אייער IP אַדרעס האָבן שױן באַשאַפֿן {{PLURAL:$1|1 קאנטע|$1 קאנטעס}} במשך דעם לעצטן טאָג, דעם מאַקסימום וואָס מען ערלויבט אין דעם פעריאד.\n\nדערפֿאַר קענען באַזוכער וואס באַניצן דעם  IP אַדרעס נישט מער שאַפֿן נײַע קאָנטעס דערווײַל.",
+       "acct_creation_throttle_hit": "באַזוכער צו דער וויקי וואס באַניצן אייער IP אַדרעס האָבן שױן באַשאַפֿן {{PLURAL:$1|1 קאנטע|$1 קאנטעס}} במשך דעם לעצטן $2, דעם מאַקסימום וואָס מען ערלויבט אין דעם צייט פעריאד.\n\nדערפֿאַר קענען באַזוכער וואס באַניצן דעם  IP אַדרעס נישט מער שאַפֿן נײַע קאָנטעס דערווײַל.",
        "emailauthenticated": "אייער ע-פאסט אדרעס איז באשטעטיגט געווארן אום $2, $3.",
        "emailnotauthenticated": "אײַער ע-פאסט אדרעס איז נאכנישט באשטעטיגט. \nקיין ע-פאסט וועט נישט ווערן געשיקט פון קיין איינע פון די פאלגנדע אייגנקייטן.",
        "noemailprefs": "ספעציפֿירט אן ע־פאסט אַדרעס אין אײַער פרעפֿערענצן כדי די פֿעאיקייטן זאלן אַרבעטן.",
        "passwordreset-emaildisabled": "ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.",
        "passwordreset-username": "באַניצער נאָמען:",
        "passwordreset-domain": "דאמען:",
-       "passwordreset-capture": "זען  דעם געשיקטן ע־בריוו?",
-       "passwordreset-capture-help": "אַז איר צייכנט דאס קעסטל, וועט מען ווײַזן דעם ע־בריוו (מיטן פראוויזארישן פאַסווארט) צו אײַך ווי אויך ווערן געשיקט צום באַניצער.",
        "passwordreset-email": "בליצפּאָסט אַדרעס:",
        "passwordreset-emailtitle": "קאנטע פרטים אין {{SITENAME}}",
        "passwordreset-emailtext-ip": "עמעצער (מסתמא איר, פון IP אדרעס $1) האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4). די פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}}\nפארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "searchprofile-advanced-tooltip": "זוכן אין צוגעשטעלטע ָנאָמענטיילן",
        "search-result-size": "$1 ({{PLURAL:$2|איין ווארט|$2 ווערטער}})",
        "search-result-category-size": "{{PLURAL:$1|1 מיטגליד|$1 מיטגלידער}} ({{PLURAL:$2|1 אונטער־קאַטעגאריע|$2 אונטער־קאַטעגאריעס}}, {{PLURAL:$3|1 טעקע|$3 טעקעס}})",
-       "search-redirect": "(ווײַטערפֿירן $1)",
+       "search-redirect": "(×\95×\95ײַ×\98ערפֿ×\99ר×\95× ×\92 ×¤Ö¿×\95×\9f $1)",
        "search-section": "(אפטיילונג $1)",
        "search-category": "(קאטעגאריע $1)",
        "search-file-match": "(פאסט צו טעקע אינהאלט)",
        "prefs-help-recentchangescount": "כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.",
        "prefs-help-watchlist-token2": "דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.\nיעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.\n[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].",
        "savedprefs": "אייערע פרעפערענצן איז אפגעהיטן געווארן.",
-       "savedrights": "×\93×\99 ×\91×\90× ×\99צער־רע×\9b×\98×\9f פֿון {{GENDER:$1|$1}} זענען געווארן געשפייכלערט.",
+       "savedrights": "×\93×\99 ×\91×\90× ×\99צער־×\92ר×\95פעס פֿון {{GENDER:$1|$1}} זענען געווארן געשפייכלערט.",
        "timezonelegend": "צײַט זאנע:",
        "localtime": "לאקאלע צייט:",
        "timezoneuseserverdefault": "ניצן סערווירער גרונט ($1)",
        "prefswarning-warning": "איר האט געמאכט ענדערונגען צו אײַערע פרעפערענצן וואס זענען נאך נישט אויפגעהיטן.\nאז איר פארלאזט דעם בלאט אן קליקן ״$1״ וועלן אײַערע פרעפערענצן נישט ווערן דערהײַנטיקט.",
        "prefs-tabs-navigation-hint": "טיפ: איר קענט ניצן די רעכטס און לינקס פייל־קלאווישן צו נאוויגירן צווישן די צינגלעך אין דער צינגלעך־ליסטע.",
        "userrights": "באַניצער רעכטן פֿאַרוואַלטערשאפט",
-       "userrights-lookup-user": "פֿ×\90ַר×\95×\95×\90Ö·×\9c×\98×\9f ×\91×\90× ×\99צער ×\92ר×\95פעס",
+       "userrights-lookup-user": "×\90×\95×\99ס×\95×\95×\99×\99×\9c×\9f ×\90 ×\91×\90× ×\99צער",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
-       "editusergroup": "רע×\93×\90Ö·×\92×\99ר×\9f {{GENDER:$1|×\91×\90Ö·× ×\99צער}} גרופּעס",
+       "editusergroup": "×\9c×\90×\93×\9f ×\91×\90Ö·× ×\99צער גרופּעס",
        "editinguser": "ענדערן באַניצער רעכטן פון  {{GENDER:$1|באַניצער|באַניצערין}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "רעדאַקטירן באַניצער גרופעס",
+       "userrights-viewusergroup": "באַקוקן באַניצער גרופעס",
        "saveusergroups": "אויפֿהיטן {{GENDER:$1|באַניצער}} גרופעס",
        "userrights-groupsmember": "מיטגליד פון:",
        "userrights-groupsmember-auto": "אויטאמטישער מיטגליד פֿון:",
        "userrights-reason": "אורזאַך:",
        "userrights-no-interwiki": "איר האט נישט קיין ערלויבניש צו רעדאַקטירן באַניצער רעכטן אויף אַנדערע וויקיס.",
        "userrights-nodatabase": "דאַטנבאַזע $1 אדער עקזיסטירט נישט אדער איז נישט ארטיק.",
-       "userrights-nologin": "איר דאַרפֿט [[Special:UserLogin| אַרײַנלאגירן]] מיט א סיסאפ קאנטע צו באַשטימען באַניצער רעכטן.",
-       "userrights-notallowed": "איר האט נישט קיין ערלויבניש צוצולייגן אדער אוועקנעמען באַניצער רעכטן.",
        "userrights-changeable-col": "גרופעס איר קענט ענדערן",
        "userrights-unchangeable-col": "גרופעס איר קענט נישט ענדערן",
        "userrights-conflict": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
-       "userrights-removed-self": "איר האט אראפגענומען אייערע אייגענע רעכטן. אזוי קענט איר מער נישט דערגרייכן דעם בלאט.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "group-autoconfirmed": "באַשטעטיקטע באַניצער",
        "right-siteadmin": "פארשליס און שליס-אויף די דאטעבאזע",
        "right-override-export-depth": "עקספארטירן בלעטער כולל געלינקטע בלעטער ביז א טיף פון 5",
        "right-sendemail": "שיקן ע-פאסט צו אנדערע באניצער",
-       "right-passwordreset": "באַקוקן פאַסווארט צוריקשטעלן ע־בריוו",
        "right-managechangetags": "שאפן און (אומ)אקטיווירן [[Special:Tags|טאגן]]",
        "right-applychangetags": "אנווענדן [[Special:Tags|טאגן]] צוזאמען מיט ענדערונגען",
        "grant-generic": "\"$1\" רעכטן־בינטל",
        "grant-group-file-interaction": "אינטעראגירן מיט מעדיע",
        "grant-group-watchlist-interaction": "אינטעראגירן מיט אייער אויפֿפאסונג־ליסטע",
        "grant-group-email": "שיקן ע־פאסט",
+       "grant-group-other": "פֿארשידענע אקטיוויטעטן",
        "grant-createaccount": "שאַפֿן קאנטעס",
        "grant-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
        "grant-editpage": "רעדאקטירן עקזיסטירנדע בלעטער",
        "action-upload_by_url": "ארויפֿלאָדן די טעקע פֿון א URL",
        "action-writeapi": "ניצן דעם שרײַבן API",
        "action-delete": "אויסמעקן דעם בלאַט",
-       "action-deleterevision": "אויסמעקן די רעוויזיע",
-       "action-deletedhistory": "באַקוקן דעם בלאט'ס אויסגעמעקטע היסטאריע",
+       "action-deleterevision": "אויסמעקן רעוויזיעס",
+       "action-deletedhistory": "באַקוקן א בלאט'ס אויסגעמעקטע היסטאריע",
+       "action-deletedtext": "באקוקן אויסגעמעקטן רעוויזיע טעקסט",
        "action-browsearchive": "זוכן אויסגעמעקטע בלעטער",
-       "action-undelete": "צ×\95ר×\99קש×\98×¢×\9c×\9f ×\93×¢×\9d ×\91×\9c×\90×\98",
-       "action-suppressrevision": "×\90×\99×\91ער×\92×\99×\99×\9f ×\90×\95×\9f ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×\93×\99 ×¤Ö¿×\90ַר×\91×\90ר×\92×\98×¢ ×¨×¢×\95×\95×\99×\96×\99×¢",
+       "action-undelete": "צ×\95ר×\99קש×\98×¢×\9c×\9f ×\91×\9c×¢×\98ער",
+       "action-suppressrevision": "×\90×\99×\91ער×\92×\99×\99×\9f ×\90×\95×\9f ×¦×\95ר×\99קש×\98×¢×\9c×\9f ×¤Ö¿×\90ַר×\91×\90ר×\92×\98×¢ ×¨×¢×\95×\95×\99×\96×\99עס",
        "action-suppressionlog": "באקוקן דעם פריוואטן לאג",
        "action-block": "בלאקירן דעם באַניצער פֿון רעדאַקטירן",
        "action-protect": "ענדערן שיצונג ניוואען פֿאַר דעם בלאַט",
        "action-userrights-interwiki": "רעדאַקטירן רעכטן פון באַניצער אויף אַנדערע וויקיס",
        "action-siteadmin": "שליסן אדער אויפשליסן די דאטנבאזע",
        "action-sendemail": "שיקן ע־פאסט",
+       "action-editmyoptions": "רעדאקטירן אײַערע פרעפערענצן",
        "action-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
        "action-viewmywatchlist": "באקוקן אײַער אויפֿפאסונג ליסטע",
        "action-viewmyprivateinfo": "באקוקן אײַער פריוואטע אינפארמאציע",
        "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
        "upload-dialog-title": "אַרױפֿלאָדן טעקע",
        "upload-dialog-button-cancel": "אַנולירן",
+       "upload-dialog-button-back": "צוריק",
        "upload-dialog-button-done": "ערליידיקט",
        "upload-dialog-button-save": "אויפֿהיטן",
        "upload-dialog-button-upload": "אַרויפֿלאָדן",
        "emailccsubject": "קאפיע פון אײַער מעלדונג צו $1: $2",
        "emailsent": "ע-פאסט געשיקט",
        "emailsenttext": "אײַער אי-בריוו איז געשיקט געווארן.",
-       "emailuserfooter": "דער בליצבריוו איז {{GENDER:$1|געשיקט געווארן}} דורך $1 צו {{GENDER:$2|$2}} מיט דער \"{{int:emailuser}}\" פֿונקציע בײ {{SITENAME}}.",
+       "emailuserfooter": "דער בליצבריוו איז {{GENDER:$1|געשיקט געווארן}} דורך $1 צו {{GENDER:$2|$2}} מיט דער \"{{int:emailuser}}\" פֿונקציע בײ {{SITENAME}}. {{GENDER:$2|אייער}} ע־פאסט וועט מען שיקן גראד be sent directly to the {{GENDER:$1|צום אריגינעלן אפשיקער|צו דער אריגינעלער אפשיקערין}}, וואס וועט אויפדעקן {{GENDER:$2|אייער}} ע־פאסט אדרעס צו {{GENDER:$1|אים|איר}}.",
        "usermessage-summary": "איבערלאזן סיסטעם אָנזאָג",
        "usermessage-editor": "סיסטעם שליח",
        "usermessage-template": "MediaWiki:באניצער־מעלדונג",
        "sp-contributions-newbies-title": "ביישטייערונגען פון נייע באַניצער",
        "sp-contributions-blocklog": "בלאקירן לאג",
        "sp-contributions-suppresslog": "אונטערדריקטע {{GENDER:$1|באַניצער}} בײַשטײַערונגען",
-       "sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
+       "sp-contributions-deleted": "אויסגעמעקטע {{GENDER:$1|באַניצער|באַניצערין}} בײַשטײַערונגען",
        "sp-contributions-uploads": "אַרויפֿלאָדונגען",
        "sp-contributions-logs": "לאגביכער",
        "sp-contributions-talk": "שמועס",
        "htmlform-cloner-delete": "אַראָפּנעמען",
        "htmlform-title-not-exists": "$1 עקזיסטירט נישט",
        "logentry-delete-delete": "$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|האט אויסגעמעקט}} ווייטערפֿירונג $3 דורך איבערשרייבן",
        "logentry-delete-restore": "$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3",
        "logentry-delete-event": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4",
        "feedback-subject": "טעמע:",
        "feedback-submit": "אײַנגעבן",
        "feedback-thanks": "ייש\"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט \"[$2 $1]\".",
-       "searchsuggest-search": "×\96×\95×\9a",
+       "searchsuggest-search": "×\96×\95×\9b×\9f {{SITENAME}}",
        "searchsuggest-containing": "כולל…",
        "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
index f225126..02e3341 100644 (file)
@@ -28,7 +28,9 @@
                        "Shinjiman",
                        "Macofe",
                        "Jdforrester",
-                       "Tungakl"
+                       "Tungakl",
+                       "Suzukaze-c",
+                       "Asdfugil"
                ]
        },
        "tog-underline": "連結加底線:",
@@ -55,7 +57,7 @@
        "tog-enotifminoredits": "喺頁面同檔案有細修改時,用電郵通知我。",
        "tog-enotifrevealaddr": "喺電郵通知信上面話畀人聽我嘅電郵地址",
        "tog-shownumberswatching": "顯示有幾多人監視",
-       "tog-oldsig": "現有簽名:",
+       "tog-oldsig": "你而家嘅簽名:",
        "tog-fancysig": "將簽名以維基字對待(冇自動連結)",
        "tog-uselivepreview": "用即時預覽",
        "tog-forceeditsummary": "我冇入修改註解時通知我",
        "newwindow": "(響新視窗度打開)",
        "cancel": "取消",
        "moredotdotdot": "更多...",
-       "morenotlisted": "爾張清單重未完成。",
+       "morenotlisted": "爾張清單可能重未完成。",
        "mypage": "版",
        "mytalk": "傾偈",
        "anontalk": "傾偈",
        "createacct-yourpasswordagain-ph": "入多次密碼",
        "userlogin-remembermypassword": "記住我有簽到",
        "userlogin-signwithsecure": "用安全連線",
+       "cannotlogin-title": "簽到唔到",
+       "cannotlogin-text": "冇可能簽到",
+       "cannotloginnow-title": "而家簽到唔到",
        "yourdomainname": "你嘅網域:",
        "password-change-forbidden": "你唔可以改呢個維基站嘅密碼。",
        "externaldberror": "驗證資料庫出錯,或者唔允許你更新你嘅外部帳戶。",
        "nocookieslogin": "{{SITENAME}} 登入要開 cookies。熄咗佢。請你開咗再試。",
        "nocookiesfornew": "呢位用戶嘅戶開未開,我哋唔能夠確認佢嘅來源。\n請肯定你已經開咗 cookies,重新載入再試。",
        "noname": "你未指定一個有效嘅用戶名。",
-       "loginsuccesstitle": "ç\99»å\85¥成功",
+       "loginsuccesstitle": "ç°½å\88°成功",
        "loginsuccess": "'''「$1」登入咗{{SITENAME}}。'''",
-       "nosuchuser": "呢度冇叫做 \"$1\"嘅用戶。\n用戶名係有分大細楷嘅。\n請檢查你個名嘅輸入方法,或者[[Special:CreateAccount|建立一個新嘅戶口]]。",
+       "nosuchuser": "呢度冇用戶叫做 \"$1\"嘅。\n用戶名係有分大細楷嘅。\n請檢查你個名嘅輸入方法,或者[[Special:CreateAccount|建立一個新嘅戶口]]。",
        "nosuchusershort": "呢度冇叫做 \"$1\"嘅用戶。 請檢查你個名嘅輸入方法。",
        "nouserspecified": "你需要指定一個用戶名。",
        "login-userblocked": "呢位用戶封鎖咗。唔容許登入。",
        "resetpass_submit": "設定密碼同登入",
        "changepassword-success": "你嘅密碼已經成功噉改咗!",
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
+       "botpasswords-label-create": "創造",
+       "botpasswords-label-update": "上載",
+       "botpasswords-label-cancel": "取消",
+       "botpasswords-label-delete": "刪除",
+       "botpasswords-label-resetpassword": "改過個個密碼",
        "resetpass_forbidden": "唔可以更改密碼",
        "resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
        "resetpass-submit-loggedin": "改密碼",
        "passwordreset-emaildisabled": "呢個維基站無得傳送電郵。",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
-       "passwordreset-capture": "睇電郵內容?",
-       "passwordreset-capture-help": "如果揀呢度,電郵連臨時密碼金向你顯示,同時會送畀用戶。",
        "passwordreset-email": "電郵地址:",
        "passwordreset-emailtitle": "{{SITENAME}}嘅戶口資料",
        "passwordreset-emailtext-ip": "有人(可能係閣下自己,來自IP地址$1)請求更改閣下喺{{SITENAME}}($4)嘅密碼。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "searchprofile-advanced-tooltip": "響自定空間名度搵",
        "search-result-size": "$1 ($2個字)",
        "search-result-category-size": "$1位成員 ($2個細類,$3個檔案)",
-       "search-redirect": "(跳轉 $1)",
+       "search-redirect": "(由$1過嚟)",
        "search-section": "(小節 $1)",
        "search-category": "(類 $1)",
        "search-file-match": "(夾啱樓案内容)",
        "saveprefs": "儲存",
        "restoreprefs": "恢復全部預設設定(喺所有項目)",
        "prefs-editing": "編輯中",
-       "rows": "行數:",
-       "columns": "列數:",
        "searchresultshead": "搵嘢",
        "stub-threshold": "楔位連結格式門檻 ($1):",
        "stub-threshold-sample-link": "樣辦",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "你並無權限去編輯響其它wiki嘅用戶權限。",
        "userrights-nodatabase": "資料庫$1唔存在或者唔係本地嘅。",
-       "userrights-nologin": "你一定要以操作員戶口[[Special:UserLogin|登入]]咗之後先可以指定用戶權限。",
-       "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
-       "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "group-autoconfirmed": "自動確認用戶",
        "right-siteadmin": "鎖同解鎖資料庫",
        "right-override-export-depth": "倒出包含有五層深連版嘅頁面",
        "right-sendemail": "寄電郵畀其他用戶",
-       "right-passwordreset": "檢查密碼/重設電郵",
        "right-managechangetags": "從數據庫度開或刪走[[Special:Tags|tags]]",
        "right-applychangetags": "套用[[Special:Tags|標籤]]到某個人嘅改動",
        "newuserlogpage": "使用者開戶記錄",
        "contribsub2": "{{GENDER:$3|$1}}嘅貢獻 ($2)",
        "contributions-userdoesnotexist": "用戶「$1」未有註冊。",
        "nocontribs": "搵唔到符合呢啲條件嘅修改。",
-       "uctop": "(而家)",
+       "uctop": "(最新)",
        "month": "由呢個月 (同更早):",
        "year": "由呢一年 (同更早):",
        "sp-contributions-newbies": "只顯示新戶口嘅貢獻",
index 421e384..55fc024 100644 (file)
        "searcharticle": "前往",
        "history": "页面历史",
        "history_short": "历史",
+       "history_small": "历史",
        "updatedmarker": "更新于我上次访问后",
        "printableversion": "可打印版本",
        "permalink": "固定链接",
        "redirectpagesub": "重定向页面",
        "redirectto": "重定向至:",
        "lastmodifiedat": "本页面最后修改于$1 $2。",
-       "viewcount": "本页面已经被访问过$1次。",
+       "viewcount": "本页面已经被访问过{{PLURAL:$1|$1次}}。",
        "protectedpage": "受保护页面",
        "jumpto": "跳转至:",
        "jumptonavigation": "导航",
        "subject-preview": "主题预览:",
        "previewerrortext": "尝试预览您的更改时发生未知错误。",
        "blockedtitle": "用户被封禁",
-       "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您的询问中包含上面的所有信息。",
-       "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。\n请您在申诉内容中说明以上所有信息。",
+       "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您做出的任何查询中包含所有上述详情。",
+       "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。请在您做出的任何查询中包含所有上述详情。",
+       "systemblockedtext": "您的用户名或IP地址已被MediaWiki自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
        "blockednoreason": "未给出原因",
        "whitelistedittext": "请$1以编辑页面。",
        "confirmedittext": "您必须确认您的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认您的电子邮件地址。",
        "edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
        "editing": "编辑“$1”",
        "creating": "创建“$1”",
-       "editingsection": "编辑“$1(段落)”",
-       "editingcomment": "编辑“$1”(新段落)",
+       "editingsection": "编辑“$1”(章节)",
+       "editingcomment": "编辑“$1”(新章节)",
        "editconflict": "编辑冲突:$1",
        "explainconflict": "其他用户在您开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示您的更改。您必须把您的更改合并至现有文字。<strong>只有</strong>当您单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
        "yourtext": "您的文字",
        "nonunicodebrowser": "<strong>警告:您的浏览器不兼容Unicode编码。</strong>这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
        "editingold": "<strong>警告:您正在编辑的是本页面的旧版本。</strong>如果您保存该编辑,该版本后的所有更改都会丢失。",
        "yourdiff": "差异",
-       "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。\n如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。\n'''不要在未获授权的情况下发表!'''<br />",
+       "copyrightwarning": "请注意您对{{SITENAME}}的所有贡献都被认为是在$2下发布,请查看在$1的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。<strong>不要在未获授权的情况下发表!</strong>",
        "copyrightwarning2": "请注意,您对{{SITENAME}}的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。<br />\n您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅$1的细节)。<strong>不要在未获授权的情况下发表!</strong>",
        "editpage-cannot-use-custom-model": "此页面的内容模型不能被更改。",
        "longpageerror": "<strong>错误:您所提交的文本长度有{{PLURAL:$1|1|$1}}KB,这大于{{PLURAL:$2|1|$2}}KB的最大值。</strong>\n因此,该文本无法保存。",
        "content-failed-to-parse": "未能将 $2 内容转换为 $1:$3",
        "invalid-content-data": "无效的内容数据",
        "content-not-allowed-here": "[[$2]]页面上不允许“$1”内容",
-       "editwarning-warning": "离开本页面可能导致您失去任何已经作出的更改。如果您处于登录状态,您可以在您的设置的“{{int:prefs-editing}}”部分停用该警告。",
+       "editwarning-warning": "离开本页面可能导致您失去任何已经作出的更改。如果您处于登录状态,您可以在您的设置的“{{int:prefs-editing}}”部分停用该警告。",
        "editpage-invalidcontentmodel-title": "内容模型不支持",
        "editpage-invalidcontentmodel-text": "内容模型“$1”不被支持。",
        "editpage-notsupportedcontentformat-title": "内容格式尚不支持",
        "saveprefs": "保存",
        "restoreprefs": "还原所有默认设置(所有分项)",
        "prefs-editing": "编辑",
-       "rows": "行数:",
-       "columns": "列数:",
        "searchresultshead": "搜索",
        "stub-threshold": "小作品链接格式阈值($1):",
        "stub-threshold-sample-link": "样例",
        "badsig": "错误的原始签名。请检查HTML标签。",
        "badsiglength": "签名过长。请不超过$1个字符。",
        "yourgender": "您希望使用什么性别称呼?",
-       "gender-unknown": "当提及您时,软件将使用性别中性的词汇(只要可能)",
+       "gender-unknown": "当提及您时,软件将尽可能使用性别中性的词法",
        "gender-male": "他",
        "gender-female": "她",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "userrights-user-editname": "输入用户名:",
        "editusergroup": "加载用户组",
        "editinguser": "更改{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
+       "viewinguserrights": "查看{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
        "userrights-editusergroup": "编辑用户组",
+       "userrights-viewusergroup": "查看用户组",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-groupsmember": "用户组:",
        "userrights-groupsmember-auto": "自动用户组:",
        "action-upload_by_url": "从URL上传本文件",
        "action-writeapi": "使用写入API",
        "action-delete": "删除本页",
-       "action-deleterevision": "删除本版本",
-       "action-deletedhistory": "查看本页面被删除的历史",
+       "action-deleterevision": "删除修订",
+       "action-deletelogentry": "删除日志记录",
+       "action-deletedhistory": "查看页面被删除的历史",
+       "action-deletedtext": "查看已删除的修订版本文字",
        "action-browsearchive": "搜索已被删除的页面",
-       "action-undelete": "还原本页",
-       "action-suppressrevision": "复核并还原该隐藏版本",
+       "action-undelete": "还原页面",
+       "action-suppressrevision": "复核并还原隐藏修订版本",
        "action-suppressionlog": "查看本非公开日志",
        "action-block": "阻止该用户编辑",
        "action-protect": "更改本页面的保护级别",
        "action-userrights-interwiki": "编辑其他wiki用户的用户权限",
        "action-siteadmin": "锁定或解锁数据库",
        "action-sendemail": "发送电子邮件",
+       "action-editmyoptions": "编辑您的参数设置",
        "action-editmywatchlist": "编辑您的监视列表",
        "action-viewmywatchlist": "查看您的监视列表",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "显示",
+       "rcfilters-activefilters": "活跃的过滤器",
+       "rcfilters-search-placeholder": "过滤器最近更改(浏览或开始输入)",
+       "rcfilters-invalid-filter": "无效过滤器",
+       "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-noresults": "找不到过滤器",
+       "rcfilters-filtergroup-registration": "用户注册",
+       "rcfilters-filter-registered-label": "已注册",
+       "rcfilters-filter-registered-description": "登录编辑者。",
+       "rcfilters-filter-unregistered-label": "未注册",
+       "rcfilters-filter-unregistered-description": "未登录的编辑者。",
+       "rcfilters-filtergroup-authorship": "编辑的作者",
+       "rcfilters-filter-editsbyself-label": "您自己的编辑",
+       "rcfilters-filter-editsbyself-description": "由您编辑。",
+       "rcfilters-filter-editsbyother-label": "由其他人编辑",
+       "rcfilters-filter-editsbyother-description": "由其他用户(而不是您)创建的编辑。",
+       "rcfilters-filtergroup-userExpLevel": "体验水平(仅限注册用户)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "少于10次编辑和4天活跃。",
+       "rcfilters-filter-userExpLevel-learner-label": "初学者",
+       "rcfilters-filter-userExpLevel-learner-description": "比“新手”拥有更多活跃天数和编辑数,但少于“有经验的用户”。",
+       "rcfilters-filter-userExpLevel-experienced-label": "有经验的用户",
+       "rcfilters-filter-userExpLevel-experienced-description": "超过30天活跃和500次编辑。",
+       "rcfilters-filtergroup-automated": "自动化贡献者",
+       "rcfilters-filter-bots-label": "机器人",
+       "rcfilters-filter-bots-description": "由自动化工具做出的编辑。",
+       "rcfilters-filter-humans-label": "人类(不是机器人)",
+       "rcfilters-filter-humans-description": "由人类编辑者做出的编辑。",
+       "rcfilters-filtergroup-significance": "意义",
+       "rcfilters-filter-minor-label": "小编辑",
+       "rcfilters-filter-minor-description": "作者已标记为小编辑的编辑。",
+       "rcfilters-filter-major-label": "不是小编辑",
+       "rcfilters-filter-major-description": "未标记为小编辑的编辑。",
+       "rcfilters-filtergroup-changetype": "更改类型",
+       "rcfilters-filter-pageedits-label": "页面编辑",
+       "rcfilters-filter-pageedits-description": "对wiki内容、讨论、分类描述的编辑....",
+       "rcfilters-filter-newpages-label": "页面创建",
+       "rcfilters-filter-newpages-description": "做出新页面的编辑。",
+       "rcfilters-filter-categorization-label": "分类更改",
+       "rcfilters-filter-categorization-description": "从分类中添加或移除页面的记录。",
+       "rcfilters-filter-logactions-label": "记录的操作",
+       "rcfilters-filter-logactions-description": "管理操作、账户创建、页面删除、上传....",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "uncategorizedcategories": "未归类分类",
        "uncategorizedimages": "未归类文件",
        "uncategorizedtemplates": "未归类模板",
+       "uncategorized-categories-exceptionlist": " #包含分类列表,它不能在Special:UncategorizedCategories中被提及。每行一条,以“*”开头。其他字符开头的行(包括空格)将被忽略。使用“#”作为注释。",
        "unusedcategories": "未使用分类",
        "unusedimages": "未使用文件",
        "wantedcategories": "需要的分类",
        "apisandbox-continue-clear": "清除",
        "apisandbox-continue-help": "{{int:apisandbox-continue}}将[https://www.mediawiki.org/wiki/API:Query#Continuing_queries 继续]上次请求;{{int:apisandbox-continue-clear}}将清除继续相关的参数。",
        "apisandbox-param-limit": "输入<kbd>max</kbd>以使用最大限制。",
-       "apisandbox-multivalue-all-namespaces": "$1(所有名字空间)",
+       "apisandbox-multivalue-all-namespaces": "$1(所有名字空间)",
        "apisandbox-multivalue-all-values": "$1(所有值)",
        "booksources": "网络书源",
        "booksources-search-legend": "搜索图书来源",
        "changecontentmodel-emptymodels-title": "没有内容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的内容不能转换为任何类型。",
        "log-name-contentmodel": "内容模型更改日志",
-       "log-description-contentmodel": "与一个页面的内容模型相关的活动",
+       "log-description-contentmodel": "此页面列举对页面内容模型的更改,以及使用默认模型以外的内容模型创建的页面。",
        "logentry-contentmodel-new": "$1已使用非默认的内容模型“$5”{{GENDER:$2|创建}}页面$3",
        "logentry-contentmodel-change": "$1将页面$3的内容模型从“$4”{{GENDER:$2|更改}}为“$5”",
        "logentry-contentmodel-change-revertlink": "回退",
        "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "终止时间:",
        "ipbreason": "原因:",
-       "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
+       "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
        "ipb-hardblock": "阻止登录用户使用该IP地址编辑",
        "ipbcreateaccount": "阻止创建新账号",
        "ipbemailban": "阻止用户发送电子邮件",
        "change-blocklink": "更改封禁",
        "contribslink": "贡献",
        "emaillink": "发送电子邮件",
-       "autoblocker": "因为您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。\n$1被封禁的理由是“$2”",
+       "autoblocker": "因为您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。$1被封禁的理由是“$2”",
        "blocklogpage": "封禁日志",
        "blocklog-showlog": "该用户曾被封禁。下面提供封禁日志以供参考:",
        "blocklog-showsuppresslog": "该用户曾被封禁并隐藏。下面提供封锁日志以供参考:",
        "proxyblockreason": "您的IP地址为已被封禁的公开代理。请联系您的互联网服务提供商或技术支持者,并告知他们此严重的安全问题。",
        "sorbsreason": "在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。",
        "sorbs_create_account_reason": "在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。",
+       "softblockrangesreason": "您的IP地址($1)不允许匿名贡献。请登录。",
        "xffblockreason": "您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1",
        "cant-see-hidden-user": "您尝试封禁的用户已被封禁并隐藏。\n由于您尚无隐藏用户的权限,您无法查看或编辑此用户的封禁。",
        "ipbblocked": "您无法封禁或解封其他用户,因为您自己已被封禁",
        "cant-move-to-user-page": "您没有权限移动页面至用户页面(用户子页面除外)。",
        "cant-move-category-page": "您没有权限移动分类页面。",
        "cant-move-to-category-page": "您没有权限移动页面至分类页面。",
+       "cant-move-subpages": "您没有权限移动子页面。",
+       "namespace-nosubpages": "名字空间“$1”不允许子页面。",
        "newtitle": "新标题:",
        "move-watch": "监视来源页面和目标页面",
        "movepagebtn": "移动页面",
        "interlanguage-link-title-nonlang": "$1——$2",
        "common.css": "/* 这里放置的CSS将应用于所有皮肤 */",
        "print.css": "/* 这里放置的CSS将影响打印输出 */",
-       "noscript.css": "/* 这里放置的CSS将影响用JavaScript的用户 */",
+       "noscript.css": "/* 这里放置的CSS将影响用JavaScript的用户 */",
        "group-autoconfirmed.css": "/* 这里放置的CSS将只影响自动确认用户 */",
        "group-user.css": "/* 这里放置的CSS将只影响注册用户 */",
        "group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
        "group-bureaucrat.css": "/* 这里放置的CSS将只影响行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
-       "group-user.js": "/* 放置于此的JavaScript将只为注册用户加载 */",
+       "group-user.js": "/* 这里的任何JavaScript将只为注册用户加载 */",
        "group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
        "group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
        "group-bureaucrat.js": "/* 这里的任何JavaScript将只为行政员加载 */",
        "pageinfo-length": "页面长度(字节)",
        "pageinfo-article-id": "页面ID",
        "pageinfo-language": "页面内容语言",
+       "pageinfo-language-change": "更改",
        "pageinfo-content-model": "页面内容类型",
        "pageinfo-content-model-change": "更改",
        "pageinfo-robot-policy": "爬虫索引",
        "pageinfo-recent-edits": "最近编辑数(过去$1内)",
        "pageinfo-recent-authors": "最近的不同作者数",
        "pageinfo-magic-words": "魔术字($1)",
-       "pageinfo-hidden-categories": "隐藏分类($1)",
+       "pageinfo-hidden-categories": "隐藏{{PLURAL:$1|分类}}($1)",
        "pageinfo-templates": "使用的模板($1)",
        "pageinfo-transclusions": "包含该页的页面($1)",
        "pageinfo-toolboxlink": "页面信息",
        "seconds": "$1秒",
        "minutes": "$1分",
        "hours": "$1小时",
-       "days": "$1天",
+       "days": "{{PLURAL:$1|$1天}}",
        "weeks": "$1周",
        "months": "$1个月",
        "years": "$1年",
        "feedback-useragent": "用户代理:",
        "searchsuggest-search": "搜索{{SITENAME}}",
        "searchsuggest-containing": "含有...",
-       "api-error-autoblocked": "您的IP地址已被自动封禁,因为它曾被一位已封禁用户使用。",
-       "api-error-badaccess-groups": "您没有将文件上传到此 wiki 的权限。",
        "api-error-badtoken": "内部错误:会话无效。",
-       "api-error-blocked": "您已被封禁,不能编辑。",
-       "api-error-copyuploaddisabled": "通过URL上传的功能已被此服务器禁用。",
-       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}}。",
-       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}},但已被删除。",
-       "api-error-empty-file": "您提交的文件是空的。",
        "api-error-emptypage": "不能创建没有内容的新页面。",
-       "api-error-fetchfileerror": "内部错误:获取文件时发生错误。",
-       "api-error-fileexists-forbidden": "名为$1的文件已经存在而且无法覆盖。",
-       "api-error-fileexists-shared-forbidden": "名为$1的文件已经存在于共享媒体库中而且无法覆盖。",
-       "api-error-file-too-large": "您提交的文件过大。",
-       "api-error-filename-tooshort": "文件名过短。",
-       "api-error-filetype-banned": "此类文件被禁止。",
-       "api-error-filetype-banned-type": "$1{{PLURAL:$4|不是允许的文件类型}}。允许的{{PLURAL:$3|文件类型是|文件类型有}}$2。",
-       "api-error-filetype-missing": "该文件没有扩展名。",
-       "api-error-hookaborted": "您试图进行的修改被一个扩展钩子终止。",
-       "api-error-http": "内部错误:无法连接到服务器。",
-       "api-error-illegal-filename": "文件名非法。",
-       "api-error-internal-error": "内部错误:此wiki在处理您的上传数据时出现了错误。",
-       "api-error-invalid-file-key": "内部错误:找不到临时文件。",
-       "api-error-missingparam": "内部错误:请求中缺少参数。",
-       "api-error-missingresult": "内部错误:无法确定是否复制成功。",
-       "api-error-mustbeloggedin": "您必须登录后再上传文件。",
-       "api-error-mustbeposted": "内部错误:请求需要HTTP POST",
-       "api-error-noimageinfo": "上传成功,但服务器没有给我们任何该文件的信息。",
-       "api-error-nomodule": "内部错误:缺少上传模块集。",
-       "api-error-ok-but-empty": "内部错误:服务器没有响应。",
-       "api-error-overwrite": "不允许覆盖现有文件。",
-       "api-error-ratelimited": "您正在尝试在比该wiki允许时间更短的时间内上传更多文件。请等待几分钟后再试。",
-       "api-error-stashfailed": "内部错误:服务器保存临时文件失败。",
        "api-error-publishfailed": "内部错误:服务器发布临时文件失败。",
-       "api-error-stasherror": "上传文件存档时出现错误。",
-       "api-error-stashedfilenotfound": "试图从藏匿处上传时找不到藏匿的文件。",
-       "api-error-stashpathinvalid": "找到的藏匿文件的路径是无效的。",
-       "api-error-stashfilestorage": "存储文件至藏匿处时出错。",
-       "api-error-stashzerolength": "服务器不能藏匿文件,因为它已经没有藏匿空间。",
-       "api-error-stashnotloggedin": "您必须登录以保存文件至上传藏匿处。",
-       "api-error-stashwrongowner": "您试图在藏匿处访问的文件不属于您。",
-       "api-error-stashnosuchfilekey": "您试图在藏匿处访问的文件密钥不存在。",
-       "api-error-timeout": "服务器没有在预期内响应。",
-       "api-error-unclassified": "出现未知错误。",
-       "api-error-unknown-code": "未知错误:“$1”。",
-       "api-error-unknown-error": "内部错误:尝试上传文件时出错。",
-       "api-error-unknown-warning": "未知的警告:“$1”。",
+       "api-error-stashfailed": "内部错误:服务器保存临时文件失败。",
+       "api-error-unknown-warning": "未知警告:“$1”。",
        "api-error-unknownerror": "未知错误:$1。",
-       "api-error-uploaddisabled": "该wiki停用上传。",
-       "api-error-verification-error": "该文件可能损坏或扩展名错误。",
-       "api-error-was-deleted": "此名称的文件曾被上传,随后被删除。",
        "duration-seconds": "$1秒",
        "duration-minutes": "$1分",
        "duration-hours": "$1小时",
        "pagelang-language": "语言",
        "pagelang-use-default": "使用默认语言",
        "pagelang-select-lang": "选择语言",
+       "pagelang-reason": "原因",
        "pagelang-submit": "提交",
+       "pagelang-nonexistent-page": "页面$1不存在。",
+       "pagelang-unchanged-language": "页面$1已设置为语言$2。",
+       "pagelang-unchanged-language-default": "页面$1已设置为wiki的默认内容语言。",
+       "pagelang-db-failed": "数据库更改页面语言失败。",
        "right-pagelang": "更改页面语言",
        "action-pagelang": "更改页面语言",
        "log-name-pagelang": "语言更改日志",
        "sessionprovider-nocookies": "Cookie可能已被禁用。确保您已启用cookie,并重试。",
        "randomrootpage": "随机根页面",
        "log-action-filter-block": "封禁类型:",
-       "log-action-filter-contentmodel": "内容模型改的类型:",
+       "log-action-filter-contentmodel": "内容模型改的类型:",
        "log-action-filter-delete": "删除类型:",
        "log-action-filter-import": "导入的类型:",
        "log-action-filter-managetags": "标签管理行为的类型:",
        "log-action-filter-block-block": "封禁",
        "log-action-filter-block-reblock": "封禁修改",
        "log-action-filter-block-unblock": "解封",
-       "log-action-filter-contentmodel-change": "内容型的更改",
-       "log-action-filter-contentmodel-new": "带有非标准内容模型的页面的更改",
+       "log-action-filter-contentmodel-change": "内容型的更改",
+       "log-action-filter-contentmodel-new": "带有非默认内容模型的页面的更改",
        "log-action-filter-delete-delete": "页面删除",
        "log-action-filter-delete-delete_redir": "重定向覆盖",
        "log-action-filter-delete-restore": "页面还原",
        "usercssispublic": "请注意:CSS子页面不应包含机密数据,因为它们可以被其他用户查看。",
        "restrictionsfield-badip": "无效的IP地址或段:$1",
        "restrictionsfield-label": "允许的IP段:",
-       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用所有,可使用<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "修订版本$1",
+       "pageid": "页面ID$1"
 }
index e2025e0..eaa41c2 100644 (file)
@@ -77,7 +77,9 @@
                        "一個正常人",
                        "Wehwei",
                        "1233thehongkonger",
-                       "Maskers"
+                       "Maskers",
+                       "Knch903",
+                       "Winstonyin"
                ]
        },
        "tog-underline": "底線標示連結:",
@@ -89,7 +91,7 @@
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "é\96\8bå\95\9fæ»\91é¼ é\9b\99æ\93\8a編輯頁面",
+       "tog-editondblclick": "é\9b\99æ\93\8aæ»\91é¼ 編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "oct": "10 月",
        "nov": "11 月",
        "dec": "12 月",
-       "january-date": "一月 $1 日",
-       "february-date": "二月 $1 日",
-       "march-date": "三月 $1 日",
-       "april-date": "四月 $1 日",
-       "may-date": "五月 $1 日",
-       "june-date": "六月 $1 日",
-       "july-date": "七月 $1 日",
-       "august-date": "八月 $1 日",
-       "september-date": "九月 $1 日",
-       "october-date": "十月 $1 日",
-       "november-date": "十一月 $1 日",
-       "december-date": "十二月 $1 日",
+       "january-date": "1月$1日",
+       "february-date": "2月$1日",
+       "march-date": "3月$1日",
+       "april-date": "4月$1日",
+       "may-date": "5月$1日",
+       "june-date": "6月$1日",
+       "july-date": "7月$1日",
+       "august-date": "8月$1日",
+       "september-date": "9月$1日",
+       "october-date": "10月$1日",
+       "november-date": "11月$1日",
+       "december-date": "12月$1日",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|分類|$1 個分類}}",
-       "category_header": "分類 \"$1\" 中的頁面",
+       "category_header": "分類「$1」中的頁面",
        "subcategories": "子分類",
        "category-media-header": "分類 \"$1\" 中的媒體",
        "category-empty": "<em>此分類目前未包含頁面或媒體。</em>",
        "searcharticle": "執行",
        "history": "頁面歷史",
        "history_short": "歷史",
-       "updatedmarker": "自我上次造訪後的更新",
+       "history_small": "歷史",
+       "updatedmarker": "自我上次瀏覽之後的更新",
        "printableversion": "可列印版",
        "permalink": "靜態連結",
        "print": "列印",
        "views": "檢視",
        "toolbox": "工具",
        "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+       "tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
        "tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
        "userpage": "檢視使用者頁面",
        "projectpage": "檢視專案頁面",
        "redirectpagesub": "重新導向頁面",
        "redirectto": "重新導向至:",
        "lastmodifiedat": "此頁面最後修改於 $1 $2。",
-       "viewcount": "此頁面已被檢視過 $1 次。",
+       "viewcount": "此頁面已被檢視過 {{PLURAL:$1|$1 次}}。",
        "protectedpage": "受保護頁面",
        "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "ok": "確定",
        "retrievedfrom": "取自 \"$1\"",
        "youhavenewmessages": "您有 $1 ($2)。",
-       "youhavenewmessagesfromusers": "有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|您}}有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
        "youhavenewmessagesmanyusers": "你有來自多位使用者的 $1 ($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|一則新訊息|999=新訊息}}",
        "newmessagesdifflinkplural": "最近{{PLURAL:$1|變更}}",
        "blockedtitle": "使用者已被封鎖",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
        "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
+       "systemblockedtext": "您的使用者名稱或IP位址已被MediaWiki自動封禁。原因如下:\n\n:<em>$2</em>\n\n* 開始時間:$8\n* 結束時間:$6\n* 被封禁使用者:$7\n\n您目前的IP位址是$3。請在作出任何查詢時包含上述所有詳情。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "列數:",
-       "columns": "欄數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "選擇用戶",
        "userrights-user-editname": "請輸入使用者名稱:",
-       "editusergroup": "加載用戶組",
+       "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
+       "viewinguserrights": "檢視{{GENDER:$1|使用者}}<strong>[[User:$1|$1]]</strong>的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
+       "userrights-viewusergroup": "檢視使用者群組",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-groupsmember-auto": "所屬隱含群組:",
        "action-upload_by_url": "使用 URL 上傳此檔案",
        "action-writeapi": "使用寫入 API",
        "action-delete": "刪除此頁面",
-       "action-deleterevision": "刪除此修訂",
-       "action-deletedhistory": "檢視此頁面的刪除歷史",
+       "action-deleterevision": "刪除修訂",
+       "action-deletelogentry": "删除日誌記錄",
+       "action-deletedhistory": "檢視頁面的刪除歷史",
+       "action-deletedtext": "查看已刪除的修訂版本文字",
        "action-browsearchive": "搜尋已刪除頁面",
-       "action-undelete": "取消刪除頁面",
-       "action-suppressrevision": "檢閱與還原隱藏修訂",
+       "action-undelete": "取消刪除頁面",
+       "action-suppressrevision": "檢閱與還原隱藏修訂",
        "action-suppressionlog": "檢視此非公開日誌",
        "action-block": "封鎖此使用者的編輯權限",
        "action-protect": "變更此頁面的保護層級",
        "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-siteadmin": "鎖定或解除鎖定資料庫",
        "action-sendemail": "傳送電子郵件",
+       "action-editmyoptions": "編輯自己的偏好設定",
        "action-editmywatchlist": "編輯您的監視清單",
        "action-viewmywatchlist": "檢視您的監視清單",
        "action-viewmyprivateinfo": "檢視您的個人資訊",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "顯示",
+       "rcfilters-activefilters": "現用過濾規則",
+       "rcfilters-search-placeholder": "過濾最近變更(瀏覽或開始輸入)",
+       "rcfilters-invalid-filter": "過濾規則無效",
+       "rcfilters-filterlist-title": "篩選器",
+       "rcfilters-filterlist-noresults": "找不到過濾規則",
+       "rcfilters-filtergroup-authorship": "編輯者",
+       "rcfilters-filter-editsbyself-label": "您自己的編輯",
+       "rcfilters-filter-editsbyself-description": "您的編輯。",
+       "rcfilters-filter-editsbyother-label": "其他人的編輯",
+       "rcfilters-filter-editsbyother-description": "由其他使用者而非您所作的編輯。",
+       "rcfilters-filtergroup-userExpLevel": "經驗等級 (僅限已註冊的使用者)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "編輯數低於 10 次,活躍低於 4 天。",
+       "rcfilters-filter-userExpLevel-learner-label": "初學者",
+       "rcfilters-filter-userExpLevel-learner-description": "活躍的天數以及編輯數比 '新手' 多,但比 '有經驗的使用者' 少。",
+       "rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
+       "rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
        "rcshowhideminor": "$1 小修訂",
        "apisandbox-continue-clear": "清除",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} 會 [https://www.mediawiki.org/wiki/API:Query#Continuing_queries 繼續] 最後的請求,{{int:apisandbox-continue-clear}} 則會清除繼續相關的參數。",
        "apisandbox-param-limit": "輸入 <kbd>max</kbd> 以使用最大限制。",
+       "apisandbox-multivalue-all-namespaces": "$1 (所有命名空間)",
+       "apisandbox-multivalue-all-values": "$1 (所有值)",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "listgrouprights-addgroup-all": "加入所有群組",
        "listgrouprights-removegroup-all": "移除所有群組",
        "listgrouprights-addgroup-self": "在自己的帳號中加入的{{PLURAL:$2|一個|多個}}群組: $1",
-       "listgrouprights-removegroup-self": "在自己的帳號中移除的{{PLURAL:$2|一個|多個}}群組: $1",
+       "listgrouprights-removegroup-self": "移除自己帳號中的{{PLURAL:$2|一個|多個}}群組: $1",
        "listgrouprights-addgroup-self-all": "在自己的帳號中加入所有群組",
-       "listgrouprights-removegroup-self-all": "在自己的帳號中移除所有群組",
+       "listgrouprights-removegroup-self-all": "移除自己帳號中的所有群組",
        "listgrouprights-namespaceprotection-header": "命名空間限制",
        "listgrouprights-namespaceprotection-namespace": "命名空間",
        "listgrouprights-namespaceprotection-restrictedto": "允許使用者編輯的權限",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}} {{GENDER:$1|$2}}。",
+       "emailuserfooter": "這封電子郵件是由$1透過{{SITENAME}}的「{{int:emailuser}}」功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到您的電子郵件地址。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "changecontentmodel-emptymodels-title": "沒有內容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
-       "log-description-contentmodel": "與頁面內容模型相關的事件",
+       "log-description-contentmodel": "此頁列舉頁面內容模型的變更記錄以及使用非預設的內容模型所創建的頁面。",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
+       "softblockrangesreason": "您的IP位址($1)不允許匿名貢獻,請登入。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "cant-move-to-user-page": "您沒有權限移動頁面至使用者頁面 (除使用者子頁面外)。",
        "cant-move-category-page": "您沒有權限移動分類頁面。",
        "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
+       "cant-move-subpages": "您沒有權限移動子頁面。",
+       "namespace-nosubpages": "名字空間「$1」不允許有子頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "pageinfo-length": "頁面長度 (位元組)",
        "pageinfo-article-id": "頁面 ID",
        "pageinfo-language": "頁面內容語言",
+       "pageinfo-language-change": "變更",
        "pageinfo-content-model": "頁面內容模型",
        "pageinfo-content-model-change": "變更",
        "pageinfo-robot-policy": "由機器人建立索引",
        "markaspatrolleddiff": "標記為已巡查",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markaspatrolledtext-file": "標記此檔案版本為己巡查",
-       "markedaspatrolled": "標記為已巡查",
+       "markedaspatrolled": "標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
        "rcpatroldisabled": "最近變更巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "logentry-delete-delete": "$1 刪除頁面 $3",
+       "logentry-delete-delete_redir": "$1通過覆蓋,{{GENDER:$2|刪除了}}重定向$3。",
        "logentry-delete-restore": "$1 還原頁面 $3",
        "logentry-delete-event": "$1 {{GENDER:$2|已更改}} $3 中 {{PLURAL:$5|1 筆日誌|$5 筆日誌}}的可見性:$4",
        "logentry-delete-revision": "$1 {{GENDER:$2|已更改}}頁面 $3 中 {{PLURAL:$5|1 筆修訂|$5 筆修訂}}的可見性:$4",
        "feedback-useragent": "使用者代理:",
        "searchsuggest-search": "搜尋 {{SITENAME}}",
        "searchsuggest-containing": "包含...",
-       "api-error-autoblocked": "您的IP位址已經被自動封禁,因為它曾經被一名已封禁的使用者使用過。",
-       "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
-       "api-error-blocked": "您已被封鎖,無法編輯。",
-       "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
-       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
-       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
-       "api-error-empty-file": "您送出的檔案是空的。",
        "api-error-emptypage": "不允許建立空白的頁面。",
-       "api-error-fetchfileerror": "內部錯誤:取得檔案時發生錯誤。",
-       "api-error-fileexists-forbidden": "名稱為 \"$1\" 的檔案已經存在,並且不能被覆寫。",
-       "api-error-fileexists-shared-forbidden": "名稱為 \"$1\" 的檔案已經存在於共用儲存庫,並且不能被覆寫。",
-       "api-error-file-too-large": "您送出的檔案太大了。",
-       "api-error-filename-tooshort": "檔案名稱過短。",
-       "api-error-filetype-banned": "此檔案類型已禁止使用。",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|不是允許的檔案類型}}。 允許的{{PLURAL:$3|檔案類型有}} $2。",
-       "api-error-filetype-missing": "此檔案名稱缺少副檔名。",
-       "api-error-hookaborted": "您嘗試進行的修改被某個擴充套件中止。",
-       "api-error-http": "內部錯誤:無法連線到伺服器。",
-       "api-error-illegal-filename": "不允許使用的檔案名稱。",
-       "api-error-internal-error": "內部錯誤:此 Wiki 在處理你的上傳時發生錯誤。",
-       "api-error-invalid-file-key": "內部錯誤:於暫存儲存庫中查無檔案。",
-       "api-error-missingparam": "內部錯誤:請求中缺少參數。",
-       "api-error-missingresult": "內部錯誤:無法辨識複製是否成功。",
-       "api-error-mustbeloggedin": "您必須登入方可上傳檔案。",
-       "api-error-mustbeposted": "內部錯誤:請求需使用 HTTP POST。",
-       "api-error-noimageinfo": "已成功上傳,但伺服器未回應任何該檔案的資訊。",
-       "api-error-nomodule": "內部錯誤:缺少上傳模組集。",
-       "api-error-ok-but-empty": "內部錯誤:伺服器沒有回應。",
-       "api-error-overwrite": "不允許覆蓋已存在的檔案。",
-       "api-error-ratelimited": "您正在嘗試在比本wiki所允許時間更短的時間內,上傳更多的檔案。請稍待幾分鐘之後再試一次。",
-       "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
-       "api-error-stasherror": "上傳檔案至儲藏庫時發生錯誤。",
-       "api-error-stashedfilenotfound": "嘗試從儲藏庫上傳檔案時查無該檔案。",
-       "api-error-stashpathinvalid": "應該存在儲藏檔案的路徑無效。",
-       "api-error-stashfilestorage": "儲存檔案至儲藏庫時發生錯誤。",
-       "api-error-stashzerolength": "伺服器無法儲藏該檔案,因為該檔案大小為 0。",
-       "api-error-stashnotloggedin": "您必須登入以儲存檔案於上傳儲藏庫。",
-       "api-error-stashwrongowner": "您嘗試在儲藏庫存取的檔案不屬於您的。",
-       "api-error-stashnosuchfilekey": "您嘗試在儲藏庫存取的檔案金鑰不存在。",
-       "api-error-timeout": "伺服器沒有在預期的時間內回應。",
-       "api-error-unclassified": "發生不明錯誤。",
-       "api-error-unknown-code": "不明錯誤:\"$1\"。",
-       "api-error-unknown-error": "內部錯誤:嘗試上傳您的檔案時發生錯誤。",
+       "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-unknown-warning": "不明警告:\"$1\"。",
        "api-error-unknownerror": "不明錯誤:\"$1\"。",
-       "api-error-uploaddisabled": "此 Wiki 的上傳功能已停用。",
-       "api-error-verification-error": "此檔案可能已損壞,或副檔名錯誤。",
-       "api-error-was-deleted": "與此名稱相同的檔案曾被上傳過,隨後遭到刪除。",
        "duration-seconds": "$1 秒",
        "duration-minutes": "$1 分鐘",
        "duration-hours": "$1 小時",
        "pagelang-language": "語言",
        "pagelang-use-default": "使用預設語言",
        "pagelang-select-lang": "選擇語言",
+       "pagelang-reason": "原因",
        "pagelang-submit": "送出",
+       "pagelang-nonexistent-page": "頁面 $1 不存在。",
+       "pagelang-unchanged-language": "頁面$1的語言已經設為$2。",
+       "pagelang-unchanged-language-default": "頁面$1的語言已經設為wiki的預設內容語言。",
+       "pagelang-db-failed": "資料庫更改頁面語言失敗。",
        "right-pagelang": "變更頁面語言",
        "action-pagelang": "變更頁面語言",
        "log-name-pagelang": "語言變更日誌",
        "special-characters-title-emdash": "長破折號",
        "special-characters-title-minus": "減號",
        "mw-widgets-dateinput-no-date": "未選擇日期",
+       "mw-widgets-mediasearch-input-placeholder": "搜尋媒體",
+       "mw-widgets-mediasearch-noresults": "查無結果。",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "sessionprovider-nocookies": "Cookie 功能可能已被關閉,請確認您改開啟 Cookie 功能並重新啟動。",
        "randomrootpage": "隨機根頁面",
        "log-action-filter-block": "封鎖類型:",
-       "log-action-filter-contentmodel": "內容模型修改類型:",
+       "log-action-filter-contentmodel": "內容模型變更類型:",
        "log-action-filter-delete": "刪除類型:",
        "log-action-filter-import": "匯入類型:",
        "log-action-filter-managetags": "標籤管理動作類型:",
        "log-action-filter-block-block": "封鎖",
        "log-action-filter-block-reblock": "封鎖修改",
        "log-action-filter-block-unblock": "解除封鎖",
-       "log-action-filter-contentmodel-change": "變更內容模型",
-       "log-action-filter-contentmodel-new": "使用非標準內容模型建立的頁面",
+       "log-action-filter-contentmodel-change": "內容模型的變更",
+       "log-action-filter-contentmodel-new": "使用非預設內容模型建立的頁面",
        "log-action-filter-delete-delete": "頁面刪除",
+       "log-action-filter-delete-delete_redir": "重新導向覆寫",
        "log-action-filter-delete-restore": "頁面取消刪除",
        "log-action-filter-delete-event": "日誌刪除",
        "log-action-filter-delete-revision": "修訂刪除",
        "log-action-filter-newusers-create": "由匿名使用者建立",
        "log-action-filter-newusers-create2": "由註冊使用者建立",
        "log-action-filter-newusers-autocreate": "自動建立",
-       "log-action-filter-newusers-byemail": "使用電子郵件送密碼建立",
+       "log-action-filter-newusers-byemail": "使用電子郵件送密碼建立",
        "log-action-filter-patrol-patrol": "手動巡查",
        "log-action-filter-patrol-autopatrol": "自動巡查",
        "log-action-filter-protect-protect": "保護",
        "usercssispublic": "請注意:CSS 子頁面可被其他使用者檢視,不應包含憑証資料。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
-       "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用 <br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用 <br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "修訂 $1",
+       "pageid": "頁面 ID $1"
 }
index c675f09..9ad5951 100644 (file)
@@ -73,4 +73,3 @@ $magicWords = [
        'special'                   => [ '0', 'цастәи', 'служебная', 'special' ],
        'index'                     => [ '1', '__АИНДЕКС__', '__ИНДЕКС__', '__INDEX__' ],
 ];
-
index ad14f4d..d20ad9b 100644 (file)
@@ -153,4 +153,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Hubong_gisa' ],
        'Withoutinterwiki'          => [ 'Hana_interwiki' ],
 ];
-
index d6dab21..d82cde7 100644 (file)
@@ -196,4 +196,3 @@ $specialPageAliases = [
 # glibc is wrong in this respect in some versions
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = "/^([a-z]+)(.*)$/sD";
-
index b45bdbf..abbffa4 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Nkyekyem',
        NS_CATEGORY_TALK    => 'Nkyekyem_nkɔmmɔbea',
 ];
-
index 80d31bc..f5abe87 100644 (file)
@@ -59,4 +59,3 @@ $magicWords = [
        'servername'                => [ '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ],
        'currentweek'               => [ '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ],
 ];
-
index a991c63..99f6d3a 100644 (file)
@@ -37,4 +37,3 @@ $specialPageAliases = [
        'Newpages'                  => [ 'አዳዲስ_ገጾች' ],
        'Shortpages'                => [ 'አጫጭር_ገጾች' ],
 ];
-
index 038566b..b66fe0e 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Wantedtemplates'           => [ 'Plantillas_requiestas', 'Plantillas_demandatas' ],
        'Watchlist'                 => [ 'Lista_de_seguimiento' ],
 ];
-
index d6432de..9e113b4 100644 (file)
@@ -39,4 +39,3 @@ $namespaceAliases = [
        'Floccgesprec'  => NS_CATEGORY_TALK,
        'Floccmotung'   => NS_CATEGORY_TALK,
 ];
-
index a83b717..795d706 100644 (file)
@@ -433,4 +433,3 @@ $imageFiles = [
        'button-headline' => 'ar/button_headline.png',
        'button-nowiki'   => 'ar/button_nowiki.png',
 ];
-
index 0c1b668..e0ab2da 100644 (file)
@@ -125,4 +125,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'ܫܒܝܠܐ', 'PATH' ],
        'url_wiki'                  => [ '0', 'ܘܝܩܝ', 'WIKI' ],
 ];
-
index 311f2e2..2cfb464 100644 (file)
@@ -16,4 +16,3 @@ $separatorTransformTable = [
 ];
 
 $fallback = 'ar';
-
index 2e69353..d99a721 100644 (file)
@@ -332,4 +332,3 @@ $digitTransformTable = [
        '.' => '.',
        ',' => ',',
 ];
-
index bf757ee..2516fc7 100644 (file)
@@ -165,4 +165,3 @@ $digitTransformTable = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 99cc28b..95bbf5a 100644 (file)
@@ -60,4 +60,3 @@ $specialPageAliases = [
        'Search'                    => [ 'Gueta' ],
        'Statistics'                => [ 'Estadístiques' ],
 ];
-
index fab56b1..b335f66 100644 (file)
@@ -89,4 +89,3 @@ $specialPageAliases = [
        'Wantedpages'               => [ 'ErunBueem', 'EmpayanGluyasikieem' ],
        'Watchlist'                 => [ 'Suzdasiki' ],
 ];
-
index 66c7b9f..45afe2a 100644 (file)
@@ -59,4 +59,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 92ca0f8..1ae3939 100644 (file)
@@ -83,4 +83,3 @@ $magicWords = [
        'img_none'                  => [ '1', 'هئچ', 'هیچ', 'none' ],
        'img_framed'                => [ '1', 'قابیق', 'قاب', 'frame', 'framed', 'enframed' ],
 ];
-
index b00da10..e118036 100644 (file)
@@ -129,4 +129,3 @@ $specialPageAliases = [
 $namespaceGenderAliases = [];
 
 $linkTrail = '/^((?:[a-z]|а|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|ә|ө|ү|ғ|ҡ|ң|ҙ|ҫ|һ|“|»)+)(.*)$/sDu';
-
index f484027..8b8041f 100644 (file)
@@ -47,4 +47,3 @@ $namespaceAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index 84f273b..14b89bf 100644 (file)
@@ -131,4 +131,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'ای لینکی ادان هست' ],
        'Withoutinterwiki'          => [ 'بی بین ویکی' ],
 ];
-
index 0b0d42e..44e1f25 100644 (file)
@@ -87,4 +87,3 @@ $magicWords = [
        'pagesincategory'           => [ '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ],
        'pagesize'                  => [ '1', 'PAHINASOKOL', 'PAGESIZE' ],
 ];
-
index 9822436..ea807fd 100644 (file)
@@ -46,7 +46,7 @@ $magicWords = [
 
 $bookstoreList = [
        'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $datePreferences = [
@@ -70,4 +70,3 @@ $separatorTransformTable = [
 ];
 
 $linkTrail = '/^([абвгґджзеёжзійклмнопрстуўфхцчшыьэюяćčłńśšŭźža-z]+)(.*)$/sDu';
-
index 25449f8..a6fd58a 100644 (file)
@@ -215,7 +215,7 @@ $magicWords = [
 
 $bookstoreList = [
        'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $datePreferences = [
@@ -244,4 +244,3 @@ $imageFiles = [
        'button-italic'   => 'be-tarask/button_italic.png',
        'button-link'     => 'be-tarask/button_link.png',
 ];
-
index 74b7fe0..3a21e75 100644 (file)
@@ -218,4 +218,3 @@ $bookstoreList = [
 $linkTrail = '/^([a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 9b70dbf..f1505af 100644 (file)
@@ -135,4 +135,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Tautan_balik' ],
        'Withoutinterwiki'          => [ 'Kada_pakai_interwiki' ],
 ];
-
index f5afe2a..654171e 100644 (file)
@@ -12,4 +12,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 7dde2b7..4edce3d 100644 (file)
@@ -174,10 +174,10 @@ $specialPageAliases = [
 
 $magicWords = [
        'redirect'                => [ 0, '#পুনর্নির্দেশ', '#পুনঃর্নির্দেশ', '#পুনঃনির্দেশ', '#পুননির্দেশ', '#REDIRECT' ],
-       'notoc'                   => [ 0, '__à¦\95à§\8bন_বিষà§\9fবসà§\8dতà§\81র_à¦\9bà¦\95_নà§\9f__', '__à¦\95à§\8bনবিষà§\9fবসà§\8dতà§\81রà¦\9bà¦\95নà§\9f__', '__à¦\95à§\8bন_বিষà§\9fবসà§\8dতà§\81র_à¦\9fà§\87বিল_নà§\9f__', '__à¦\95à§\8bনবিষà§\9fবসà§\8dতà§\81রà¦\9fà§\87বিলনà§\9f__', '__NOTOC__' ],
-       'nogallery'               => [ 0, '__à¦\95à§\8bনà¦\97à§\8dযালারিনà§\9f__', '__à¦\95à§\8bনà¦\97à§\8dযালারà§\80নà§\9f__', '__à¦\95à§\8bন_à¦\97à§\8dযালারি_নà§\9f__', '__à¦\95à§\8bন_à¦\97à§\8dযালারà§\80_নà§\9f__', '__NOGALLERY__' ],
-       'toc'                     => [ 0, '__বিষà§\9fবসà§\8dতà§\81র_à¦\9bà¦\95__', '__বিষà§\9fবসà§\8dতà§\81রà¦\9bà¦\95__', '__বিষà§\9fবসà§\8dতà§\81র_à¦\9fà§\87বিল__', '__বিষà§\9fবস্তুরটেবিল__', '__TOC__' ],
-       'noeditsection'           => [ 0, '__à¦\95à§\8bনসমà§\8dপাদনাà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দনà§\9f__', '__à¦\95à§\8bন_সমà§\8dপাদনা_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ_নà§\9f__', '__NOEDITSECTION__' ],
+       'notoc'                   => [ 0, '__à¦\95à§\8bন_বিষয়বসà§\8dতà§\81র_à¦\9bà¦\95_নয়__', '__à¦\95à§\8bনবিষয়বসà§\8dতà§\81রà¦\9bà¦\95নয়__', '__à¦\95à§\8bন_বিষয়বসà§\8dতà§\81র_à¦\9fà§\87বিল_নয়__', '__à¦\95à§\8bনবিষয়বসà§\8dতà§\81রà¦\9fà§\87বিলনয়__', '__NOTOC__' ],
+       'nogallery'               => [ 0, '__à¦\95à§\8bনà¦\97à§\8dযালারিনয়__', '__à¦\95à§\8bনà¦\97à§\8dযালারà§\80নয়__', '__à¦\95à§\8bন_à¦\97à§\8dযালারি_নয়__', '__à¦\95à§\8bন_à¦\97à§\8dযালারà§\80_নয়__', '__NOGALLERY__' ],
+       'toc'                     => [ 0, '__বিষয়বসà§\8dতà§\81র_à¦\9bà¦\95__', '__বিষয়বসà§\8dতà§\81রà¦\9bà¦\95__', '__বিষয়বসà§\8dতà§\81র_à¦\9fà§\87বিল__', '__বিষয়বস্তুরটেবিল__', '__TOC__' ],
+       'noeditsection'           => [ 0, '__à¦\95à§\8bনসমà§\8dপাদনাà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দনয়__', '__à¦\95à§\8bন_সমà§\8dপাদনা_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ_নয়__', '__NOEDITSECTION__' ],
        'currentmonth'            => [ 1, 'চলতি_মাস', 'চলতিমাস', 'বর্তমান_মাস', 'বর্তমানমাস', 'বর্তমান_মাস_২', 'বর্তমানমাস২', 'CURRENTMONTH', 'CURRENTMONTH2' ],
        'currentmonth1'           => [ 1, 'চলতি_মাস_১', 'চলতিমাস১', 'বর্তমান_মাস_১', 'বর্তমানমাস১', 'CURRENTMONTH1' ],
        'currentmonthname'        => [ 1, 'বর্তমান_মাসের_নাম', 'বর্তমানমাসেরনাম', 'CURRENTMONTHNAME' ],
@@ -187,24 +187,24 @@ $magicWords = [
        'currentday2'             => [ 1, 'বর্তমান_দিন_২', 'বর্তমানদিন২', 'আজকের_দিন_২', 'আজকেরদিন২', 'CURRENTDAY2' ],
        'currentdayname'          => [ 1, 'বর্তমান_দিনের_নাম', 'বর্তমানদিনেরনাম', 'আজকের_দিনের_নাম', 'আজকেরদিনেরনাম', 'CURRENTDAYNAME' ],
        'currentyear'             => [ 1, 'চলতি_বছর', 'চলতিবছর', 'বর্তমান_বছর', 'বর্তমানবছর', 'CURRENTYEAR' ],
-       'currenttime'             => [ 1, 'বরà§\8dতমান_সমà§\9f', 'বরà§\8dতমানসমà§\9f', 'à¦\8fà¦\96নà¦\95ার_সমà§\9f', 'à¦\8fà¦\96নà¦\95ারসমà§\9f', 'à¦\8fà¦\96ন_সমà§\9f', 'CURRENTTIME' ],
+       'currenttime'             => [ 1, 'বরà§\8dতমান_সময়', 'বরà§\8dতমানসময়', 'à¦\8fà¦\96নà¦\95ার_সময়', 'à¦\8fà¦\96নà¦\95ারসময়', 'à¦\8fà¦\96ন_সময়', 'CURRENTTIME' ],
        'currenthour'             => [ 1, 'বর্তমান_ঘণ্টা', 'বর্তমানঘণ্টা', 'বর্তমান_ঘন্টা', 'বর্তমানঘন্টা', 'এখনকার_ঘণ্টা', 'এখনকারঘণ্টা', 'CURRENTHOUR' ],
-       'localmonth'              => [ 1, 'সà§\8dথানà§\80à§\9f_মাস', 'সà§\8dথানà§\80à§\9fমাস', 'সà§\8dথানà§\80à§\9f_মাস_২', 'সà§\8dথানà§\80à§\9fমাস২', 'LOCALMONTH', 'LOCALMONTH2' ],
-       'localmonth1'             => [ 1, 'সà§\8dথানà§\80à§\9f_মাস_১', 'সà§\8dথানà§\80à§\9fমাস১', 'LOCALMONTH1' ],
-       'localmonthname'          => [ 1, 'সà§\8dথানà§\80à§\9f_মাসà§\87র_নাম', 'সà§\8dথানà§\80à§\9fমাসেরনাম', 'LOCALMONTHNAME' ],
-       'localmonthnamegen'       => [ 1, 'সà§\8dথানà§\80à§\9f_মাসà§\87র_নাম_à¦\89à§\8eপনà§\8dন', 'সà§\8dথানà§\80à§\9fমাসেরনামউৎপন্ন', 'LOCALMONTHNAMEGEN' ],
-       'localmonthabbrev'        => [ 1, 'সà§\8dথানà§\80à§\9f_মাস_সà¦\82à¦\95à§\8dষà§\87প', 'সà§\8dথানà§\80à§\9fমাসসà¦\82à¦\95à§\8dষà§\87প', 'সà§\8dথানà§\80à§\9f_মাস_সà¦\82à¦\95à§\8dষিপà§\8dত', 'সà§\8dথানà§\80à§\9fমাসসংক্ষিপ্ত', 'সংক্ষেপিত_স্থানীয়_মাস', 'সংক্ষেপিতস্থানীয়মাস', 'LOCALMONTHABBREV' ],
-       'localday'                => [ 1, 'সà§\8dথানà§\80à§\9f_দিন', 'সà§\8dথানà§\80à§\9fদিন', 'স্থানীয়_বার', 'স্থানীয়বার', 'LOCALDAY' ],
-       'localday2'               => [ 1, 'সà§\8dথানà§\80à§\9f_দিন_২', 'সà§\8dথানà§\80à§\9fদিন২', 'LOCALDAY2' ],
-       'localdayname'            => [ 1, 'সà§\8dথানà§\80à§\9f_দিনà§\87র_নাম', 'সà§\8dথানà§\80à§\9fদিনেরনাম', 'LOCALDAYNAME' ],
-       'localyear'               => [ 1, 'সà§\8dথানà§\80à§\9f_বà¦\9bর', 'সà§\8dথানà§\80à§\9fবছর', 'LOCALYEAR' ],
-       'localtime'               => [ 1, 'সà§\8dথানà§\80à§\9f_সমà§\9f', 'সà§\8dথানà§\80à§\9fসমà§\9f', 'LOCALTIME' ],
-       'localhour'               => [ 1, 'সà§\8dথানà§\80à§\9f_à¦\98ণà§\8dà¦\9fা', 'সà§\8dথানà§\80à§\9fà¦\98ণà§\8dà¦\9fা', 'সà§\8dথানà§\80à§\9f_à¦\98নà§\8dà¦\9fা', 'সà§\8dথানà§\80à§\9fঘন্টা', 'LOCALHOUR' ],
+       'localmonth'              => [ 1, 'সà§\8dথানà§\80য়_মাস', 'সà§\8dথানà§\80য়মাস', 'সà§\8dথানà§\80য়_মাস_২', 'সà§\8dথানà§\80য়মাস২', 'LOCALMONTH', 'LOCALMONTH2' ],
+       'localmonth1'             => [ 1, 'সà§\8dথানà§\80য়_মাস_১', 'সà§\8dথানà§\80য়মাস১', 'LOCALMONTH1' ],
+       'localmonthname'          => [ 1, 'সà§\8dথানà§\80য়_মাসà§\87র_নাম', 'সà§\8dথানà§\80য়মাসেরনাম', 'LOCALMONTHNAME' ],
+       'localmonthnamegen'       => [ 1, 'সà§\8dথানà§\80য়_মাসà§\87র_নাম_à¦\89à§\8eপনà§\8dন', 'সà§\8dথানà§\80য়মাসেরনামউৎপন্ন', 'LOCALMONTHNAMEGEN' ],
+       'localmonthabbrev'        => [ 1, 'সà§\8dথানà§\80য়_মাস_সà¦\82à¦\95à§\8dষà§\87প', 'সà§\8dথানà§\80য়মাসসà¦\82à¦\95à§\8dষà§\87প', 'সà§\8dথানà§\80য়_মাস_সà¦\82à¦\95à§\8dষিপà§\8dত', 'সà§\8dথানà§\80য়মাসসংক্ষিপ্ত', 'সংক্ষেপিত_স্থানীয়_মাস', 'সংক্ষেপিতস্থানীয়মাস', 'LOCALMONTHABBREV' ],
+       'localday'                => [ 1, 'সà§\8dথানà§\80য়_দিন', 'সà§\8dথানà§\80য়দিন', 'স্থানীয়_বার', 'স্থানীয়বার', 'LOCALDAY' ],
+       'localday2'               => [ 1, 'সà§\8dথানà§\80য়_দিন_২', 'সà§\8dথানà§\80য়দিন২', 'LOCALDAY2' ],
+       'localdayname'            => [ 1, 'সà§\8dথানà§\80য়_দিনà§\87র_নাম', 'সà§\8dথানà§\80য়দিনেরনাম', 'LOCALDAYNAME' ],
+       'localyear'               => [ 1, 'সà§\8dথানà§\80য়_বà¦\9bর', 'সà§\8dথানà§\80য়বছর', 'LOCALYEAR' ],
+       'localtime'               => [ 1, 'সà§\8dথানà§\80য়_সময়', 'সà§\8dথানà§\80য়সময়', 'LOCALTIME' ],
+       'localhour'               => [ 1, 'সà§\8dথানà§\80য়_à¦\98ণà§\8dà¦\9fা', 'সà§\8dথানà§\80য়à¦\98ণà§\8dà¦\9fা', 'সà§\8dথানà§\80য়_à¦\98নà§\8dà¦\9fা', 'সà§\8dথানà§\80য়ঘন্টা', 'LOCALHOUR' ],
        'numberofpages'           => [ 1, 'পাতার_সংখ্যা', 'পাতারসংখ্যা', 'পৃষ্ঠার_সংখ্যা', 'পৃষ্ঠারসংখ্যা', 'পৃষ্ঠা_সংখ্যা', 'পৃষ্ঠাসংখ্যা', 'NUMBEROFPAGES' ],
        'numberofarticles'        => [ 1, 'নিবন্ধের_সংখ্যা', 'নিবন্ধেরসংখ্যা', 'নিবন্ধ_সংখ্যা', 'নিবন্ধসংখ্যা', 'NUMBEROFARTICLES' ],
        'numberoffiles'           => [ 1, 'ফাইলের_সংখ্যা', 'ফাইলেরসংখ্যা', 'ফাইল_সংখ্যা', 'ফাইলসংখ্যা', 'NUMBEROFFILES' ],
        'numberofusers'           => [ 1, 'ব্যবহারকারীর_সংখ্যা', 'ব্যবহারকারীরসংখ্যা', 'ব্যবহারকারী_সংখ্যা', 'ব্যবহারকারীসংখ্যা', 'NUMBEROFUSERS' ],
-       'numberofactiveusers'     => [ 1, 'সà¦\95à§\8dরিà§\9f_বà§\8dযবহারà¦\95ারà§\80র_সà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিà§\9fবà§\8dযবহারà¦\95ারà§\80রসà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিà§\9f_বà§\8dযবহারà¦\95ারà§\80_সà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিà§\9fব্যবহারকারীসংখ্যা', 'NUMBEROFACTIVEUSERS' ],
+       'numberofactiveusers'     => [ 1, 'সà¦\95à§\8dরিয়_বà§\8dযবহারà¦\95ারà§\80র_সà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিয়বà§\8dযবহারà¦\95ারà§\80রসà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিয়_বà§\8dযবহারà¦\95ারà§\80_সà¦\82à¦\96à§\8dযা', 'সà¦\95à§\8dরিয়ব্যবহারকারীসংখ্যা', 'NUMBEROFACTIVEUSERS' ],
        'numberofedits'           => [ 1, 'সম্পাদনার_সংখ্যা', 'সম্পাদনারসংখ্যা', 'সম্পাদনা_সংখ্যা', 'সম্পাদনাসংখ্যা', 'NUMBEROFEDITS' ],
        'pagename'                => [ 1, 'পাতার_নাম', 'পাতারনাম', 'পৃষ্ঠার_নাম', 'পৃষ্ঠারনাম', 'PAGENAME' ],
        'pagenamee'               => [ 1, 'পাতার_নামম', 'পাতারনামম', 'পৃষ্ঠার_নামম', 'পৃষ্ঠারনামম', 'PAGENAMEE' ],
@@ -213,8 +213,8 @@ $magicWords = [
        'namespacenumber'         => [ 1, 'নামস্থানের_সংখ্যা', 'নামস্থানেরসংখ্যা', 'NAMESPACENUMBER' ],
        'talkspace'               => [ 1, 'আলাপের_স্থান', 'আলোচনার_স্থান', 'আলাপেরস্থান', 'আলোচনারস্থান', 'আলাপের_জায়গা', 'আলাপেরজায়গা', 'TALKSPACE' ],
        'talkspacee'              => [ 1, 'আলাপের_স্থানন', 'আলোচনার_স্থানন', 'আলাপেরস্থানন', 'আলোচনারস্থানন', 'TALKSPACEE' ],
-       'subjectspace'            => [ 1, 'বিষà§\9fà§\87র_সà§\8dথান', 'নিবনà§\8dধà§\87র_সà§\8dথান', 'বিষà§\9fেরস্থান', 'নিবন্ধেরস্থান', 'SUBJECTSPACE', 'ARTICLESPACE' ],
-       'subjectspacee'           => [ 1, 'বিষà§\9fà§\87র_সà§\8dথানন', 'নিবনà§\8dধà§\87র_সà§\8dথানন', 'বিষà§\9fেরস্থানন', 'নিবন্ধেরস্থানন', 'SUBJECTSPACEE', 'ARTICLESPACEE' ],
+       'subjectspace'            => [ 1, 'বিষয়à§\87র_সà§\8dথান', 'নিবনà§\8dধà§\87র_সà§\8dথান', 'বিষয়েরস্থান', 'নিবন্ধেরস্থান', 'SUBJECTSPACE', 'ARTICLESPACE' ],
+       'subjectspacee'           => [ 1, 'বিষয়à§\87র_সà§\8dথানন', 'নিবনà§\8dধà§\87র_সà§\8dথানন', 'বিষয়েরস্থানন', 'নিবন্ধেরস্থানন', 'SUBJECTSPACEE', 'ARTICLESPACEE' ],
        'fullpagename'            => [ 1, 'পূর্ণ_পাতার_নাম', 'সম্পূর্ণ_পাতার_নাম', 'পূর্ণপাতারনাম', 'সম্পূর্ণপাতারনাম', 'পূর্ণ_পৃষ্ঠার_নাম', 'সম্পূর্ণ_পৃষ্ঠার_নাম', 'পূর্ণপৃষ্ঠারনাম', 'সম্পূর্ণপৃষ্ঠারনাম', 'FULLPAGENAME' ],
        'fullpagenamee'           => [ 1, 'পূর্ণ_পাতার_নামম', 'সম্পূর্ণ_পাতার_নামম', 'পূর্ণপাতারনামম', 'সম্পূর্ণপাতারনামম', 'পূর্ণ_পৃষ্ঠার_নামম', 'সম্পূর্ণ_পৃষ্ঠার_নামম', 'পূর্ণপৃষ্ঠারনামম', 'সম্পূর্ণপৃষ্ঠারনামম', 'FULLPAGENAMEE' ],
        'subpagename'             => [ 1, 'উপপাতার_নাম', 'উপপাতারনাম', 'উপপৃষ্ঠার_নাম', 'উপপৃষ্ঠারনাম', 'SUBPAGENAME' ],
@@ -225,8 +225,8 @@ $magicWords = [
        'basepagenamee'           => [ 1, 'ভিত্তি_পাতার_নামম', 'ভিত্তিপাতারনামম', 'ভিত্তি_পৃষ্ঠার_নামম', 'ভিত্তি_পৃষ্ঠার_নামম', 'BASEPAGENAMEE' ],
        'talkpagename'            => [ 1, 'আলাপ_পাতার_নাম', 'আলাপপাতারনাম', 'আলাপ_পৃষ্ঠার_নাম', 'আলোচনা_পৃষ্ঠার_নাম', 'আলোচনা_পাতার_নাম', 'আলোচনাপাতারনাম', 'আলোচনা_পৃষ্ঠার_নাম', 'আলোচনা_পৃষ্ঠার_নাম', 'TALKPAGENAME' ],
        'talkpagenamee'           => [ 1, 'আলাপ_পাতার_নামম', 'আলাপপাতারনামম', 'আলাপ_পৃষ্ঠার_নামম', 'আলোচনা_পৃষ্ঠার_নামম', 'আলোচনা_পাতার_নামম', 'আলোচনাপাতারনামম', 'আলোচনা_পৃষ্ঠার_নামম', 'আলোচনা_পৃষ্ঠার_নামম', 'TALKPAGENAMEE' ],
-       'subjectpagename'         => [ 1, 'বিষà§\9fà§\87র_পাতার_নাম', 'বিষà§\9fà§\87রপাতারনাম', 'বিষà§\9fà§\87র_পà§\83ষà§\8dঠার_নাম', 'বিষà§\9fেরপৃষ্ঠারনাম', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ],
-       'subjectpagenamee'        => [ 1, 'বিষà§\9fà§\87র_পাতার_নামম', 'বিষà§\9fà§\87রপাতারনামম', 'বিষà§\9fà§\87র_পà§\83ষà§\8dঠার_নামম', 'বিষà§\9fেরপৃষ্ঠারনামম', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ],
+       'subjectpagename'         => [ 1, 'বিষয়à§\87র_পাতার_নাম', 'বিষয়à§\87রপাতারনাম', 'বিষয়à§\87র_পà§\83ষà§\8dঠার_নাম', 'বিষয়েরপৃষ্ঠারনাম', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ],
+       'subjectpagenamee'        => [ 1, 'বিষয়à§\87র_পাতার_নামম', 'বিষয়à§\87রপাতারনামম', 'বিষয়à§\87র_পà§\83ষà§\8dঠার_নামম', 'বিষয়েরপৃষ্ঠারনামম', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ],
        'img_thumbnail'           => [ 1, 'থাম্ব','থাম্বনেইল', 'thumb', 'thumbnail' ],
        'img_manualthumb'         => [ 1, 'থাম্ব=$1','থাম্বনেইল=$1', 'thumbnail=$1', 'thumb=$1' ],
        'img_right'               => [ 1, 'ডান', 'ডানে', 'right' ],
@@ -248,7 +248,7 @@ $magicWords = [
        'img_link'                => [ 1, 'সংযোগ=$1', 'লিঙ্ক=$1', 'link=$1' ],
        'img_class'               => [ 1, 'ক্লাস=$1', 'class=$1' ],
        'sitename'                => [ 1, 'সাইটের_নাম', 'সাইটেরনাম', 'SITENAME' ],
-       'localurl'                => [ 0, 'সà§\8dথানà§\80à§\9f_à¦\87à¦\89à¦\86রà¦\8fল:', 'সà§\8dথানà§\80à§\9fইউআরএল:', 'LOCALURL:' ],
+       'localurl'                => [ 0, 'সà§\8dথানà§\80য়_à¦\87à¦\89à¦\86রà¦\8fল:', 'সà§\8dথানà§\80য়ইউআরএল:', 'LOCALURL:' ],
        'articlepath'             => [ 0, 'নিবন্ধের_পথ', 'নিবন্ধেরপথ', 'ARTICLEPATH' ],
        'pageid'                  => [ 0, 'পাতার_আইডি', 'পাতারআইডি', 'পৃষ্ঠার_আইডি', 'পৃষ্ঠারআইডি', 'PAGEID' ],
        'server'                  => [ 0, 'সার্ভার', 'SERVER' ],
@@ -258,31 +258,31 @@ $magicWords = [
        'grammar'                 => [ 0, 'ব্যাকরণ:', 'GRAMMAR:' ],
        'gender'                  => [ 0, 'লিঙ্গ:', 'GENDER:' ],
        'bidi'                    => [ 0, 'বিআইডিআই:', 'BIDI:' ],
-       'notitleconvert'          => [ 0, '__à¦\95à§\8bন_শিরà§\8bনাম_রà§\82পানà§\8dতরà¦\95ারà§\80_নà§\9f__', '__à¦\95à§\8bনশিরà§\8bনামরà§\82পানà§\8dতরà¦\95ারà§\80নà§\9f__', '__NOTITLECONVERT__', '__NOTC__' ],
-       'nocontentconvert'        => [ 0, '__à¦\95à§\8bন_বিষà§\9fবসà§\8dতà§\81_রà§\82পানà§\8dতরà¦\95ারà§\80_নà§\9f__', '__à¦\95à§\8bনবিষà§\9fবসà§\8dতà§\81রà§\82পানà§\8dতরà¦\95ারà§\80নà§\9f__', '__NOCONTENTCONVERT__', '__NOCC__' ],
+       'notitleconvert'          => [ 0, '__à¦\95à§\8bন_শিরà§\8bনাম_রà§\82পানà§\8dতরà¦\95ারà§\80_নয়__', '__à¦\95à§\8bনশিরà§\8bনামরà§\82পানà§\8dতরà¦\95ারà§\80নয়__', '__NOTITLECONVERT__', '__NOTC__' ],
+       'nocontentconvert'        => [ 0, '__à¦\95à§\8bন_বিষয়বসà§\8dতà§\81_রà§\82পানà§\8dতরà¦\95ারà§\80_নয়__', '__à¦\95à§\8bনবিষয়বসà§\8dতà§\81রà§\82পানà§\8dতরà¦\95ারà§\80নয়__', '__NOCONTENTCONVERT__', '__NOCC__' ],
        'currentweek'             => [ 1, 'বর্তমান_সপ্তাহ', 'বর্তমানসপ্তাহ', 'চলতি_সপ্তাহ', 'চলতিসপ্তাহ', 'CURRENTWEEK' ],
        'currentdow'              => [ 1, 'বর্তমান_সপ্তাহের_দিন', 'বর্তমানসপ্তাহেরদিন', 'CURRENTDOW' ],
-       'localweek'               => [ 1, 'সà§\8dথানà§\80à§\9f_সপà§\8dতাহ', 'সà§\8dথানà§\80à§\9fসপ্তাহ', 'LOCALWEEK' ],
-       'localdow'                => [ 1, 'সà§\8dথানà§\80à§\9f_সপà§\8dতাহà§\87র_দিন', 'সà§\8dথানà§\80à§\9fসপ্তাহেরদিন', 'LOCALDOW' ],
+       'localweek'               => [ 1, 'সà§\8dথানà§\80য়_সপà§\8dতাহ', 'সà§\8dথানà§\80য়সপ্তাহ', 'LOCALWEEK' ],
+       'localdow'                => [ 1, 'সà§\8dথানà§\80য়_সপà§\8dতাহà§\87র_দিন', 'সà§\8dথানà§\80য়সপ্তাহেরদিন', 'LOCALDOW' ],
        'revisionid'              => [ 1, 'সংশোধনের_আইডি', 'সংশোধনেরআইডি', 'REVISIONID' ],
        'revisionday'             => [ 1, 'সংশোধনের_দিন', 'সংশোধনেরদিন', 'REVISIONDAY' ],
        'revisionday2'            => [ 1, 'সংশোধনের_দিন_২', 'সংশোধনেরদিন২', 'REVISIONDAY2' ],
        'revisionmonth'           => [ 1, 'সংশোধনের_মাস', 'সংশোধনেরমাস', 'REVISIONMONTH' ],
        'revisionmonth1'          => [ 1, 'সংশোধনের_মাস_১', 'সংশোধনেরমাস১', 'REVISIONMONTH1' ],
        'revisionyear'            => [ 1, 'সংশোধনের_বছর', 'সংশোধনেরবছর', 'REVISIONYEAR' ],
-       'revisiontimestamp'       => [ 1, 'সà¦\82শà§\8bধনà§\87র_সমà§\9fতারিà¦\96', 'সà¦\82শà§\8bধনà§\87রসমà§\9fতারিখ', 'REVISIONTIMESTAMP' ],
+       'revisiontimestamp'       => [ 1, 'সà¦\82শà§\8bধনà§\87র_সময়তারিà¦\96', 'সà¦\82শà§\8bধনà§\87রসময়তারিখ', 'REVISIONTIMESTAMP' ],
        'revisionuser'            => [ 1, 'সংশোধনের_ব্যবহারকারী', 'সংশোধনেরব্যবহারকারী', 'REVISIONUSER' ],
        'revisionsize'            => [ 1, 'সংশোধনের_আকার', 'সংশোধনেরআকার', 'REVISIONSIZE' ],
        'plural'                  => [ 0, 'বহুবচন:', 'PLURAL:' ],
        'raw'                     => [ 0, 'অবিন্যস্ত:', 'RAW:' ],
        'displaytitle'            => [ 1, 'প্রদর্শনের_শিরোনাম', 'প্রদর্শনেরশিরোনাম', 'প্রদর্শিত_শিরোনাম', 'প্রদর্শিতশিরোনাম', 'DISPLAYTITLE' ],
        'newsectionlink'          => [ 1, '__নতুন_অনুচ্ছেদের_সংযোগ__', '__নতুন_অনুচ্ছেদের_লিঙ্ক__', '__নতুনঅনুচ্ছেদেরসংযোগ__', '__নতুনঅনুচ্ছেদেরলিঙ্ক__', '__NEWSECTIONLINK__' ],
-       'nonewsectionlink'        => [ 1, '__à¦\95à§\8bন_নতà§\81ন_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87র_সà¦\82যà§\8bà¦\97_নà§\9f__', '__à¦\95à§\8bন_নতà§\81ন_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87র_লিà¦\99à§\8dà¦\95_নà§\9f__', '__à¦\95à§\8bননতà§\81নà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87রসà¦\82যà§\8bà¦\97নà§\9f__', '__à¦\95à§\8bননতà§\81নà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87রলিà¦\99à§\8dà¦\95নà§\9f__', '__NONEWSECTIONLINK__' ],
+       'nonewsectionlink'        => [ 1, '__à¦\95à§\8bন_নতà§\81ন_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87র_সà¦\82যà§\8bà¦\97_নয়__', '__à¦\95à§\8bন_নতà§\81ন_à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87র_লিà¦\99à§\8dà¦\95_নয়__', '__à¦\95à§\8bননতà§\81নà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87রসà¦\82যà§\8bà¦\97নয়__', '__à¦\95à§\8bননতà§\81নà¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87রলিà¦\99à§\8dà¦\95নয়__', '__NONEWSECTIONLINK__' ],
        'currentversion'          => [ 1, 'বর্তমান_সংস্করণ', 'বর্তমানসংস্করণ', 'CURRENTVERSION' ],
-       'currenttimestamp'        => [ 1, 'বরà§\8dতমান_সমà§\9fতারিà¦\96', 'বরà§\8dতমান_সমà§\9fতারিখ', 'CURRENTTIMESTAMP' ],
-       'localtimestamp'          => [ 1, 'সà§\8dথানà§\80à§\9f_সমà§\9fতারিà¦\96', 'সà§\8dথানà§\80à§\9fসমà§\9fতারিখ', 'LOCALTIMESTAMP' ],
+       'currenttimestamp'        => [ 1, 'বরà§\8dতমান_সময়তারিà¦\96', 'বরà§\8dতমান_সময়তারিখ', 'CURRENTTIMESTAMP' ],
+       'localtimestamp'          => [ 1, 'সà§\8dথানà§\80য়_সময়তারিà¦\96', 'সà§\8dথানà§\80য়সময়তারিখ', 'LOCALTIMESTAMP' ],
        'language'                => [ 0, '#ভাষা:', '#LANGUAGE:' ],
-       'contentlanguage'         => [ 1, 'বিষà§\9fবসà§\8dতà§\81র_ভাষা', 'বিষà§\9fবস্তুরভাষা', 'CONTENTLANGUAGE', 'CONTENTLANG' ],
+       'contentlanguage'         => [ 1, 'বিষয়বসà§\8dতà§\81র_ভাষা', 'বিষয়বস্তুরভাষা', 'CONTENTLANGUAGE', 'CONTENTLANG' ],
        'pagesinnamespace'        => [ 1, 'নামস্থানে_পাতা', 'নামস্থানে_পৃষ্ঠা', 'নামস্থানেপাতা', 'নামস্থানেপৃষ্ঠা', 'PAGESINNAMESPACE:', 'PAGESINNS:' ],
        'numberofadmins'          => [ 1, 'প্রশাসকের_সংখ্যা', 'প্রশাসকেরসংখ্যা', 'প্রশাসক_সংখ্যা', 'প্রশাসকসংখ্যা', 'NUMBEROFADMINS' ],
        'formatnum'               => [ 0, 'নম্বর_বিন্যাস', 'নম্বরবিন্যাস', 'FORMATNUM' ],
@@ -290,11 +290,11 @@ $magicWords = [
        'defaultsort'             => [ 1, 'পূর্বনির্ধারিত_বাছাই', 'পূর্বনির্ধারিতবাছাই', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ],
        'filepath'                => [ 0, 'ফাইলের_পথ:', 'ফাইলেরপথ:', 'FILEPATH:' ],
        'tag'                     => [ 0, 'ট্যাগ', 'tag' ],
-       'hiddencat'               => [ 1, '__লà§\81à¦\95াà§\9fিতবিষà§\9fশ্রেণী__', '__লুক্কায়িতবিষয়শ্রেণী__', '__HIDDENCAT__' ],
-       'pagesincategory'         => [ 1, 'বিষà§\9fশà§\8dরà§\87ণà§\80তà§\87পাতা', 'বিষà§\9fশà§\8dরà§\87ণà§\80তà§\87পà§\83ষà§\8dঠা', 'বিষà§\9fশà§\8dরà§\87ণà§\80তà§\87_পাতা', 'বিষà§\9fশ্রেণীতে_পৃষ্ঠা', 'PAGESINCATEGORY', 'PAGESINCAT' ],
+       'hiddencat'               => [ 1, '__লà§\81à¦\95ায়িতবিষয়শ্রেণী__', '__লুক্কায়িতবিষয়শ্রেণী__', '__HIDDENCAT__' ],
+       'pagesincategory'         => [ 1, 'বিষয়শà§\8dরà§\87ণà§\80তà§\87পাতা', 'বিষয়শà§\8dরà§\87ণà§\80তà§\87পà§\83ষà§\8dঠা', 'বিষয়শà§\8dরà§\87ণà§\80তà§\87_পাতা', 'বিষয়শ্রেণীতে_পৃষ্ঠা', 'PAGESINCATEGORY', 'PAGESINCAT' ],
        'pagesize'                => [ 1, 'পাতার_আকার', 'পাতারআকার', 'পৃষ্ঠার_আকার', 'পৃষ্ঠারআকার', 'PAGESIZE' ],
        'index'                   => [ 1, '__নির্ঘণ্ট__', '__INDEX__' ],
-       'noindex'                 => [ 1, '__à¦\95à§\8bননিরà§\8dà¦\98ণà§\8dà¦\9fনà§\9f__', '__à¦\95à§\8bন_নিরà§\8dà¦\98ণà§\8dà¦\9f_নà§\9f__', '__নিরà§\8dà¦\98ণà§\8dà¦\9fনà§\9f__', '__NOINDEX__' ],
+       'noindex'                 => [ 1, '__à¦\95à§\8bননিরà§\8dà¦\98ণà§\8dà¦\9fনয়__', '__à¦\95à§\8bন_নিরà§\8dà¦\98ণà§\8dà¦\9f_নয়__', '__নিরà§\8dà¦\98ণà§\8dà¦\9fনয়__', '__NOINDEX__' ],
        'numberingroup'           => [ 1, 'দলে_সংখ্যা', 'দলেসংখ্যা', 'NUMBERINGROUP', 'NUMINGROUP' ],
        'staticredirect'          => [ 1, '__স্থির_পুনর্নির্দেশ__', '__স্থিরপুনর্নির্দেশ__', '__STATICREDIRECT__' ],
        'protectionlevel'         => [ 1, 'সুরক্ষার_স্তর', 'সুরক্ষারস্তর', 'সুরক্ষা_স্তর', 'সুরক্ষাস্তর', 'PROTECTIONLEVEL' ],
@@ -304,7 +304,7 @@ $magicWords = [
        'url_wiki'                => [ 0, 'উইকি', 'WIKI' ],
        'pagesincategory_all'     => [ 0, 'সব', 'সকল', 'all' ],
        'pagesincategory_pages'   => [ 0, 'পাতাসমূহ', 'পৃষ্ঠাসমূহ', 'pages' ],
-       'pagesincategory_subcats' => [ 0, 'à¦\89পবিষà§\9fশ্রেণী', '', 'subcats' ],
+       'pagesincategory_subcats' => [ 0, 'à¦\89পবিষয়শ্রেণী', '', 'subcats' ],
        'pagesincategory_files'   => [ 0, 'ফাইলসমূহ', 'files' ],
 ];
 
index dbf3443..043f4d1 100644 (file)
@@ -20,4 +20,3 @@ $digitTransformTable = [
        '8' => '༨', # &#x0f28;
        '9' => '༩', # &#x0f29;
 ];
-
index d8aee4f..decfbdd 100644 (file)
@@ -41,4 +41,3 @@ $digitTransformTable = [
        '8' => '৮',
        '9' => '৯'
 ];
-
index 69a5d2f..a2a7e7d 100644 (file)
@@ -146,7 +146,7 @@ $magicWords = [
 ];
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -162,4 +162,3 @@ $dateFormats = [
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = "/^((?:c\'h|C\'H|C\'h|c’h|C’H|C’h|[a-zA-ZàâçéèêîôûäëïöüùñÇÉÂÊÎÔÛÄËÏÖÜÀÈÙÑ])+)(.*)$/sDu";
-
index 6211da2..23122cd 100644 (file)
@@ -261,4 +261,3 @@ $magicWords = [
 $fallback8bitEncoding = "iso-8859-2";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zćčžšđž]+)(.*)$/sDu';
-
index 93142b7..79381c1 100644 (file)
@@ -67,4 +67,3 @@ $specialPageAliases = [
        'Userlogin'                 => [ 'Нэбтэрхэ' ],
        'Userlogout'                => [ 'Гараха' ],
 ];
-
index 0d932a8..cb26337 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'oc';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Especial',
@@ -158,6 +160,14 @@ $dateFormats = [
        'ymd both' => 'H:i, Y M j',
 ];
 
+$datePreferences = [
+       'default',
+       'dmy',
+       'ymd',
+       'ISO 8601',
+];
+$defaultDateFormat = 'dmy';
+
 $bookstoreList = [
        'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
        'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
@@ -165,4 +175,3 @@ $bookstoreList = [
 ];
 
 $linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
-
index 6d875ae..d5e52e8 100644 (file)
@@ -138,4 +138,3 @@ $dateFormats = [
        'cdo date' => 'Y "nièng" n "nguŏk" j "hô̤" (l)',
        'cdo both' => 'Y "nièng" n "nguŏk" j "hô̤" (D) H:i',
 ];
-
index e2c038b..9ad3c52 100644 (file)
@@ -55,4 +55,3 @@ $specialPageAliases = [
        'Version'                   => [ 'Bersiyon' ],
        'Watchlist'                 => [ 'Gibantayan' ],
 ];
-
index 08f4e39..1bccad3 100644 (file)
@@ -22,4 +22,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Katigoria',
        NS_CATEGORY_TALK    => 'Kombetsasion_ni_katigoria',
 ];
-
index dab649d..ff68ad8 100644 (file)
@@ -99,4 +99,3 @@ $dateFormats = [
 $separatorTransformTable = [ ','  => '.', '.' => ',' ];
 $linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
-
index 738cb02..9a993ea 100644 (file)
@@ -94,4 +94,3 @@ $dateFormats = [
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„';
-
index e778856..90f1128 100644 (file)
@@ -356,4 +356,3 @@ $bookstoreList = [
 $linkTrail = '/^([a-záčďéěíňóřšťúůýž]+)(.*)$/sDu';
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index ee94546..27c786d 100644 (file)
@@ -28,4 +28,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kategòrëjô',
        NS_CATEGORY_TALK    => 'Diskùsëjô_Kategòrëji',
 ];
-
index 8375270..c45f025 100644 (file)
@@ -92,4 +92,3 @@ $dateFormats = [
 
 $linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопсстѹфхѡѿцчшщъыьѣюѥѧѩѫѭѯѱѳѷѵґѓђёјйљњќуўџэ҄я“»]+)(.*)$/sDu';
 $linkPrefixCharset = '„«';
-
index 5b9c2b6..56b4d1d 100644 (file)
@@ -35,4 +35,3 @@ $namespaceGenderAliases = [];
 $linkPrefixExtension = true;
 $linkTrail = '/^([a-zа-яĕçăӳ"»]+)(.*)$/sDu';
 $linkPrefixCharset = 'a-zA-Z"\\x{80}-\\x{10ffff}';
-
index a569f16..2fec9fc 100644 (file)
@@ -98,9 +98,8 @@ $defaultDateFormat = 'dmy';
 $bookstoreList = [
        "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
        "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
-       "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
-       "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
+       "Amazon.com" => "https://www.amazon.com/exec/obidos/ISBN=$1",
+       "Amazon.co.uk" => "https://www.amazon.co.uk/exec/obidos/ISBN=$1"
 ];
 
 $linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
-
index c96a442..48450d3 100644 (file)
@@ -144,4 +144,3 @@ $bookstoreList = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
-
index 5fc359e..160f57d 100644 (file)
@@ -344,7 +344,7 @@ $dateFormats = [
 $capitalizeAllNouns = true;
 $bookstoreList = [
        'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
-       'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
+       'amazon.de' => 'https://www.amazon.de/gp/search/field-isbn=$1',
        'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
        'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
        'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
@@ -357,4 +357,3 @@ $imageFiles = [
        'button-bold'     => 'de/button_bold.png',
        'button-italic'   => 'de/button_italic.png',
 ];
-
index dacefa3..c0f53ed 100644 (file)
@@ -10,4 +10,3 @@
 
 $fallback = 'de';
 $separatorTransformTable = [ ',' => "'", '.' => ',' ];
-
index c81fd34..51067bf 100644 (file)
@@ -325,4 +325,3 @@ $magicWords = [
        'pagesincategory_subcats'   => [ '0', 'bınkatategori', 'subcats' ],
        'pagesincategory_files'     => [ '0', 'dosyey', 'files' ],
 ];
-
index bce8b62..4b5aeb0 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'de';
+$fallback = 'hsb, de';
 
 $namespaceNames = [
        NS_MEDIA            => 'Medija',
@@ -140,4 +140,3 @@ $dateFormats = [
        'dmy date' => 'j. xg Y',
        'dmy both' => 'j. xg Y, H:i',
 ];
-
index f3dfefb..67c59e3 100644 (file)
@@ -80,4 +80,3 @@ $specialPageAliases = [
        'Wantedtemplates'           => [ 'ބޭނުންވާ_ފަންވަތްތައް' ],
        'Watchlist'                 => [ 'މަގޭ_ނަޒަރު' ],
 ];
-
index 646012e..50ae191 100644 (file)
@@ -20,4 +20,3 @@ $digitTransformTable = [
        '8' => '༨', # &#x0f28;
        '9' => '༩', # &#x0f29;
 ];
-
index dd7cd68..7bf07ea 100644 (file)
@@ -332,4 +332,3 @@ $dateFormats = [
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
-
index 67369e2..689586b 100644 (file)
@@ -187,7 +187,7 @@ $dateFormats = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/gp/search/?field-isbn=$1'
+       'Amazon.com' => 'https://www.amazon.com/gp/search/?field-isbn=$1'
 ];
 
 /**
@@ -349,6 +349,7 @@ $magicWords = [
        'directionmark'           => [ 1, 'DIRECTIONMARK', 'DIRMARK' ],
        'language'                => [ 0, '#LANGUAGE:' ],
        'contentlanguage'         => [ 1, 'CONTENTLANGUAGE', 'CONTENTLANG' ],
+       'pagelanguage'            => [ 1, 'PAGELANGUAGE' ],
        'pagesinnamespace'        => [ 1, 'PAGESINNAMESPACE:', 'PAGESINNS:' ],
        'numberofadmins'          => [ 1, 'NUMBEROFADMINS' ],
        'formatnum'               => [ 0, 'FORMATNUM' ],
index c886457..61addfa 100644 (file)
@@ -14,4 +14,3 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ 'UncategorisedPages' ],
        'Uncategorizedtemplates'    => [ 'UncategorisedTemplates' ],
 ];
-
index 9c6b7be..0ce25e2 100644 (file)
@@ -284,4 +284,3 @@ $dateFormats = [
        'dmy date' => 'j M. Y',
        'dmy both' => 'H:i, j M. Y',
 ];
-
index 3b7c4bc..01bd00c 100644 (file)
@@ -300,4 +300,3 @@ $dateFormats = [
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
-
index 8a53d9e..28c69df 100644 (file)
@@ -146,7 +146,7 @@ $bookstoreList = [
        'Raamatukoi' => 'http://www.raamatukoi.ee/cgi-bin/index?valik=otsing&paring=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -289,4 +289,3 @@ $dateFormats = [
        'et roman date' => 'j. xrm Y',
        'et roman both' => 'j. xrm Y, "kell" H:i',
 ];
-
index 85d172c..bf65812 100644 (file)
@@ -106,4 +106,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
-
index eee9793..84dfabf 100644 (file)
@@ -417,4 +417,3 @@ $imageFiles = [
        'button-headline' => 'fa/button_headline.png',
        'button-nowiki'   => 'fa/button_nowiki.png',
 ];
-
index 71c4a75..ea09933 100644 (file)
@@ -12,4 +12,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 0d1abbd..b019fd6 100644 (file)
@@ -286,4 +286,3 @@ $bookstoreList = [
 ];
 
 $linkTrail = '/^([a-zäö]+)(.*)$/sDu';
-
index f7614ce..e0e7492 100644 (file)
@@ -99,4 +99,3 @@ $bookstoreList = [
 ];
 
 $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
-
index 9bb02da..3e3cf80 100644 (file)
@@ -294,7 +294,7 @@ $magicWords = [
 ];
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -317,4 +317,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 106ba5e..0ac1caf 100644 (file)
@@ -11,7 +11,7 @@
 $fallback = 'fr';
 
 $bookstoreList = [
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'Amazon.fr'    => 'https://www.amazon.fr/exec/obidos/ISBN=$1',
        'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
        'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
        'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
@@ -302,4 +302,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 7ad9d50..d76edbf 100644 (file)
@@ -11,4 +11,3 @@
 $fallback = 'de';
 
 $linkTrail = '/^([a-zäöüßåāđē]+)(.*)$/sDu';
-
index 8bb6c6c..9846686 100644 (file)
@@ -105,4 +105,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 4bf6a09..28f52b6 100644 (file)
@@ -129,4 +129,3 @@ $specialPageAliases = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zàáèéìíòóùúâêîôûäëïöü]+)(.*)$/sDu';
-
index a508790..585e697 100644 (file)
@@ -77,4 +77,3 @@ $namespaceAliases = [
        'Plé_múnla' => NS_TEMPLATE_TALK,
        'Rang' => NS_CATEGORY
 ];
-
index 7a6d127..adf578f 100644 (file)
@@ -88,4 +88,3 @@ $specialPageAliases = [
 $magicWords = [
        'redirect'                  => [ '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ],
 ];
-
index 6dd812d..86e2b27 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
 $namespaceAliases = [
        '$1_談詑' => NS_PROJECT_TALK,
 ];
-
index 5fb511e..155ba2b 100644 (file)
@@ -20,4 +20,3 @@ $namespaceNames = [
        NS_HELP_TALK        => '帮助谈詑',
        NS_CATEGORY_TALK    => '分类谈詑',
 ];
-
index 1a136db..ae6944a 100644 (file)
@@ -45,4 +45,3 @@ $specialPageAliases = [
        'Unusedimages'              => [ '冇用嗰檔案' ],
        'Watchlist'                 => [ '監視列表' ],
 ];
-
index b147d5c..caa16d9 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Roinn-seòrsa',
        NS_CATEGORY_TALK    => 'Deasbaireachd_na_roinn-seòrsa',
 ];
-
index 8f1d4a7..a447df4 100644 (file)
@@ -274,4 +274,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index c5d7f46..6281208 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
 
 // Remove Spanish gender aliases (bug 37090)
 $namespaceGenderAliases = [];
-
index d5817b6..a6fab27 100644 (file)
@@ -26,4 +26,3 @@ $specialPageAliases = [
        'Allpages'                  => [ '𐌰𐌻𐌻𐍃𐍃𐌴𐌹𐌳𐍉𐌽𐍃' ],
        'Recentchanges'             => [ '𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃' ],
 ];
-
index f1bb4f8..e2f0cc0 100644 (file)
@@ -21,4 +21,3 @@ $dateFormats = [
        'ymd date' => 'Y xg j',
        'ymd both' => 'H:i, Y xg j',
 ];
-
index 6d1b7b8..d47d9c0 100644 (file)
@@ -112,4 +112,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-
index db29a56..aec3a76 100644 (file)
@@ -127,4 +127,3 @@ $digitTransformTable = [
 $digitGroupingPattern = "##,##,###";
 
 $linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
-
index d3b6e44..e2fc110 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Ronney',
        NS_CATEGORY_TALK    => 'Resooney_ronney',
 ];
-
index 66a3e41..fab2a13 100644 (file)
@@ -117,4 +117,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'ʻaoʻao', 'aoao', 'pages' ],
        'pagesincategory_files'     => [ '0', 'waihona', 'files' ],
 ];
-
index 9e03942..19f8232 100644 (file)
@@ -343,6 +343,5 @@ $bookstoreList = [
        'מיתוס'          => 'http://www.mitos.co.il/',
        'iBooks'         => 'http://www.ibooks.co.il/',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com'     => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com'     => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
-
index 3f3b007..5a70a83 100644 (file)
@@ -299,4 +299,3 @@ $digitTransformTable = [
 $linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 5a32567..6671feb 100644 (file)
@@ -24,4 +24,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'vibhag',
        NS_CATEGORY_TALK    => 'voibhag_ke_baat',
 ];
-
index 97cac52..498585f 100644 (file)
@@ -289,4 +289,3 @@ $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $fallback8bitEncoding = 'iso-8859-2';
 
 $linkTrail = '/^([čšžćđßa-z]+)(.*)$/sDu';
-
index 6aa28e5..7fe8773 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'de';
+$fallback = 'dsb, de';
 
 $namespaceNames = [
        NS_MEDIA            => 'Media',
@@ -144,4 +144,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Lisćina_wotkazow' ],
        'Withoutinterwiki'          => [ 'Falowace_mjezyrěčne_wotkazy' ],
 ];
-
index a217a29..0c894ef 100644 (file)
@@ -136,4 +136,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zàèòÀÈÒ]+)(.*)$/sDu';
-
index 6ba075a..7fcfad8 100644 (file)
@@ -279,4 +279,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]+)(.*)$/sDu';
-
index ab1d198..9a5a809 100644 (file)
@@ -76,7 +76,7 @@ $dateFormats = [
 ];
 
 $bookstoreList = [
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -255,4 +255,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև«»]+)(.*)$/sDu';
-
index b4adcbb..c3a2905 100644 (file)
@@ -132,4 +132,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Referentias_a_iste_pagina' ],
        'Withoutinterwiki'          => [ 'Sin_interwiki' ],
 ];
-
index 5fee306..2107e7d 100644 (file)
@@ -43,7 +43,7 @@ $namespaceAliases = [
 
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        'Bhinneka.com bookstore' => 'http://www.bhinneka.com/Buku/Engine/search.asp?fisbn=$1',
        'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id',
@@ -310,4 +310,3 @@ $dateFormats = [
        'ymd date' => 'Y F j',
        'ymd both' => 'Y F j H.i',
 ];
-
index 75f45b1..6723742 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Quo_catenunes_ci' ],
        'Withoutinterwiki'          => [ 'Sin_interwiki' ],
 ];
-
index 29edef3..2177cbf 100644 (file)
@@ -69,4 +69,3 @@ $magicWords = [
        'displaytitle'              => [ '1', 'ZIÍSHÍ', 'DISPLAYTITLE' ],
        'pagesize'                  => [ '1', 'ÀSÁIHÜ', 'PAGESIZE' ],
 ];
-
index 6f4f23a..389cdcf 100644 (file)
@@ -9,4 +9,3 @@
  */
 
 $fallback = 'zh-cn, zh-hans';
-
index 280ea41..6bc195b 100644 (file)
@@ -26,4 +26,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kategoria',
        NS_CATEGORY_TALK    => 'Kategoria_tungtungan',
 ];
-
index 7aae422..0b49204 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'eo';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Specala',
@@ -27,6 +29,11 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Kategorio_Debato',
 ];
 
+$namespaceGenderAliases = [
+       NS_USER => [ 'male' => 'Uzanto', 'female' => 'Uzantino' ],
+       NS_USER_TALK => [ 'male' => 'Uzanto_Debato', 'female' => 'Uzantino_Debato' ],
+];
+
 $namespaceAliases = [
        'Imajo' => NS_FILE,
        'Imajo_Debato' => NS_FILE_TALK,
@@ -96,4 +103,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Surveyaji' ],
        'Whatlinkshere'             => [ 'QuoLigasHike' ],
 ];
-
index c6f0e39..e6151db 100644 (file)
@@ -212,4 +212,3 @@ $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkPrefixExtension = true;
 $linkTrail = '/^([áðéíóúýþæöa-z-–]+)(.*)$/sDu';
 $linkPrefixCharset = 'áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z–-';
-
index 8714c72..e73a2fc 100644 (file)
@@ -226,4 +226,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
-
index b905345..c45a0dd 100644 (file)
@@ -321,4 +321,3 @@ $magicWords = [
        'url_wiki'                  => [ '0', 'ウィキ', 'WIKI' ],
        'url_query'                 => [ '0', 'クエリ', 'クエリー', 'QUERY' ],
 ];
-
index 05e892b..3b788a3 100644 (file)
@@ -36,4 +36,3 @@ $namespaceAliases = [
        'Pitulung_Dhiskusi' => NS_HELP_TALK,
        'Kategori_Dhiskusi' => NS_CATEGORY_TALK,
 ];
-
index 7c55460..d2e2d27 100644 (file)
@@ -146,4 +146,3 @@ $magicWords = [
 
 $linkPrefixExtension = true;
 $linkTrail = '/^([a-zაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ“»]+)(.*)$/sDu';
-
index 1f993b0..52e8e77 100644 (file)
@@ -142,4 +142,3 @@ $dateFormats = [
 
 $linkTrail = "/^((?:[a-zıʼ’“»]|'(?!'))+)(.*)$/sDu";
 $linkPrefixCharset = 'a-zıA-Zİ\\x80-\\xff';
-
index 2cfab54..3ae9975 100644 (file)
@@ -31,4 +31,3 @@ $namespaceAliases = [
        'Talγa'            => NS_TEMPLATE,
        'Amyannan_n_talγa' => NS_TEMPLATE_TALK,
 ];
-
index 621c964..256abd7 100644 (file)
@@ -46,4 +46,3 @@ $namespaceAliases = [
 
 // Remove Russian gender aliases
 $namespaceGenderAliases = [];
-
index fe2e92a..97d8d68 100644 (file)
@@ -20,4 +20,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Kalasi',
        NS_CATEGORY_TALK    => 'Disolo_kalasi',
 ];
-
index 23280af..b8f85e4 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'زمرہ',
        NS_CATEGORY_TALK    => 'تبادلۂ_خیال_زمرہ',
 ];
-
index 10e3ac3..39b68fa 100644 (file)
@@ -47,4 +47,3 @@ $namespaceAliases = [
        'Kategori'           => NS_CATEGORY,
        'Kategori_tartışma'  => NS_CATEGORY_TALK,
 ];
-
index ce30e55..b8fc7e7 100644 (file)
@@ -11,4 +11,3 @@
 # Stub message file for converter code "kk"
 
 $fallback = 'kk-cyrl';
-
index a589ac2..72179d6 100644 (file)
@@ -385,4 +385,3 @@ $specialPageAliases = [
 # -------------------------------------------------------------------
 # Default messages
 # -------------------------------------------------------------------
-
index 37b4a15..818a9b6 100644 (file)
@@ -355,4 +355,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Мында_сілтегендер' ],
        'Withoutinterwiki'          => [ 'Уики-аралықсыздар' ],
 ];
-
index 1f1289d..56d8a58 100644 (file)
@@ -349,4 +349,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Mında_siltegender' ],
        'Withoutinterwiki'          => [ 'Wïkï-aralıqsızdar' ],
 ];
-
index 5e7ae13..150d5cc 100644 (file)
@@ -54,4 +54,3 @@ $namespaceAliases = [
        'Kategori' => NS_CATEGORY,
        'Kategoridiskussion' => NS_CATEGORY_TALK
 ];
-
index e970b17..967224f 100644 (file)
@@ -256,4 +256,3 @@ $magicWords = [
        'noindex'                   => [ '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ],
        'staticredirect'            => [ '1', '__ស្ថិតិទំព័របញ្ជូនបន្ត__', '__STATICREDIRECT__' ],
 ];
-
index 5d846ea..5fa77e9 100644 (file)
@@ -62,4 +62,3 @@ $digitTransformTable = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 4a3c15e..3ac7779 100644 (file)
@@ -367,4 +367,3 @@ $dateFormats = [
        'ko date'            => 'Y년 M월 j일 (D)',
        'ko both'            => 'Y년 M월 j일 (D) H:i',
 ];
-
index eebd0fb..79548ea 100644 (file)
@@ -107,4 +107,3 @@ $magicWords = [
        'notoc'                     => [ '0', '__БАШЛАСЫЗ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ],
        'nogallery'                 => [ '0', '_ГАЛЛЕРЕЯСЫЗ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ],
 ];
-
index b2f4697..27ac9f1 100644 (file)
@@ -49,4 +49,3 @@ $separatorTransformTable = [
        '.' => '٫', # &#x066b;
        ',' => '٬', # &#x066c;
 ];
-
index f8dc00f..55dc004 100644 (file)
@@ -41,4 +41,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index b13578e..164b20a 100644 (file)
@@ -210,4 +210,3 @@ $magicWords = [
 $imageFiles = [
        'button-italic'   => 'ksh/button_italic.png',
 ];
-
index d8bee65..7551ccf 100644 (file)
@@ -32,4 +32,3 @@ $digitTransformTable = [
        '.' => '٫', # &#x066b; wrong table ?
        ',' => '٬', # &#x066c;
 ];
-
index c97ef25..32844a2 100644 (file)
@@ -109,3 +109,4 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'rûpel', 'pages' ],
 ];
 
+$linkTrail = '/^([a-zçêîşûẍḧÇÊÎŞÛẌḦ]+)(.*)$/sDu';
index a5204be..069c64b 100644 (file)
@@ -44,4 +44,3 @@ $namespaceAliases = [
        'Категория'                          => NS_CATEGORY,
        'Обсуждение_категории'               => NS_CATEGORY_TALK
 ];
-
index 5a0a02b..53be156 100644 (file)
@@ -202,4 +202,3 @@ $magicWords = [
        'pagesincategory_all'       => [ '0', 'oll', 'all' ],
        'pagesincategory_pages'     => [ '0', 'folennow', 'pages' ],
 ];
-
index e2256af..99b49a5 100644 (file)
@@ -32,4 +32,3 @@ $namespaceNames = [
        NS_HELP             => 'Жардам',
        NS_CATEGORY         => 'Категория',
 ];
-
index 67143e7..1fa3e11 100644 (file)
@@ -157,4 +157,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Nexus_ad_paginam' ],
        'Withoutinterwiki'          => [ 'Paginae_sine_nexibus_ad_linguas_alias', 'Paginae_sine_nexibus_intervicis' ],
 ];
-
index 78c87fc..bb18959 100644 (file)
@@ -177,4 +177,3 @@ $magicWords = [
        'img_left'                  => [ '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ],
        'img_none'                  => [ '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ],
 ];
-
index 2f52faf..a416fe7 100644 (file)
@@ -191,4 +191,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'Säiten', 'seiten', 'pages' ],
        'pagesincategory_files'     => [ '0', 'Fichieren', 'dateien', 'files' ],
 ];
-
index b54f73a..9b4aa82 100644 (file)
@@ -42,4 +42,3 @@ $namespaceNames = [
 $namespaceGenderAliases = [];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӀ1“»]+)(.*)$/sDu';
-
index 86e9f88..0002adc 100644 (file)
@@ -56,4 +56,3 @@ $namespaceAliases = [
 
 // Remove Russian gender aliases
 $namespaceGenderAliases = [];
-
index eb453ea..051b323 100644 (file)
@@ -33,4 +33,3 @@ $specialPageAliases = [
        'Newimages'                 => [ 'FixesNova' ],
        'Newpages'                  => [ 'PajesNova' ],
 ];
-
index fe512b2..56ccf7b 100644 (file)
@@ -150,4 +150,3 @@ $dateFormats = [
        'ymd date' => 'Y M j',
        'ymd both' => 'Y M j H:i',
 ];
-
index d5a0788..8c01b09 100644 (file)
@@ -120,4 +120,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Cose appunta chì' ],
        'Withoutinterwiki'          => [ 'Sensa Interwiki' ],
 ];
-
index 92001ed..dc1840c 100644 (file)
@@ -100,4 +100,3 @@ $magicWords = [
        'img_none'                  => [ '1', 'nissön', 'nessuno', 'none' ],
        'sitename'                  => [ '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ],
 ];
-
index d7ea41f..a44e0ac 100644 (file)
@@ -20,4 +20,3 @@ $linkPrefixExtension = true;
 
 # Same as the French (bug 8485)
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 1c79efd..665b222 100644 (file)
@@ -91,4 +91,3 @@ $digitTransformTable = [
        '8' => '໘', # &#x0ed8;
        '9' => '໙', # &#x0ed9;
 ];
-
index 8bdfc7f..f77049a 100644 (file)
@@ -32,4 +32,3 @@ $namespaceNames = [
 ];
 
 $fallback = 'lv';
-
index d9ef8bc..5214c46 100644 (file)
@@ -151,4 +151,3 @@ $digitTransformTable = [
        '.' => '點',
        ',' => '',
 ];
-
index 45d6f6c..b86bb14 100644 (file)
@@ -55,4 +55,3 @@ $namespaceAliases = [
        'Kategori'           => NS_CATEGORY,
        'Kategori_tartışma'  => NS_CATEGORY_TALK,
 ];
-
index 84b107e..76110ac 100644 (file)
@@ -137,4 +137,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'МезеньСюлмафкстТяса' ],
        'Withoutinterwiki'          => [ 'Интервикифтома' ],
 ];
-
index 653be83..e8df5aa 100644 (file)
@@ -231,4 +231,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pejy_mirohy' ],
        'Withoutinterwiki'          => [ 'Tsy_misy_interwiki' ],
 ];
-
index 99ab0e5..7d12967 100644 (file)
@@ -91,4 +91,3 @@ $magicWords = [
        'img_bottom'                => [ '1', 'ӱлычын', 'снизу', 'bottom' ],
        'sitename'                  => [ '1', 'САЙТЛӰМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ],
 ];
-
index 0529a0e..4bee5e1 100644 (file)
@@ -159,4 +159,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'laman', 'halaman', 'pages' ],
        'pagesincategory_files'     => [ '0', 'berkas', 'files' ],
 ];
-
index c15b040..cf608fc 100644 (file)
@@ -359,4 +359,3 @@ $magicWords = [
 
 $linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрстќуфхцчџш]+)(.*)$/sDu';
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 2c9542b..f6d0d14 100644 (file)
@@ -356,4 +356,3 @@ $magicWords = [
 $linkTrail = "/^([a-z\x{0D02}-\x{0D7F}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index e63f009..a672fc4 100644 (file)
@@ -47,4 +47,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя“»]+)(.*)$/sDu';
-
index dd8133e..744fe73 100644 (file)
@@ -18,4 +18,3 @@ $specialPageAliases = [
        'Preferences'               => [ 'Преферинце' ],
        'Recentchanges'             => [ 'Модификэрьреченте' ],
 ];
-
index 61fc613..b51839d 100644 (file)
@@ -326,4 +326,3 @@ $digitTransformTable = [
 $linkTrail = "/^([\xE0\xA4\x80-\xE0\xA5\xA3\xE0\xA5\xB1-\xE0\xA5\xBF\xEF\xBB\xBF\xE2\x80\x8D]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index a9ddf7d..4d01b28 100644 (file)
@@ -42,4 +42,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index c39854e..5d720ce 100644 (file)
@@ -211,4 +211,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pautan_ke_sini', 'Pautan_ke' ],
        'Withoutinterwiki'          => [ 'Laman_tanpa_pautan_bahasa' ],
 ];
-
index aad38b7..015dade 100644 (file)
@@ -268,4 +268,3 @@ $magicWords = [
 ];
 
 $linkPrefixCharset = 'A-\\x{10ffff}';
-
index 42afbd9..0dcfe2d 100644 (file)
@@ -75,4 +75,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ],
        'staticredirect'            => [ '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ],
 ];
-
index ebaa7ca..3bafe48 100644 (file)
@@ -57,4 +57,3 @@ $dateFormats = [
        'my long date' => 'Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
        'my long both' => 'H:i"၊" Y "ဇန်နဝါရီ" F"လ" j "ရက်"',
 ];
-
index 20057d5..01bc33d 100644 (file)
@@ -183,4 +183,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'ЯН', 'ПУТЬ', 'PATH' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 027cf34..e93362b 100644 (file)
@@ -121,4 +121,3 @@ $magicWords = [
        'grammar'                   => [ '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ],
        'gender'                    => [ '0', 'جنسیت:', 'جنس:', 'GENDER:' ],
 ];
-
index 1bf970c..767a305 100644 (file)
@@ -75,4 +75,3 @@ $specialPageAliases = [
        'Upload'                    => [ 'Quetza', 'Subir' ],
        'Userlogin'                 => [ 'Tlacalaquiliztli', 'Registrarse' ],
 ];
-
index 3f67a61..be7574c 100644 (file)
@@ -53,4 +53,3 @@ $namespaceAliases = [
        'Categoria' => NS_CATEGORY,
        'Discussioni_categoria' => NS_CATEGORY_TALK,
 ];
-
index c378f23..66f0527 100644 (file)
  * @author לערי ריינהארט
  */
 
+$fallback = 'nn';
+
 $bookstoreList = [
        'Antikvariat.net' => 'http://www.antikvariat.net/',
        'Frida' => 'http://wo.uio.no/as/WebObjects/frida.woa/wa/fres?action=sok&isbn=$1&visParametre=1&sort=alfabetisk&bs=50',
        'Bibsys' => 'http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&fid=isbn&term=$1&op=and&fid=bd&term=&arstall=&sortering=sortdate-&treffPrSide=50',
        'Akademika' => 'http://www.akademika.no/sok.php?ts=4&sok=$1',
        'Haugenbok' => 'http://www.haugenbok.no/resultat.cfm?st=extended&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $namespaceNames = [
@@ -83,6 +85,14 @@ $namespaceAliases = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
 
+$datePreferenceMigrationMap = [
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+];
+$defaultDateFormat = 'dmy';
+
 $dateFormats = [
        'mdy time' => 'H:i',
        'mdy date' => 'M j., Y',
@@ -320,4 +330,3 @@ $magicWords = [
        'url_path'                  => [ '0', 'STI', 'PATH' ],
        'url_query'                 => [ '0', 'SPØRRING', 'QUERY' ],
 ];
-
index b04066c..10d0a83 100644 (file)
@@ -88,7 +88,7 @@ $magicWords = [
 $bookstoreList = [
        'Verteken vun leverbore Böker'  => 'http://www.buchhandel.de/sixcms/list.php?page=buchhandel_profisuche_frameset&suchfeld=isbn&suchwert=$1=0&y=0',
        'abebooks.de'                   => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
-       'Amazon.de'                     => 'http://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.de'                     => 'https://www.amazon.de/exec/obidos/ISBN=$1',
        'Lehmanns Fachbuchhandlung'     => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1',
 ];
 
@@ -211,4 +211,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Wat wiest hier hen' ],
        'Withoutinterwiki'          => [ 'Sieden ahn Spraaklenken' ],
 ];
-
index 2a3ab0b..8af1c00 100644 (file)
@@ -319,4 +319,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
-
index 2f7ad26..c6ab806 100644 (file)
@@ -57,4 +57,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index 2d2cf39..65a7595 100644 (file)
@@ -39,4 +39,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index dde2e04..9d22254 100644 (file)
@@ -382,4 +382,3 @@ $specialPageAliases = [
 ];
 
 $linkTrail = '/^([a-zäöüïëéèà]+)(.*)$/sDu';
-
index 5ceafd1..7572c67 100644 (file)
@@ -42,6 +42,8 @@
  * @see https://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
  */
 
+$fallback = 'nb';
+
 $datePreferences = [
        'default',
        'dmyt',
@@ -94,9 +96,9 @@ $bookstoreList = [
        'Haugenbok'    => 'http://www.haugenbok.no/resultat.cfm?st=hurtig&isbn=$1',
        'Akademika'    => 'http://www.akademika.no/sok.php?isbn=$1',
        'Gnist'        => 'http://www.gnist.no/sok.php?isbn=$1',
-       'Amazon.co.uk' => 'http://www.amazon.co.uk/exec/obidos/ISBN=$1',
-       'Amazon.de'    => 'http://www.amazon.de/exec/obidos/ISBN=$1',
-       'Amazon.com'   => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.co.uk' => 'https://www.amazon.co.uk/exec/obidos/ISBN=$1',
+       'Amazon.de'    => 'https://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.com'   => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -319,4 +321,3 @@ $separatorTransformTable = [
        '.' => ','
 ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
-
index 2cdc6f0..80ce2dc 100644 (file)
@@ -40,4 +40,3 @@ $magicWords = [
        'currenttime'               => [ '1', 'NAKO_BJALE', 'CURRENTTIME' ],
        'currenthour'               => [ '1', 'IRI_BJALE', 'CURRENTHOUR' ],
 ];
-
index 0917c73..334160f 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
 ];
 
 $datePreferences = false;
-
index 6c7512b..1d9e0e5 100644 (file)
  * @author לערי ריינהארט
  */
 
+$fallback = 'ca';
+
 $bookstoreList = [
-       'Amazon.fr' => 'http://www.amazon.fr/exec/obidos/ISBN=$1'
+       'Amazon.fr' => 'https://www.amazon.fr/exec/obidos/ISBN=$1'
 ];
 
 $namespaceNames = [
@@ -57,6 +59,8 @@ $namespaceAliases = [
        'Discussion_Imatge'    => NS_FILE_TALK,
 ];
 
+$namespaceGenderAliases = [];
+
 $specialPageAliases = [
        'Allmessages'               => [ 'Messatge_sistèma', 'Messatge_del_sistèma' ],
        'Allpages'                  => [ 'Totas_las_paginas' ],
@@ -285,4 +289,3 @@ $dateFormats = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 $linkTrail = "/^([a-zàâçéèêîôû]+)(.*)$/sDu";
-
index 63c1e80..022a9ac 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zčČšŠžŽäÄöÖ]+)(.*)$/sDu';
-
index 4f500a7..d17105a 100644 (file)
@@ -252,4 +252,3 @@ $magicWords = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 5ba4ff5..44e943e 100644 (file)
@@ -179,4 +179,3 @@ $magicWords = [
 
 $linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|“|»)+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-
index 856ffa2..253119b 100644 (file)
@@ -182,4 +182,3 @@ $magicWords = [
 $linkTrail = '/^([ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ਖ਼ਗ਼ਜ਼ੜਫ਼ੰੱੲੳa-z]+)(.*)$/sDu';
 
 $digitGroupingPattern = "##,##,###";
-
index ff9a2b4..62c8418 100644 (file)
@@ -14,4 +14,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 449ec0e..bd13273 100644 (file)
@@ -58,4 +58,3 @@ $specialPageAliases = [
        'Listbots'                  => [ 'Waddefresser', 'Bots' ],
        'Search'                    => [ 'Uffgucke', 'Suche' ],
 ];
-
index 1e4706d..6365b8a 100644 (file)
@@ -60,4 +60,3 @@ $namespaceAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index f49889a..7062e07 100644 (file)
@@ -42,4 +42,3 @@ $digitTransformTable = [
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 ];
-
index cfe0345..d7b5bea 100644 (file)
@@ -317,4 +317,3 @@ $magicWords = [
        'pagesincategory_pages'     => [ '0', 'strony', 'pages' ],
        'pagesincategory_files'     => [ '0', 'pliki', 'files' ],
 ];
-
index 7fd9f1f..1d1a8c3 100644 (file)
@@ -39,4 +39,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorìa',
        NS_CATEGORY_TALK    => 'Discussion_ant_sla_categorìa',
 ];
-
index 239c888..410927b 100644 (file)
@@ -16,6 +16,8 @@
  * @author ZaDiak
  */
 
+$fallback = 'el';
+
 $namespaceNames = [
        NS_MEDIA            => 'Μέσον',
        NS_SPECIAL          => 'Ειδικόν',
@@ -53,4 +55,3 @@ $dateFormats = [
        'pnt date' => 'j xg Y',
        'pnt both' => 'H:i, j xg Y',
 ];
-
index cc555b6..5db6ce4 100644 (file)
@@ -155,4 +155,3 @@ $magicWords = [
        'noindex'                   => [ '1', '__بې_ليکلړ__', '__NOINDEX__' ],
        'protectionlevel'           => [ '1', 'ژغورکچه', 'PROTECTIONLEVEL' ],
 ];
-
index 5c3c191..f020303 100644 (file)
@@ -329,4 +329,3 @@ $magicWords = [
        'staticredirect'            => [ '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ],
        'protectionlevel'           => [ '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ],
 ];
-
index 8f84f20..61625e1 100644 (file)
@@ -328,4 +328,3 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ],
        'url_path'                  => [ '0', 'CAMINHO', 'PATH' ],
 ];
-
index eb1c8d9..d8282dc 100644 (file)
@@ -277,4 +277,3 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ],
        'formatdate'                => [ '0', 'punchawrikchakuy', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ],
 ];
-
index a85d801..523783e 100644 (file)
@@ -34,4 +34,3 @@ $namespaceNames = [
 
 // Remove Spanish gender aliases (bug 37090)
 $namespaceGenderAliases = [];
-
index 7304dbf..d4da53f 100644 (file)
@@ -40,4 +40,3 @@ $magicWords = [
        'img_manualthumb'           => [ '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ],
        'img_upright'               => [ '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ],
 ];
-
index 0a5fd11..cb6b47d 100644 (file)
@@ -30,4 +30,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Shopni',
        NS_CATEGORY_TALK    => 'Shopni_vakyarimata',
 ];
-
index 8b92171..55674ce 100644 (file)
@@ -292,4 +292,3 @@ $dateFormats = [
 $fallback8bitEncoding = 'iso8859-2';
 
 $linkTrail = '/^([a-zăâîşţșțĂÂÎŞŢȘȚ]+)(.*)$/sDu';
-
index 29627a6..7c3663a 100644 (file)
@@ -23,4 +23,3 @@ $specialPageAliases = [
        'Version'                   => [ 'Versione' ],
        'Watchlist'                 => [ 'PàggeneCondrollete' ],
 ];
-
index e1af8f3..3041abd 100644 (file)
@@ -413,7 +413,7 @@ $bookstoreList = [
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search?query=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 /**
@@ -439,4 +439,3 @@ $imageFiles = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
-
index 34832b0..6225aef 100644 (file)
@@ -128,4 +128,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Одказы_гев' ],
        'Withoutinterwiki'          => [ 'Без_інтервікі' ],
 ];
-
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
new file mode 100644 (file)
index 0000000..041dc46
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+/** Aromanian (armãneashti)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ */
+
+$fallback = 'ro';
index 4a369bd..aa5fdeb 100644 (file)
@@ -283,4 +283,3 @@ $magicWords = [
 ];
 
 $digitGroupingPattern = "##,##,###";
-
index 38d58f6..8a69163 100644 (file)
@@ -41,4 +41,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index 83770fa..0697595 100644 (file)
@@ -54,4 +54,3 @@ $dateFormats = [
 ];
 
 $linkTrail = "/^([a-z]+)(.*)$/sD";
-
index 43350d1..35d6e0a 100644 (file)
@@ -149,4 +149,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntanoQui' ],
        'Withoutinterwiki'          => [ 'PagineSenzaInterwiki' ],
 ];
-
index 20c23f3..4d4a48e 100644 (file)
@@ -150,4 +150,3 @@ $magicWords = [
        'pagesincategory'           => [ '1', 'زمريجاصفحا', 'PAGESINCATEGORY', 'PAGESINCAT' ],
        'pagesize'                  => [ '1', 'صفحيجيماپ', 'PAGESIZE' ],
 ];
-
index 53e763f..954f3b6 100644 (file)
@@ -101,4 +101,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntaniInogghi' ],
        'Withoutinterwiki'          => [ 'PàginiChenaInterwiki' ],
 ];
-
index e04b004..8e1d476 100644 (file)
@@ -137,4 +137,3 @@ $magicWords = [
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 $linkTrail = '/^(:?[a-zàáâçčʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
-
index b6de002..1253350 100644 (file)
@@ -14,4 +14,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index adf90ce..f0367ae 100644 (file)
@@ -56,4 +56,3 @@ $namespaceAliases = [
 ];
 
 $namespaceGenderAliases = [];
-
index fb79237..8130978 100644 (file)
@@ -13,6 +13,8 @@
  * @author לערי ריינהארט
  */
 
+$fallback = 'bs, sr-el, hr';
+
 $namespaceNames = [
        NS_SPECIAL          => 'Posebno',
        NS_TALK             => 'Razgovor',
@@ -30,6 +32,23 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Razgovor_o_kategoriji',
 ];
 
+# Some dummy translations to prevent language fallback for now
+# @TODO: Check whether localising them is appropriate.
+$namespaceGenderAliases = [];
+$defaultDateFormat = 'dmy';
+$datePreferences = [
+       'default',
+       'dmy',
+       'ymd',
+       'ISO 8601',
+];
+$datePreferenceMigrationMap = [
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+];
+
 $specialPageAliases = [
        'Activeusers'               => [ 'Aktivni_korisnici' ],
        'Allmessages'               => [ 'Sve_poruke' ],
@@ -202,4 +221,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
-
index eeed627..89e74e9 100644 (file)
@@ -188,4 +188,3 @@ $magicWords = [
        'img_middle'                => [ '1', 'මැද', 'middle' ],
        'special'                   => [ '0', 'විශේෂ', 'special' ],
 ];
-
index 40dc198..0399bfa 100644 (file)
@@ -177,9 +177,9 @@ $bookstoreList = [
        'Haugenbok' => 'http://www.haugenbok.no/searchresults.cfm?searchtype=simple&isbn=$1',
        'Akademika' => 'http://www.akademika.no/sok.php?isbn=$1',
        'Gnist' => 'http://www.gnist.no/sok.php?isbn=$1',
-       'Amazon.co.uk' => 'http://www.amazon.co.uk/exec/obidos/ISBN=$1',
-       'Amazon.de' => 'http://www.amazon.de/exec/obidos/ISBN=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.co.uk' => 'https://www.amazon.co.uk/exec/obidos/ISBN=$1',
+       'Amazon.de' => 'https://www.amazon.de/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 $magicWords = [
@@ -290,4 +290,3 @@ $separatorTransformTable = [
 ];
 
 $linkTrail = '/^([a-záäčďéíľĺňóôŕšťúýž]+)(.*)$/sDu';
-
index 7599bc2..3893109 100644 (file)
@@ -182,4 +182,3 @@ $dateFormats = [
 
 $fallback8bitEncoding = "iso-8859-2";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index a0d88d4..b674c49 100644 (file)
@@ -211,4 +211,3 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index 2bf0156..892307a 100644 (file)
@@ -15,4 +15,3 @@
 
 $fallback = 'sr-ec';
 $linkTrail = '/^([abvgdđežzijklljmnnjoprstćufhcčdžšабвгдђежзијклљмнњопрстћуфхцчџш]+)(.*)$/usD';
-
index a34771d..9a6c51f 100644 (file)
@@ -405,4 +405,3 @@ $magicWords = [
        'pagesincategory_files'     => [ '0', 'датотеке', 'files' ],
 ];
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index b03a482..b4d715b 100644 (file)
@@ -301,4 +301,3 @@ $magicWords = [
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index c42b4bc..fc26b43 100644 (file)
@@ -148,4 +148,3 @@ $magicWords = [
        'talkspacee'                => [ '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ],
        'special'                   => [ '0', 'spesyal', 'speciaal', 'special' ],
 ];
-
index cce58e8..4f656d4 100644 (file)
@@ -41,4 +41,3 @@ $namespaceGenderAliases = [
        NS_USER => [ 'male' => 'Benutser', 'female' => 'Benutserske' ],
        NS_USER_TALK => [ 'male' => 'Benutser_Diskussion', 'female' => 'Benutserske_Diskussion' ],
 ];
-
index 5646cf1..75fff56 100644 (file)
@@ -123,4 +123,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'NumbuKaDieu' ],
        'Withoutinterwiki'          => [ 'TanpaInterwiki' ],
 ];
-
index 8819be6..01c33ee 100644 (file)
@@ -338,4 +338,3 @@ $dateFormats = [
        'ymd date' => 'Y F j',
        'ymd both' => 'Y F j "kl." H.i',
 ];
-
index 2aa75cd..a7f4278 100644 (file)
@@ -119,4 +119,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Maangalizi' ],
        'Whatlinkshere'             => [ 'VingoViungavyoUkurasahuu' ],
 ];
-
index 97853d4..797e443 100644 (file)
@@ -62,4 +62,3 @@ $namespaceAliases = [
 
 // Remove Polish gender aliases
 $namespaceGenderAliases = [];
-
index 1702d1f..f089896 100644 (file)
@@ -83,4 +83,3 @@ $magicWords = [
 $linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 4383ab4..7ad1a7e 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'ವರ್ಗೊ',
        NS_CATEGORY_TALK    => 'ವರ್ಗೊ_ಪಾತೆರ',
 ];
-
index f322cfd..8e1020b 100644 (file)
@@ -147,4 +147,3 @@ $magicWords = [
 $linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
-
index 6680d3c..18eb9fa 100644 (file)
@@ -69,4 +69,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Pájina_sira_ne\'ebé_bá_iha_ne\'e' ],
        'Withoutinterwiki'          => [ 'Laiha_interwiki' ],
 ];
-
index 9c58ee6..bd107f5 100644 (file)
@@ -67,4 +67,3 @@ $dateFormats = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхчшъэюяғӣқўҳҷцщыь]+)(.*)$/sDu';
-
index 484d400..39b636a 100644 (file)
@@ -190,4 +190,3 @@ $dateFormats = [
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 ];
-
index 484446b..1ae4716 100644 (file)
@@ -35,4 +35,3 @@ $namespaceNames = [
 ];
 
 $linkTrail = '/^([a-zÄäÇçĞğŇňÖöŞşÜüÝýŽž]+)(.*)$/sDu';
-
index 0c1813c..949969b 100644 (file)
@@ -144,4 +144,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'Ano_ang_nakakawing_dito' ],
        'Withoutinterwiki'          => [ 'Walang_ugnayang-wiki' ],
 ];
-
index 613cb28..ed0ff28 100644 (file)
@@ -154,4 +154,3 @@ $magicWords = [
        'pagesize'                  => [ '1', 'СӘҺИФӘ_ПАМЈӘ', 'PAGESIZE' ],
        'url_wiki'                  => [ '0', 'ВИКИ', 'WIKI' ],
 ];
-
index 8e8d475..16fa65f 100644 (file)
@@ -47,4 +47,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Lukautbuk' ],
        'Whatlinkshere'             => [ 'Ol link ikam long hia' ],
 ];
-
index 9e07263..564da6c 100644 (file)
@@ -354,4 +354,3 @@ $magicWords = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([a-zÇĞçğİıÖöŞşÜüÂâÎîÛû]+)(.*)$/sDu';
-
index 34c3cca..9d95444 100644 (file)
@@ -210,4 +210,3 @@ $magicWords = [
 ];
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӘәӨөҮүҖҗҢңҺһ]+)(.*)$/sDu';
-
index da073b1..c545012 100644 (file)
@@ -89,4 +89,3 @@ $magicWords = [
 $fallback8bitEncoding = "windows-1254";
 
 $linkTrail = '/^([a-zäçğıñöşü“»]+)(.*)$/sDu';
-
index cc9e2a3..7742b68 100644 (file)
@@ -15,4 +15,3 @@ $fallback = 'fr';
 
 // Remove French aliases
 $namespaceGenderAliases = [];
-
index 32194f6..01254e7 100644 (file)
@@ -116,8 +116,7 @@ $bookstoreList = [
        'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
        'Books.Ru' => 'http://www.books.ru/shop/search/advanced?as%5Btype%5D=books&as%5Bname%5D=&as%5Bisbn%5D=$1&as%5Bauthor%5D=&as%5Bmaker%5D=&as%5Bcontents%5D=&as%5Binfo%5D=&as%5Bdate_after%5D=&as%5Bdate_before%5D=&as%5Bprice_less%5D=&as%5Bprice_more%5D=&as%5Bstrict%5D=%E4%E0&as%5Bsub%5D=%E8%F1%EA%E0%F2%FC&x=22&y=8',
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1'
 ];
-
index 79cf100..46d5dcb 100644 (file)
@@ -45,4 +45,3 @@ $namespaceGenderAliases = [];
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-
index 13d5775..492fbcb 100644 (file)
@@ -45,4 +45,3 @@ $specialPageAliases = [
        'Allpages'                  => [ 'بارلىق_بەتلەر' ],
        'Ancientpages'              => [ 'كونا_بەتلەر' ],
 ];
-
index 0c381e5..480d94f 100644 (file)
@@ -121,7 +121,7 @@ $dateFormats = [
 ];
 
 $bookstoreList = [
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+       'Amazon.com' => 'https://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
 // Russian names are kept for backwards compatibility
index d5449bf..cac8482 100644 (file)
@@ -167,4 +167,3 @@ $magicWords = [
        'index'                     => [ '1', '__اشاریہ__', '__INDEX__' ],
        'noindex'                   => [ '1', '__نااشاریہ__', '__NOINDEX__' ],
 ];
-
index 1f3aae2..53d8efa 100644 (file)
@@ -123,4 +123,3 @@ $separatorTransformTable = [
        '.' => ',',
        ',' => "\xc2\xa0", # nbsp
 ];
-
index f71092c..986d9bd 100644 (file)
@@ -155,4 +155,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'PuntaQua' ],
        'Withoutinterwiki'          => [ 'PagineSensaInterwiki' ],
 ];
-
index 0283b7d..b28c618 100644 (file)
@@ -85,4 +85,3 @@ $magicWords = [
        'fullurl'                   => [ '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ],
        'index'                     => [ '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ],
 ];
-
index 201a677..64d4604 100644 (file)
@@ -351,4 +351,3 @@ $datePreferenceMigrationMap = [
 
 $linkTrail = "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÏÖÜÀÈÙ]+)(.*)$/sDu";
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
-
index a28777f..271fae1 100644 (file)
@@ -31,4 +31,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorie',
        NS_CATEGORY_TALK    => 'Discuusje_categorie',
 ];
-
index 7400417..1a29f02 100644 (file)
@@ -61,4 +61,3 @@ $specialPageAliases = [
 
 // Remove German aliases
 $namespaceGenderAliases = [];
-
index ffb788a..d0f5ca5 100644 (file)
@@ -109,4 +109,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ 'Galädalised' ],
        'Whatlinkshere'             => [ 'Yümsisio', 'Isio' ],
 ];
-
index 4829601..bef241a 100644 (file)
@@ -39,4 +39,3 @@ $namespaceNames = [
 $magicWords = [
        'redirect'                  => [ '0', '#saadaq', '#suuna', '#REDIRECT' ],
 ];
-
index 45841fd..68f3ae7 100644 (file)
@@ -83,4 +83,3 @@ $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
 
 # $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
 $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
-
index 1c6e9b5..8243e15 100644 (file)
@@ -60,4 +60,3 @@ $specialPageAliases = [
        'Whatlinkshere'             => [ 'AnoAnNasumpayDinhi' ],
        'Withoutinterwiki'          => [ 'Warayinterwiki' ],
 ];
-
index d96b51f..7722884 100644 (file)
@@ -80,4 +80,3 @@ $specialPageAliases = [
        'Wantedpages'               => [ 'Xët yiñ laaj' ],
        'Watchlist'                 => [ 'Limu toppte' ],
 ];
-
index 477f76a..ddbebbd 100644 (file)
 
 $fallback = 'zh-hans';
 
+$datePreferences = [
+       'default',
+       'wuu',
+       'ISO 8601',
+];
+
+$defaultDateFormat = 'wuu';
+
+$dateFormats = [
+       'wuu time' => 'H:i',
+       'wuu date' => 'Y年n月j号 (D)',
+       'wuu both' => 'Y年n月j号 (D) H:i',
+];
index 68ad7fb..07f9716 100644 (file)
@@ -53,4 +53,3 @@ $namespaceAliases = [
 
 // Remove Russian aliases
 $namespaceGenderAliases = [];
-
index edc860e..1553f6d 100644 (file)
@@ -199,4 +199,3 @@ $magicWords = [
        'url_wiki'                  => [ '0', 'וויקי', 'ויקי', 'WIKI' ],
        'pagesincategory_pages'     => [ '0', 'בלעטער', 'דפים', 'pages' ],
 ];
-
index 46acbb5..fc8581b 100644 (file)
@@ -50,4 +50,3 @@ $specialPageAliases = [
        'Userlogin'                 => [ 'ÌwọléOníse' ],
        'Userlogout'                => [ 'Ìbọ̀sódeOníṣe' ],
 ];
-
index 2422244..58024d2 100644 (file)
@@ -193,7 +193,7 @@ $specialPageAliases = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       '亞馬遜' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+       '亞馬遜' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
        '博客來書店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
        '三民書店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
        '天下書店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
@@ -227,4 +227,3 @@ $dateFormats = [
        'yue ymd date' => 'Y-n-j',
        'yue ymd both' => 'Y-n-j H:i',
 ];
-
index bd56d64..a7978be 100644 (file)
@@ -40,4 +40,3 @@ $namespaceNames = [
        NS_CATEGORY         => 'Categorie',
        NS_CATEGORY_TALK    => 'Overleg_categorie',
 ];
-
index 845db8b..3ac5d58 100644 (file)
@@ -180,4 +180,3 @@ $specialPageAliases = [
        'Watchlist'                 => [ '监视列表', '監視列表', '監視清单' ],
        'Whatlinkshere'             => [ '链入页面', '鏈入頁面', '連入頁面' ],
 ];
-
index b887a00..bd822d6 100644 (file)
@@ -15,4 +15,3 @@
 
 # Inherit everything for now
 $fallback = 'zh-hans';
-
index 7c80db1..7a0dbb6 100644 (file)
@@ -425,12 +425,11 @@ $dateFormats = [
 $bookstoreList = [
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       '亚马逊' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
-       '卓越亚马逊' => 'http://www.amazon.cn/mn/advancedSearchApp?isbn=$1',
+       '亚马逊' => 'https://www.amazon.com/exec/obidos/ISBN=$1',
+       '卓越亚马逊' => 'https://www.amazon.cn/mn/advancedSearchApp?isbn=$1',
        '当当网' => 'http://search.dangdang.com/search.aspx?key=$1',
        '博客来书店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
        '三民书店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
        '天下书店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
        '新丝路书店' => 'http://www.silkbook.com/function/Search_list_book_data.asp?item=5&text=$1'
 ];
-
index cfa926d..1bfe940 100644 (file)
@@ -306,4 +306,3 @@ $bookstoreList = [
        '天下書店' => 'http://www.cwbook.com.tw/search/result1.jsp?field=2&keyWord=$1',
        '新絲路書店' => 'http://www.silkbook.com/function/Search_list_book_data.asp?item=5&text=$1'
 ];
-
index c25e44f..b15b22f 100644 (file)
@@ -25,4 +25,3 @@ $specialPageAliases = [
        'ComparePages'              => [ '頁面比較' ],
        'Unblock'                   => [ '解除封禁' ],
 ];
-
index 48e79cf..962811c 100644 (file)
@@ -13,4 +13,3 @@
 
 # Inherit everything for now
 $fallback = 'zh-hans';
-
index 94510ef..a6c6b84 100644 (file)
@@ -105,4 +105,3 @@ $dateFormats = [
        'CNS 7648 compact date'  => '"ROC" xoY-m-d (l)',
        'CNS 7648 compact both'  => '"ROC" xoY-m-d (D) H:i',
 ];
-
diff --git a/maintenance/archives/patch-externallinks-el_index_60.sql b/maintenance/archives/patch-externallinks-el_index_60.sql
new file mode 100644 (file)
index 0000000..eacb107
--- /dev/null
@@ -0,0 +1,4 @@
+-- @since 1.29
+ALTER TABLE /*$wgDBprefix*/externallinks ADD COLUMN el_index_60 varbinary(60) NOT NULL DEFAULT '';
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
index 38daf64..befafc1 100644 (file)
@@ -60,7 +60,7 @@ class BackupDumper extends Maintenance {
        /**
         * The dependency-injected database to use.
         *
-        * @var DatabaseBase|null
+        * @var IDatabase|null
         *
         * @see self::setDB
         */
@@ -163,7 +163,7 @@ class BackupDumper extends Maintenance {
                                        $val = explode( ':', $param );
 
                                        if ( count( $val ) === 1 ) {
-                                               $this->loadPlugin( $val[0] );
+                                               $this->loadPlugin( $val[0], '' );
                                        } elseif ( count( $val ) === 2 ) {
                                                $this->loadPlugin( $val[0], $val[1] );
                                        } else {
@@ -314,7 +314,7 @@ class BackupDumper extends Maintenance {
         * @todo Fixme: the --server parameter is currently not respected, as it
         * doesn't seem terribly easy to ask the load balancer for a particular
         * connection by name.
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function backupDb() {
                if ( $this->forcedDb !== null ) {
@@ -335,7 +335,7 @@ class BackupDumper extends Maintenance {
         * Force the dump to use the provided database connection for database
         * operations, wherever possible.
         *
-        * @param DatabaseBase|null $db (Optional) the database connection to use. If null, resort to
+        * @param IDatabase|null $db (Optional) the database connection to use. If null, resort to
         *   use the globally provided ways to get database connections.
         */
        function setDB( IDatabase $db = null ) {
index 453464a..bff2c13 100644 (file)
@@ -24,7 +24,6 @@
 use \Cdb\Exception as CdbException;
 use \Cdb\Reader as CdbReader;
 
-/** */
 require_once __DIR__ . '/commandLine.inc';
 
 function cdbShowHelp( $command ) {
index 4996446..d98e5cd 100644 (file)
@@ -32,7 +32,6 @@
 
 $optionsWithArgs = [ 'd' ];
 
-/** */
 require_once __DIR__ . "/commandLine.inc";
 
 if ( isset( $options['d'] ) ) {
index f6e65f9..81e18c9 100644 (file)
@@ -48,7 +48,7 @@ class FindHooks extends Maintenance {
        /*
         * Hooks that are ignored
         */
-       protected static $ignore = [ 'testRunLegacyHooks', 'Test' ];
+       protected static $ignore = [ 'Test' ];
 
        public function __construct() {
                parent::__construct();
@@ -238,7 +238,7 @@ class FindHooks extends Maintenance {
                $m = [];
                preg_match_all(
                        // All functions which runs hooks
-                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\s*\(\s*' .
+                       '/(?:wfRunHooks|Hooks\:\:run)\s*\(\s*' .
                                // First argument is the hook name as string
                                '([\'"])(.*?)\1' .
                                // Comma for second argument
index d3041d9..a84f2ae 100644 (file)
@@ -108,6 +108,7 @@ class GenerateJsonI18n extends Maintenance {
                if ( !is_readable( $phpfile ) ) {
                        $this->error( "Error reading $phpfile", 1 );
                }
+               $messages = null;
                include $phpfile;
                $phpfileContents = file_get_contents( $phpfile );
 
index f0e0555..6717a8e 100644 (file)
@@ -109,7 +109,8 @@ TEXT
                }
 
                $this->output( "Done!\n" );
-               $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges\n" );
+               $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges,\n" );
+               $this->output( "and initSiteStats.php to update page and revision counts\n" );
        }
 
        function setNsfilter( array $namespaces ) {
@@ -283,6 +284,9 @@ TEXT
                $source = new ImportStreamSource( $handle );
                $importer = new WikiImporter( $source, $this->getConfig() );
 
+               // Updating statistics require a lot of time so disable it
+               $importer->disableStatisticsUpdate();
+
                if ( $this->hasOption( 'debug' ) ) {
                        $importer->setDebug( true );
                }
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
deleted file mode 100644 (file)
index fc9428d..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- * Support functions for the importImages.php script
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @author Rob Church <robchur@gmail.com>
- * @author Mij <mij@bitchx.it>
- */
-
-/**
- * Search a directory for files with one of a set of extensions
- *
- * @param string $dir Path to directory to search
- * @param array $exts Array of extensions to search for
- * @param bool $recurse Search subdirectories recursively
- * @return array|bool Array of filenames on success, or false on failure
- */
-function findFiles( $dir, $exts, $recurse = false ) {
-       if ( is_dir( $dir ) ) {
-               $dhl = opendir( $dir );
-               if ( $dhl ) {
-                       $files = [];
-                       while ( ( $file = readdir( $dhl ) ) !== false ) {
-                               if ( is_file( $dir . '/' . $file ) ) {
-                                       list( /* $name */, $ext ) = splitFilename( $dir . '/' . $file );
-                                       if ( array_search( strtolower( $ext ), $exts ) !== false ) {
-                                               $files[] = $dir . '/' . $file;
-                                       }
-                               } elseif ( $recurse && is_dir( $dir . '/' . $file ) && $file !== '..' && $file !== '.' ) {
-                                       $files = array_merge( $files, findFiles( $dir . '/' . $file, $exts, true ) );
-                               }
-                       }
-
-                       return $files;
-               } else {
-                       return [];
-               }
-       } else {
-               return [];
-       }
-}
-
-/**
- * Split a filename into filename and extension
- *
- * @param string $filename Filename
- * @return array
- */
-function splitFilename( $filename ) {
-       $parts = explode( '.', $filename );
-       $ext = $parts[count( $parts ) - 1];
-       unset( $parts[count( $parts ) - 1] );
-       $fname = implode( '.', $parts );
-
-       return [ $fname, $ext ];
-}
-
-/**
- * Find an auxilliary file with the given extension, matching
- * the give base file path. $maxStrip determines how many extensions
- * may be stripped from the original file name before appending the
- * new extension. For example, with $maxStrip = 1 (the default),
- * file files acme.foo.bar.txt and acme.foo.txt would be auxilliary
- * files for acme.foo.bar and the extension ".txt". With $maxStrip = 2,
- * acme.txt would also be acceptable.
- *
- * @param string $file Base path
- * @param string $auxExtension The extension to be appended to the base path
- * @param int $maxStrip The maximum number of extensions to strip from the base path (default: 1)
- * @return string|bool
- */
-function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
-       if ( strpos( $auxExtension, '.' ) !== 0 ) {
-               $auxExtension = '.' . $auxExtension;
-       }
-
-       $d = dirname( $file );
-       $n = basename( $file );
-
-       while ( $maxStrip >= 0 ) {
-               $f = $d . '/' . $n . $auxExtension;
-
-               if ( file_exists( $f ) ) {
-                       return $f;
-               }
-
-               $idx = strrpos( $n, '.' );
-               if ( !$idx ) {
-                       break;
-               }
-
-               $n = substr( $n, 0, $idx );
-               $maxStrip -= 1;
-       }
-
-       return false;
-}
-
-# @todo FIXME: Access the api in a saner way and performing just one query
-# (preferably batching files too).
-function getFileCommentFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
-       $body = Http::get( $url, [], __METHOD__ );
-       if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
-               return false;
-       }
-
-       return html_entity_decode( $matches[1] );
-}
-
-function getFileUserFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
-       $body = Http::get( $url, [], __METHOD__ );
-       if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
-               return false;
-       }
-
-       return html_entity_decode( $matches[1] );
-}
index 5a4ab39..4a3d2d6 100644 (file)
  * @author Mij <mij@bitchx.it>
  */
 
-$optionsWithArgs = [
-       'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
-       'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
-];
+require_once __DIR__ . '/Maintenance.php';
+
+class ImportImages extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+
+               $this->addDescription( 'Imports images and other media files into the wiki' );
+               $this->addArg( 'dir', 'Path to the directory containing images to be imported' );
+
+               $this->addOption( 'extensions',
+                       'Comma-separated list of allowable extensions, defaults to $wgFileExtensions',
+                       false,
+                       true
+               );
+               $this->addOption( 'overwrite',
+                       'Overwrite existing images with the same name (default is to skip them)' );
+               $this->addOption( 'limit',
+                       'Limit the number of images to process. Ignored or skipped images are not counted',
+                       false,
+                       true
+               );
+               $this->addOption( 'from',
+                       "Ignore all files until the one with the given name. Useful for resuming aborted "
+                               . "imports. The name should be the file's canonical database form.",
+                       false,
+                       true
+               );
+               $this->addOption( 'skip-dupes',
+                       'Skip images that were already uploaded under a different name (check SHA1)' );
+               $this->addOption( 'search-recursively', 'Search recursively for files in subdirectories' );
+               $this->addOption( 'sleep',
+                       'Sleep between files. Useful mostly for debugging',
+                       false,
+                       true
+               );
+               $this->addOption( 'user',
+                       "Set username of uploader, default 'Maintenance script'",
+                       false,
+                       true
+               );
+               // This parameter can optionally have an argument. If none specified, getOption()
+               // returns 1 which is precisely what we need.
+               $this->addOption( 'check-userblock', 'Check if the user got blocked during import' );
+               $this->addOption( 'comment',
+                       "Set file description, default 'Importing file'",
+                       false,
+                       true
+               );
+               $this->addOption( 'comment-file',
+                       'Set description to the content of this file',
+                       false,
+                       true
+               );
+               $this->addOption( 'comment-ext',
+                       'Causes the description for each file to be loaded from a file with the same name, but '
+                               . 'the extension provided. If a global description is also given, it is appended.',
+                       false,
+                       true
+               );
+               $this->addOption( 'summary',
+                       'Upload summary, description will be used if not provided',
+                       false,
+                       true
+               );
+               $this->addOption( 'license',
+                       'Use an optional license template',
+                       false,
+                       true
+               );
+               $this->addOption( 'timestamp',
+                       'Override upload time/date, all MediaWiki timestamp formats are accepted',
+                       false,
+                       true
+               );
+               $this->addOption( 'protect',
+                       'Specify the protect value (autoconfirmed,sysop)',
+                       false,
+                       true
+               );
+               $this->addOption( 'unprotect', 'Unprotects all uploaded images' );
+               $this->addOption( 'source-wiki-url',
+                       'If specified, take User and Comment data for each imported file from this URL. '
+                               . 'For example, --source-wiki-url="http://en.wikipedia.org/',
+                       false,
+                       true
+               );
+               $this->addOption( 'dry', "Dry run, don't import anything" );
+       }
 
-$optionsWithoutArgs = [
-       'protect', 'unprotect', 'search-recursively', 'check-userblock', 'overwrite',
-       'skip-dupes', 'dry'
-];
+       public function execute() {
+               global $wgFileExtensions, $wgUser, $wgRestrictionLevels;
 
-require_once __DIR__ . '/commandLine.inc';
-require_once __DIR__ . '/importImages.inc';
-$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
+               $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
 
-echo "Import Images\n\n";
+               $this->output( "Import Images\n\n" );
 
-# Need a path
-if ( count( $args ) == 0 ) {
-       showUsage();
-}
+               $dir = $this->getArg( 0 );
 
-$dir = $args[0];
+               # Check Protection
+               if ( $this->hasOption( 'protect' ) && $this->hasOption( 'unprotect' ) ) {
+                       $this->error( "Cannot specify both protect and unprotect.  Only 1 is allowed.\n", 1 );
+               }
 
-# Check Protection
-if ( isset( $options['protect'] ) && isset( $options['unprotect'] ) ) {
-       die( "Cannot specify both protect and unprotect.  Only 1 is allowed.\n" );
-}
+               if ( $this->hasOption( 'protect' ) && trim( $this->getOption( 'protect' ) ) ) {
+                       $this->error( "You must specify a protection option.\n", 1 );
+               }
 
-if ( isset( $options['protect'] ) && $options['protect'] == 1 ) {
-       die( "You must specify a protection option.\n" );
-}
+               # Prepare the list of allowed extensions
+               $extensions = $this->hasOption( 'extensions' )
+                       ? explode( ',', strtolower( $this->getOption( 'extensions' ) ) )
+                       : $wgFileExtensions;
 
-# Prepare the list of allowed extensions
-global $wgFileExtensions;
-$extensions = isset( $options['extensions'] )
-       ? explode( ',', strtolower( $options['extensions'] ) )
-       : $wgFileExtensions;
-
-# Search the path provided for candidates for import
-$files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) );
-
-# Initialise the user for this operation
-$user = isset( $options['user'] )
-       ? User::newFromName( $options['user'] )
-       : User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
-if ( !$user instanceof User ) {
-       $user = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
-}
-$wgUser = $user;
-
-# Get block check. If a value is given, this specified how often the check is performed
-if ( isset( $options['check-userblock'] ) ) {
-       if ( !$options['check-userblock'] ) {
-               $checkUserBlock = 1;
-       } else {
-               $checkUserBlock = (int)$options['check-userblock'];
-       }
-} else {
-       $checkUserBlock = false;
-}
+               # Search the path provided for candidates for import
+               $files = $this->findFiles( $dir, $extensions, $this->hasOption( 'search-recursively' ) );
 
-# Get --from
-MediaWiki\suppressWarnings();
-$from = $options['from'];
-MediaWiki\restoreWarnings();
+               # Initialise the user for this operation
+               $user = $this->hasOption( 'user' )
+                       ? User::newFromName( $this->getOption( 'user' ) )
+                       : User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
+               if ( !$user instanceof User ) {
+                       $user = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
+               }
+               $wgUser = $user;
+
+               # Get block check. If a value is given, this specified how often the check is performed
+               $checkUserBlock = (int)$this->getOption( 'check-userblock' );
+
+               $from = $this->getOption( 'from' );
+               $sleep = (int)$this->getOption( 'sleep' );
+               $limit = (int)$this->getOption( 'limit' );
+               $timestamp = $this->getOption( 'timestamp', false );
+
+               # Get the upload comment. Provide a default one in case there's no comment given.
+               $commentFile = $this->getOption( 'comment-file' );
+               if ( $commentFile !== null ) {
+                       $comment = file_get_contents( $commentFile );
+                       if ( $comment === false || $comment === null ) {
+                               $this->error( "failed to read comment file: {$commentFile}\n", 1 );
+                       }
+               } else {
+                       $comment = $this->getOption( 'comment', 'Importing file' );
+               }
+               $commentExt = $this->getOption( 'comment-ext' );
+               $summary = $this->getOption( 'summary', '' );
 
-# Get sleep time.
-MediaWiki\suppressWarnings();
-$sleep = $options['sleep'];
-MediaWiki\restoreWarnings();
+               $license = $this->getOption( 'license', '' );
 
-if ( $sleep ) {
-       $sleep = (int)$sleep;
-}
+               $sourceWikiUrl = $this->getOption( 'source-wiki-url' );
 
-# Get limit number
-MediaWiki\suppressWarnings();
-$limit = $options['limit'];
-MediaWiki\restoreWarnings();
+               # Batch "upload" operation
+               $count = count( $files );
+               if ( $count > 0 ) {
 
-if ( $limit ) {
-       $limit = (int)$limit;
-}
+                       foreach ( $files as $file ) {
 
-$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
+                               if ( $sleep && ( $processed > 0 ) ) {
+                                       sleep( $sleep );
+                               }
 
-# Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing file';
+                               $base = UtfNormal\Validator::cleanUp( wfBaseName( $file ) );
 
-if ( isset( $options['comment-file'] ) ) {
-       $comment = file_get_contents( $options['comment-file'] );
-       if ( $comment === false || $comment === null ) {
-               die( "failed to read comment file: {$options['comment-file']}\n" );
-       }
-} elseif ( isset( $options['comment'] ) ) {
-       $comment = $options['comment'];
-}
+                               # Validate a title
+                               $title = Title::makeTitleSafe( NS_FILE, $base );
+                               if ( !is_object( $title ) ) {
+                                       $this->output(
+                                               "{$base} could not be imported; a valid title cannot be produced\n" );
+                                       continue;
+                               }
 
-$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
+                               if ( $from ) {
+                                       if ( $from == $title->getDBkey() ) {
+                                               $from = null;
+                                       } else {
+                                               $ignored++;
+                                               continue;
+                                       }
+                               }
 
-$summary = isset( $options['summary'] ) ? $options['summary'] : '';
+                               if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
+                                       $user->clearInstanceCache( 'name' ); // reload from DB!
+                                       if ( $user->isBlocked() ) {
+                                               $this->output( $user->getName() . " was blocked! Aborting.\n" );
+                                               break;
+                                       }
+                               }
 
-# Get the license specifier
-$license = isset( $options['license'] ) ? $options['license'] : '';
+                               # Check existence
+                               $image = wfLocalFile( $title );
+                               if ( $image->exists() ) {
+                                       if ( $this->hasOption( 'overwrite' ) ) {
+                                               $this->output( "{$base} exists, overwriting..." );
+                                               $svar = 'overwritten';
+                                       } else {
+                                               $this->output( "{$base} exists, skipping\n" );
+                                               $skipped++;
+                                               continue;
+                                       }
+                               } else {
+                                       if ( $this->hasOption( 'skip-dupes' ) ) {
+                                               $repo = $image->getRepo();
+                                               # XXX: we end up calculating this again when actually uploading. that sucks.
+                                               $sha1 = FSFile::getSha1Base36FromPath( $file );
+
+                                               $dupes = $repo->findBySha1( $sha1 );
+
+                                               if ( $dupes ) {
+                                                       $this->output(
+                                                               "{$base} already exists as {$dupes[0]->getName()}, skipping\n" );
+                                                       $skipped++;
+                                                       continue;
+                                               }
+                                       }
 
-# Batch "upload" operation
-$count = count( $files );
-if ( $count > 0 ) {
+                                       $this->output( "Importing {$base}..." );
+                                       $svar = 'added';
+                               }
 
-       foreach ( $files as $file ) {
-               $base = UtfNormal\Validator::cleanUp( wfBaseName( $file ) );
+                               if ( $sourceWikiUrl ) {
+                                       /* find comment text directly from source wiki, through MW's API */
+                                       $real_comment = $this->getFileCommentFromSourceWiki( $sourceWikiUrl, $base );
+                                       if ( $real_comment === false ) {
+                                               $commentText = $comment;
+                                       } else {
+                                               $commentText = $real_comment;
+                                       }
 
-               # Validate a title
-               $title = Title::makeTitleSafe( NS_FILE, $base );
-               if ( !is_object( $title ) ) {
-                       echo "{$base} could not be imported; a valid title cannot be produced\n";
-                       continue;
-               }
+                                       /* find user directly from source wiki, through MW's API */
+                                       $real_user = $this->getFileUserFromSourceWiki( $sourceWikiUrl, $base );
+                                       if ( $real_user === false ) {
+                                               $wgUser = $user;
+                                       } else {
+                                               $wgUser = User::newFromName( $real_user );
+                                               if ( $wgUser === false ) {
+                                                       # user does not exist in target wiki
+                                                       $this->output(
+                                                               "failed: user '$real_user' does not exist in target wiki." );
+                                                       continue;
+                                               }
+                                       }
+                               } else {
+                                       # Find comment text
+                                       $commentText = false;
+
+                                       if ( $commentExt ) {
+                                               $f = $this->findAuxFile( $file, $commentExt );
+                                               if ( !$f ) {
+                                                       $this->output( " No comment file with extension {$commentExt} found "
+                                                                . "for {$file}, using default comment. " );
+                                               } else {
+                                                       $commentText = file_get_contents( $f );
+                                                       if ( !$commentText ) {
+                                                               $this->output(
+                                                                       " Failed to load comment file {$f}, using default comment. " );
+                                                       }
+                                               }
+                                       }
 
-               if ( $from ) {
-                       if ( $from == $title->getDBkey() ) {
-                               $from = null;
-                       } else {
-                               $ignored++;
-                               continue;
-                       }
-               }
+                                       if ( !$commentText ) {
+                                               $commentText = $comment;
+                                       }
+                               }
 
-               if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
-                       $user->clearInstanceCache( 'name' ); // reload from DB!
-                       if ( $user->isBlocked() ) {
-                               echo $user->getName() . " was blocked! Aborting.\n";
-                               break;
-                       }
-               }
+                               # Import the file
+                               if ( $this->hasOption( 'dry' ) ) {
+                                       $this->output(
+                                               " publishing {$file} by '{$wgUser->getName()}', comment '$commentText'... "
+                                       );
+                               } else {
+                                       $mwProps = new MWFileProps( MimeMagic::singleton() );
+                                       $props = $mwProps->getPropsFromPath( $file, true );
+                                       $flags = 0;
+                                       $publishOptions = [];
+                                       $handler = MediaHandler::getHandler( $props['mime'] );
+                                       if ( $handler ) {
+                                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                                       } else {
+                                               $publishOptions['headers'] = [];
+                                       }
+                                       $archive = $image->publish( $file, $flags, $publishOptions );
+                                       if ( !$archive->isGood() ) {
+                                               $this->output( "failed. (" .
+                                                        $archive->getWikiText( false, false, 'en' ) .
+                                                        ")\n" );
+                                               $failed++;
+                                               continue;
+                                       }
+                               }
 
-               # Check existence
-               $image = wfLocalFile( $title );
-               if ( $image->exists() ) {
-                       if ( isset( $options['overwrite'] ) ) {
-                               echo "{$base} exists, overwriting...";
-                               $svar = 'overwritten';
-                       } else {
-                               echo "{$base} exists, skipping\n";
-                               $skipped++;
-                               continue;
-                       }
-               } else {
-                       if ( isset( $options['skip-dupes'] ) ) {
-                               $repo = $image->getRepo();
-                               # XXX: we end up calculating this again when actually uploading. that sucks.
-                               $sha1 = FSFile::getSha1Base36FromPath( $file );
+                               $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
+                               if ( !$this->hasOption( 'summary' ) ) {
+                                       $summary = $commentText;
+                               }
 
-                               $dupes = $repo->findBySha1( $sha1 );
+                               if ( $this->hasOption( 'dry' ) ) {
+                                       $this->output( "done.\n" );
+                               } elseif ( $image->recordUpload2(
+                                       $archive->value,
+                                       $summary,
+                                       $commentText,
+                                       $props,
+                                       $timestamp
+                               ) ) {
+                                       # We're done!
+                                       $this->output( "done.\n" );
 
-                               if ( $dupes ) {
-                                       echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
-                                       $skipped++;
-                                       continue;
+                                       $doProtect = false;
+
+                                       $protectLevel = $this->getOption( 'protect' );
+
+                                       if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
+                                               $doProtect = true;
+                                       }
+                                       if ( $this->hasOption( 'unprotect' ) ) {
+                                               $protectLevel = '';
+                                               $doProtect = true;
+                                       }
+
+                                       if ( $doProtect ) {
+                                               # Protect the file
+                                               $this->output( "\nWaiting for replica DBs...\n" );
+                                               // Wait for replica DBs.
+                                               sleep( 2.0 ); # Why this sleep?
+                                               wfWaitForSlaves();
+
+                                               $this->output( "\nSetting image restrictions ... " );
+
+                                               $cascade = false;
+                                               $restrictions = [];
+                                               foreach ( $title->getRestrictionTypes() as $type ) {
+                                                       $restrictions[$type] = $protectLevel;
+                                               }
+
+                                               $page = WikiPage::factory( $title );
+                                               $status = $page->doUpdateRestrictions( $restrictions, [], $cascade, '', $user );
+                                               $this->output( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+                                       }
+                               } else {
+                                       $this->output( "failed. (at recordUpload stage)\n" );
+                                       $svar = 'failed';
                                }
-                       }
 
-                       echo "Importing {$base}...";
-                       $svar = 'added';
-               }
+                               $$svar++;
+                               $processed++;
 
-               if ( isset( $options['source-wiki-url'] ) ) {
-                       /* find comment text directly from source wiki, through MW's API */
-                       $real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
-                       if ( $real_comment === false ) {
-                               $commentText = $comment;
-                       } else {
-                               $commentText = $real_comment;
+                               if ( $limit && $processed >= $limit ) {
+                                       break;
+                               }
                        }
 
-                       /* find user directly from source wiki, through MW's API */
-                       $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
-                       if ( $real_user === false ) {
-                               $wgUser = $user;
-                       } else {
-                               $wgUser = User::newFromName( $real_user );
-                               if ( $wgUser === false ) {
-                                       # user does not exist in target wiki
-                                       echo "failed: user '$real_user' does not exist in target wiki.";
-                                       continue;
+                       # Print out some statistics
+                       $this->output( "\n" );
+                       foreach (
+                               [
+                                       'count' => 'Found',
+                                       'limit' => 'Limit',
+                                       'ignored' => 'Ignored',
+                                       'added' => 'Added',
+                                       'skipped' => 'Skipped',
+                                       'overwritten' => 'Overwritten',
+                                       'failed' => 'Failed'
+                               ] as $var => $desc
+                       ) {
+                               if ( $$var > 0 ) {
+                                       $this->output( "{$desc}: {$$var}\n" );
                                }
                        }
                } else {
-                       # Find comment text
-                       $commentText = false;
-
-                       if ( $commentExt ) {
-                               $f = findAuxFile( $file, $commentExt );
-                               if ( !$f ) {
-                                       echo " No comment file with extension {$commentExt} found "
-                                               . "for {$file}, using default comment. ";
-                               } else {
-                                       $commentText = file_get_contents( $f );
-                                       if ( !$commentText ) {
-                                               echo " Failed to load comment file {$f}, using default comment. ";
+                       $this->output( "No suitable files could be found for import.\n" );
+               }
+       }
+
+       /**
+        * Search a directory for files with one of a set of extensions
+        *
+        * @param string $dir Path to directory to search
+        * @param array $exts Array of extensions to search for
+        * @param bool $recurse Search subdirectories recursively
+        * @return array|bool Array of filenames on success, or false on failure
+        */
+       private function findFiles( $dir, $exts, $recurse = false ) {
+               if ( is_dir( $dir ) ) {
+                       $dhl = opendir( $dir );
+                       if ( $dhl ) {
+                               $files = [];
+                               while ( ( $file = readdir( $dhl ) ) !== false ) {
+                                       if ( is_file( $dir . '/' . $file ) ) {
+                                               list( /* $name */, $ext ) = $this->splitFilename( $dir . '/' . $file );
+                                               if ( array_search( strtolower( $ext ), $exts ) !== false ) {
+                                                       $files[] = $dir . '/' . $file;
+                                               }
+                                       } elseif ( $recurse && is_dir( $dir . '/' . $file ) && $file !== '..' && $file !== '.' ) {
+                                               $files = array_merge( $files, $this->findFiles( $dir . '/' . $file, $exts, true ) );
                                        }
                                }
-                       }
 
-                       if ( !$commentText ) {
-                               $commentText = $comment;
-                       }
-               }
-
-               # Import the file
-               if ( isset( $options['dry'] ) ) {
-                       echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
-               } else {
-                       $mwProps = new MWFileProps( MimeMagic::singleton() );
-                       $props = $mwProps->getPropsFromPath( $file, true );
-                       $flags = 0;
-                       $publishOptions = [];
-                       $handler = MediaHandler::getHandler( $props['mime'] );
-                       if ( $handler ) {
-                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                               return $files;
                        } else {
-                               $publishOptions['headers'] = [];
+                               return [];
                        }
-                       $archive = $image->publish( $file, $flags, $publishOptions );
-                       if ( !$archive->isGood() ) {
-                               echo "failed. (" .
-                                       $archive->getWikiText( false, false, 'en' ) .
-                                       ")\n";
-                               $failed++;
-                               continue;
-                       }
-               }
-
-               $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
-               if ( !isset( $options['summary'] ) ) {
-                       $summary = $commentText;
+               } else {
+                       return [];
                }
+       }
 
-               if ( isset( $options['dry'] ) ) {
-                       echo "done.\n";
-               } elseif ( $image->recordUpload2(
-                       $archive->value,
-                       $summary,
-                       $commentText,
-                       $props,
-                       $timestamp
-               ) ) {
-                       # We're done!
-                       echo "done.\n";
+       /**
+        * Split a filename into filename and extension
+        *
+        * @param string $filename Filename
+        * @return array
+        */
+       private function splitFilename( $filename ) {
+               $parts = explode( '.', $filename );
+               $ext = $parts[count( $parts ) - 1];
+               unset( $parts[count( $parts ) - 1] );
+               $fname = implode( '.', $parts );
+
+               return [ $fname, $ext ];
+       }
 
-                       $doProtect = false;
+       /**
+        * Find an auxilliary file with the given extension, matching
+        * the give base file path. $maxStrip determines how many extensions
+        * may be stripped from the original file name before appending the
+        * new extension. For example, with $maxStrip = 1 (the default),
+        * file files acme.foo.bar.txt and acme.foo.txt would be auxilliary
+        * files for acme.foo.bar and the extension ".txt". With $maxStrip = 2,
+        * acme.txt would also be acceptable.
+        *
+        * @param string $file Base path
+        * @param string $auxExtension The extension to be appended to the base path
+        * @param int $maxStrip The maximum number of extensions to strip from the base path (default: 1)
+        * @return string|bool
+        */
+       private function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
+               if ( strpos( $auxExtension, '.' ) !== 0 ) {
+                       $auxExtension = '.' . $auxExtension;
+               }
 
-                       global $wgRestrictionLevels;
+               $d = dirname( $file );
+               $n = basename( $file );
 
-                       $protectLevel = isset( $options['protect'] ) ? $options['protect'] : null;
+               while ( $maxStrip >= 0 ) {
+                       $f = $d . '/' . $n . $auxExtension;
 
-                       if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
-                               $doProtect = true;
-                       }
-                       if ( isset( $options['unprotect'] ) ) {
-                               $protectLevel = '';
-                               $doProtect = true;
+                       if ( file_exists( $f ) ) {
+                               return $f;
                        }
 
-                       if ( $doProtect ) {
-                               # Protect the file
-                               echo "\nWaiting for replica DBs...\n";
-                               // Wait for replica DBs.
-                               sleep( 2.0 ); # Why this sleep?
-                               wfWaitForSlaves();
-
-                               echo "\nSetting image restrictions ... ";
-
-                               $cascade = false;
-                               $restrictions = [];
-                               foreach ( $title->getRestrictionTypes() as $type ) {
-                                       $restrictions[$type] = $protectLevel;
-                               }
-
-                               $page = WikiPage::factory( $title );
-                               $status = $page->doUpdateRestrictions( $restrictions, [], $cascade, '', $user );
-                               echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
+                       $idx = strrpos( $n, '.' );
+                       if ( !$idx ) {
+                               break;
                        }
-               } else {
-                       echo "failed. (at recordUpload stage)\n";
-                       $svar = 'failed';
-               }
 
-               $$svar++;
-               $processed++;
-
-               if ( $limit && $processed >= $limit ) {
-                       break;
+                       $n = substr( $n, 0, $idx );
+                       $maxStrip -= 1;
                }
 
-               if ( $sleep ) {
-                       sleep( $sleep );
-               }
+               return false;
        }
 
-       # Print out some statistics
-       echo "\n";
-       foreach (
-               [
-                       'count' => 'Found',
-                       'limit' => 'Limit',
-                       'ignored' => 'Ignored',
-                       'added' => 'Added',
-                       'skipped' => 'Skipped',
-                       'overwritten' => 'Overwritten',
-                       'failed' => 'Failed'
-               ] as $var => $desc
-       ) {
-               if ( $$var > 0 ) {
-                       echo "{$desc}: {$$var}\n";
+       # @todo FIXME: Access the api in a saner way and performing just one query
+       # (preferably batching files too).
+       private function getFileCommentFromSourceWiki( $wiki_host, $file ) {
+               $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+               $body = Http::get( $url, [], __METHOD__ );
+               if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
+                       return false;
                }
+
+               return html_entity_decode( $matches[1] );
        }
-} else {
-       echo "No suitable files could be found for import.\n";
-}
 
-exit( 0 );
+       private function getFileUserFromSourceWiki( $wiki_host, $file ) {
+               $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+               $body = Http::get( $url, [], __METHOD__ );
+               if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
+                       return false;
+               }
 
-function showUsage( $reason = false ) {
-       if ( $reason ) {
-               echo $reason . "\n";
+               return html_entity_decode( $matches[1] );
        }
 
-       echo <<<TEXT
-Imports images and other media files into the wiki
-USAGE: php importImages.php [options] <dir>
-
-<dir> : Path to the directory containing images to be imported
-
-Options:
---extensions=<exts>     Comma-separated list of allowable extensions, defaults
-                        to \$wgFileExtensions.
---overwrite             Overwrite existing images with the same name (default
-                        is to skip them).
---limit=<num>           Limit the number of images to process. Ignored or
-                        skipped images are not counted.
---from=<name>           Ignore all files until the one with the given name.
-                        Useful for resuming aborted imports. <name> should be
-                        the file's canonical database form.
---skip-dupes            Skip images that were already uploaded under a different
-                        name (check SHA1).
---search-recursively    Search recursively for files in subdirectories.
---sleep=<sec>           Sleep between files. Useful mostly for debugging.
---user=<username>       Set username of uploader, default 'Maintenance script'.
---check-userblock       Check if the user got blocked during import.
---comment=<text>        Set file description, default 'Importing file'.
---comment-file=<file>   Set description to the content of <file>.
---comment-ext=<ext>     Causes the description for each file to be loaded from a
-                        file with the same name, but the extension <ext>. If a
-                        global description is also given, it is appended.
---license=<code>        Use an optional license template.
---dry                   Dry run, don't import anything.
---protect=<protect>     Specify the protect value (autoconfirmed,sysop).
---summary=<summary>     Upload summary, description will be used if not
-                        provided.
---timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp
-                        formats are accepted.
---unprotect             Unprotects all uploaded images.
---source-wiki-url       If specified, take User and Comment data for each
-                        imported file from this URL. For example,
-                        --source-wiki-url="http://en.wikipedia.org/."
-
-TEXT;
-       exit( 1 );
 }
+
+$maintClass = 'ImportImages';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 8618a93..dee2164 100644 (file)
 馬鞌 马鞍
 觔斗 斤斗
 穀阳 穀阳
+伊東豊雄   伊东丰雄
index 3062c1e..3c7ea7a 100644 (file)
 划進 划進
 划過 划過
 划龍舟      划龍舟
+划龍船      划龍船
 只影響      只影響
 么弟 么弟
 六么 六么
 苧麻 苧麻
 张柏芝      張栢芝
 杜琪峰      杜琪峯
+單向 單向
+轉向 轉向 #分詞用
index dd38a30..b4cd628 100644 (file)
 碼錶
 錶冠
 魔錶
-彆口氣
-彆強
-皺彆
-一彆頭
 并州
 幽并
 併力
 於後
 猜三划五
 划龍舟
+划龍船
 南迴線
 南迴鐵路
 北迴線
 藉此
 龍捲
 捲舌
+不捲
+漫捲
+捲地
+捲瓣
+捲葉蛾
+捲尾猴
+捲積雲
 夸父
 夸克
 夸特
 水里溪
 二里頭
 年歷史
+年歷次
 西歷史
+西歷次
+西歷代
+西歷任
 國歷史
 國歷代
 國歷任
 不斗膽
 不每只
 不采聲
-專向往
+向往常
+向往日
+向往時
+向往來
+方向
+轉向
+單向 #分詞用
 丰容
 之一只
 之二只
 網球台
 合府上
 後面店
-向往常
-向往日
-向往時
-向往來
 唯一只
 喂了一聲
-喜向往
 四出徵收
 四面包
 多半只
 扎好根
 扑撻
 打吨
-折向往
 拉面上
 拉面具
 拉面前
 敢情欲
 敢斗了膽
 敲扑
-方向往
 望了望
 桌几
 每每只
 要自制
 語有云
 跌扑
-轉向往
 酒帘
 金表態
 金表情
 幸運鬍
 刮鬍
 剃鬍
-吹鬍
 蓄鬍
-白鬍
-長鬍
 鬍髯
 髯鬍
 髭鬍
 功勳
 蝎虎
 磨蝎
-方志恒
 古蹟
 瀋撫
 賦范
 乃係
 製衣
 巨製
-不捲
-漫捲
-捲地
-捲葉蛾
-捲尾猴
-捲積雲
 窗簾
 吉徵
 凶徵
 譯製
 燉製
 煮製
+熬製
 遏制 #以下分詞用
 管制
 抑制
 繫上,
 繫上。
 繫舟
+繫膜
 亂發生
 亂發脾氣
 秀發村
 啊喂
 呵喂
 呦喂
+哈囉喂
 松口鎮
+岩松了
 沙瑯
 琺瑯
 菜餚
 仁貴 #分詞用
 金聖歎
 天台 #分詞用
+性別扭曲
diff --git a/maintenance/manageJobs.php b/maintenance/manageJobs.php
new file mode 100644 (file)
index 0000000..9585ed8
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Maintenance script that handles managing job queue admin tasks
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that handles managing job queue admin tasks (re-push, delete, ...)
+ *
+ * @ingroup Maintenance
+ */
+class ManageJobs extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Perform administrative tasks on a job queue' );
+               $this->addOption( 'type', 'Job type', true, true );
+               $this->addOption( 'action', 'Queue operation ("delete", "repush-abandoned")', true, true );
+       }
+
+       public function execute() {
+               $type = $this->getOption( 'type' );
+               $action = $this->getOption( 'action' );
+
+               $group = JobQueueGroup::singleton();
+               $queue = $group->get( $type );
+
+               if ( $action === 'delete' ) {
+                       $this->delete( $queue );
+               } elseif ( $action === 'repush-abandoned' ) {
+                       $this->repushAbandoned( $queue );
+               } else {
+                       $this->error( "Invalid action '$action'.", 1 );
+               }
+       }
+
+       private function delete( JobQueue $queue ) {
+               $this->output( "Queue has {$queue->getSize()} job(s); deleting...\n" );
+               $queue->delete();
+               $this->output( "Done; current size is {$queue->getSize()} job(s).\n" );
+       }
+
+       private function repushAbandoned( JobQueue $queue ) {
+               $cache = ObjectCache::getInstance( CACHE_DB );
+               $key = $cache->makeGlobalKey( 'last-job-repush', $queue->getWiki(), $queue->getType() );
+
+               $now = wfTimestampNow();
+               $lastRepushTime = $cache->get( $key );
+               if ( $lastRepushTime === false ) {
+                       $lastRepushTime = wfTimestamp( TS_MW, 1 ); // include all jobs
+               }
+
+               $this->output( "Last re-push time: $lastRepushTime; current time: $now\n" );
+
+               $count = 0;
+               $skipped = 0;
+               foreach ( $queue->getAllAbandonedJobs() as $job ) {
+                       /** @var Job $job */
+                       if ( $job->getQueuedTimestamp() < $lastRepushTime ) {
+                               ++$skipped;
+                               continue; // already re-pushed in prior round
+                       }
+
+                       $queue->push( $job );
+                       ++$count;
+
+                       if ( ( $count % $this->mBatchSize ) == 0 ) {
+                               $queue->waitForBackups();
+                       }
+               }
+
+               $cache->set( $key, $now ); // next run will ignore these jobs
+
+               $this->output( "Re-pushed $count job(s) [$skipped skipped].\n" );
+       }
+}
+
+$maintClass = "ManageJobs";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 256ee36..ba1f752 100644 (file)
@@ -389,11 +389,18 @@ CREATE TABLE /*_*/externallinks (
   -- which allows for fast searching for all pages under example.com with the
   -- clause:
   --      WHERE el_index LIKE 'http://com.example.%'
-  el_index nvarchar(450) NOT NULL
+  el_index nvarchar(450) NOT NULL,
+
+  -- This is el_index truncated to 60 bytes to allow for sortable queries that
+  -- aren't supported by a partial index.
+  -- @todo Drop the default once this is deployed everywhere and code is populating it.
+  el_index_60 varbinary(60) NOT NULL default ''
 );
 
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index);
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
 -- el_to index intentionally not added; we cannot index nvarchar(max) columns,
 -- but we also cannot restrict el_to to a smaller column size as the external
 -- link may be larger.
index b705500..522871d 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -224,7 +225,7 @@ class NamespaceConflictChecker extends Maintenance {
         * @return array
         */
        private function getInterwikiList() {
-               $result = Interwiki::getAllPrefixes();
+               $result = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes();
                $prefixes = [];
                foreach ( $result as $row ) {
                        $prefixes[] = $row['iw_prefix'];
diff --git a/maintenance/oracle/archives/patch-externallinks-el_index_60.sql b/maintenance/oracle/archives/patch-externallinks-el_index_60.sql
new file mode 100644 (file)
index 0000000..c4b906d
--- /dev/null
@@ -0,0 +1,5 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.externallinks ADD el_index_60 VARBINARY(60) NOT NULL DEFAULT '';
+CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
+CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
index 616b401..edb3398 100644 (file)
@@ -219,13 +219,16 @@ CREATE TABLE &mw_prefix.externallinks (
   el_id     NUMBER  NOT NULL,
   el_from   NUMBER  NOT NULL,
   el_to     VARCHAR2(2048) NOT NULL,
-  el_index  VARCHAR2(2048) NOT NULL
+  el_index  VARCHAR2(2048) NOT NULL,
+  el_index_60  VARBINARY(60) NOT NULL DEFAULT ''
 );
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
 CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
+CREATE INDEX &mw_prefix.externallinks_i04 ON &mw_prefix.externallinks (el_index_60, el_id);
+CREATE INDEX &mw_prefix.externallinks_i05 ON &mw_prefix.externallinks (el_from, el_index_60, el_id);
 
 CREATE TABLE &mw_prefix.langlinks (
   ll_from    NUMBER  NOT NULL,
index e4f3e91..2da8830 100644 (file)
@@ -57,7 +57,7 @@ class Orphans extends Maintenance {
        /**
         * Lock the appropriate tables for the script
         * @param Database $db
-        * @param string $extraTable The name of any extra tables to lock (eg: text)
+        * @param string[] $extraTable The name of any extra tables to lock (eg: text)
         */
        private function lockTables( $db, $extraTable = [] ) {
                $tbls = [ 'page', 'revision', 'redirect' ];
diff --git a/maintenance/populateInterwiki.php b/maintenance/populateInterwiki.php
new file mode 100644 (file)
index 0000000..8f7a918
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * Maintenance script that populates the interwiki table with list of sites from
+ * a source wiki, such as English Wikipedia. (the default source)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+class PopulateInterwiki extends Maintenance {
+
+       /**
+        * @var string
+        */
+       private $source;
+
+       public function __construct() {
+               parent::__construct();
+
+               $this->addDescription( <<<TEXT
+This script will populate the interwiki table, pulling in interwiki links that are used on Wikipedia
+or another MediaWiki wiki.
+
+When the script has finished, it will make a note of this in the database, and will not run again
+without the --force option.
+
+--source parameter is the url for the source wiki api, such as "https://en.wikipedia.org/w/api.php"
+(the default) from which the script fetches the interwiki data and uses here to populate
+the interwiki database table.
+TEXT
+               );
+
+               $this->addOption( 'source', 'Source wiki for interwiki table, such as '
+                       . 'https://en.wikipedia.org/w/api.php (the default)', false, true );
+               $this->addOption( 'force', 'Run regardless of whether the database says it has '
+                       . 'been run already.' );
+       }
+
+       public function execute() {
+               $force = $this->getOption( 'force', false );
+               $this->source = $this->getOption( 'source', 'https://en.wikipedia.org/w/api.php' );
+
+               $data = $this->fetchLinks();
+
+               if ( $data === false ) {
+                       $this->error( "Error during fetching data." );
+               } else {
+                       $this->doPopulate( $data, $force );
+               }
+       }
+
+       /**
+        * @return array[]|bool The 'interwikimap' sub-array or false on failure.
+        */
+       protected function fetchLinks() {
+               $url = wfArrayToCgi( [
+                       'action' => 'query',
+                       'meta' => 'siteinfo',
+                       'siprop' => 'interwikimap',
+                       'sifilteriw' => 'local',
+                       'format' => 'json'
+               ] );
+
+               if ( !empty( $this->source ) ) {
+                       $url = rtrim( $this->source, '?' ) . '?' . $url;
+               }
+
+               $json = Http::get( $url );
+               $data = json_decode( $json, true );
+
+               if ( is_array( $data ) ) {
+                       return $data['query']['interwikimap'];
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param array[] $data
+        * @param bool $force
+        *
+        * @return bool
+        */
+       protected function doPopulate( array $data, $force ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( !$force ) {
+                       $row = $dbw->selectRow(
+                               'updatelog',
+                               '1',
+                               [ 'ul_key' => 'populate interwiki' ],
+                               __METHOD__
+                       );
+
+                       if ( $row ) {
+                               $this->output( "Interwiki table already populated.  Use php " .
+                                       "maintenance/populateInterwiki.php\n--force from the command line " .
+                                       "to override.\n" );
+                               return true;
+                       }
+               }
+
+               foreach ( $data as $d ) {
+                       $prefix = $d['prefix'];
+
+                       $row = $dbw->selectRow(
+                               'interwiki',
+                               '1',
+                               [ 'iw_prefix' => $prefix ],
+                               __METHOD__
+                       );
+
+                       if ( !$row ) {
+                               $dbw->insert(
+                                       'interwiki',
+                                       [
+                                               'iw_prefix' => $prefix,
+                                               'iw_url' => $d['url'],
+                                               'iw_local' => 1
+                                       ],
+                                       __METHOD__,
+                                       'IGNORE'
+                               );
+                       }
+
+                       Interwiki::invalidateCache( $prefix );
+               }
+
+               $this->output( "Interwiki links are populated.\n" );
+
+               return true;
+       }
+
+}
+
+$maintClass = PopulateInterwiki::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2273761..61ad075 100644 (file)
@@ -254,13 +254,16 @@ CREATE INDEX cl_sortkey     ON categorylinks (cl_to, cl_sortkey, cl_from);
 
 CREATE SEQUENCE externallinks_el_id_seq;
 CREATE TABLE externallinks (
-  el_id     INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq'),
-  el_from   INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-  el_to     TEXT     NOT NULL,
-  el_index  TEXT     NOT NULL
+  el_id       INTEGER     NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq'),
+  el_from     INTEGER     NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  el_to       TEXT        NOT NULL,
+  el_index    TEXT        NOT NULL,
+  el_index_60 BYTEA       NOT NULL  DEFAULT ''
 );
 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
 CREATE INDEX externallinks_index   ON externallinks (el_index);
+CREATE INDEX el_index_60           ON externallinks (el_index_60, el_id);
+CREATE INDEX el_from_index_60      ON externallinks (el_from, el_index_60, el_id);
 
 CREATE TABLE langlinks (
   ll_from    INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
index da8a6bc..d073282 100644 (file)
@@ -122,6 +122,9 @@ class RebuildFileCache extends Maintenance {
                                $article = Article::newFromTitle( $title, $context );
                                $context->setWikiPage( $article->getPage() );
 
+                               // Some extensions like FlaggedRevs while error out if this is unset
+                               RequestContext::getMain()->setTitle( $title );
+
                                // If the article is cacheable, then load it
                                if ( $article->isFileCacheable( HTMLFileCache::MODE_REBUILD ) ) {
                                        $viewCache = new HTMLFileCache( $title, 'view' );
index 37636c8..b7f0762 100644 (file)
@@ -108,9 +108,8 @@ class RebuildTextIndex extends Maintenance {
                        );
 
                        foreach ( $res as $s ) {
+                               $title = Title::makeTitle( $s->page_namespace, $s->page_title );
                                try {
-                                       $title = Title::makeTitle( $s->page_namespace, $s->page_title );
-
                                        $rev = new Revision( $s );
                                        $content = $rev->getContent();
 
index df4ce56..372c352 100644 (file)
@@ -139,45 +139,53 @@ class RefreshImageMetadata extends Maintenance {
                        }
 
                        foreach ( $res as $row ) {
-                               // LocalFile will upgrade immediately here if obsolete
-                               $file = $repo->newFileFromRow( $row );
-                               if ( $file->getUpgraded() ) {
-                                       // File was upgraded.
-                                       $upgraded++;
-                                       $newLength = strlen( $file->getMetadata() );
-                                       $oldLength = strlen( $row->img_metadata );
-                                       if ( $newLength < $oldLength - 5 ) {
-                                               // If after updating, the metadata is smaller then
-                                               // what it was before, that's probably not a good thing
-                                               // because we extract more data with time, not less.
-                                               // Thus this probably indicates an error of some sort,
-                                               // or at the very least is suspicious. Have the - 5 just
-                                               // to weed out any inconsequential changes.
-                                               $error++;
-                                               $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                       "$oldLength bytes of metadata but now has $newLength bytes.\n" );
-                                       } elseif ( $verbose ) {
-                                               $this->output( "Refreshed File:{$row->img_name}.\n" );
-                                       }
-                               } else {
-                                       $leftAlone++;
-                                       if ( $force ) {
-                                               $file->upgradeRow();
+                               try {
+                                       // LocalFile will upgrade immediately here if obsolete
+                                       $file = $repo->newFileFromRow( $row );
+                                       if ( $file->getUpgraded() ) {
+                                               // File was upgraded.
+                                               $upgraded++;
                                                $newLength = strlen( $file->getMetadata() );
                                                $oldLength = strlen( $row->img_metadata );
                                                if ( $newLength < $oldLength - 5 ) {
+                                                       // If after updating, the metadata is smaller then
+                                                       // what it was before, that's probably not a good thing
+                                                       // because we extract more data with time, not less.
+                                                       // Thus this probably indicates an error of some sort,
+                                                       // or at the very least is suspicious. Have the - 5 just
+                                                       // to weed out any inconsequential changes.
                                                        $error++;
-                                                       $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                               "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
-                                               }
-                                               if ( $verbose ) {
-                                                       $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
+                                                       $this->output(
+                                                               "Warning: File:{$row->img_name} used to have " .
+                                                               "$oldLength bytes of metadata but now has $newLength bytes.\n"
+                                                       );
+                                               } elseif ( $verbose ) {
+                                                       $this->output( "Refreshed File:{$row->img_name}.\n" );
                                                }
                                        } else {
-                                               if ( $verbose ) {
-                                                       $this->output( "Skipping File:{$row->img_name}.\n" );
+                                               $leftAlone++;
+                                               if ( $force ) {
+                                                       $file->upgradeRow();
+                                                       $newLength = strlen( $file->getMetadata() );
+                                                       $oldLength = strlen( $row->img_metadata );
+                                                       if ( $newLength < $oldLength - 5 ) {
+                                                               $error++;
+                                                               $this->output(
+                                                                       "Warning: File:{$row->img_name} used to have " .
+                                                                       "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n"
+                                                               );
+                                                       }
+                                                       if ( $verbose ) {
+                                                               $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
+                                                       }
+                                               } else {
+                                                       if ( $verbose ) {
+                                                               $this->output( "Skipping File:{$row->img_name}.\n" );
+                                                       }
                                                }
                                        }
+                               } catch ( Exception $e ) {
+                                       $this->output( "{$row->img_name} failed. {$e->getMessage()}\n" );
                                }
                        }
                        $conds2 = [ 'img_name > ' . $dbw->addQuotes( $row->img_name ) ];
index 28be6a3..c17ce99 100644 (file)
@@ -51,13 +51,11 @@ require_once __DIR__ . '/../Maintenance.php';
 class CompressOld extends Maintenance {
        /**
         * Option to load each revision individually.
-        *
         */
        const LS_INDIVIDUAL = 0;
 
        /**
         * Option to load revisions in chunks.
-        *
         */
        const LS_CHUNKED = 1;
 
index cf60d89..2b6ea03 100644 (file)
@@ -676,12 +676,19 @@ CREATE TABLE /*_*/externallinks (
   -- which allows for fast searching for all pages under example.com with the
   -- clause:
   --      WHERE el_index LIKE 'http://com.example.%'
-  el_index blob NOT NULL
+  el_index blob NOT NULL,
+
+  -- This is el_index truncated to 60 bytes to allow for sortable queries that
+  -- aren't supported by a partial index.
+  -- @todo Drop the default once this is deployed everywhere and code is populating it.
+  el_index_60 varbinary(60) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
+CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id);
+CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id);
 
 --
 -- Track interlanguage links
index b9baf8c..9906990 100644 (file)
@@ -2,73 +2,22 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
-use Composer\Spdx\SpdxLicenses;
-use JsonSchema\Validator;
-
 class ValidateRegistrationFile extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
        }
        public function execute() {
-               if ( !class_exists( Validator::class ) ) {
-                       $this->error( 'The JsonSchema library cannot be found, please install it through composer.', 1 );
-               } elseif ( !class_exists( SpdxLicenses::class ) ) {
-                       $this->error(
-                               'The spdx-licenses library cannot be found, please install it through composer.', 1
-                       );
-               }
-
+               $validator = new ExtensionJsonValidator( function( $msg ) {
+                       $this->error( $msg, 1 );
+               } );
+               $validator->checkDependencies();
                $path = $this->getArg( 0 );
-               $data = json_decode( file_get_contents( $path ) );
-               if ( !is_object( $data ) ) {
-                       $this->error( "$path is not a valid JSON file.", 1 );
-               }
-               if ( !isset( $data->manifest_version ) ) {
-                       $this->output( "Warning: No manifest_version set, assuming 1.\n" );
-                       // For backwards-compatability assume 1
-                       $data->manifest_version = 1;
-               }
-               $version = $data->manifest_version;
-               if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) {
-                       $schemaPath = dirname( __DIR__ ) . "/docs/extension.schema.v$version.json";
-               } else {
-                       $schemaPath = dirname( __DIR__ ) . '/docs/extension.schema.json';
-               }
-
-               if ( $version < ExtensionRegistry::OLDEST_MANIFEST_VERSION
-                       || $version > ExtensionRegistry::MANIFEST_VERSION
-               ) {
-                       $this->error( "Error: $path is using a non-supported schema version, it should use "
-                               . ExtensionRegistry::MANIFEST_VERSION, 1 );
-               } elseif ( $version < ExtensionRegistry::MANIFEST_VERSION ) {
-                       $this->output( "Warning: $path is using a deprecated schema, and should be updated to "
-                               . ExtensionRegistry::MANIFEST_VERSION . "\n" );
-               }
-
-               $licenseError = false;
-               // Check if it's a string, if not, schema validation will display an error
-               if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) {
-                       $licenses = new SpdxLicenses();
-                       $valid = $licenses->validate( $data->{'license-name'} );
-                       if ( !$valid ) {
-                               $licenseError = '[license-name] Invalid SPDX license identifier, '
-                                       . 'see <https://spdx.org/licenses/>';
-                       }
-               }
-
-               $validator = new Validator;
-               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
-               if ( $validator->isValid() && !$licenseError ) {
-                       $this->output( "$path validates against the version $version schema!\n" );
-               } else {
-                       foreach ( $validator->getErrors() as $error ) {
-                               $this->output( "[{$error['property']}] {$error['message']}\n" );
-                       }
-                       if ( $licenseError ) {
-                               $this->output( "$licenseError\n" );
-                       }
-                       $this->error( "$path does not validate.", 1 );
+               try {
+                       $validator->validate( $path );
+                       $this->output( "$path validates against the schema!\n" );
+               } catch ( ExtensionJsonValidationError $e ) {
+                       $this->error( $e->getMessage(), 1 );
                }
        }
 }
diff --git a/maintenance/view.php b/maintenance/view.php
new file mode 100644 (file)
index 0000000..af7eb2d
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Show page contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to show page contents.
+ *
+ * @ingroup Maintenance
+ */
+class ViewCLI extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Show article contents on the command line' );
+               $this->addArg( 'title', 'Title of article to view' );
+       }
+
+       public function execute() {
+               $title = Title::newFromText( $this->getArg() );
+               if ( !$title ) {
+                       $this->error( "Invalid title", true );
+               }
+
+               $page = WikiPage::factory( $title );
+
+               $content = $page->getContent( Revision::RAW );
+               if ( !$content ) {
+                       $this->error( "Page has no content", true );
+               }
+               if ( !$content instanceof TextContent ) {
+                       $this->error( "Non-text content models not supported", true );
+               }
+
+               $this->output( $content->getNativeData() );
+       }
+}
+
+$maintClass = "ViewCLI";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 926ac43..be9debc 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile Generic.Arrays.DisallowLongArraySyntax
 /**
  * New version of MediaWiki web-based config/installation
  *
@@ -60,7 +61,7 @@ function wfInstallerMain() {
        if ( isset( $_SESSION['installData'][$fingerprint] ) ) {
                $session = $_SESSION['installData'][$fingerprint];
        } else {
-               $session = [];
+               $session = array();
        }
 
        if ( !is_null( $wgRequest->getVal( 'uselang' ) ) ) {
index 99e752c..983da09 100644 (file)
@@ -6,6 +6,7 @@
     "postdoc": "grunt copy:jsduck"
   },
   "devDependencies": {
+    "eslint": "3.12.2",
     "eslint-config-wikimedia": "0.3.0",
     "grunt": "1.0.1",
     "grunt-banana-checker": "0.5.0",
@@ -16,7 +17,7 @@
     "grunt-karma": "2.0.0",
     "grunt-stylelint": "0.6.0",
     "karma": "1.1.0",
-    "karma-chrome-launcher": "1.0.1",
+    "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.0",
     "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
index a556b60..22f109d 100644 (file)
@@ -1060,7 +1060,6 @@ return [
                        'resources/src/mediawiki/htmlform/autocomplete.js',
                        'resources/src/mediawiki/htmlform/autoinfuse.js',
                        'resources/src/mediawiki/htmlform/checkmatrix.js',
-                       'resources/src/mediawiki/htmlform/datetime.js',
                        'resources/src/mediawiki/htmlform/cloner.js',
                        'resources/src/mediawiki/htmlform/hide-if.js',
                        'resources/src/mediawiki/htmlform/multiselect.js',
@@ -1174,7 +1173,6 @@ return [
                        'searchsuggest-containing',
                ],
                'dependencies' => [
-                       'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
                        'jquery.getAttrs',
@@ -1278,59 +1276,18 @@ return [
                        'upload-form-label-infoform-description-tooltip',
                        'upload-form-label-usage-title',
                        'upload-form-label-usage-filename',
-                       'api-error-unknownerror',
+                       'action-upload',
+                       'apierror-mustbeloggedin',
+                       'badaccess-groups',
+                       'apierror-unknownerror',
                        'api-error-unknown-warning',
-                       'api-error-autoblocked',
-                       'api-error-blocked',
-                       'api-error-badaccess-groups',
-                       'api-error-badtoken',
-                       'api-error-copyuploaddisabled',
-                       'api-error-duplicate',
-                       'api-error-duplicate-archive',
-                       'api-error-empty-file',
-                       'api-error-emptypage',
-                       'api-error-fetchfileerror',
-                       'api-error-fileexists-forbidden',
-                       'api-error-fileexists-shared-forbidden',
-                       'api-error-file-too-large',
-                       'api-error-filename-tooshort',
-                       'api-error-filetype-banned',
-                       'api-error-filetype-banned-type',
-                       'api-error-filetype-missing',
-                       'api-error-hookaborted',
-                       'api-error-http',
-                       'api-error-illegal-filename',
-                       'api-error-internal-error',
-                       'api-error-invalid-file-key',
-                       'api-error-missingparam',
-                       'api-error-missingresult',
-                       'api-error-mustbeloggedin',
-                       'api-error-mustbeposted',
-                       'api-error-noimageinfo',
-                       'api-error-nomodule',
-                       'api-error-ok-but-empty',
-                       'api-error-overwrite',
-                       'api-error-stashfailed',
-                       'api-error-publishfailed',
-                       'api-error-stasherror',
-                       'api-error-stashedfilenotfound',
-                       'api-error-stashpathinvalid',
-                       'api-error-stashfilestorage',
-                       'api-error-stashzerolength',
-                       'api-error-stashnotloggedin',
-                       'api-error-stashwrongowner',
-                       'api-error-stashnosuchfilekey',
-                       'api-error-timeout',
-                       'api-error-unclassified',
-                       'api-error-unknown-code',
-                       'api-error-unknown-error',
-                       'api-error-uploaddisabled',
-                       'api-error-verification-error',
-                       'api-error-was-deleted',
                        'fileexists',
                        'filepageexists',
+                       'file-exists-duplicate',
+                       'file-deleted-duplicate',
                        'filename-bad-prefix',
                        'filename-thumb-name',
+                       'filewasdeleted',
                        'badfilename',
                        'protectedpagetext',
                ],
@@ -1592,15 +1549,12 @@ return [
                        'dsb' => 'resources/src/mediawiki.language/languages/dsb.js',
                        'fi' => 'resources/src/mediawiki.language/languages/fi.js',
                        'ga' => 'resources/src/mediawiki.language/languages/ga.js',
-                       'he' => 'resources/src/mediawiki.language/languages/he.js',
                        'hsb' => 'resources/src/mediawiki.language/languages/hsb.js',
                        'hu' => 'resources/src/mediawiki.language/languages/hu.js',
                        'hy' => 'resources/src/mediawiki.language/languages/hy.js',
                        'la' => 'resources/src/mediawiki.language/languages/la.js',
                        'os' => 'resources/src/mediawiki.language/languages/os.js',
-                       'ru' => 'resources/src/mediawiki.language/languages/ru.js',
                        'sl' => 'resources/src/mediawiki.language/languages/sl.js',
-                       'uk' => 'resources/src/mediawiki.language/languages/uk.js',
                ],
                'dependencies' => [
                        'mediawiki.language.data',
@@ -1738,6 +1692,8 @@ return [
                        'mediawiki.api.watch',
                        'mediawiki.notify',
                        'mediawiki.util',
+                       'mediawiki.Title',
+                       'mediawiki.jqueryMsg',
                        'jquery.accessKeyLabel',
                        'mediawiki.RegExp',
                ],
@@ -1749,6 +1705,10 @@ return [
                        'tooltip-ca-watch',
                        'tooltip-ca-unwatch',
                        'watcherrortext',
+                       'addedwatchtext',
+                       'addedwatchtext-talk',
+                       'removedwatchtext',
+                       'removedwatchtext-talk',
                ],
        ],
        'mediawiki.page.rollback' => [
@@ -1773,6 +1733,78 @@ return [
 
        /* MediaWiki Special pages */
 
+       'mediawiki.rcfilters.filters' => [
+               'scripts' => [
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js',
+               ],
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less',
+               ],
+               'messages' => [
+                       'rcfilters-activefilters',
+                       'rcfilters-restore-default-filters',
+                       'rcfilters-clear-all-filters',
+                       'rcfilters-search-placeholder',
+                       'rcfilters-invalid-filter',
+                       'rcfilters-empty-filter',
+                       'rcfilters-filterlist-title',
+                       'rcfilters-filterlist-noresults',
+                       'rcfilters-filtergroup-registration',
+                       'rcfilters-filter-registered-label',
+                       'rcfilters-filter-registered-description',
+                       'rcfilters-filter-unregistered-label',
+                       'rcfilters-filter-unregistered-description',
+                       'rcfilters-filtergroup-authorship',
+                       'rcfilters-filter-editsbyself-label',
+                       'rcfilters-filter-editsbyself-description',
+                       'rcfilters-filter-editsbyother-label',
+                       'rcfilters-filter-editsbyother-description',
+                       'rcfilters-filtergroup-userExpLevel',
+                       'rcfilters-filter-userExpLevel-newcomer-label',
+                       'rcfilters-filter-userExpLevel-newcomer-description',
+                       'rcfilters-filter-userExpLevel-learner-label',
+                       'rcfilters-filter-userExpLevel-learner-description',
+                       'rcfilters-filter-userExpLevel-experienced-label',
+                       'rcfilters-filter-userExpLevel-experienced-description',
+                       'rcfilters-filtergroup-automated',
+                       'rcfilters-filter-bots-label',
+                       'rcfilters-filter-bots-description',
+                       'rcfilters-filter-humans-label',
+                       'rcfilters-filter-humans-description',
+                       'rcfilters-filtergroup-significance',
+                       'rcfilters-filter-minor-label',
+                       'rcfilters-filter-minor-description',
+                       'rcfilters-filter-major-label',
+                       'rcfilters-filter-major-description',
+                       '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-categorization-description',
+                       'rcfilters-filter-logactions-label',
+                       'rcfilters-filter-logactions-description',
+               ],
+               'dependencies' => [
+                       'oojs-ui',
+                       'mediawiki.Uri',
+                       'oojs-ui.styles.icons-moderation'
+               ],
+       ],
        'mediawiki.special' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'targets' => [ 'desktop', 'mobile' ],
@@ -1847,9 +1879,11 @@ return [
        ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.legend' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.legend.js' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js',
@@ -1857,6 +1891,7 @@ return [
                        'jquery.makeCollapsible',
                        'mediawiki.cookie',
                ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist.enhanced' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
@@ -1927,6 +1962,7 @@ return [
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.search' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
@@ -2027,6 +2063,11 @@ return [
        ],
        'mediawiki.special.watchlist' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.js',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'oojs-ui-core',
+                       'user.options',
+               ]
        ],
        'mediawiki.special.version' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.version.css',
index 7db7547..7b4e546 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Чаховіч Уладзіслаў",
                        "Artificial123",
-                       "Goshaproject"
+                       "Goshaproject",
+                       "Mechanizatar"
                ]
        },
        "ooui-outline-control-move-down": "Перамясціць элемент ўніз",
@@ -18,6 +19,7 @@
        "ooui-dialog-process-dismiss": "Прапусціць",
        "ooui-dialog-process-retry": "Паспрабаваць яшчэ раз",
        "ooui-dialog-process-continue": "Працягнуць",
+       "ooui-selectfile-button-select": "Выбраць файл",
        "ooui-selectfile-not-supported": "Выбраны файл не падтрымліваецца",
        "ooui-selectfile-placeholder": "Файл не выбраны"
 }
diff --git a/resources/lib/oojs-ui/i18n/hif-latn.json b/resources/lib/oojs-ui/i18n/hif-latn.json
new file mode 100644 (file)
index 0000000..9e903ca
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Thakurji"
+               ]
+       },
+       "ooui-outline-control-move-down": "Item ke niche karo",
+       "ooui-outline-control-move-up": "Item ke uppar karo",
+       "ooui-outline-control-remove": "Item ke hatao",
+       "ooui-toolbar-more": "Aur",
+       "ooui-toolgroup-expand": "Aur",
+       "ooui-toolgroup-collapse": "Kamtii",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancel karo",
+       "ooui-dialog-process-error": "Koi chij wrong hoe gais",
+       "ooui-dialog-process-dismiss": "Dismiss karo",
+       "ooui-dialog-process-retry": "Fir se try karo",
+       "ooui-dialog-process-continue": "Continue",
+       "ooui-selectfile-button-select": "Ek file ke select karo",
+       "ooui-selectfile-not-supported": "File selection ke support nai karaa jaawe hai",
+       "ooui-selectfile-placeholder": "Koi file ke nai select karaa gais hai",
+       "ooui-selectfile-dragdrop-placeholder": "Hian pe file ke girao"
+}
index dbe9f86..9b88695 100644 (file)
@@ -11,7 +11,8 @@
                        "Sayginer",
                        "Meelo",
                        "McAang",
-                       "Uğurkent"
+                       "Uğurkent",
+                       "1917 Ekim Devrimi"
                ]
        },
        "ooui-outline-control-move-down": "Ögeyi aşağı taşı",
@@ -28,5 +29,6 @@
        "ooui-dialog-process-continue": "Devam et",
        "ooui-selectfile-button-select": "Dosya seç",
        "ooui-selectfile-not-supported": "Dosya seçimi desteklenmiyor",
-       "ooui-selectfile-placeholder": "Herhangi bir dosya seçilmedi"
+       "ooui-selectfile-placeholder": "Herhangi bir dosya seçilmedi",
+       "ooui-selectfile-dragdrop-placeholder": "Dosyayı buraya aç"
 }
index 911b618..335e509 100644 (file)
@@ -18,5 +18,7 @@
        "ooui-dialog-process-retry": "Кабатлау",
        "ooui-dialog-process-continue": "Дәвам итү",
        "ooui-selectfile-button-select": "Файлны сайлагыз",
-       "ooui-selectfile-placeholder": "Файл сайланмаган"
+       "ooui-selectfile-not-supported": "Файл сайлау хупланмый",
+       "ooui-selectfile-placeholder": "Файл сайланмаган",
+       "ooui-selectfile-dragdrop-placeholder": "Файлны монда куегыз"
 }
index a96ae13..b93d59e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -41,3 +41,5 @@ OO.ui.ApexTheme.prototype.getDialogTransitionDuration = function () {
 OO.ui.theme = new OO.ui.ApexTheme();
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-apex.js.map
\ No newline at end of file
index e5e6252..2bee712 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   opacity: 0.5;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-}
-.oo-ui-floatableElement-hidden {
-  display: none;
+  min-height: 3.125em;
 }
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
 .oo-ui-fieldLayout:after {
   clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: block;
   float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   text-align: right;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
   display: table;
+  width: 100%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: table-cell;
   vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  width: 1px;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
   padding: 0.5em 0.75em;
   line-height: 1.5;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
+  margin-top: -0.3em;
+}
 .oo-ui-fieldLayout:last-child {
   margin-bottom: 0;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-right: 5%;
-  width: 35%;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help {
+  margin-right: 0;
+  margin-left: -1.875em;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 60%;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  margin-right: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  display: block;
+  padding-top: 0.5em;
+}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
   margin-bottom: 1.25em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.5em;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+  max-width: 50em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding: 0.25em 0 0.25em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  max-width: 50em;
   padding: 0.5em 0;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
-.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
   color: #ccc;
 }
 .oo-ui-fieldLayout-messages {
   line-height: 1.5em;
   vertical-align: middle;
 }
-.oo-ui-actionFieldLayout {
-  max-width: 50em;
-}
 .oo-ui-actionFieldLayout-input,
 .oo-ui-actionFieldLayout-button {
   display: table-cell;
   width: 1%;
   white-space: nowrap;
 }
+.oo-ui-actionFieldLayout.oo-ui-fieldLayout-align-top {
+  max-width: 50em;
+}
 .oo-ui-fieldsetLayout {
   position: relative;
   min-width: 0;
 body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: table-cell;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   display: block;
   position: absolute;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header {
   color: inherit;
   display: inline-table;
   box-sizing: border-box;
-  max-width: 100%;
   padding: 0;
   white-space: normal;
   float: left;
+  width: 100%;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label:empty {
+  display: none;
 }
 .oo-ui-fieldsetLayout-group {
   clear: both;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
   float: right;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
   padding: 0.5em 0.75em;
-  line-height: 1.5;
+  line-height: 1.4;
+}
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
   font-size: 1.1em;
   margin-bottom: 0.5em;
   padding: 0.25em 0;
   font-weight: bold;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8em;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   left: 0;
   top: 0.25em;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -449,6 +475,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-panelLayout-scrollable {
   overflow-y: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -462,7 +490,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-panelLayout-framed {
   border-radius: 0.5em;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
   margin: 1em 0;
@@ -596,7 +623,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0.3em;
   margin-right: 0.5em;
 }
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-active .oo-ui-buttonElement-button {
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
 }
 .oo-ui-buttonGroupWidget:last-child {
@@ -638,8 +665,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values
+                       /* @noflip */
   left: 0;
   background-repeat: no-repeat;
 }
@@ -667,9 +694,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0.25em;
   box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+.oo-ui-popupWidget-anchored {
   margin-top: 6px;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  top: -6px;
+}
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
   content: '';
@@ -713,7 +743,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
   cursor: auto;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
@@ -832,10 +861,14 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
   display: block;
   position: absolute;
   top: 0;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -843,21 +876,24 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -865,20 +901,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: block;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
-  position: absolute;
-  top: 0;
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
@@ -1177,9 +1203,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-progressBarWidget-bar {
   height: 1em;
   border-right: 1px solid #ccc;
-  -webkit-transition: width 250ms ease, margin-left 250ms ease;
-     -moz-transition: width 250ms ease, margin-left 250ms ease;
-          transition: width 250ms ease, margin-left 250ms ease;
+  -webkit-transition: width 250ms ease;
+     -moz-transition: width 250ms ease;
+          transition: width 250ms ease;
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #eaf4fa), color-stop(100%, #b0d9ee));
   background-image: -webkit-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
@@ -1192,7 +1218,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
-  margin-left: -10%;
+  -webkit-transform: translate(-25%);
+     -moz-transform: translate(-25%);
+      -ms-transform: translate(-25%);
+          transform: translate(-25%);
   border-left: 1px solid #a6cee1;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
@@ -1200,25 +1229,43 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
index 6a31fe8..632c085 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:active {
   color: #000;
+  box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
   color: #36c;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
   color: #447ff5;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   color: #2a4b8d;
   box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #36c;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
   color: #447ff5;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   color: #2a4b8d;
   box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
   color: #d33;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
   color: #ff4242;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   color: #b32424;
   box-shadow: none;
 }
   box-shadow: inset 0 0 0 1px #36c;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
   background-color: #c8ccd1;
   color: #000;
   border-color: #72777d;
+  box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
   background-color: #2a4b8d;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #859dcc;
+  border-color: #447ff5;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #859dcc;
+  border-color: #447ff5;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
-  border-color: #b77c79;
+  border-color: #ff4242;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-}
-.oo-ui-floatableElement-hidden {
-  display: none;
+  min-height: 3.125em;
 }
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
 .oo-ui-fieldLayout:after {
   clear: both;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: block;
   float: left;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   text-align: right;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
   display: table;
+  width: 100%;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   display: table-cell;
   vertical-align: middle;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  display: inline-block;
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  width: 1px;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
   padding: 0.5em 0.75em;
   line-height: 1.5;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
+  margin-top: -0.3em;
+}
 .oo-ui-fieldLayout.oo-ui-labelElement,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
   margin-top: 1.171875em;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline:first-child {
   margin-top: 0;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   padding-bottom: 0.3125em;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-  padding: 0.3125em 0.46875em;
+.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  line-height: 1.4;
 }
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+  max-width: 50em;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
   width: 35%;
   margin-right: 5%;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
+  display: block;
   padding-top: 0.3125em;
 }
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help,
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-help {
+  margin-right: 0;
+  margin-left: -1.875em;
+}
 .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
 .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 60%;
 }
-.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+  padding: 0.3125em 0.46875em;
+  padding-right: 0;
+}
+.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label {
   color: #72777d;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
 .oo-ui-fieldLayout-messages .oo-ui-labelWidget {
   display: table-cell;
   padding: 0.1em 0 0.1em 0.3125em;
-  line-height: 1.5;
+  line-height: 1.4;
   vertical-align: middle;
 }
-.oo-ui-actionFieldLayout {
-  max-width: 50em;
-}
 .oo-ui-actionFieldLayout-input,
 .oo-ui-actionFieldLayout-button {
   display: table-cell;
   width: 1%;
   white-space: nowrap;
 }
+.oo-ui-actionFieldLayout.oo-ui-fieldLayout-align-top {
+  max-width: 50em;
+}
 .oo-ui-fieldsetLayout {
   position: relative;
   min-width: 0;
 body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: table-cell;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   display: block;
   position: absolute;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header {
   color: inherit;
   display: inline-table;
   box-sizing: border-box;
-  max-width: 100%;
   padding: 0;
   white-space: normal;
   float: left;
+  width: 100%;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label:empty {
+  display: none;
 }
 .oo-ui-fieldsetLayout-group {
   clear: both;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help {
   float: right;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
   padding: 0.5em 0.75em;
-  line-height: 1.5;
+  line-height: 1.4;
+}
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
+  max-width: 50em;
 }
 .oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
 .oo-ui-fieldsetLayout + .oo-ui-formLayout {
   margin-top: 2em;
 }
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
+  display: inline-block;
   margin-bottom: 0.56818em;
   font-size: 1.1em;
   font-weight: bold;
+  line-height: 1.4;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-labelElement-label {
   padding-left: 2em;
   line-height: 1.8;
 }
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-fieldsetLayout-header > .oo-ui-iconElement-icon {
   top: 0;
   left: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget {
   margin-right: 0;
 }
-.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header > .oo-ui-popupButtonWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
@@ -580,6 +616,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-panelLayout-scrollable {
   overflow-y: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -591,10 +629,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-panelLayout-padded {
   padding: 1.25em;
 }
+.oo-ui-panelLayout-padded.oo-ui-formLayout > .oo-ui-fieldsetLayout .oo-ui-labelElement-label,
+.oo-ui-panelLayout-padded.oo-ui-formLayout > .oo-ui-fieldsetLayout .oo-ui-iconElement-icon {
+  margin-top: -0.25em;
+}
 .oo-ui-panelLayout-framed {
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
   margin: 1em 0;
@@ -636,7 +677,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
 }
 .oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5;
+  line-height: 1.6;
 }
 .oo-ui-optionWidget-selected .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   opacity: 1;
@@ -727,7 +768,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   z-index: 0;
   position: relative;
 }
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-active .oo-ui-buttonElement-button {
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
 }
 .oo-ui-buttonGroupWidget:last-child {
@@ -782,8 +823,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  top: 0;
-  /* @noflip */
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values
+                       /* @noflip */
   left: 0;
   background-repeat: no-repeat;
 }
@@ -809,11 +850,14 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #fff;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+.oo-ui-popupWidget-anchored {
   margin-top: 9px;
 }
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  top: -9px;
+}
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
   content: '';
@@ -857,7 +901,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
   cursor: auto;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
@@ -882,7 +925,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-checkboxInputWidget {
   position: relative;
-  line-height: 1.6em;
+  line-height: 1.5625em;
   white-space: nowrap;
 }
 .oo-ui-checkboxInputWidget * {
@@ -892,8 +935,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget [type='checkbox'] {
   position: relative;
   max-width: none;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   margin: 0;
   opacity: 0;
   z-index: 1;
@@ -909,8 +952,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
           box-sizing: border-box;
   position: absolute;
   left: 0;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   border: 1px solid #72777d;
   border-radius: 2px;
 }
@@ -974,7 +1017,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
   padding: 0.25em 0;
@@ -1032,7 +1075,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-radioInputWidget {
   position: relative;
-  line-height: 1.6em;
+  line-height: 1.5625em;
   white-space: nowrap;
 }
 .oo-ui-radioInputWidget * {
@@ -1042,8 +1085,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-radioInputWidget [type='radio'] {
   position: relative;
   max-width: none;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   margin: 0;
   opacity: 0;
   z-index: 1;
@@ -1055,8 +1098,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  width: 1.6em;
-  height: 1.6em;
+  width: 1.5625em;
+  height: 1.5625em;
   border: 1px solid #72777d;
   border-radius: 100%;
 }
@@ -1071,11 +1114,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 100%;
 }
 .oo-ui-radioInputWidget [type='radio']:checked + span {
-  border-width: 0.4em;
+  border-width: 0.390625em;
 }
 .oo-ui-radioInputWidget [type='radio']:checked:hover + span,
 .oo-ui-radioInputWidget [type='radio']:checked:focus:hover + span {
-  border-width: 0.4em;
+  border-width: 0.390625em;
 }
 .oo-ui-radioInputWidget [type='radio']:disabled + span {
   background-color: #c8ccd1;
@@ -1130,7 +1173,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   left: -3px;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
   padding: 0.25em 0;
@@ -1183,10 +1226,14 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
   display: block;
   position: absolute;
   top: 0;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1194,21 +1241,24 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1216,44 +1266,34 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: block;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
-  position: absolute;
-  top: 0;
+.oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
+  pointer-events: none;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
-  margin: 0;
   font-size: inherit;
   font-family: inherit;
   background-color: #fff;
   color: #000;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding: 0.625em 0.546875em 0.546875em;
 }
 .oo-ui-textInputWidget input {
+  padding: 0.625em 0.546875em 0.546875em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget textarea {
-  line-height: 1.275;
+  padding: 0.46875em 0.546875em 0.546875em;
+  line-height: 1.4;
 }
 .oo-ui-textInputWidget .oo-ui-pendingElement-pending {
   background-color: transparent;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
-  box-shadow: inset 0 0 0 0.1em #fff;
+  box-shadow: inset 0 0 0 1px #fff;
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
      -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
@@ -1300,62 +1340,61 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
-  border-color: #f00;
+  border-color: #d33;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:hover {
-  border-color: #f00;
+  border-color: #d33;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:focus {
-  border-color: #f00;
-  box-shadow: inset 0 0 0 0.1em #f00;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  background-color: #eaecf0;
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #c8ccd1;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.51;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-left: 2.875em;
+  padding-left: 2.65625em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0;
-  height: 100%;
-  max-height: 2.375em;
-  margin-left: 0.5em;
-  background-position: right center;
+  max-height: 2.5em;
+  left: 0.46875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
   padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 100%;
-  max-height: 2.375em;
-  margin: 0 0.775em;
+  max-height: 2.5em;
+  right: 0.625em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
-  padding: 0.4em;
-  line-height: 1.5;
+  right: 0.625em;
+  border: 1px solid transparent;
+  border-width: 1px 0;
+  padding: 0.625em 0 0.546875em;
+  line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-  margin-right: 2.0875em;
+  right: 2.1875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-  margin-left: 2.475em;
+  left: 2.65625em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  background-color: #eaecf0;
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #c8ccd1;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.51;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
 }
 .oo-ui-menuSelectWidget {
   position: absolute;
@@ -1365,7 +1404,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: -1px;
   border: 1px solid #a2a9b1;
   border-radius: 0 0 2px 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
 .oo-ui-menuSelectWidget input {
   position: absolute;
@@ -1600,9 +1639,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   text-overflow: ellipsis;
   overflow: hidden;
 }
-.oo-ui-multioptionWidget .oo-ui-labelElement-label {
-  line-height: 1.5;
-}
 .oo-ui-multioptionWidget.oo-ui-widget-disabled {
   color: #72777d;
 }
@@ -1629,44 +1665,67 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
-  background-color: #36c;
   height: 1em;
-  -webkit-transition: width 200ms, margin-left 200ms;
-     -moz-transition: width 200ms, margin-left 200ms;
-          transition: width 200ms, margin-left 200ms;
+  -webkit-transition: width 200ms;
+     -moz-transition: width 200ms;
+          transition: width 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
   -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
      -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
-  margin-left: -10%;
+  -webkit-transform: translate(-25%);
+     -moz-transform: translate(-25%);
+      -ms-transform: translate(-25%);
+          transform: translate(-25%);
   border-left-width: 1px;
 }
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-  opacity: 0.6;
+.oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar {
+  background-color: #36c;
+}
+.oo-ui-progressBarWidget.oo-ui-widget-disabled .oo-ui-progressBarWidget-bar {
+  background-color: #c8ccd1;
 }
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
-    margin-left: -40%;
+    -webkit-transform: translate(-100%);
+       -moz-transform: translate(-100%);
+        -ms-transform: translate(-100%);
+            transform: translate(-100%);
   }
   to {
-    margin-left: 100%;
+    -webkit-transform: translate(350%);
+       -moz-transform: translate(350%);
+        -ms-transform: translate(350%);
+            transform: translate(350%);
   }
 }
index c53470e..5dc78ab 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -57,16 +57,17 @@ OO.ui.MouseButtons = {
 
 /**
  * @property {number}
+ * @private
  */
 OO.ui.elementId = 0;
 
 /**
  * Generate a unique ID for element
  *
- * @return {string} [id]
+ * @return {string} ID
  */
 OO.ui.generateElementId = function () {
-       OO.ui.elementId += 1;
+       OO.ui.elementId++;
        return 'oojsui-' + OO.ui.elementId;
 };
 
@@ -386,15 +387,49 @@ OO.ui.infuse = function ( idOrNode ) {
        /**
         * Get a localized message.
         *
-        * In environments that provide a localization system, this function should be overridden to
-        * return the message translated in the user's language. The default implementation always returns
-        * English messages.
-        *
         * After the message key, message parameters may optionally be passed. In the default implementation,
         * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
         * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
         * they support unnamed, ordered message parameters.
         *
+        * In environments that provide a localization system, this function should be overridden to
+        * return the message translated in the user's language. The default implementation always returns
+        * English messages. An example of doing this with [jQuery.i18n](https://github.com/wikimedia/jquery.i18n)
+        * follows.
+        *
+        *     @example
+        *     var i, iLen, button,
+        *         messagePath = 'oojs-ui/dist/i18n/',
+        *         languages = [ $.i18n().locale, 'ur', 'en' ],
+        *         languageMap = {};
+        *
+        *     for ( i = 0, iLen = languages.length; i < iLen; i++ ) {
+        *         languageMap[ languages[ i ] ] = messagePath + languages[ i ].toLowerCase() + '.json';
+        *     }
+        *
+        *     $.i18n().load( languageMap ).done( function() {
+        *         // Replace the built-in `msg` only once we've loaded the internationalization.
+        *         // OOjs UI uses `OO.ui.deferMsg` for all initially-loaded messages. So long as
+        *         // you put off creating any widgets until this promise is complete, no English
+        *         // will be displayed.
+        *         OO.ui.msg = $.i18n;
+        *
+        *         // A button displaying "OK" in the default locale
+        *         button = new OO.ui.ButtonWidget( {
+        *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),
+        *             icon: 'check'
+        *         } );
+        *         $( 'body' ).append( button.$element );
+        *
+        *         // A button displaying "OK" in Urdu
+        *         $.i18n().locale = 'ur';
+        *         button = new OO.ui.ButtonWidget( {
+        *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),
+        *             icon: 'check'
+        *         } );
+        *         $( 'body' ).append( button.$element );
+        *     } );
+        *
         * @param {string} key Message key
         * @param {...Mixed} [params] Message parameters
         * @return {string} Translated message with parameters substituted
@@ -486,6 +521,22 @@ OO.ui.isSafeUrl = function ( url ) {
        return false;
 };
 
+/**
+ * Check if the user has a 'mobile' device.
+ *
+ * For our purposes this means the user is primarily using an
+ * on-screen keyboard, touch input instead of a mouse and may
+ * have a physically small display.
+ *
+ * It is left up to implementors to decide how to compute this
+ * so the default implementation always returns false.
+ *
+ * @return {boolean} Use is on a mobile device
+ */
+OO.ui.isMobile = function () {
+       return false;
+};
+
 /*!
  * Mixin namespace.
  */
@@ -538,7 +589,6 @@ OO.ui.Element = function OoUiElement( config ) {
        this.$element = config.$element ||
                $( document.createElement( this.getTagName() ) );
        this.elementGroup = null;
-       this.debouncedUpdateThemeClassesHandler = OO.ui.debounce( this.debouncedUpdateThemeClasses );
 
        // Initialization
        if ( Array.isArray( config.classes ) ) {
@@ -776,7 +826,7 @@ OO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {
 };
 
 /**
- * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
+ * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of an HTML DOM node
  * (and its children) that represent an Element of the same class and the given configuration,
  * generated by the PHP implementation.
  *
@@ -1113,6 +1163,9 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
 
        animations = {};
        callback = typeof config.complete === 'function' && config.complete;
+       if ( callback ) {
+               OO.ui.warnDeprecation( 'Element#scrollIntoView: The `complete` callback config option is deprecated. Use the return promise instead.' );
+       }
        container = this.getClosestScrollableContainer( el, config.direction );
        $container = $( container );
        elementDimensions = this.getDimensions( el );
@@ -1281,16 +1334,7 @@ OO.ui.Element.prototype.supports = function ( methods ) {
  *   guaranteeing that theme updates do not occur within an element's constructor
  */
 OO.ui.Element.prototype.updateThemeClasses = function () {
-       this.debouncedUpdateThemeClassesHandler();
-};
-
-/**
- * @private
- * @localdoc This method is called directly from the QUnit tests instead of #updateThemeClasses, to
- *   make them synchronous.
- */
-OO.ui.Element.prototype.debouncedUpdateThemeClasses = function () {
-       OO.ui.theme.updateElementClasses( this );
+       OO.ui.theme.queueUpdateElementClasses( this );
 };
 
 /**
@@ -1368,6 +1412,13 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
  * @return {jQuery.Promise} Promise which resolves when the scroll is complete
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
+       if (
+               !this.isElementAttached() ||
+               !this.isVisible() ||
+               ( this.getElementGroup() && !this.getElementGroup().isVisible() )
+       ) {
+               return $.Deferred().resolve();
+       }
        return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
@@ -1489,7 +1540,7 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 /* Static Properties */
 
 /**
- * Whether this widget will behave reasonably when wrapped in a HTML `<label>`. If this is true,
+ * Whether this widget will behave reasonably when wrapped in an HTML `<label>`. If this is true,
  * wrappers such as OO.ui.FieldLayout may use a `<label>` instead of implementing own label click
  * handling.
  *
@@ -1572,7 +1623,10 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  *
  * @constructor
  */
-OO.ui.Theme = function OoUiTheme() {};
+OO.ui.Theme = function OoUiTheme() {
+       this.elementClassesQueue = [];
+       this.debouncedUpdateQueuedElementClasses = OO.ui.debounce( this.updateQueuedElementClasses );
+};
 
 /* Setup */
 
@@ -1616,6 +1670,36 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
                .addClass( classes.on.join( ' ' ) );
 };
 
+/**
+ * @private
+ */
+OO.ui.Theme.prototype.updateQueuedElementClasses = function () {
+       var i;
+       for ( i = 0; i < this.elementClassesQueue.length; i++ ) {
+               this.updateElementClasses( this.elementClassesQueue[ i ] );
+       }
+       // Clear the queue
+       this.elementClassesQueue = [];
+};
+
+/**
+ * Queue #updateElementClasses to be called for this element.
+ *
+ * @localdoc QUnit tests override this method to directly call #queueUpdateElementClasses,
+ *   to make them synchronous.
+ *
+ * @param {OO.ui.Element} element Element for which to update classes
+ */
+OO.ui.Theme.prototype.queueUpdateElementClasses = function ( element ) {
+       // Keep items in the queue unique. Use lastIndexOf to start checking from the end because that's
+       // the most common case (this method is often called repeatedly for the same element).
+       if ( this.elementClassesQueue.lastIndexOf( element ) !== -1 ) {
+               return;
+       }
+       this.elementClassesQueue.push( element );
+       this.debouncedUpdateQueuedElementClasses();
+};
+
 /**
  * Get the transition duration in milliseconds for dialogs opening/closing
  *
@@ -2845,6 +2929,7 @@ OO.ui.mixin.LabelElement.prototype.getLabel = function () {
  * @deprecated since 0.16.0
  */
 OO.ui.mixin.LabelElement.prototype.fitLabel = function () {
+       OO.ui.warnDeprecation( 'LabelElement#fitLabel: This is a deprecated no-op.' );
        return this;
 };
 
@@ -4006,7 +4091,14 @@ OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
                        // Initial clip after visible
                        this.clip();
                } else {
-                       this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
+                       this.$clippable.css( {
+                               width: '',
+                               height: '',
+                               maxWidth: '',
+                               maxHeight: '',
+                               overflowX: '',
+                               overflowY: ''
+                       } );
                        OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
 
                        this.$clippableScrollableContainer = null;
@@ -4103,9 +4195,13 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        extraHeight = $container.outerHeight() - this.$clippable.outerHeight();
        extraWidth = $container.outerWidth() - this.$clippable.outerWidth();
        ccOffset = $container.offset();
-       $scrollableContainer = this.$clippableScrollableContainer.is( 'html, body' ) ?
-               this.$clippableWindow : this.$clippableScrollableContainer;
-       scOffset = $scrollableContainer.offset() || { top: 0, left: 0 };
+       if ( this.$clippableScrollableContainer.is( 'html, body' ) ) {
+               $scrollableContainer = this.$clippableWindow;
+               scOffset = { top: 0, left: 0 };
+       } else {
+               $scrollableContainer = this.$clippableScrollableContainer;
+               scOffset = $scrollableContainer.offset();
+       }
        scHeight = $scrollableContainer.innerHeight() - buffer;
        scWidth = $scrollableContainer.innerWidth() - buffer;
        ccWidth = $container.outerWidth() + buffer;
@@ -4552,13 +4648,19 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
 /**
  * Set popup alignment
  *
- * @param {string} align Alignment of the popup, `center`, `force-left`, `force-right`,
+ * @param {string} [align=center] Alignment of the popup, `center`, `force-left`, `force-right`,
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.setAlignment = function ( align ) {
-       // Validate alignment and transform deprecated values
-       if ( [ 'left', 'right', 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
-               this.align = { left: 'force-right', right: 'force-left' }[ align ] || align;
+       // Transform values deprecated since v0.11.0
+       if ( align === 'left' || align === 'right' ) {
+               OO.ui.warnDeprecation( 'PopupWidget#setAlignment parameter value `' + align + '` is deprecated. Use `force-right` or `force-left` instead.' );
+               align = { left: 'force-right', right: 'force-left' }[ align ];
+       }
+
+       // Validate alignment
+       if ( [ 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
+               this.align = align;
        } else {
                this.align = 'center';
        }
@@ -6254,7 +6356,7 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
  * OO.ui.MenuOptionWidget. The DropdownWidget takes care of opening and displaying the menu so that
  * users can interact with it.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.DropdownInputWidget instead.
  *
  *     @example
@@ -6525,7 +6627,7 @@ OO.ui.RadioOptionWidget.prototype.setDisabled = function ( disabled ) {
  * an interface for adding, removing and selecting options.
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.RadioSelectInputWidget instead.
  *
  *     @example
@@ -6886,7 +6988,7 @@ OO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {
  * CheckboxMultiselectWidget provides an interface for adding, removing and selecting options.
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  *
- * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use
  * OO.ui.CheckboxMultiselectInputWidget instead.
  *
  *     @example
@@ -7197,10 +7299,10 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
        }
 
        if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
-               this.$floatable.addClass( 'oo-ui-floatableElement-hidden' );
+               this.$floatable.addClass( 'oo-ui-element-hidden' );
                return;
        } else {
-               this.$floatable.removeClass( 'oo-ui-floatableElement-hidden' );
+               this.$floatable.removeClass( 'oo-ui-element-hidden' );
        }
 
        if ( !this.needsCustomPosition ) {
@@ -7277,9 +7379,6 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
 OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
 OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
 
-// For backwards compatibility
-OO.ui.TextInputMenuSelectWidget = OO.ui.FloatingMenuSelectWidget;
-
 /* Methods */
 
 /**
@@ -7306,6 +7405,23 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
        return this;
 };
 
+/*
+ * The old name for the FloatingMenuSelectWidget widget, provided for backwards-compatibility.
+ *
+ * @class
+ * @extends OO.ui.FloatingMenuSelectWidget
+ *
+ * @constructor
+ * @deprecated since v0.12.5.
+ */
+OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget() {
+       OO.ui.warnDeprecation( 'TextInputMenuSelectWidget is deprecated. Use the FloatingMenuSelectWidget instead.' );
+       // Parent constructor
+       OO.ui.TextInputMenuSelectWidget.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.FloatingMenuSelectWidget );
+
 /**
  * Progress bars visually display the status of an operation, such as a download,
  * and can be either determinate or indeterminate:
@@ -7808,7 +7924,7 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
  * in {@link OO.ui.FieldLayout field layouts} that use the {@link OO.ui.FieldLayout#align inline}
  * alignment. For more information, please see the [OOjs UI documentation on MediaWiki][1].
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // An example of selected, unselected, and disabled checkbox inputs
@@ -7939,7 +8055,7 @@ OO.ui.CheckboxInputWidget.prototype.restorePreInfuseState = function ( state ) {
 
 /**
  * DropdownInputWidget is a {@link OO.ui.DropdownWidget DropdownWidget} intended to be used
- * within a HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
+ * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
  * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
  * more information about input widgets.
  *
@@ -8101,7 +8217,7 @@ OO.ui.DropdownInputWidget.prototype.blur = function () {
  * with {@link OO.ui.RadioOptionWidget radio options} instead of this class. For more information,
  * please see the [OOjs UI documentation on MediaWiki][1].
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // An example of selected, unselected, and disabled radio inputs
@@ -8216,7 +8332,7 @@ OO.ui.RadioInputWidget.prototype.restorePreInfuseState = function ( state ) {
 
 /**
  * RadioSelectInputWidget is a {@link OO.ui.RadioSelectWidget RadioSelectWidget} intended to be used
- * within a HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
+ * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
  * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
  * more information about input widgets.
  *
@@ -8554,7 +8670,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  * which modifies incoming values rather than validating them.
  * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  *     @example
  *     // Example of a text input widget
@@ -8657,9 +8773,6 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                blur: this.onBlur.bind( this ),
                focus: this.onFocus.bind( this )
        } );
-       this.$input.one( {
-               focus: this.onElementAttach.bind( this )
-       } );
        this.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );
        this.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );
        this.on( 'labelChange', this.updatePosition.bind( this ) );
@@ -8704,6 +8817,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                this.$input.attr( 'rows', config.rows );
        }
        if ( this.label || config.autosize ) {
+               this.isWaitingToBeAttached = true;
                this.installParentChangeDetector();
        }
 };
@@ -8814,6 +8928,11 @@ OO.ui.TextInputWidget.prototype.onBlur = function () {
  * @param {jQuery.Event} e Focus event
  */
 OO.ui.TextInputWidget.prototype.onFocus = function () {
+       if ( this.isWaitingToBeAttached ) {
+               // If we've received focus, then we must be attached to the document, and if
+               // isWaitingToBeAttached is still true, that means the handler never fired. Fire it now.
+               this.onElementAttach();
+       }
        this.setValidityFlag( true );
 };
 
@@ -8824,6 +8943,7 @@ OO.ui.TextInputWidget.prototype.onFocus = function () {
  * @param {jQuery.Event} e Element attach event
  */
 OO.ui.TextInputWidget.prototype.onElementAttach = function () {
+       this.isWaitingToBeAttached = false;
        // Any previously calculated size is now probably invalid if we reattached elsewhere
        this.valCache = null;
        this.adjustSize();
@@ -8936,7 +9056,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
        if ( MutationObserver ) {
                // The new way. If only it wasn't so ugly.
 
-               if ( this.$element.closest( 'html' ).length ) {
+               if ( this.isElementAttached() ) {
                        // Widget is attached already, do nothing. This breaks the functionality of this function when
                        // the widget is detached and reattached. Alas, doing this correctly with MutationObserver
                        // would require observation of the whole document, which would hurt performance of other,
@@ -8971,7 +9091,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
 
                onRemove = function () {
                        // If the node was attached somewhere else, report it
-                       if ( widget.$element.closest( 'html' ).length ) {
+                       if ( widget.isElementAttached() ) {
                                widget.onElementAttach();
                        }
                        mutationObserver.disconnect();
@@ -9000,6 +9120,11 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
        var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,
                idealHeight, newHeight, scrollWidth, property;
 
+       if ( this.isWaitingToBeAttached ) {
+               // #onElementAttach will be called soon, which calls this method
+               return this;
+       }
+
        if ( this.multiline && this.$input.val() !== this.valCache ) {
                if ( this.autosize ) {
                        this.$clone
@@ -9386,6 +9511,12 @@ OO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {
  */
 OO.ui.TextInputWidget.prototype.positionLabel = function () {
        var after, rtl, property;
+
+       if ( this.isWaitingToBeAttached ) {
+               // #onElementAttach will be called soon, which calls this method
+               return this;
+       }
+
        // Clear old values
        this.$input
                // Clear old values if present
@@ -9523,7 +9654,7 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  * - by choosing a value from the menu. The value of the chosen option will then appear in the text
  *   input field.
  *
- * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.
  *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
  *
@@ -9578,6 +9709,9 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
                autocomplete: false
        }, config );
 
+       // ComboBoxInputWidget shouldn't support multiline
+       config.multiline = false;
+
        // Parent constructor
        OO.ui.ComboBoxInputWidget.parent.call( this, config );
 
@@ -9827,6 +9961,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.notices = [];
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
+       this.$header = $( '<div>' );
        this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
        this.align = null;
        if ( config.help ) {
@@ -9860,8 +9995,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .toggleClass( 'oo-ui-fieldLayout-disabled', this.fieldWidget.isDisabled() )
-               .append( this.$help, this.$body );
+               .append( this.$body );
        this.$body.addClass( 'oo-ui-fieldLayout-body' );
+       this.$header.addClass( 'oo-ui-fieldLayout-header' );
        this.$messages.addClass( 'oo-ui-fieldLayout-messages' );
        this.$field
                .addClass( 'oo-ui-fieldLayout-field' )
@@ -9947,10 +10083,15 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                        value = 'left';
                }
                // Reorder elements
-               if ( value === 'inline' ) {
-                       this.$body.append( this.$field, this.$label );
+               if ( value === 'top' ) {
+                       this.$header.append( this.$label, this.$help );
+                       this.$body.append( this.$header, this.$field );
+               } else if ( value === 'inline' ) {
+                       this.$header.append( this.$label, this.$help );
+                       this.$body.append( this.$field, this.$header );
                } else {
-                       this.$body.append( this.$label, this.$field );
+                       this.$header.append( this.$label );
+                       this.$body.append( this.$header, this.$help, this.$field );
                }
                // Set classes. The following classes can be used here:
                // * oo-ui-fieldLayout-align-left
@@ -10155,6 +10296,8 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: $( '<div>' ) } ) );
        OO.ui.mixin.GroupElement.call( this, config );
 
+       // Properties
+       this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
                        classes: [ 'oo-ui-fieldsetLayout-help' ],
@@ -10177,10 +10320,13 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        }
 
        // Initialization
+       this.$header
+               .addClass( 'oo-ui-fieldsetLayout-header' )
+               .append( this.$icon, this.$label, this.$help );
        this.$group.addClass( 'oo-ui-fieldsetLayout-group' );
        this.$element
                .addClass( 'oo-ui-fieldsetLayout' )
-               .prepend( this.$label, this.$help, this.$icon, this.$group );
+               .prepend( this.$header, this.$group );
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
@@ -10440,3 +10586,5 @@ OO.inheritClass( OO.ui.HorizontalLayout, OO.ui.Layout );
 OO.mixinClass( OO.ui.HorizontalLayout, OO.ui.mixin.GroupElement );
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-core.js.map
\ No newline at end of file
index 962db9a..32daabd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -82,3 +82,5 @@ OO.ui.MediaWikiTheme.prototype.getDialogTransitionDuration = function () {
 OO.ui.theme = new OO.ui.MediaWikiTheme();
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-mediawiki.js.map
\ No newline at end of file
index 4b59876..d781e68 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   color: #000;
 }
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
   display: inline-block;
   position: relative;
index c3b0c98..9860240 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
   margin-left: 0;
 }
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
   display: inline-block;
   position: relative;
   margin: 0 -1px;
   border: 1px solid #c8ccd1;
   background-color: #fff;
-  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
   min-width: 16em;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   pointer-events: none;
 }
 .oo-ui-toolbar-bar {
-  border-bottom: 1px solid #c8ccd1;
   background-color: #fff;
-  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
-  font-weight: 500;
   color: #222;
+  border-bottom: 1px solid #c8ccd1;
+  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+  font-weight: 500;
 }
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
   border-bottom: 0;
index f57e2db..0b8a7f6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -2329,3 +2329,5 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
 };
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-toolbars.js.map
\ No newline at end of file
index 884e48e..ec581c1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
           transform: translateZ(0);
   height: 2em;
   width: 4em;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
-  -webkit-transform: translate3d(0, 0, 0);
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
index cfbea3e..aced25b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
@@ -68,7 +68,7 @@
   border-right: 1px solid #ddd;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
 .oo-ui-indexLayout > .oo-ui-menuLayout-menu {
   height: 3em;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   -webkit-transform: translateZ(0);
-     -moz-transform: translateZ(0);
-      -ms-transform: translateZ(0);
           transform: translateZ(0);
   background-color: #f8f9fa;
   width: 3.5em;
index 8242c86..4bf461f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -1642,7 +1642,7 @@ OO.ui.MenuLayout.prototype.getMenuPosition = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed. Disabled on mobile.
  * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  */
@@ -1781,7 +1781,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        if ( !this.scrolling && page ) {
                page.scrollElementIntoView( {
                        complete: function () {
-                               if ( layout.autoFocus ) {
+                               if ( layout.autoFocus && !OO.ui.isMobile() ) {
                                        layout.focus();
                                }
                        }
@@ -2112,6 +2112,7 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
                                // meaningless because the next page is not visible yet and thus can't hold focus.
                                if (
                                        this.autoFocus &&
+                                       !OO.ui.isMobile() &&
                                        this.stackLayout.continuous &&
                                        OO.ui.findFocusable( page.$element ).length !== 0
                                ) {
@@ -2188,7 +2189,7 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all cards, one after another
  * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed. Disabled on mobile.
  */
 OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        // Configuration initialization
@@ -2291,7 +2292,7 @@ OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
        if ( card ) {
                card.scrollElementIntoView( {
                        complete: function () {
-                               if ( layout.autoFocus ) {
+                               if ( layout.autoFocus && !OO.ui.isMobile() ) {
                                        layout.focus();
                                }
                        }
@@ -2556,6 +2557,7 @@ OO.ui.IndexLayout.prototype.setCard = function ( name ) {
                                // meaningless because the next card is not visible yet and thus can't hold focus.
                                if (
                                        this.autoFocus &&
+                                       !OO.ui.isMobile() &&
                                        this.stackLayout.continuous &&
                                        OO.ui.findFocusable( card.$element ).length !== 0
                                ) {
@@ -3573,6 +3575,7 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [placeholder] Placeholder text
  * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.
+ * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added.
  * @cfg {Object} [menu] (required) Configuration options to pass to the
  *  {@link OO.ui.MenuSelectWidget menu select widget}.
  * @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.
@@ -3594,6 +3597,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Configuration initialization
        config = $.extend( {
                allowArbitrary: false,
+               allowDuplicates: false,
                $overlay: this.$element
        }, config );
 
@@ -3625,6 +3629,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Properties
        this.$content = $( '<div>' );
        this.allowArbitrary = config.allowArbitrary;
+       this.allowDuplicates = config.allowDuplicates;
        this.$overlay = config.$overlay;
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
@@ -3640,7 +3645,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        // Events
        if ( this.popup ) {
                $tabFocus.on( {
-                       focus: this.onFocusForPopup.bind( this )
+                       focus: this.focus.bind( this )
                } );
                this.popup.$element.on( 'focusout', this.onPopupFocusOut.bind( this ) );
                if ( this.popup.$autoCloseIgnore ) {
@@ -3824,7 +3829,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {
        $.each( datas, function ( i, data ) {
                var item;
 
-               if ( !widget.getItemFromData( data ) ) {
+               if ( !widget.getItemFromData( data ) || widget.allowDuplicates ) {
                        item = menu.getItemFromData( data );
                        if ( item ) {
                                item = widget.createItemWidget( data, item.label );
@@ -4048,20 +4053,6 @@ OO.ui.CapsuleMultiselectWidget.prototype.onInputBlur = function () {
        this.clearInput();
 };
 
-/**
- * Handle focus events
- *
- * @private
- * @param {jQuery.Event} event
- */
-OO.ui.CapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
-       if ( !this.isDisabled() ) {
-               this.popup.setSize( this.$handle.width() );
-               this.popup.toggle( true );
-               OO.ui.findFocusable( this.popup.$element ).focus();
-       }
-};
-
 /**
  * Handles popup focus out events.
  *
@@ -4327,10 +4318,21 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
 };
 
 /**
+ * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
+ *
  * @class
+ * @extends OO.ui.CapsuleMultiselectWidget
+ *
+ * @constructor
  * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
  */
-OO.ui.CapsuleMultiSelectWidget = OO.ui.CapsuleMultiselectWidget;
+OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
+       OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
+       // Parent constructor
+       OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
 
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
@@ -5234,11 +5236,9 @@ OO.ui.NumberInputWidget.prototype.validateNumber = function ( value ) {
                return false;
        }
 
-       /* eslint-disable no-bitwise */
-       if ( this.isInteger && ( n | 0 ) !== n ) {
+       if ( this.isInteger && Math.floor( n ) !== n ) {
                return false;
        }
-       /* eslint-enable no-bitwise */
 
        if ( n < this.min || n > this.max ) {
                return false;
@@ -5345,3 +5345,5 @@ OO.ui.NumberInputWidget.prototype.setDisabled = function ( disabled ) {
 };
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-widgets.js.map
\ No newline at end of file
index 40de1d7..2fc4cc8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index d1b35e8..c643c28 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:42Z
+ * Date: 2017-01-19T20:22:32Z
  */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
-  line-height: 1.5;
+  line-height: 1.4;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   text-align: left;
   margin: 1em;
   padding: 1em;
-  border: 1px solid #ff9e9e;
+  border: 1px solid #d33;
   background-color: #fff7f7;
   border-radius: 2px;
 }
   max-height: calc(100% - 2em);
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
index f6e2a39..ab83a55 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.1
+ * OOjs UI v0.18.4-fix (d4045dee45)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-11-29T22:57:37Z
+ * Date: 2017-01-19T20:22:26Z
  */
 ( function ( OO ) {
 
@@ -1987,7 +1987,7 @@ OO.ui.Window.prototype.getReadyProcess = function () {
 /**
  * Get the 'hold' process.
  *
- * The hold proccess is used to keep a window from being used in a particular context,
+ * The hold process is used to keep a window from being used in a particular context,
  * based on the `data` argument. This method is called during the closing phase of the window’s
  * lifecycle.
  *
@@ -2702,7 +2702,8 @@ OO.ui.MessageDialog.static.name = 'message';
 
 OO.ui.MessageDialog.static.size = 'small';
 
-OO.ui.MessageDialog.static.verbose = false;
+// @deprecated since v0.18.4 as default; TODO: Remove
+OO.ui.MessageDialog.static.verbose = true;
 
 /**
  * Dialog title.
@@ -2810,7 +2811,6 @@ OO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {
  * @param {Object} [data] Dialog opening data
  * @param {jQuery|string|Function|null} [data.title] Description of the action being confirmed
  * @param {jQuery|string|Function|null} [data.message] Description of the action's consequence
- * @param {boolean} [data.verbose] Message is verbose and should be styled as a long message
  * @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each
  *   action item
  */
@@ -2826,6 +2826,7 @@ OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
                        this.message.setLabel(
                                data.message !== undefined ? data.message : this.constructor.static.message
                        );
+                       // @deprecated since v0.18.4 as default; TODO: Remove and make default instead.
                        this.message.$element.toggleClass(
                                'oo-ui-messageDialog-message-verbose',
                                data.verbose !== undefined ? data.verbose : this.constructor.static.verbose
@@ -2881,11 +2882,19 @@ OO.ui.MessageDialog.prototype.setDimensions = function ( dim ) {
        // Twiddle the overflow property, otherwise an unnecessary scrollbar will be produced.
        // Need to do it after transition completes (250ms), add 50ms just in case.
        setTimeout( function () {
-               var oldOverflow = $scrollable[ 0 ].style.overflow;
+               var oldOverflow = $scrollable[ 0 ].style.overflow,
+                       activeElement = document.activeElement;
+
                $scrollable[ 0 ].style.overflow = 'hidden';
 
                OO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );
 
+               // Check reconsiderScrollbars didn't destroy our focus, as we
+               // are doing this after the ready process.
+               if ( activeElement && activeElement !== document.activeElement && activeElement.focus ) {
+                       activeElement.focus();
+               }
+
                $scrollable[ 0 ].style.overflow = oldOverflow;
        }, 300 );
 
@@ -3153,10 +3162,22 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
  * @inheritdoc
  */
 OO.ui.ProcessDialog.prototype.getActionWidgets = function ( actions ) {
-       var i, len, widgets = [];
+       var i, len, config,
+               isMobile = OO.ui.isMobile(),
+               widgets = [];
+
        for ( i = 0, len = actions.length; i < len; i++ ) {
+               config = $.extend( { framed: !OO.ui.isMobile() }, actions[ i ] );
+               if ( isMobile &&
+                       ( config.flags === 'back' || ( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 ) )
+               ) {
+                       $.extend( config, {
+                               icon: 'previous',
+                               label: ''
+                       } );
+               }
                widgets.push(
-                       new OO.ui.ActionWidget( $.extend( { framed: true }, actions[ i ] ) )
+                       new OO.ui.ActionWidget( config )
                );
        }
        return widgets;
@@ -3379,7 +3400,6 @@ OO.ui.getWindowManager = function () {
 OO.ui.alert = function ( text, options ) {
        return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
                message: text,
-               verbose: true,
                actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
        }, options ) ).then( function ( opened ) {
                return opened.then( function ( closing ) {
@@ -3415,8 +3435,7 @@ OO.ui.alert = function ( text, options ) {
  */
 OO.ui.confirm = function ( text, options ) {
        return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
-               message: text,
-               verbose: true
+               message: text
        }, options ) ).then( function ( opened ) {
                return opened.then( function ( closing ) {
                        return closing.then( function ( data ) {
@@ -3426,4 +3445,56 @@ OO.ui.confirm = function ( text, options ) {
        } );
 };
 
+/**
+ * Display a quick modal prompt dialog, using a OO.ui.MessageDialog. While the dialog is open,
+ * the rest of the page will be dimmed out and the user won't be able to interact with it. The
+ * dialog has a text input widget and two action buttons, one to confirm an operation (labelled "OK")
+ * and one to cancel it (labelled "Cancel").
+ *
+ * A window manager is created automatically when this function is called for the first time.
+ *
+ *     @example
+ *     OO.ui.prompt( 'Choose a line to go to', { textInput: { placeholder: 'Line number' } } ).done( function ( result ) {
+ *         if ( result !== null ) {
+ *             console.log( 'User typed "' + result + '" then clicked "OK".' );
+ *         } else {
+ *             console.log( 'User clicked "Cancel" or closed the dialog.' );
+ *         }
+ *     } );
+ *
+ * @param {jQuery|string} text Message text to display
+ * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
+ * @cfg {Object} [textInput] Additional options for text input widget, see OO.ui.TextInputWidget
+ * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to
+ *  confirm, the promise will resolve with the value of the text input widget; otherwise, it will
+ *  resolve to `null`.
+ */
+OO.ui.prompt = function ( text, options ) {
+       var manager = OO.ui.getWindowManager(),
+               textInput = new OO.ui.TextInputWidget( ( options && options.textInput ) || {} ),
+               textField = new OO.ui.FieldLayout( textInput, {
+                       align: 'top',
+                       label: text
+               } );
+
+       // TODO: This is a little hacky, and could be done by extending MessageDialog instead.
+
+       return manager.openWindow( 'messageDialog', $.extend( {
+               message: textField.$element
+       }, options ) ).then( function ( opened ) {
+               // After ready
+               textInput.on( 'enter', function () {
+                       manager.getCurrentWindow().close( { action: 'accept' } );
+               } );
+               textInput.focus();
+               return opened.then( function ( closing ) {
+                       return closing.then( function ( data ) {
+                               return $.Deferred().resolve( data && data.action === 'accept' ? textInput.getValue() : null );
+                       } );
+               } );
+       } );
+};
+
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-windows.js.map
\ No newline at end of file
index 02dfffa..449cb77 100644 (file)
@@ -9,7 +9,7 @@
        },
        "images": {
                "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
index f904cc2..b5dff27 100644 (file)
@@ -4,30 +4,46 @@
        "images": {
                "block": { "file": "images/icons/block.svg" },
                "blockUndo": { "file": {
-                       "ltr": "images/icons/blockUndo-ltr.svg",
-                       "rtl": "images/icons/blockUndo-rtl.svg"
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
+               } },
+               "unBlock": { "file": {
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
                } },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
                "flagUndo": { "file": {
-                       "ltr": "images/icons/flagUndo-ltr.svg",
-                       "rtl": "images/icons/flagUndo-rtl.svg"
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
-               "lock": { "file": "images/icons/lock.svg" },
-               "star": { "file": "images/icons/star.svg" },
-               "trash": { "file": "images/icons/trash.svg" },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/trashUndo-ltr.svg",
-                       "rtl": "images/icons/trashUndo-rtl.svg"
+               "unFlag": { "file": {
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
+               "lock": { "file": "images/icons/lock.svg" },
                "unLock": { "file": {
                        "ltr": "images/icons/unLock-ltr.svg",
                        "rtl": "images/icons/unLock-rtl.svg"
                } },
-               "unStar": { "file": "images/icons/unStar.svg" }
-
-
+               "star": { "file": "images/icons/star.svg" },
+               "unStar": { "file": "images/icons/unStar.svg" },
+               "trash": { "file": "images/icons/trash.svg" },
+               "unTrash": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "trashUndo": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "ongoingConversation": {
+                       "file": {
+                               "ltr": "images/icons/ongoingConversation-ltr.svg",
+                               "rtl": "images/icons/ongoingConversation-rtl.svg"
+                       }
+               }
        }
 }
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg
deleted file mode 100644 (file)
index 5058629..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png
deleted file mode 100644 (file)
index 640bb2a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-ltr.svg
deleted file mode 100644 (file)
index 160219c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png
deleted file mode 100644 (file)
index 2475b06..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/blockUndo-rtl.svg
deleted file mode 100644 (file)
index 90fe46a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png
deleted file mode 100644 (file)
index 780cb87..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-ltr.svg
deleted file mode 100644 (file)
index 4bbd61c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png
deleted file mode 100644 (file)
index fa3696a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/flagUndo-rtl.svg
deleted file mode 100644 (file)
index 5d94425..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png
new file mode 100644 (file)
index 0000000..0963538
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg
new file mode 100644 (file)
index 0000000..5058629
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png
new file mode 100644 (file)
index 0000000..6d3c067
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg
new file mode 100644 (file)
index 0000000..c3f99d6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png
new file mode 100644 (file)
index 0000000..df49095
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-ltr.svg
new file mode 100644 (file)
index 0000000..658809d
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+    <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png
new file mode 100644 (file)
index 0000000..3d7e9bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ongoingConversation-rtl.svg
new file mode 100644 (file)
index 0000000..648ce55
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
+    <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png
deleted file mode 100644 (file)
index 87590fa..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg
deleted file mode 100644 (file)
index 9a625b8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z" id="trash-can-undo"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png
deleted file mode 100644 (file)
index dd35023..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg
deleted file mode 100644 (file)
index 17ca8dc..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z" id="trash-can-undo"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png
new file mode 100644 (file)
index 0000000..640bb2a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-ltr.svg
new file mode 100644 (file)
index 0000000..160219c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png
new file mode 100644 (file)
index 0000000..2475b06
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unBlock-rtl.svg
new file mode 100644 (file)
index 0000000..90fe46a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png
new file mode 100644 (file)
index 0000000..780cb87
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-ltr.svg
new file mode 100644 (file)
index 0000000..4bbd61c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png
new file mode 100644 (file)
index 0000000..fa3696a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unFlag-rtl.svg
new file mode 100644 (file)
index 0000000..5d94425
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png
new file mode 100644 (file)
index 0000000..87590fa
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-ltr.svg
new file mode 100644 (file)
index 0000000..9a625b8
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z" id="trash-can-undo"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png
new file mode 100644 (file)
index 0000000..dd35023
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unTrash-rtl.svg
new file mode 100644 (file)
index 0000000..17ca8dc
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z" id="trash-can-undo"/>
+</svg>
index f110a04..e040ffb 100644 (file)
@@ -23,7 +23,7 @@
        },
        "images": {
                "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
index 3779ae3..9cc0f32 100644 (file)
        "images": {
                "block": { "file": "images/icons/block.svg", "variants": [ "destructive" ] },
                "blockUndo": { "file": {
-                       "ltr": "images/icons/blockUndo-ltr.svg",
-                       "rtl": "images/icons/blockUndo-rtl.svg"
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
+               } },
+               "unBlock": { "file": {
+                       "ltr": "images/icons/unBlock-ltr.svg",
+                       "rtl": "images/icons/unBlock-rtl.svg"
                } },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
+               "unFlag": { "file": {
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
+               } },
                "flagUndo": { "file": {
-                       "ltr": "images/icons/flagUndo-ltr.svg",
-                       "rtl": "images/icons/flagUndo-rtl.svg"
+                       "ltr": "images/icons/unFlag-ltr.svg",
+                       "rtl": "images/icons/unFlag-rtl.svg"
                } },
                "lock": { "file": {
                        "ltr": "images/icons/lock-ltr.svg",
                        "rtl": "images/icons/lock-rtl.svg"
                }, "variants": [ "destructive" ] },
+               "unLock": { "file": {
+                       "ltr": "images/icons/unLock-ltr.svg",
+                       "rtl": "images/icons/unLock-rtl.svg"
+               }, "variants": [ "destructive" ] },
+               "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
+               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] },
+               "trash": { "file": "images/icons/trash.svg" },
+               "unTrash": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
+               "trashUndo": { "file": {
+                       "ltr": "images/icons/unTrash-ltr.svg",
+                       "rtl": "images/icons/unTrash-rtl.svg"
+               } },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
                                "rtl": "images/icons/ongoingConversation-rtl.svg"
                        },
                        "variants": [ "progressive" ]
-               },
-               "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
-               "trash": { "file": "images/icons/trash.svg" },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/trashUndo-ltr.svg",
-                       "rtl": "images/icons/trashUndo-rtl.svg"
-               } },
-               "unLock": { "file": {
-                       "ltr": "images/icons/unLock-ltr.svg",
-                       "rtl": "images/icons/unLock-rtl.svg"
-               }, "variants": [ "destructive" ] },
-               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] }
+               }
        }
 }
index 61aec85..14f6b18 100644 (file)
@@ -24,6 +24,7 @@
        "images": {
                "logoCC": { "file": "images/icons/logo-cc.svg" },
                "logoWikimediaCommons": { "file": "images/icons/logo-wikimediaCommons.svg" },
+               "logoWikimediaDiscovery": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
                "logoWikipedia": { "file": "images/icons/logo-wikipedia.svg" }
        }
 }
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-invert.svg
deleted file mode 100644 (file)
index 21548d9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png
deleted file mode 100644 (file)
index 6afb2bd..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch-progressive.svg
deleted file mode 100644 (file)
index 359d032..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/betaLaunch.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png
deleted file mode 100644 (file)
index 7426f56..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-invert.svg
deleted file mode 100644 (file)
index 36fd719..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png
deleted file mode 100644 (file)
index d797f3e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index bc96e99..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png
deleted file mode 100644 (file)
index 640bb2a..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-ltr.svg
deleted file mode 100644 (file)
index 160219c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png
deleted file mode 100644 (file)
index a02e2e0..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-invert.svg
deleted file mode 100644 (file)
index b6f1610..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png
deleted file mode 100644 (file)
index 4d062cb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index dc03220..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png
deleted file mode 100644 (file)
index 2475b06..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/blockUndo-rtl.svg
deleted file mode 100644 (file)
index 90fe46a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png
deleted file mode 100644 (file)
index 8338017..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-invert.svg
deleted file mode 100644 (file)
index c73d23f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png
deleted file mode 100644 (file)
index bf1a6e0..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index 16b6d3a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png
deleted file mode 100644 (file)
index 780cb87..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-ltr.svg
deleted file mode 100644 (file)
index 4bbd61c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png
deleted file mode 100644 (file)
index 4f9c3ad..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-invert.svg
deleted file mode 100644 (file)
index 440390e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png
deleted file mode 100644 (file)
index 4abe9c8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index 7f45734..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png
deleted file mode 100644 (file)
index fa3696a..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/flagUndo-rtl.svg
deleted file mode 100644 (file)
index 5d94425..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png
new file mode 100644 (file)
index 0000000..0963538
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg
new file mode 100644 (file)
index 0000000..21548d9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png
new file mode 100644 (file)
index 0000000..6afb2bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg
new file mode 100644 (file)
index 0000000..359d032
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png
new file mode 100644 (file)
index 0000000..6d3c067
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery.svg
new file mode 100644 (file)
index 0000000..c3f99d6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
index 55a68db..441fe2d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.png differ
index 663913a..548e136 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
 </svg>
index c1676e6..2e7107d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.png differ
index a9631cc..daf032a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
 </svg>
index 536e77c..ddb1c5c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin.png differ
index f1fa246..26fb6b7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 4c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
 </svg>
index 607354c..ee5de90 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.png differ
index 43074af..cfa98d8 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
 </svg>
+
index 2fcf2e1..036a31d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.png differ
index 7dc09d4..7cf1509 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
 </svg>
+
index 88160bc..d8c1691 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr.png differ
index d84970f..9d71335 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4z"/>
-    <path d="M18 11h-1V7.1l-.1-.1H13V5.1c-.3-.1-.7-.1-1-.1-3.9 0-7 3.1-7 7 0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7 0-.3 0-.7-.1-1H18zm-6 5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+  <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
+  <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
 </svg>
+
index 6ea8226..934d5cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.png differ
index 6a4af93..8b02ddb 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
 </svg>
index 56b7924..be7c51e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.png differ
index 8108685..c920c8d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
 </svg>
index 20aba25..7cc1f74 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl.png differ
index 8f35458..03c484a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0z"/>
-    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 5c2.2 0 4-1.8 4-4s-1.8-4-4-4-4 1.8-4 4 1.8 4 4 4z"/>
+    <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
+    <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png
deleted file mode 100644 (file)
index af3f0e9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-invert.svg
deleted file mode 100644 (file)
index 0763ff8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png
deleted file mode 100644 (file)
index 2f09eb6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr-progressive.svg
deleted file mode 100644 (file)
index 6d1fdd9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png
deleted file mode 100644 (file)
index 3b5231f..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-ltr.svg
deleted file mode 100644 (file)
index 64b3b71..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png
deleted file mode 100644 (file)
index 1cb5449..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-invert.svg
deleted file mode 100644 (file)
index 12e57b2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png
deleted file mode 100644 (file)
index e828b36..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl-progressive.svg
deleted file mode 100644 (file)
index 6395968..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png
deleted file mode 100644 (file)
index a1d2388..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trashUndo-rtl.svg
deleted file mode 100644 (file)
index e5e4032..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png
new file mode 100644 (file)
index 0000000..7426f56
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg
new file mode 100644 (file)
index 0000000..36fd719
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png
new file mode 100644 (file)
index 0000000..d797f3e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..bc96e99
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png
new file mode 100644 (file)
index 0000000..640bb2a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr.svg
new file mode 100644 (file)
index 0000000..160219c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png
new file mode 100644 (file)
index 0000000..a02e2e0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg
new file mode 100644 (file)
index 0000000..b6f1610
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png
new file mode 100644 (file)
index 0000000..4d062cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..dc03220
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png
new file mode 100644 (file)
index 0000000..2475b06
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl.svg
new file mode 100644 (file)
index 0000000..90fe46a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png
new file mode 100644 (file)
index 0000000..8338017
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg
new file mode 100644 (file)
index 0000000..c73d23f
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png
new file mode 100644 (file)
index 0000000..bf1a6e0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..16b6d3a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png
new file mode 100644 (file)
index 0000000..780cb87
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr.svg
new file mode 100644 (file)
index 0000000..4bbd61c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png
new file mode 100644 (file)
index 0000000..4f9c3ad
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg
new file mode 100644 (file)
index 0000000..440390e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png
new file mode 100644 (file)
index 0000000..4abe9c8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..7f45734
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png
new file mode 100644 (file)
index 0000000..fa3696a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl.svg
new file mode 100644 (file)
index 0000000..5d94425
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
+</svg>
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png
new file mode 100644 (file)
index 0000000..af3f0e9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg
new file mode 100644 (file)
index 0000000..0763ff8
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png
new file mode 100644 (file)
index 0000000..2f09eb6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..6d1fdd9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png
new file mode 100644 (file)
index 0000000..3b5231f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr.svg
new file mode 100644 (file)
index 0000000..64b3b71
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png
new file mode 100644 (file)
index 0000000..1cb5449
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg
new file mode 100644 (file)
index 0000000..12e57b2
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png
new file mode 100644 (file)
index 0000000..e828b36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..6395968
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png
new file mode 100644 (file)
index 0000000..a1d2388
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl.svg
new file mode 100644 (file)
index 0000000..e5e4032
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
+</svg>
index 2c6a588..ddda432 100644 (file)
             }
         };
 
-        if (!options.live) this.each(function() { get(this); });
+        this.each(function() { get(this); });
 
         if ( options.trigger != 'manual' ) {
             var eventIn  = options.trigger == 'hover' ? 'mouseenter focus' : 'focus',
                 eventOut = options.trigger == 'hover' ? 'mouseleave blur' : 'blur';
             if ( options.live ) {
                 mw.track( 'mw.deprecate', 'tipsy-live' );
-                mw.log.warn( 'Use of the "live" option of jquery.tipsy is deprecated.' );
-                // XXX: The official status of 'context' is deprecated, and the official status of
-                // 'selector' is removed, so this really needs to go.
-                $( this.context )
-                    .on( eventIn, this.selector, enter )
-                    .on( eventOut, this.selector, leave );
-            } else {
-                this
-                    .on( eventIn, enter )
-                    .on( eventOut, leave );
+                mw.log.warn( 'Use of the "live" option of jquery.tipsy is no longer supported.' );
             }
+            this
+                .on( eventIn, enter )
+                .on( eventOut, leave );
         }
 
         return this;
index f25944c..4f900a4 100644 (file)
@@ -24,7 +24,7 @@
         *
         * @private
         * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
-        * @return {Array} Array with 0 or more of the string values: ctrl, option, alt, shift, esc
+        * @return {Array} Array with 1 or more of the string values, in this order: ctrl, option, alt, shift, esc
         */
        function getAccessKeyModifiers( ua ) {
                var profile, accessKeyModifiers;
                }
 
                profile = $.client.profile( ua );
-               accessKeyModifiers = [ 'alt' ];
-
-               // Classic Opera on any platform
-               if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
-                       accessKeyModifiers = [ 'shift', 'esc' ];
-
-               // Chrome and modern Opera on any platform
-               } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
-                       accessKeyModifiers = (
-                               profile.platform === 'mac' ?
-                                       // Chrome on Mac
-                                       [ 'ctrl', 'option' ] :
-                                       // Chrome on Windows or Linux
+
+               switch ( profile.name ) {
+                       case 'chrome':
+                       case 'opera':
+                               if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
+                                       accessKeyModifiers = [ 'shift', 'esc' ];
+                               } else if ( profile.platform === 'mac' ) {
+                                       accessKeyModifiers = [ 'ctrl', 'option' ];
+                               } else {
+                                       // Chrome/Opera on Windows or Linux
                                        // (both alt- and alt-shift work, but alt with E, D, F etc does not
                                        // work since they are browser shortcuts)
-                                       [ 'alt', 'shift' ]
-                       );
-
-               // Non-Windows Safari with webkit_version > 526
-               } else if ( profile.platform !== 'win' &&
-                       profile.name === 'safari' &&
-                       profile.layoutVersion > 526
-               ) {
-                       accessKeyModifiers = [ 'ctrl', 'alt' ];
-
-               // Safari/Konqueror on any platform, or any browser on Mac
-               // (but not Safari on Windows)
-               } else if (
-                       !( profile.platform === 'win' && profile.name === 'safari' ) &&
-                       (
-                               profile.name === 'safari' ||
-                               profile.platform === 'mac' ||
-                               profile.name === 'konqueror'
-                       )
-               ) {
-                       accessKeyModifiers = [ 'ctrl' ];
-
-               // Firefox/Iceweasel 2.x and later
-               } else if (
-                       ( profile.name === 'firefox' || profile.name === 'iceweasel' ) &&
-                       profile.versionBase > '1'
-               ) {
-                       accessKeyModifiers = [ 'alt', 'shift' ];
+                                       accessKeyModifiers = [ 'alt', 'shift' ];
+                               }
+                               break;
+                       case 'firefox':
+                       case 'iceweasel':
+                               if ( profile.versionBase < 2 ) {
+                                       // Before v2, Firefox used alt, though it was rebindable in about:config
+                                       accessKeyModifiers = [ 'alt' ];
+                               } else {
+                                       if ( profile.platform === 'mac' ) {
+                                               if ( profile.versionNumber < 14 ) {
+                                                       accessKeyModifiers = [ 'ctrl' ];
+                                               } else {
+                                                       accessKeyModifiers = [ 'ctrl', 'option' ];
+                                               }
+                                       } else {
+                                               accessKeyModifiers = [ 'alt', 'shift' ];
+                                       }
+                               }
+                               break;
+                       case 'safari':
+                       case 'konqueror':
+                               if ( profile.platform === 'win' ) {
+                                       accessKeyModifiers = [ 'alt' ];
+                               } else {
+                                       if ( profile.layoutVersion > 526 ) {
+                                               // Non-Windows Safari with webkit_version > 526
+                                               accessKeyModifiers = [ 'ctrl', profile.platform === 'mac' ? 'option' : 'alt' ];
+                                       } else {
+                                               accessKeyModifiers = [ 'ctrl' ];
+                                       }
+                               }
+                               break;
+                       case 'msie':
+                       case 'edge':
+                               accessKeyModifiers = [ 'alt' ];
+                               break;
+                       default:
+                               accessKeyModifiers = profile.platform === 'mac' ? [ 'ctrl' ] : [ 'alt' ];
+                               break;
                }
 
                // cache modifiers
index 0bfa8f3..c3d39da 100644 (file)
@@ -12,7 +12,6 @@
  *             $('#textbox').expandableField();
  *
  * Options:
- *
  */
 ( function ( $ ) {
 
index 4da05e6..1b64237 100644 (file)
                                s = out;
                        }
                        i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                formatFloat: function ( s ) {
                        var i = parseFloat( s );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                formatInt: function ( s ) {
                        var i = parseInt( s, 10 );
-                       return isNaN( i ) ? 0 : i;
+                       return isNaN( i ) ? -Infinity : i;
                },
 
                clearTableBody: function ( table ) {
index c8d3fad..7e966ea 100644 (file)
@@ -11,7 +11,7 @@
                var idleTimeout = 3000,
                        api = new mw.Api(),
                        timer,
-                       pending,
+                       stashReq,
                        lastText,
                        lastSummary,
                        lastTextHash,
                        PRIORITY_LOW = 1,
                        PRIORITY_HIGH = 2;
 
+               // We don't attempt to stash new section edits because in such cases the parser output
+               // varies on the edit summary (since it determines the new section's name).
+               if ( !$form.length || section === 'new' ) {
+                       return;
+               }
+
                // Send a request to stash the edit to the API.
                // If a request is in progress, abort it since its payload is stale and the API
                // may limit concurrent stash parses.
                function stashEdit() {
-                       api.getToken( 'csrf' ).then( function ( token ) {
-                               var req, params,
-                                       textChanged = isTextChanged(),
-                                       priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
-
-                               if ( pending ) {
-                                       if ( lastPriority > priority ) {
-                                               // Stash request for summary change should wait on pending text change stash
-                                               pending.then( checkStash );
-                                               return;
-                                       }
-                                       pending.abort();
+                       var req, params,
+                               textChanged = isTextChanged(),
+                               priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
+
+                       if ( stashReq ) {
+                               if ( lastPriority > priority ) {
+                                       // Stash request for summary change should wait on pending text change stash
+                                       stashReq.then( checkStash );
+                                       return;
                                }
+                               stashReq.abort();
+                       }
 
-                               // Update the "last" tracking variables
-                               lastSummary = $summary.textSelection( 'getContents' );
-                               lastPriority = priority;
-                               if ( textChanged ) {
-                                       lastText = $text.textSelection( 'getContents' );
-                                       // Reset hash
-                                       lastTextHash = null;
-                               }
+                       // Update the "last" tracking variables
+                       lastSummary = $summary.textSelection( 'getContents' );
+                       lastPriority = priority;
+                       if ( textChanged ) {
+                               lastText = $text.textSelection( 'getContents' );
+                               // Reset hash
+                               lastTextHash = null;
+                       }
+
+                       params = {
+                               action: 'stashedit',
+                               title: mw.config.get( 'wgPageName' ),
+                               section: section,
+                               sectiontitle: '',
+                               summary: lastSummary,
+                               contentmodel: model,
+                               contentformat: format,
+                               baserevid: revId
+                       };
+                       if ( lastTextHash ) {
+                               params.stashedtexthash = lastTextHash;
+                       } else {
+                               params.text = lastText;
+                       }
 
-                               params = {
-                                       action: 'stashedit',
-                                       token: token,
-                                       title: mw.config.get( 'wgPageName' ),
-                                       section: section,
-                                       sectiontitle: '',
-                                       summary: lastSummary,
-                                       contentmodel: model,
-                                       contentformat: format,
-                                       baserevid: revId
-                               };
-                               if ( lastTextHash ) {
-                                       params.stashedtexthash = lastTextHash;
+                       req = api.postWithToken( 'csrf', params );
+                       stashReq = req;
+                       req.then( function ( data ) {
+                               if ( req === stashReq ) {
+                                       stashReq = null;
+                               }
+                               if ( data.stashedit && data.stashedit.texthash ) {
+                                       lastTextHash = data.stashedit.texthash;
                                } else {
-                                       params.text = lastText;
+                                       // Request failed or text hash expired;
+                                       // include the text in a future stash request.
+                                       lastTextHash = null;
                                }
-
-                               req = api.post( params );
-                               pending = req;
-                               req.then( function ( data ) {
-                                       if ( req === pending ) {
-                                               pending = null;
-                                       }
-                                       if ( data.stashedit && data.stashedit.texthash ) {
-                                               lastTextHash = data.stashedit.texthash;
-                                       } else {
-                                               // Request failed or text hash expired;
-                                               // include the text in a future stash request.
-                                               lastTextHash = null;
-                                       }
-                               } );
                        } );
                }
 
                        idleTimeout = 3000;
                }
 
-               function onFormLoaded() {
-                       if (
-                               // Reverts may involve use (undo) links; stash as they review the diff.
-                               // Since the form has a pre-filled summary, stash the edit immediately.
-                               mw.util.getParamValue( 'undo' ) !== null ||
-                               // Pressing "show changes" and "preview" also signify that the user will
-                               // probably save the page soon
-                               $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
-                       ) {
-                               checkStash();
-                       }
-               }
-
-               // We don't attempt to stash new section edits because in such cases the parser output
-               // varies on the edit summary (since it determines the new section's name).
-               if ( $form.find( 'input[name=wpSection]' ).val() === 'new' ) {
-                       return;
-               }
-
                $text.on( {
-                       change: checkStash,
                        keyup: onKeyUp,
-                       focus: onTextFocus
+                       focus: onTextFocus,
+                       change: checkStash
                } );
                $summary.on( {
+                       keyup: onKeyUp,
                        focus: onSummaryFocus,
-                       focusout: checkStash,
-                       keyup: onKeyUp
+                       focusout: checkStash
                } );
-               onFormLoaded();
+
+               if (
+                       // Reverts may involve use (undo) links; stash as they review the diff.
+                       // Since the form has a pre-filled summary, stash the edit immediately.
+                       mw.util.getParamValue( 'undo' ) !== null ||
+                       // Pressing "show changes" and "preview" also signify that the user will
+                       // probably save the page soon
+                       $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
+               ) {
+                       checkStash();
+               }
        } );
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.language/languages/he.js b/resources/src/mediawiki.language/languages/he.js
deleted file mode 100644 (file)
index 5bf8c4d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Hebrew (עברית) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
-       if ( grammarForms && grammarForms[ form ] ) {
-               return grammarForms[ form ][ word ];
-       }
-       switch ( form ) {
-               case 'prefixed':
-               case 'תחילית': // the same word in Hebrew
-                       // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.slice( 0, 1 ) === 'ו' && word.slice( 0, 2 ) !== 'וו' ) {
-                               word = 'ו' + word;
-                       }
-
-                       // Remove the "He" if prefixed
-                       if ( word.slice( 0, 1 ) === 'ה' ) {
-                               word = word.slice( 1 );
-                       }
-
-                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if ( word.slice( 0, 1 ) < 'א' || word.slice( 0, 1 ) > 'ת' ) {
-                               word = '־' + word;
-                       }
-       }
-       return word;
-};
diff --git a/resources/src/mediawiki.language/languages/ru.js b/resources/src/mediawiki.language/languages/ru.js
deleted file mode 100644 (file)
index 09d7c0b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * Russian (Русский) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       'use strict';
-
-       var forms, transformations, i, rule, sourcePattern, regexp, replacement;
-
-       forms = mediaWiki.language.getData( 'ru', 'grammarForms' );
-       if ( forms && forms[ form ] ) {
-               return forms[ form ][ word ];
-       }
-
-       transformations = mediaWiki.language.getData( 'ru', 'grammarTransformations' );
-
-       if ( !transformations[ form ] ) {
-               return word;
-       }
-
-       for ( i = 0; i < transformations[ form ].length; i++ ) {
-               rule = transformations[ form ][ i ];
-               sourcePattern = rule[ 0 ];
-
-               if ( sourcePattern === '@metadata' ) {
-                       continue;
-               }
-
-               regexp = new RegExp( sourcePattern );
-               replacement = rule[ 1 ];
-
-               if ( word.match( regexp ) ) {
-                       return word.replace( regexp, replacement );
-               }
-       }
-
-       return word;
-};
diff --git a/resources/src/mediawiki.language/languages/uk.js b/resources/src/mediawiki.language/languages/uk.js
deleted file mode 100644 (file)
index 138045c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * Ukrainian (Українська) language functions
- */
-
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
-       if ( grammarForms && grammarForms[ form ] ) {
-               return grammarForms[ form ][ word ];
-       }
-       switch ( form ) {
-               case 'genitive': // родовий відмінок
-                       if ( word.slice( -2 ) === 'ія' ) {
-                               word = word.slice( 0, -2 ) + 'ії';
-                       } else if ( word.slice( -2 ) === 'ти' ) {
-                               word = word.slice( 0, -2 ) + 'т';
-                       } else if ( word.slice( -2 ) === 'ди' ) {
-                               word = word.slice( 0, -2 ) + 'дів';
-                       } else if ( word.slice( -3 ) === 'ник' ) {
-                               word = word.slice( 0, -3 ) + 'ника';
-                       }
-
-                       break;
-               case 'accusative': // знахідний відмінок
-                       if ( word.slice( -2 ) === 'ія' ) {
-                               word = word.slice( 0, -2 ) + 'ію';
-                       }
-
-                       break;
-       }
-
-       return word;
-};
index fc2af3d..3726a68 100644 (file)
 
                /**
                 * Grammatical transformations, needed for inflected languages.
-                * Invoked by putting `{{grammar:form|word}}` in a message.
+                * Invoked by putting `{{grammar:case|word}}` in a message.
                 *
                 * The rules can be defined in $wgGrammarForms global or computed
                 * dynamically by overriding this method per language.
                 * @return {string}
                 */
                convertGrammar: function ( word, form ) {
-                       var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-                       if ( grammarForms && grammarForms[ form ] ) {
-                               return grammarForms[ form ][ word ] || word;
+                       var userLanguage, forms, transformations,
+                               patterns, i, rule, sourcePattern, regexp, replacement;
+
+                       userLanguage = mw.config.get( 'wgUserLanguage' );
+
+                       forms = mw.language.getData( userLanguage, 'grammarForms' );
+                       if ( forms && forms[ form ] ) {
+                               return forms[ form ][ word ];
+                       }
+
+                       transformations = mediaWiki.language.getData( userLanguage, 'grammarTransformations' );
+
+                       if ( !( transformations && transformations[ form ] ) ) {
+                               return word;
+                       }
+
+                       patterns = transformations[ form ];
+
+                       // Some names of grammar rules are aliases for other rules.
+                       // In such cases the value is a string rather than object,
+                       // so load the actual rules.
+                       if ( typeof patterns === 'string' ) {
+                               patterns = transformations[ patterns ];
                        }
+
+                       for ( i = 0; i < patterns.length; i++ ) {
+                               rule = patterns[ i ];
+                               sourcePattern = rule[ 0 ];
+
+                               if ( sourcePattern === '@metadata' ) {
+                                       continue;
+                               }
+
+                               regexp = new RegExp( sourcePattern );
+                               replacement = rule[ 1 ];
+
+                               if ( word.match( regexp ) ) {
+                                       return word.replace( regexp, replacement );
+                               }
+                       }
+
                        return word;
                },
 
index 10ceecc..83277cb 100644 (file)
                                numberString = mw.language.commafy( num, pattern );
                        }
 
-                       convertedNumber = '';
-                       for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable.hasOwnProperty( numberString[ i ] ) ) {
-                                       convertedNumber += transformTable[ numberString[ i ] ];
-                               } else {
-                                       convertedNumber += numberString[ i ];
+                       if ( transformTable ) {
+                               convertedNumber = '';
+                               for ( i = 0; i < numberString.length; i++ ) {
+                                       if ( transformTable.hasOwnProperty( numberString[ i ] ) ) {
+                                               convertedNumber += transformTable[ numberString[ i ] ];
+                                       } else {
+                                               convertedNumber += numberString[ i ];
+                                       }
                                }
+                       } else {
+                               convertedNumber = numberString;
                        }
 
                        if ( integer ) {
index 42392ed..befe957 100644 (file)
@@ -244,7 +244,7 @@ input#wpSummary {
 .catlinks li {
        display: inline-block;
        line-height: 1.25em;
-       border-left: 1px solid #aaa;
+       border-left: 1px solid #a2a9b1;
        margin: 0.125em 0;
        padding: 0 0.5em;
        zoom: 1;
@@ -303,7 +303,7 @@ p.mw-delete-editreasons {
 div.mw-warning-with-logexcerpt {
        padding: 3px;
        margin-bottom: 3px;
-       border: 2px solid #2f6fab;
+       border: 2px solid #2a4b8d;
        clear: both;
 }
 
@@ -363,7 +363,7 @@ table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        padding: 0.2em 0.4em;
 }
 
@@ -482,7 +482,7 @@ table.wikitable > caption {
 .mw-datatable,
 .mw-datatable td,
 .mw-datatable th {
-       border: 1px solid #aaa;
+       border: 1px solid #a2a9b1;
        padding: 0 0.15em 0 0.15em;
 }
 
@@ -495,7 +495,7 @@ table.wikitable > caption {
 }
 
 .mw-datatable tr:hover td {
-       background-color: #eef;
+       background-color: #eaf3ff;
 }
 
 /* Correct directionality when page dir is different from site/user dir */
index 9688f1f..d4937c6 100644 (file)
 // Form input sizes
 @checkboxSize: 2em;
 @radioSize: 2em;
-
-// The following rules are deprecated
-@colorWhite: #fff;
-@colorOffWhite: #fafafa;
-@colorGrayDark: #898989;
-@colorGrayLight: #ccc;
-@colorGrayLighter: #ddd;
-@colorGrayLightest: #eee;
-// Green; for contextual use of a positive finalizing action
-@colorConstructive: #00af89;
-@colorConstructiveHighlight: #1c6665;
-@colorConstructiveActive: #134645;
-
index 558fd4c..e20b422 100644 (file)
                        api = apiUrl ? new mw.ForeignApi( apiUrl ) : new mw.Api();
 
                return api.get( {
+                       formatversion: 2,
                        action: 'query',
                        prop: 'info',
-                       indexpageids: true,
                        titles: title.getPrefixedDb()
                } ).then( function ( data ) {
-                       var pageId, page, contentModel, moduleName;
-                       if ( !data.query.pageids[ 0 ] ) {
+                       var contentModel, moduleName, page = data.query.pages[ 0 ];
+                       if ( !page ) {
                                return $.Deferred().reject( 'unexpected-response', 'Unexpected API response' );
                        }
-                       pageId = data.query.pageids[ 0 ];
-                       page = data.query.pages[ pageId ];
-
                        contentModel = page.contentmodel;
                        moduleName = 'mediawiki.messagePoster.' + contentModel;
                        return mw.loader.using( moduleName ).then( function () {
@@ -99,7 +96,6 @@
         * @param {mw.Title} title Title being posted to
         * @param {mw.Api} api mw.Api instance that the instance should use
         * @return {mw.messagePoster.MessagePoster}
-        *
         */
        MessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
                return new this.contentModelToClass[ contentModel ]( title, api );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
new file mode 100644 (file)
index 0000000..5dfb68d
--- /dev/null
@@ -0,0 +1,160 @@
+( function ( mw ) {
+       /**
+        * Filter item model
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} name Filter name
+        * @param {Object} config Configuration object
+        * @cfg {string} [group] The group this item belongs to
+        * @cfg {string} [label] The label for the filter
+        * @cfg {string} [description] The description of the filter
+        * @cfg {boolean} [active=true] The filter is active and affecting the result
+        * @cfg {string[]} [excludes=[]] A list of filter names this filter, if
+        *  selected, makes inactive.
+        * @cfg {boolean} [default] The default state of this filter
+        */
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+
+               this.name = name;
+               this.group = config.group || '';
+               this.label = config.label || this.name;
+               this.description = config.description;
+               this.default = !!config.default;
+
+               this.active = config.active === undefined ? true : !!config.active;
+               this.excludes = config.excludes || [];
+               this.selected = this.default;
+       };
+
+       /* Initialization */
+
+       OO.initClass( mw.rcfilters.dm.FilterItem );
+       OO.mixinClass( mw.rcfilters.dm.FilterItem, OO.EventEmitter );
+
+       /* Events */
+
+       /**
+        * @event update
+        *
+        * The state of this filter has changed
+        */
+
+       /* Methods */
+
+       /**
+        * Get the name of this filter
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Get the group name this filter belongs to
+        *
+        * @return {string} Filter group name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getGroup = function () {
+               return this.group;
+       };
+
+       /**
+        * Get the label of this filter
+        *
+        * @return {string} Filter label
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getLabel = function () {
+               return this.label;
+       };
+
+       /**
+        * Get the description of this filter
+        *
+        * @return {string} Filter description
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getDescription = function () {
+               return this.description;
+       };
+
+       /**
+        * Get the default value of this filter
+        *
+        * @return {boolean} Filter default
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getDefault = function () {
+               return this.default;
+       };
+
+       /**
+        * Get the selected state of this filter
+        *
+        * @return {boolean} Filter is selected
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isSelected = function () {
+               return this.selected;
+       };
+
+       /**
+        * Check if this filter is active
+        *
+        * @return {boolean} Filter is active
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isActive = function () {
+               return this.active;
+       };
+
+       /**
+        * Check if this filter has a list of excluded filters
+        *
+        * @return {boolean} Filter has a list of excluded filters
+        */
+       mw.rcfilters.dm.FilterItem.prototype.hasExcludedFilters = function () {
+               return !!this.excludes.length;
+       };
+
+       /**
+        * Get this filter's list of excluded filters
+        *
+        * @return {string[]} Array of excluded filter names
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getExcludedFilters = function () {
+               return this.excludes;
+       };
+
+       /**
+        * Toggle the active state of the item
+        *
+        * @param {boolean} [isActive] Filter is active
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleActive = function ( isActive ) {
+               isActive = isActive === undefined ? !this.active : isActive;
+
+               if ( this.active !== isActive ) {
+                       this.active = isActive;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Toggle the selected state of the item
+        *
+        * @param {boolean} [isSelected] Filter is selected
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected === undefined ? !this.selected : isSelected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+                       this.emit( 'update' );
+               }
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
new file mode 100644 (file)
index 0000000..3f7fa53
--- /dev/null
@@ -0,0 +1,613 @@
+( function ( mw, $ ) {
+       /**
+        * View model for the filters selection and display
+        *
+        * @mixins OO.EventEmitter
+        * @mixins OO.EmitterList
+        *
+        * @constructor
+        */
+       mw.rcfilters.dm.FiltersViewModel = function MwRcfiltersDmFiltersViewModel() {
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+               OO.EmitterList.call( this );
+
+               this.groups = {};
+               this.excludedByMap = {};
+               this.defaultParams = {};
+               this.defaultFiltersEmpty = null;
+
+               // Events
+               this.aggregate( { update: 'filterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: 'onFilterItemUpdate' } );
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.FiltersViewModel );
+       OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EventEmitter );
+       OO.mixinClass( mw.rcfilters.dm.FiltersViewModel, OO.EmitterList );
+
+       /* Events */
+
+       /**
+        * @event initialize
+        *
+        * Filter list is initialized
+        */
+
+       /**
+        * @event itemUpdate
+        * @param {mw.rcfilters.dm.FilterItem} item Filter item updated
+        *
+        * Filter item has changed
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to filter item change.
+        *
+        * @param {mw.rcfilters.dm.FilterItem} item Updated filter
+        * @fires itemUpdate
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.onFilterItemUpdate = function ( item ) {
+               // Reapply the active state of filters
+               this.reapplyActiveFilters( item );
+
+               this.emit( 'itemUpdate', item );
+       };
+
+       /**
+        * Calculate the active state of the filters, based on selected filters in the group.
+        *
+        * @param {mw.rcfilters.dm.FilterItem} item Changed item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.reapplyActiveFilters = function ( item ) {
+               var selectedItemsCount,
+                       group = item.getGroup(),
+                       model = this;
+               if (
+                       !this.groups[ group ].exclusionType ||
+                       this.groups[ group ].exclusionType === 'default'
+               ) {
+                       // Default behavior
+                       // If any parameter is selected, but:
+                       // - If there are unselected items in the group, they are inactive
+                       // - If the entire group is selected, all are inactive
+
+                       // Check what's selected in the group
+                       selectedItemsCount = this.groups[ group ].filters.filter( function ( filterItem ) {
+                               return filterItem.isSelected();
+                       } ).length;
+
+                       this.groups[ group ].filters.forEach( function ( filterItem ) {
+                               filterItem.toggleActive(
+                                       selectedItemsCount > 0 ?
+                                               // If some items are selected
+                                               (
+                                                       selectedItemsCount === model.groups[ group ].filters.length ?
+                                                       // If **all** items are selected, they're all inactive
+                                                       false :
+                                                       // If not all are selected, then the selected are active
+                                                       // and the unselected are inactive
+                                                       filterItem.isSelected()
+                                               ) :
+                                               // No item is selected, everything is active
+                                               true
+                               );
+                       } );
+               } else if ( this.groups[ group ].exclusionType === 'explicit' ) {
+                       // Explicit behavior
+                       // - Go over the list of excluded filters to change their
+                       //   active states accordingly
+
+                       // For each item in the list, see if there are other selected
+                       // filters that also exclude it. If it does, it will still be
+                       // inactive.
+
+                       item.getExcludedFilters().forEach( function ( filterName ) {
+                               var filterItem = model.getItemByName( filterName );
+
+                               // Note to reduce confusion:
+                               // - item is the filter whose state changed and should exclude the other filters
+                               //   in its list of exclusions
+                               // - filterItem is the filter that is potentially being excluded by the current item
+                               // - anotherExcludingFilter is any other filter that excludes filterItem; we must check
+                               //   if that filter is selected, because if it is, we should not touch the excluded item
+                               if (
+                                       // Check if there are any filters (other than the current one)
+                                       // that also exclude the filterName
+                                       !model.excludedByMap[ filterName ].some( function ( anotherExcludingFilterName ) {
+                                               var anotherExcludingFilter = model.getItemByName( anotherExcludingFilterName );
+
+                                               return (
+                                                       anotherExcludingFilterName !== item.getName() &&
+                                                       anotherExcludingFilter.isSelected()
+                                               );
+                                       } )
+                               ) {
+                                       // Only change the state for filters that aren't
+                                       // also affected by other excluding selected filters
+                                       filterItem.toggleActive( !item.isSelected() );
+                               }
+                       } );
+               }
+       };
+
+       /**
+        * Set filters and preserve a group relationship based on
+        * the definition given by an object
+        *
+        * @param {Object} filters Filter group definition
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
+               var i, filterItem, selectedFilterNames, excludedFilters,
+                       model = this,
+                       items = [],
+                       addToMap = function ( excludedFilters ) {
+                               excludedFilters.forEach( function ( filterName ) {
+                                       model.excludedByMap[ filterName ] = model.excludedByMap[ filterName ] || [];
+                                       model.excludedByMap[ filterName ].push( filterItem.getName() );
+                               } );
+                       };
+
+               // Reset
+               this.clearItems();
+               this.groups = {};
+               this.excludedByMap = {};
+
+               $.each( filters, function ( group, data ) {
+                       model.groups[ group ] = model.groups[ group ] || {};
+                       model.groups[ group ].filters = model.groups[ group ].filters || [];
+
+                       model.groups[ group ].title = data.title;
+                       model.groups[ group ].type = data.type;
+                       model.groups[ group ].separator = data.separator || '|';
+                       model.groups[ group ].exclusionType = data.exclusionType || 'default';
+
+                       selectedFilterNames = [];
+                       for ( i = 0; i < data.filters.length; i++ ) {
+                               excludedFilters = data.filters[ i ].excludes || [];
+
+                               filterItem = new mw.rcfilters.dm.FilterItem( data.filters[ i ].name, {
+                                       group: group,
+                                       label: data.filters[ i ].label,
+                                       description: data.filters[ i ].description,
+                                       selected: data.filters[ i ].selected,
+                                       excludes: excludedFilters,
+                                       'default': data.filters[ i ].default
+                               } );
+
+                               // Map filters and what excludes them
+                               addToMap( excludedFilters );
+
+                               if ( data.type === 'send_unselected_if_any' ) {
+                                       // Store the default parameter state
+                                       // For this group type, parameter values are direct
+                                       model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default );
+                               } else if (
+                                       data.type === 'string_options' &&
+                                       data.filters[ i ].default
+                               ) {
+                                       selectedFilterNames.push( data.filters[ i ].name );
+                               }
+
+                               model.groups[ group ].filters.push( filterItem );
+                               items.push( filterItem );
+                       }
+
+                       if ( data.type === 'string_options' ) {
+                               // Store the default parameter group state
+                               // For this group, the parameter is group name and value is the names
+                               // of selected items
+                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].separator );
+                       }
+               } );
+
+               this.addItems( items );
+
+               this.emit( 'initialize' );
+       };
+
+       /**
+        * Get the names of all available filters
+        *
+        * @return {string[]} An array of filter names
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFilterNames = function () {
+               return this.getItems().map( function ( item ) { return item.getName(); } );
+       };
+
+       /**
+        * Get the object that defines groups and their filter items.
+        * The structure of this response:
+        * {
+        *   groupName: {
+        *     title: {string} Group title
+        *     type: {string} Group type
+        *     filters: {string[]} Filters in the group
+        *   }
+        * }
+        *
+        * @return {Object} Filter groups
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFilterGroups = function () {
+               return this.groups;
+       };
+
+       /**
+        * Get the current state of the filters.
+        *
+        * Checks whether the filter group is active. This means at least one
+        * filter is selected, but not all filters are selected.
+        *
+        * @param {string} groupName Group name
+        * @return {boolean} Filter group is active
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.isFilterGroupActive = function ( groupName ) {
+               var count = 0,
+                       filters = this.groups[ groupName ].filters;
+
+               filters.forEach( function ( filterItem ) {
+                       count += Number( filterItem.isSelected() );
+               } );
+
+               return (
+                       count > 0 &&
+                       count < filters.length
+               );
+       };
+
+       /**
+        * Update the representation of the parameters. These are the back-end
+        * parameters representing the filters, but they represent the given
+        * current state regardless of validity.
+        *
+        * This should only run after filters are already set.
+        *
+        * @param {Object} params Parameter state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.updateParameters = function ( params ) {
+               var model = this;
+
+               $.each( params, function ( name, value ) {
+                       // Only store the parameters that exist in the system
+                       if ( model.getItemByName( name ) ) {
+                               model.parameters[ name ] = value;
+                       }
+               } );
+       };
+
+       /**
+        * Get the value of a specific parameter
+        *
+        * @param {string} name Parameter name
+        * @return {number|string} Parameter value
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParamValue = function ( name ) {
+               return this.parameters[ name ];
+       };
+
+       /**
+        * Get the current selected state of the filters
+        *
+        * @return {Object} Filters selected state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getSelectedState = function () {
+               var i,
+                       items = this.getItems(),
+                       result = {};
+
+               for ( i = 0; i < items.length; i++ ) {
+                       result[ items[ i ].getName() ] = items[ i ].isSelected();
+               }
+
+               return result;
+       };
+
+       /**
+        * Get the current full state of the filters
+        *
+        * @return {Object} Filters full state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFullState = function () {
+               var i,
+                       items = this.getItems(),
+                       result = {};
+
+               for ( i = 0; i < items.length; i++ ) {
+                       result[ items[ i ].getName() ] = {
+                               selected: items[ i ].isSelected(),
+                               active: items[ i ].isActive()
+                       };
+               }
+
+               return result;
+       };
+
+       /**
+        * Get the default parameters object
+        *
+        * @return {Object} Default parameter values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getDefaultParams = function () {
+               return this.defaultParams;
+       };
+
+       /**
+        * Set all filter states to default values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.setFiltersToDefaults = function () {
+               var defaultFilterStates = this.getFiltersFromParameters( this.getDefaultParams() );
+
+               this.updateFilters( defaultFilterStates );
+       };
+
+       /**
+        * Analyze the groups and their filters and output an object representing
+        * the state of the parameters they represent.
+        *
+        * @param {Object} [filterGroups] An object defining the filter groups to
+        *  translate to parameters. Its structure must follow that of this.groups
+        *  see #getFilterGroups
+        * @return {Object} Parameter state object
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
+               var i, filterItems, anySelected, values,
+                       result = {},
+                       groupItems = filterGroups || this.getFilterGroups();
+
+               $.each( groupItems, function ( group, data ) {
+                       filterItems = data.filters;
+
+                       if ( data.type === 'send_unselected_if_any' ) {
+                               // First, check if any of the items are selected at all.
+                               // If none is selected, we're treating it as if they are
+                               // all false
+                               anySelected = filterItems.some( function ( filterItem ) {
+                                       return filterItem.isSelected();
+                               } );
+
+                               // Go over the items and define the correct values
+                               for ( i = 0; i < filterItems.length; i++ ) {
+                                       result[ filterItems[ i ].getName() ] = anySelected ?
+                                               Number( !filterItems[ i ].isSelected() ) : 0;
+                               }
+                       } else if ( data.type === 'string_options' ) {
+                               values = [];
+                               for ( i = 0; i < filterItems.length; i++ ) {
+                                       if ( filterItems[ i ].isSelected() ) {
+                                               values.push( filterItems[ i ].getName() );
+                                       }
+                               }
+
+                               if ( values.length === 0 || values.length === filterItems.length ) {
+                                       result[ group ] = 'all';
+                               } else {
+                                       result[ group ] = values.join( data.separator );
+                               }
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Sanitize value group of a string_option groups type
+        * Remove duplicates and make sure to only use valid
+        * values.
+        *
+        * @private
+        * @param {string} groupName Group name
+        * @param {string[]} valueArray Array of values
+        * @return {string[]} Array of valid values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
+               var result = [],
+                       validNames = this.groups[ groupName ].filters.map( function ( filterItem ) {
+                               return filterItem.getName();
+                       } );
+
+               if ( valueArray.indexOf( 'all' ) > -1 ) {
+                       // If anywhere in the values there's 'all', we
+                       // treat it as if only 'all' was selected.
+                       // Example: param=valid1,valid2,all
+                       // Result: param=all
+                       return [ 'all' ];
+               }
+
+               // Get rid of any dupe and invalid parameter, only output
+               // valid ones
+               // Example: param=valid1,valid2,invalid1,valid1
+               // Result: param=valid1,valid2
+               valueArray.forEach( function ( value ) {
+                       if (
+                               validNames.indexOf( value ) > -1 &&
+                               result.indexOf( value ) === -1
+                       ) {
+                               result.push( value );
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Check whether the current filter state is set to all false.
+        *
+        * @return {boolean} Current filters are all empty
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.areCurrentFiltersEmpty = function () {
+               var currFilters = this.getSelectedState();
+
+               return Object.keys( currFilters ).every( function ( filterName ) {
+                       return !currFilters[ filterName ];
+               } );
+       };
+
+       /**
+        * Check whether the default values of the filters are all false.
+        *
+        * @return {boolean} Default filters are all false
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.areDefaultFiltersEmpty = function () {
+               var defaultFilters;
+
+               if ( this.defaultFiltersEmpty !== null ) {
+                       // We only need to do this test once,
+                       // because defaults are set once per session
+                       defaultFilters = this.getFiltersFromParameters();
+                       this.defaultFiltersEmpty = Object.keys( defaultFilters ).every( function ( filterName ) {
+                               return !defaultFilters[ filterName ];
+                       } );
+               }
+
+               return this.defaultFiltersEmpty;
+       };
+
+       /**
+        * This is the opposite of the #getParametersFromFilters method; this goes over
+        * the given parameters and translates into a selected/unselected value in the filters.
+        *
+        * @param {Object} params Parameters query object
+        * @return {Object} Filter state object
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) {
+               var i, filterItem,
+                       groupMap = {},
+                       model = this,
+                       base = this.getDefaultParams(),
+                       result = {};
+
+               params = $.extend( {}, base, params );
+
+               $.each( params, function ( paramName, paramValue ) {
+                       // Find the filter item
+                       filterItem = model.getItemByName( paramName );
+                       // Ignore if no filter item exists
+                       if ( filterItem ) {
+                               groupMap[ filterItem.getGroup() ] = groupMap[ filterItem.getGroup() ] || {};
+
+                               // Mark the group if it has any items that are selected
+                               groupMap[ filterItem.getGroup() ].hasSelected = (
+                                       groupMap[ filterItem.getGroup() ].hasSelected ||
+                                       !!Number( paramValue )
+                               );
+
+                               // Add the relevant filter into the group map
+                               groupMap[ filterItem.getGroup() ].filters = groupMap[ filterItem.getGroup() ].filters || [];
+                               groupMap[ filterItem.getGroup() ].filters.push( filterItem );
+                       } else if ( model.groups.hasOwnProperty( paramName ) ) {
+                               // This parameter represents a group (values are the filters)
+                               // this is equivalent to checking if the group is 'string_options'
+                               groupMap[ paramName ] = { filters: model.groups[ paramName ].filters };
+                       }
+               } );
+
+               // Now that we know the groups' selection states, we need to go over
+               // the filters in the groups and mark their selected states appropriately
+               $.each( groupMap, function ( group, data ) {
+                       var paramValues, filterItem,
+                               allItemsInGroup = data.filters;
+
+                       if ( model.groups[ group ].type === 'send_unselected_if_any' ) {
+                               for ( i = 0; i < allItemsInGroup.length; i++ ) {
+                                       filterItem = allItemsInGroup[ i ];
+
+                                       result[ filterItem.getName() ] = data.hasSelected ?
+                                               // Flip the definition between the parameter
+                                               // state and the filter state
+                                               // This is what the 'toggleSelected' value of the filter is
+                                               !Number( params[ filterItem.getName() ] ) :
+                                               // Otherwise, there are no selected items in the
+                                               // group, which means the state is false
+                                               false;
+                               }
+                       } else if ( model.groups[ group ].type === 'string_options' ) {
+                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].separator ) );
+
+                               for ( i = 0; i < allItemsInGroup.length; i++ ) {
+                                       filterItem = allItemsInGroup[ i ];
+
+                                       result[ filterItem.getName() ] = (
+                                                       // If it is the word 'all'
+                                                       paramValues.length === 1 && paramValues[ 0 ] === 'all' ||
+                                                       // All values are written
+                                                       paramValues.length === model.groups[ group ].filters.length
+                                               ) ?
+                                               // All true (either because all values are written or the term 'all' is written)
+                                               // is the same as all filters set to false
+                                               false :
+                                               // Otherwise, the filter is selected only if it appears in the parameter values
+                                               paramValues.indexOf( filterItem.getName() ) > -1;
+                               }
+                       }
+               } );
+               return result;
+       };
+
+       /**
+        * Get the item that matches the given name
+        *
+        * @param {string} name Filter name
+        * @return {mw.rcfilters.dm.FilterItem} Filter item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getItemByName = function ( name ) {
+               return this.getItems().filter( function ( item ) {
+                       return name === item.getName();
+               } )[ 0 ];
+       };
+
+       /**
+        * Set all filters to false or empty/all
+        * This is equivalent to display all.
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.emptyAllFilters = function () {
+               var filters = {};
+
+               this.getItems().forEach( function ( filterItem ) {
+                       filters[ filterItem.getName() ] = false;
+               } );
+
+               // Update filters
+               this.updateFilters( filters );
+       };
+
+       /**
+        * Toggle selected state of items by their names
+        *
+        * @param {Object} filterDef Filter definitions
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.updateFilters = function ( filterDef ) {
+               var name, filterItem;
+
+               for ( name in filterDef ) {
+                       filterItem = this.getItemByName( name );
+                       filterItem.toggleSelected( filterDef[ name ] );
+               }
+       };
+
+       /**
+        * Find items whose labels match the given string
+        *
+        * @param {string} str Search string
+        * @return {Object} An object of items to show
+        *  arranged by their group names
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( str ) {
+               var i,
+                       result = {},
+                       items = this.getItems();
+
+               // Normalize so we can search strings regardless of case
+               str = str.toLowerCase();
+               for ( i = 0; i < items.length; i++ ) {
+                       if ( items[ i ].getLabel().toLowerCase().indexOf( str ) > -1 ) {
+                               result[ items[ i ].getGroup() ] = result[ items[ i ].getGroup() ] || [];
+                               result[ items[ i ].getGroup() ].push( items[ i ] );
+                       }
+               }
+               return result;
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
new file mode 100644 (file)
index 0000000..28d9f28
--- /dev/null
@@ -0,0 +1,72 @@
+( function ( mw ) {
+       /**
+        * Controller for the filters in Recent Changes
+        *
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        */
+       mw.rcfilters.Controller = function MwRcfiltersController( model ) {
+               this.model = model;
+               // TODO: When we are ready, update the URL when a filter is updated
+               // this.model.connect( this, { itemUpdate: 'updateURL' } );
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.Controller );
+
+       /**
+        * Initialize the filter and parameter states
+        */
+       mw.rcfilters.Controller.prototype.initialize = function () {
+               var uri = new mw.Uri();
+
+               // Give the model a full parameter state from which to
+               // update the filters
+               this.model.updateFilters(
+                       // Translate the url params to filter select states
+                       this.model.getFiltersFromParameters( uri.query )
+               );
+       };
+
+       /**
+        * Reset to default filters
+        */
+       mw.rcfilters.Controller.prototype.resetToDefaults = function () {
+               this.model.setFiltersToDefaults();
+       };
+
+       /**
+        * Empty all selected filters
+        */
+       mw.rcfilters.Controller.prototype.emptyFilters = function () {
+               this.model.emptyAllFilters();
+       };
+
+       /**
+        * Update the state of a filter
+        *
+        * @param {string} filterName Filter name
+        * @param {boolean} isSelected Filter selected state
+        */
+       mw.rcfilters.Controller.prototype.updateFilter = function ( filterName, isSelected ) {
+               var obj = {};
+
+               obj[ filterName ] = isSelected;
+               this.model.updateFilters( obj );
+       };
+
+       /**
+        * Update the URL of the page to reflect current filters
+        */
+       mw.rcfilters.Controller.prototype.updateURL = function () {
+               var uri = new mw.Uri();
+
+               // Add to existing queries in URL
+               // TODO: Clean up the list of filters; perhaps 'falsy' filters
+               // shouldn't appear at all? Or compare to existing query string
+               // and see if current state of a specific filter is needed?
+               uri.extend( this.model.getParametersFromFilters() );
+
+               // Update the URL itself
+               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
new file mode 100644 (file)
index 0000000..7b29d4b
--- /dev/null
@@ -0,0 +1,226 @@
+/*!
+ * JavaScript for Special:RecentChanges
+ */
+( function ( mw, $ ) {
+       /**
+        * @class mw.rcfilters
+        * @singleton
+        */
+       var rcfilters = {
+               /** */
+               init: function () {
+                       var model = new mw.rcfilters.dm.FiltersViewModel(),
+                               controller = new mw.rcfilters.Controller( model ),
+                               widget = new mw.rcfilters.ui.FilterWrapperWidget( controller, model );
+
+                       model.initializeFilters( {
+                               registration: {
+                                       title: mw.msg( 'rcfilters-filtergroup-registration' ),
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hideliu',
+                                                       label: mw.msg( 'rcfilters-filter-registered-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-registered-description' )
+                                               },
+                                               {
+                                                       name: 'hideanons',
+                                                       label: mw.msg( 'rcfilters-filter-unregistered-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-unregistered-description' )
+                                               }
+                                       ]
+                               },
+                               userExpLevel: {
+                                       title: mw.msg( 'rcfilters-filtergroup-userExpLevel' ),
+                                       // Type 'string_options' means that the group is evaluated by
+                                       // string values separated by comma; for example, param=opt1,opt2
+                                       // If all options are selected they are replaced by the term "all".
+                                       // The filters are the values for the parameter defined by the group.
+                                       // ** In this case, the parameter name is the group name. **
+                                       type: 'string_options',
+                                       separator: ',',
+                                       filters: [
+                                               {
+                                                       name: 'newcomer',
+                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-description' )
+                                               },
+                                               {
+                                                       name: 'learner',
+                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-learner-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-learner-description' )
+                                               },
+                                               {
+                                                       name: 'experienced',
+                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-experienced-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-experienced-description' )
+                                               }
+                                       ]
+                               },
+                               authorship: {
+                                       title: mw.msg( 'rcfilters-filtergroup-authorship' ),
+                                       // Type 'send_unselected_if_any' means that the controller will go over
+                                       // all unselected filters in the group and use their parameters
+                                       // as truthy in the query string.
+                                       // This is to handle the "negative" filters. We are showing users
+                                       // a positive message ("Show xxx") but the filters themselves are
+                                       // based on "hide YYY". The purpose of this is to correctly map
+                                       // the functionality to the UI, whether we are dealing with 2
+                                       // parameters in the group or more.
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidemyself',
+                                                       label: mw.msg( 'rcfilters-filter-editsbyself-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-editsbyself-description' )
+                                               },
+                                               {
+                                                       name: 'hidebyothers',
+                                                       label: mw.msg( 'rcfilters-filter-editsbyother-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-editsbyother-description' )
+                                               }
+                                       ]
+                               },
+                               automated: {
+                                       title: mw.msg( 'rcfilters-filtergroup-automated' ),
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidebots',
+                                                       label: mw.msg( 'rcfilters-filter-bots-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-bots-description' ),
+                                                       'default': true
+                                               },
+                                               {
+                                                       name: 'hidehumans',
+                                                       label: mw.msg( 'rcfilters-filter-humans-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-humans-description' ),
+                                                       'default': false
+                                               }
+                                       ]
+                               },
+                               significance: {
+                                       title: mw.msg( 'rcfilters-filtergroup-significance' ),
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hideminor',
+                                                       label: mw.msg( 'rcfilters-filter-minor-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-minor-description' )
+                                               },
+                                               {
+                                                       name: 'hidemajor',
+                                                       label: mw.msg( 'rcfilters-filter-major-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-major-description' )
+                                               }
+                                       ]
+                               },
+                               changetype: {
+                                       title: mw.msg( 'rcfilters-filtergroup-changetype' ),
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidepageedits',
+                                                       label: mw.msg( 'rcfilters-filter-pageedits-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-pageedits-description' ),
+                                                       'default': false
+                                               },
+                                               {
+                                                       name: 'hidenewpages',
+                                                       label: mw.msg( 'rcfilters-filter-newpages-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-newpages-description' ),
+                                                       'default': false
+                                               },
+                                               {
+                                                       name: 'hidecategorization',
+                                                       label: mw.msg( 'rcfilters-filter-categorization-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-categorization-description' ),
+                                                       'default': true
+                                               },
+                                               {
+                                                       name: 'hidelog',
+                                                       label: mw.msg( 'rcfilters-filter-logactions-label' ),
+                                                       description: mw.msg( 'rcfilters-filter-logactions-description' ),
+                                                       'default': false
+                                               }
+                                       ]
+                               }
+                       } );
+
+                       $( '.rcoptions' ).before( widget.$element );
+
+                       // Initialize values
+                       controller.initialize();
+
+                       // HACK: Remove old-style filter links for filters handled by the widget
+                       // Ideally the widget would handle all filters and we'd just remove .rcshowhide entirely
+                       $( '.rcshowhide' ).children().each( function () {
+                               // HACK: Interpret the class name to get the filter name
+                               // This should really be set as a data attribute
+                               var i,
+                                       name = null,
+                                       // Some of the older browsers we support don't have .classList,
+                                       // so we have to interpret the class attribute manually.
+                                       classes = this.getAttribute( 'class' ).split( ' ' );
+                               for ( i = 0; i < classes.length; i++ ) {
+                                       if ( classes[ i ].substr( 0, 'rcshow'.length ) === 'rcshow' ) {
+                                               name = classes[ i ].substr( 'rcshow'.length );
+                                               break;
+                                       }
+                               }
+                               if ( name === null ) {
+                                       return;
+                               }
+                               if ( name === 'hidemine' ) {
+                                       // HACK: the span for hidemyself is called hidemine
+                                       name = 'hidemyself';
+                               }
+                               // This span corresponds to a filter that's in our model, so remove it
+                               if ( model.getItemByName( name ) ) {
+                                       // HACK: Remove the text node after the span.
+                                       // If there isn't one, we're at the end, so remove the text node before the span.
+                                       // This would be unnecessary if we added separators with CSS.
+                                       if ( this.nextSibling && this.nextSibling.nodeType === Node.TEXT_NODE ) {
+                                               this.parentNode.removeChild( this.nextSibling );
+                                       } else if ( this.previousSibling && this.previousSibling.nodeType === Node.TEXT_NODE ) {
+                                               this.parentNode.removeChild( this.previousSibling );
+                                       }
+                                       // Remove the span itself
+                                       this.parentNode.removeChild( this );
+                               }
+                       } );
+
+                       $( '.rcoptions form' ).submit( function () {
+                               var $form = $( this );
+
+                               // Get current filter values
+                               $.each( model.getParametersFromFilters(), function ( paramName, paramValue ) {
+                                       var $existingInput = $form.find( 'input[name=' + paramName + ']' );
+                                       // Check if the hidden input already exists
+                                       // This happens if the parameter was already given
+                                       // on load
+                                       if ( $existingInput.length ) {
+                                               // Update the value
+                                               $existingInput.val( paramValue );
+                                       } else {
+                                               // Append hidden fields with filter values
+                                               $form.append(
+                                                       $( '<input>' )
+                                                               .attr( 'type', 'hidden' )
+                                                               .attr( 'name', paramName )
+                                                               .val( paramValue )
+                                               );
+                                       }
+                               } );
+
+                               // Continue the submission process
+                               return true;
+                       } );
+               }
+       };
+
+       $( rcfilters.init );
+
+       module.exports = rcfilters;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.js
new file mode 100644 (file)
index 0000000..3ddb5a0
--- /dev/null
@@ -0,0 +1,3 @@
+( function ( mw ) {
+       mw.rcfilters = { dm: {}, ui: {} };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less
new file mode 100644 (file)
index 0000000..2ff731c
--- /dev/null
@@ -0,0 +1,36 @@
+.mw-rcfilters-ui-filterCapsuleMultiselectWidget {
+       &-content-title {
+               font-weight: bold;
+               color: #54595d;
+       }
+
+       &-item-inactive {
+               opacity: 0.5;
+       }
+
+       &-emptyFilters {
+               color: #72777d;
+       }
+
+       &-table {
+               display: table;
+               width: 100%;
+       }
+
+       &-row {
+               display: table-row;
+       }
+
+       &-cell {
+               display: table-cell;
+
+               &:last-child {
+                       text-align: right;
+               }
+       }
+
+       .oo-ui-capsuleItemWidget {
+               color: #222;
+               background-color: #fff;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
new file mode 100644 (file)
index 0000000..3723916
--- /dev/null
@@ -0,0 +1,26 @@
+.mw-rcfilters-ui-filterGroupWidget {
+       padding-bottom: 0.5em;
+
+       &-title {
+               // TODO: Unify colors with official design palette
+               background: #eaecf0;
+               padding: 0.5em 0.75em;
+               color: #555a5d;
+       }
+
+       &-active {
+               .mw-rcfilters-ui-filterGroupWidget-title {
+                       font-weight: bold;
+               }
+       }
+
+       &-invalid-notice {
+               padding: 0.5em;
+               font-style: italic;
+               display: none;
+
+               .mw-rcfilters-ui-filterGroupWidget-invalid & {
+                       display: block;
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less
new file mode 100644 (file)
index 0000000..912e75c
--- /dev/null
@@ -0,0 +1,22 @@
+.mw-rcfilters-ui-filterItemWidget {
+       padding-left: 0.5em;
+
+       &-label {
+               &-title {
+                       font-weight: bold;
+                       font-size: 1.2em;
+                       color: #222;
+               }
+               &-desc {
+                       color: #464a4f;
+               }
+       }
+
+       .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+               margin-bottom: 0 !important;
+       }
+
+       &-inactive {
+               opacity: 0.5;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
new file mode 100644 (file)
index 0000000..f138d7e
--- /dev/null
@@ -0,0 +1,33 @@
+.mw-rcfilters-ui-filterWrapperWidget {
+       width: 100%;
+
+       .oo-ui-capsuleMultiselectWidget {
+               max-width: none;
+
+               &.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
+                       // TODO: Unify colors with official design palette
+                       background-color: #f8f9fa;
+                       border: 1px solid #a2a9b1;
+                       min-height: 5.5em;
+                       padding: 0.75em;
+
+               }
+       }
+
+       &-popup {
+               // We have to override OOUI's definition, which is set
+               // on the inline style of the popup
+               margin-top: 2.4em !important;
+               max-width: 650px;
+       }
+
+       &-search {
+               max-width: none;
+               margin-top: -0.5em;
+       }
+
+       &-capsule-invalid-filter {
+               // TODO: Unify colors with official design palette
+               background: red;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less
new file mode 100644 (file)
index 0000000..b874e0f
--- /dev/null
@@ -0,0 +1,16 @@
+.mw-rcfilters-ui-filtersListWidget {
+       &-title {
+               font-size: 1.2em;
+               padding: 0.75em;
+               // TODO: Unify colors with official design palette
+               color: #54595d;
+               border-bottom: 1px solid #c8ccd1;
+               background: #f8f9fa;
+       }
+
+       &-noresults {
+               padding: 0.5em;
+               // TODO: Unify colors with official design palette
+               color: #666;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
new file mode 100644 (file)
index 0000000..c498ce9
--- /dev/null
@@ -0,0 +1,184 @@
+( function ( mw, $ ) {
+       /**
+        * Filter-specific CapsuleMultiselectWidget
+        *
+        * @extends OO.ui.CapsuleMultiselectWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model RCFilters view model
+        * @param {OO.ui.InputWidget} filterInput A filter input that focuses the capsule widget
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget = function MwRcfiltersUiFilterCapsuleMultiselectWidget( controller, model, filterInput, config ) {
+               // Parent
+               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( {
+                       $autoCloseIgnore: filterInput.$element
+               }, config ) );
+
+               this.controller = controller;
+               this.model = model;
+               this.filterInput = filterInput;
+
+               this.$content.prepend(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-content-title' )
+                               .text( mw.msg( 'rcfilters-activefilters' ) )
+               );
+
+               this.resetButton = new OO.ui.ButtonWidget( {
+                       icon: 'trash',
+                       framed: false,
+                       title: mw.msg( 'rcfilters-clear-all-filters' ),
+                       classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-resetButton' ]
+               } );
+
+               this.emptyFilterMessage = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-empty-filter' ),
+                       classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-emptyFilters' ]
+               } );
+
+               // Events
+               this.resetButton.connect( this, { click: 'onResetButtonClick' } );
+               this.model.connect( this, { itemUpdate: 'onModelItemUpdate' } );
+               // Add the filterInput as trigger
+               this.filterInput.$input
+                       .on( 'focus', this.focus.bind( this ) );
+
+               // Initialize
+               this.$content.append( this.emptyFilterMessage.$element );
+               this.$handle
+                       .append(
+                               // The content and button should appear side by side regardless of how
+                               // wide the button is; the button also changes its width depending
+                               // on language and its state, so the safest way to present both side
+                               // by side is with a table layout
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-table' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-content' )
+                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell' )
+                                                                       .append( this.$content ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell' )
+                                                                       .append( this.resetButton.$element )
+                                                       )
+                                       )
+                       );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget' );
+
+               this.reevaluateResetRestoreState();
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterCapsuleMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+
+       /* Events */
+
+       /**
+        * @event remove
+        * @param {string[]} filters Array of names of removed filters
+        *
+        * Filters were removed
+        */
+
+       /* Methods */
+
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelItemUpdate = function () {
+               // Re-evaluate reset state
+               this.reevaluateResetRestoreState();
+       };
+
+       /**
+        * Respond to click event on the reset button
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onResetButtonClick = function () {
+               if ( this.model.areCurrentFiltersEmpty() ) {
+                       // Reset to default filters
+                       this.controller.resetToDefaults();
+               } else {
+                       // Reset to have no filters
+                       this.controller.emptyFilters();
+               }
+       };
+
+       /**
+        * Reevaluate the restore state for the widget between setting to defaults and clearing all filters
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.reevaluateResetRestoreState = function () {
+               var defaultsAreEmpty = this.model.areDefaultFiltersEmpty(),
+                       currFiltersAreEmpty = this.model.areCurrentFiltersEmpty(),
+                       hideResetButton = currFiltersAreEmpty && defaultsAreEmpty;
+
+               this.resetButton.setIcon(
+                       currFiltersAreEmpty ? 'history' : 'trash'
+               );
+
+               this.resetButton.setLabel(
+                       currFiltersAreEmpty ? mw.msg( 'rcfilters-restore-default-filters' ) : ''
+               );
+
+               this.resetButton.toggle( !hideResetButton );
+               this.emptyFilterMessage.toggle( currFiltersAreEmpty );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.focus = function () {
+               // Override this method; we don't want to focus on the popup, and we
+               // don't want to bind the size to the handle.
+               if ( !this.isDisabled() ) {
+                       this.popup.toggle( true );
+                       this.filterInput.$input.get( 0 ).focus();
+               }
+               return this;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
+               // HACK can be removed once I21b8cff4048 is merged in oojs-ui
+               this.focus();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
+               // Parent
+               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items );
+
+               this.emit( 'remove', items.map( function ( item ) { return item.getData(); } ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onKeyDown = function () {};
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onPopupFocusOut = function () {};
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.clearInput = function () {
+               if ( this.filterInput ) {
+                       this.filterInput.setValue( '' );
+               }
+               this.menu.toggle( false );
+               this.menu.selectItem();
+               this.menu.highlightItem();
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js
new file mode 100644 (file)
index 0000000..2723258
--- /dev/null
@@ -0,0 +1,60 @@
+( function ( mw, $ ) {
+       /**
+        * A group of filters
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.GroupWidget
+        * @mixins OO.ui.mixin.LabelElement
+        *
+        * @constructor
+        * @param {string} name Group name
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( name, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FilterGroupWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.GroupWidget.call( this, config );
+               OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+                       $label: $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-title' )
+               } ) );
+
+               this.name = name;
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterGroupWidget' )
+                       .append(
+                               this.$label,
+                               this.$group
+                                       .addClass( 'mw-rcfilters-ui-filterGroupWidget-group' )
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterGroupWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FilterGroupWidget, OO.ui.mixin.GroupWidget );
+       OO.mixinClass( mw.rcfilters.ui.FilterGroupWidget, OO.ui.mixin.LabelElement );
+
+       /**
+        * Get the group name
+        *
+        * @return {string} Group name
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Toggle the active state of this group
+        *
+        * @param {boolean} isActive The group is active
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.toggleActiveState = function ( isActive ) {
+               this.$element.toggleClass( 'mw-rcfilters-ui-filterGroupWidget-active', isActive );
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js
new file mode 100644 (file)
index 0000000..f353051
--- /dev/null
@@ -0,0 +1,97 @@
+( function ( mw, $ ) {
+       /**
+        * A widget representing a single toggle filter
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.FilterItem} model Filter item model
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FilterItemWidget = function MwRcfiltersUiFilterItemWidget( controller, model, config ) {
+               var layout,
+                       $label = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterItemWidget-label' );
+
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FilterItemWidget.parent.call( this, config );
+
+               this.controller = controller;
+               this.model = model;
+
+               this.checkboxWidget = new OO.ui.CheckboxInputWidget( {
+                       value: this.model.getName(),
+                       selected: this.model.isSelected()
+               } );
+
+               $label.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterItemWidget-label-title' )
+                               .text( this.model.getLabel() )
+               );
+               if ( this.model.getDescription() ) {
+                       $label.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-filterItemWidget-label-desc' )
+                                       .text( this.model.getDescription() )
+                       );
+               }
+
+               layout = new OO.ui.FieldLayout( this.checkboxWidget, {
+                       label: $label,
+                       align: 'inline'
+               } );
+
+               // Event
+               this.checkboxWidget.connect( this, { change: 'onCheckboxChange' } );
+               this.model.connect( this, { update: 'onModelUpdate' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterItemWidget' )
+                       .append(
+                               layout.$element
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterItemWidget, OO.ui.Widget );
+
+       /* Methods */
+
+       /**
+        * Respond to checkbox change.
+        * NOTE: This event is emitted both for deliberate user action and for
+        * a change that the code requests ('setSelected')
+        *
+        * @param {boolean} isSelected The checkbox is selected
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.onCheckboxChange = function ( isSelected ) {
+               this.controller.updateFilter( this.model.getName(), isSelected );
+       };
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.onModelUpdate = function () {
+               this.checkboxWidget.setSelected( this.model.isSelected() );
+
+               this.$element.toggleClass(
+                       'mw-rcfilters-ui-filterItemWidget-inactive',
+                       !this.model.isActive()
+               );
+       };
+
+       /**
+        * Get the name of this filter
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.getName = function () {
+               return this.model.getName();
+       };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
new file mode 100644 (file)
index 0000000..34cc240
--- /dev/null
@@ -0,0 +1,165 @@
+( function ( mw ) {
+       /**
+        * List displaying all filter groups
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {Object} config Configuration object
+        * @cfg {Object} [filters] A definition of the filter groups in this list
+        */
+       mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FilterWrapperWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.controller = controller;
+               this.model = model;
+               this.filtersInCapsule = [];
+
+               this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
+                       this.controller,
+                       this.model,
+                       {
+                               label: mw.msg( 'rcfilters-filterlist-title' )
+                       }
+               );
+
+               this.textInput = new OO.ui.TextInputWidget( {
+                       classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
+                       icon: 'search',
+                       placeholder: mw.msg( 'rcfilters-search-placeholder' )
+               } );
+
+               this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
+                       popup: {
+                               $content: this.filterPopup.$element,
+                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ]
+                       }
+               } );
+
+               // Events
+               this.model.connect( this, {
+                       initialize: 'onModelInitialize',
+                       itemUpdate: 'onModelItemUpdate'
+               } );
+               this.textInput.connect( this, {
+                       change: 'onTextInputChange'
+               } );
+               this.capsule.connect( this, {
+                       remove: 'onCapsuleRemoveItem'
+               } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
+                       .append( this.capsule.$element, this.textInput.$element );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to text input change
+        *
+        * @param {string} newValue Current value
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
+               // Filter the results
+               this.filterPopup.filter( this.model.findMatches( newValue ) );
+       };
+
+       /**
+        * Respond to an event where an item is removed from the capsule.
+        * This is the case where a user actively removes a filter box from the capsule widget.
+        *
+        * @param {string[]} filterNames An array of filter names that were removed
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleRemoveItem = function ( filterNames ) {
+               var filterItem,
+                       widget = this;
+
+               filterNames.forEach( function ( filterName ) {
+                       // Go over filters
+                       filterItem = widget.model.getItemByName( filterName );
+                       filterItem.toggleSelected( false );
+               } );
+       };
+
+       /**
+        * Respond to model update event and set up the available filters to choose
+        * from.
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
+               var items,
+                       wrapper = this,
+                       filters = this.model.getItems();
+
+               // Reset
+               this.capsule.getMenu().clearItems();
+
+               // Insert hidden options for the capsule to get its item data from
+               items = filters.map( function ( filterItem ) {
+                       return new OO.ui.MenuOptionWidget( {
+                               data: filterItem.getName(),
+                               label: filterItem.getLabel()
+                       } );
+               } );
+
+               this.capsule.getMenu().addItems( items );
+
+               // Add defaults to capsule. We have to do this
+               // after we added to the capsule menu, since that's
+               // how the capsule multiselect widget knows which
+               // object to add
+               filters.forEach( function ( filterItem ) {
+                       if ( filterItem.isSelected() ) {
+                               wrapper.addCapsuleItemFromName( filterItem.getName() );
+                       }
+               } );
+       };
+
+       /**
+        * Respond to model item update
+        *
+        * @param {mw.rcfilters.dm.FilterItem} item Filter item that was updated
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function ( item ) {
+               var widget = this;
+
+               if ( item.isSelected() ) {
+                       this.addCapsuleItemFromName( item.getName() );
+               } else {
+                       this.capsule.removeItemsFromData( [ item.getName() ] );
+               }
+
+               // Toggle the active state of the group
+               this.filterPopup.getItems().forEach( function ( groupWidget ) {
+                       if ( groupWidget.getName() === item.getGroup() ) {
+                               groupWidget.toggleActiveState( widget.model.isFilterGroupActive( groupWidget.getName() ) );
+                       }
+               } );
+       };
+
+       /**
+        * Add a capsule item by its filter name
+        *
+        * @param {string} itemName Filter name
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.addCapsuleItemFromName = function ( itemName ) {
+               var item = this.model.getItemByName( itemName );
+
+               this.capsule.addItemsFromData( [ itemName ] );
+
+               // Deal with active/inactive capsule filter items
+               this.capsule.getItemFromData( itemName ).$element
+                       .toggleClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-item-inactive', !item.isActive() );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js
new file mode 100644 (file)
index 0000000..f5ec1fc
--- /dev/null
@@ -0,0 +1,154 @@
+( function ( mw, $ ) {
+       /**
+        * List displaying all filter groups
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.GroupWidget
+        * @mixins OO.ui.mixin.LabelElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FiltersListWidget = function MwRcfiltersUiFiltersListWidget( controller, model, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FiltersListWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.GroupWidget.call( this, config );
+               OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+                       $label: $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filtersListWidget-title' )
+               } ) );
+
+               this.controller = controller;
+               this.model = model;
+
+               this.noResultsLabel = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-filterlist-noresults' ),
+                       classes: [ 'mw-rcfilters-ui-filtersListWidget-noresults' ]
+               } );
+
+               // Events
+               this.model.connect( this, {
+                       initialize: 'onModelInitialize'
+               } );
+
+               // Initialize
+               this.showNoResultsMessage( false );
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filtersListWidget' )
+                       .append(
+                               this.$label,
+                               this.$group
+                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-group' ),
+                               this.noResultsLabel.$element
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FiltersListWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FiltersListWidget, OO.ui.mixin.GroupWidget );
+       OO.mixinClass( mw.rcfilters.ui.FiltersListWidget, OO.ui.mixin.LabelElement );
+
+       /* Methods */
+
+       /**
+        * Respond to initialize event from the model
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.onModelInitialize = function () {
+               var i, group, groupWidget,
+                       itemWidgets = [],
+                       groupWidgets = [],
+                       groups = this.model.getFilterGroups();
+
+               // Reset
+               this.clearItems();
+
+               for ( group in groups ) {
+                       groupWidget = new mw.rcfilters.ui.FilterGroupWidget( group, {
+                               label: groups[ group ].title
+                       } );
+                       groupWidgets.push( groupWidget );
+
+                       itemWidgets = [];
+                       if ( groups[ group ].filters ) {
+                               for ( i = 0; i < groups[ group ].filters.length; i++ ) {
+                                       itemWidgets.push(
+                                               new mw.rcfilters.ui.FilterItemWidget(
+                                                       this.controller,
+                                                       groups[ group ].filters[ i ],
+                                                       {
+                                                               label: groups[ group ].filters[ i ].getLabel(),
+                                                               description: groups[ group ].filters[ i ].getDescription()
+                                                       }
+                                               )
+                                       );
+                               }
+
+                               groupWidget.addItems( itemWidgets );
+                       }
+               }
+
+               this.addItems( groupWidgets );
+       };
+
+       /**
+        * Switch between showing the 'no results' message for filtering results or the result list.
+        *
+        * @param {boolean} showNoResults Show no results message
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.showNoResultsMessage = function ( showNoResults ) {
+               this.noResultsLabel.toggle( !!showNoResults );
+               this.$group.toggleClass( 'oo-ui-element-hidden', !!showNoResults );
+       };
+
+       /**
+        * Show only the items matching with the models in the given list
+        *
+        * @param {Object} groupItems An object of items to show
+        *  arranged by their group names
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.filter = function ( groupItems ) {
+               var i, j, groupName, itemWidgets,
+                       groupWidgets = this.getItems(),
+                       hasItemWithName = function ( itemArr, name ) {
+                               return !!itemArr.filter( function ( item ) {
+                                       return item.getName() === name;
+                               } ).length;
+                       };
+
+               if ( $.isEmptyObject( groupItems ) ) {
+                       // No results. Hide everything, show only 'no results'
+                       // message
+                       this.showNoResultsMessage( true );
+                       return;
+               }
+
+               this.showNoResultsMessage( false );
+               for ( i = 0; i < groupWidgets.length; i++ ) {
+                       groupName = groupWidgets[ i ].getName();
+
+                       // If this group widget is in the filtered results,
+                       // show it - otherwise, hide it
+                       groupWidgets[ i ].toggle( !!groupItems[ groupName ] );
+
+                       if ( !groupItems[ groupName ] ) {
+                               // Continue to next group
+                               continue;
+                       }
+
+                       // We have items to show
+                       itemWidgets = groupWidgets[ i ].getItems();
+                       for ( j = 0; j < itemWidgets.length; j++ ) {
+                               // Only show items that are in the filtered list
+                               itemWidgets[ j ].toggle(
+                                       hasItemWithName( groupItems[ groupName ], itemWidgets[ j ].getName() )
+                               );
+                       }
+               }
+       };
+}( mediaWiki, jQuery ) );
index e1df01d..87e209e 100644 (file)
@@ -123,7 +123,6 @@ table.toc td {
 /* Images */
 /* @noflip */div.floatright, table.floatright {
        margin: 0 0 .5em .5em;
-       border: 0;
 }
 
 div.floatright p {
@@ -132,7 +131,6 @@ div.floatright p {
 
 /* @noflip */div.floatleft, table.floatleft {
        margin: 0 .5em .5em 0;
-       border: 0;
 }
 
 div.floatleft p {
@@ -158,6 +156,7 @@ div.thumbinner {
 }
 
 html .thumbimage {
+       background-color: #fff;
        border: 1px solid #c8ccd1;
 }
 
index 33ceb48..7d096f9 100644 (file)
@@ -88,8 +88,8 @@ img {
 
 hr {
        height: 1px;
-       color: #aaa;
-       background-color: #aaa;
+       color: #a2a9b1;
+       background-color: #a2a9b1;
        border: 0;
        margin: .2em 0;
 }
@@ -108,7 +108,7 @@ h6 {
        overflow: hidden;
        padding-top: .5em;
        padding-bottom: .17em;
-       border-bottom: 1px solid #aaa;
+       border-bottom: 1px solid #a2a9b1;
 }
 
 h1 {
@@ -227,7 +227,7 @@ table {
 
 /* Forms */
 fieldset {
-       border: 1px solid #2f6fab;
+       border: 1px solid #2a4b8d;
        margin: 1em 0 1em 0;
        padding: 0 1em 1em;
 }
index 60155fd..e9922f8 100644 (file)
                                                } );
                                        } else if ( Util.apiBool( pi.multi ) ) {
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
-                                                       allowArbitrary: true
+                                                       allowArbitrary: true,
+                                                       allowDuplicates: Util.apiBool( pi.allowsduplicates )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.capsuleWidget );
                                                } else {
                                                        n = +value;
                                                        return !isNaN( n ) && isFinite( n ) &&
-                                                               // eslint-disable-next-line no-bitwise
-                                                               ( n | 0 ) === n &&
+                                                               Math.floor( n ) === n &&
                                                                n >= pi.min && n <= pi.apiSandboxMax;
                                                }
                                        } );
 
                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                        allowArbitrary: true,
+                                       allowDuplicates: Util.apiBool( pi.allowsduplicates ),
                                        popup: {
                                                classes: [ 'mw-apisandbox-popup' ],
                                                $content: $content
index bdd45bc..29c0fea 100644 (file)
@@ -21,7 +21,6 @@
                        $checkboxes.prop( 'disabled', isAllNS );
                },
 
-               /** */
                init: function () {
                        $select = $( '#namespace' );
                        $checkboxes = $( '#nsassociated, #nsinvert' );
index 5b259e7..ebb6b48 100644 (file)
@@ -18,3 +18,9 @@ th.mw-version-ext-col-label {
 .mw-version-ext-vcs-version {
        unicode-bidi: embed;
 }
+
+.mw-version-credits {
+       column-width: 18em;
+       -moz-column-width: 18em;
+       -webkit-column-width: 18em;
+}
index a35f4d1..7cc9b9b 100644 (file)
@@ -1,15 +1,61 @@
 /*!
  * JavaScript for Special:Watchlist
- *
- * This script is only loaded, if the user opt-in a setting in Special:Preferences,
- * that the watchlist should be automatically reloaded, when a filter option is
- * changed in the header form.
  */
-jQuery( function ( $ ) {
-       // add a listener on all form elements in the header form
-       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
-               // submit the form, when one of the input fields was changed
-               $( '#mw-watchlist-form' ).submit();
+( function ( mw, $, OO ) {
+       $( function () {
+               var $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' );
+
+               // If the user wants to reset their watchlist, use an API call to do so (no reload required)
+               // Adapted from a user script by User:NQ of English Wikipedia
+               // (User:NQ/WatchlistResetConfirm.js)
+               $resetForm.submit( function ( event ) {
+                       var $button = $resetForm.find( 'input[name=mw-watchlist-reset-submit]' );
+
+                       event.preventDefault();
+
+                       // Disable reset button to prevent multiple concurrent requests
+                       $button.prop( 'disabled', true );
+
+                       if ( !$progressBar ) {
+                               $progressBar = new OO.ui.ProgressBarWidget( { progress: false } ).$element;
+                               $progressBar.css( {
+                                       position: 'absolute',
+                                       width: '100%'
+                               } );
+                       }
+                       // Show progress bar
+                       $resetForm.append( $progressBar );
+
+                       // Use action=setnotificationtimestamp to mark all as visited,
+                       // then set all watchlist lines accordingly
+                       new mw.Api().postWithToken( 'csrf', {
+                               formatversion: 2,
+                               action: 'setnotificationtimestamp',
+                               entirewatchlist: true
+                       } ).done( function () {
+                               // Enable button again
+                               $button.prop( 'disabled', false );
+                               // Hide the button because further clicks can not generate any visual changes
+                               $button.css( 'visibility', 'hidden' );
+                               $progressBar.detach();
+                               $( '.mw-changeslist-line-watched' )
+                                       .removeClass( 'mw-changeslist-line-watched' )
+                                       .addClass( 'mw-changeslist-line-not-watched' );
+                       } ).fail( function () {
+                               // On error, fall back to server-side reset
+                               // First remove this submit listener and then re-submit the form
+                               $resetForm.off( 'submit' ).submit();
+                       } );
+               } );
+
+               // if the user wishes to reload the watchlist whenever a filter changes
+               if ( mw.user.options.get( 'watchlistreloadautomatically' ) ) {
+                       // add a listener on all form elements in the header form
+                       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
+                               // submit the form when one of the input fields is modified
+                               $( '#mw-watchlist-form' ).submit();
+                       } );
+               }
        } );
 
-} );
+}( mediaWiki, jQuery, OO ) );
index 4c4e129..ff38d0d 100644 (file)
@@ -48,22 +48,16 @@ Styleguide 6.2.
        &.mw-ui-destructive {
                .mixin-mw-ui-anchor-styles( @colorDestructive );
        }
-
-       //`.mw-ui-constructive` is deprecated; consolidated with `progressive`, see T110555
-       &.mw-ui-constructive {
-               .mixin-mw-ui-anchor-styles( @colorConstructive );
-       }
 }
 
 /*
 Quiet anchors
 
-Use quiet anchors when they are less important and alongside other progressive/destructive/progressive
+Use quiet anchors when they are less important and alongside other progressive/destructive
 anchors. Use of quiet anchors is not recommended on mobile/tablet due to lack of hover state.
 
 Markup:
 <a href="#" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet">Progressive</a>
-<a href="#" class="mw-ui-anchor mw-ui-constructive mw-ui-quiet">Constructive</a>
 <a href="#" class="mw-ui-anchor mw-ui-destructive mw-ui-quiet">Destructive</a>
 
 Styleguide 6.2.1.
index 8bddb3a..87ce7be 100644 (file)
@@ -23,6 +23,7 @@
 // Styleguide 1.1.
 .mw-ui-input {
        background-color: #fff;
+       color: @colorGray1;
        .box-sizing( border-box );
        display: block;
        width: 100%;
index 5551745..30593bf 100644 (file)
@@ -16,7 +16,6 @@ Text
 Context classes may be used on elements with only plain-text content with the mw-ui-text base. When the context classes
 are used on interactive and block-level elements, the appropriate alternative base type classes should also be used. For
 example, mw-ui-anchor with A, or mw-ui-button with buttons.
-'Constructive' is deprecated and merged with 'Progressive'.
 
 Markup:
 <span class="mw-ui-text mw-ui-progressive">Progressive</span>
@@ -28,11 +27,10 @@ Styleguide 6.1.
 .mw-ui-text {
        // The selector order is like this on purpose; IE 6 ignores the second selector,
        // so we don't want to accidentally apply this color on all mw-ui-CONTEXT classes
-       .mw-ui-progressive&,
-       .mw-ui-constructive& {
+       &.mw-ui-progressive {
                color: @colorProgressive;
        }
-       .mw-ui-destructive& {
+       &.mw-ui-destructive {
                color: @colorDestructive;
        }
 }
\ No newline at end of file
index 1793849..ad49a42 100644 (file)
         *  - 'boolean': The field is a boolean.
         *  - 'toggleLocal': The field represents {@link #getLocal this.getLocal()}.
         *    Editing should directly call {@link #toggleLocal this.toggleLocal()}.
+        * @return {boolean} return.calendarComponent Whether this field is part of a calendar, e.g.
+        *  part of the date instead of the time.
         * @return {number} return.size Maximum number of characters in the field (when
         *  the 'intercalary' component is falsey). If 0, the field should be hidden entirely.
         * @return {Object.<string,number>} return.intercalarySize Map from
                                }
                                spec = {
                                        component: null,
+                                       calendarComponent: false,
                                        editable: false,
                                        type: 'static',
                                        value: params.slice( 1 ).join( '|' ),
                                                c = params[ 0 ] === '#' ? '' : ':';
                                                return {
                                                        component: 'zone',
+                                                       calendarComponent: false,
                                                        editable: true,
                                                        type: 'toggleLocal',
                                                        size: 5 + c.length,
                                        case 'full':
                                                spec = {
                                                        component: 'zone',
+                                                       calendarComponent: false,
                                                        editable: true,
                                                        type: 'toggleLocal',
                                                        values: params[ 0 ] === 'short' ? this.shortZones : this.fullZones,
index e9bedf5..3e4c5e2 100644 (file)
                                $field = $( '<span>' )
                                        .width( sz )
                                        .data( 'mw-widgets-datetime-dateTimeInputWidget-placeholder', placeholder );
+                               if ( spec.type !== 'static' ) {
+                                       $field.prop( 'tabIndex', -1 );
+                                       $field.on( 'focus', this.onFieldFocus.bind( this, $field ) );
+                               }
                                if ( spec.type === 'static' ) {
                                        $field.text( spec.value );
                                } else {
         * @param {jQuery.Event} e Focus event
         */
        mw.widgets.datetime.DateTimeInputWidget.prototype.onFieldFocus = function ( $field ) {
+               var spec = $field.data( 'mw-widgets-datetime-dateTimeInputWidget-fieldSpec' );
+
                if ( !this.isDisabled() ) {
                        if ( this.getValueAsDate() === null ) {
                                this.setValue( this.formatter.getDefaultDate() );
                        }
 
                        if ( this.calendar ) {
-                               this.calendar.toggle( true );
+                               this.calendar.toggle( !!spec.calendarComponent );
                        }
                }
        };
index b280ead..6db2d06 100644 (file)
@@ -67,6 +67,7 @@
                        case 'year|#':
                                spec = {
                                        component: 'Year',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 4,
                                        zeropad: false
@@ -76,6 +77,7 @@
                        case 'season|#':
                                spec = {
                                        component: 'Season',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 1,
                                        intercalarySize: { 1: 0 },
@@ -86,6 +88,7 @@
                        case 'season|full':
                                spec = {
                                        component: 'Season',
+                                       calendarComponent: true,
                                        type: 'string',
                                        intercalarySize: { 1: 0 },
                                        values: {
                        case 'dow|full':
                                spec = {
                                        component: 'DOW',
+                                       calendarComponent: true,
                                        editable: false,
                                        type: 'string',
                                        intercalarySize: { 1: 0 },
                        case 'day|0':
                                spec = {
                                        component: 'Day',
+                                       calendarComponent: true,
                                        type: 'string',
                                        size: 2,
                                        intercalarySize: { 1: 13 },
                        case 'second|0':
                                spec = {
                                        component: tag.charAt( 0 ).toUpperCase() + tag.slice( 1 ),
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '0'
                        case 'millisecond|0':
                                spec = {
                                        component: 'Millisecond',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 3,
                                        zeropad: params[ 0 ] === '0'
index 9e9b15f..877edba 100644 (file)
@@ -2,7 +2,7 @@
 
        /**
         * Provides various methods needed for formatting dates and times. This
-        * implementation implments the proleptic Gregorian calendar over years
+        * implementation implements the proleptic Gregorian calendar over years
         * 0000–9999.
         *
         * @class
                        case 'year|0':
                                spec = {
                                        component: 'year',
+                                       calendarComponent: true,
                                        type: 'number',
                                        size: 4,
                                        zeropad: params[ 0 ] === '0'
                        case 'month|full':
                                spec = {
                                        component: 'month',
+                                       calendarComponent: true,
                                        type: 'string',
                                        values: params[ 0 ] === 'short' ? this.shortMonthNames : this.fullMonthNames
                                };
                        case 'dow|full':
                                spec = {
                                        component: 'dow',
+                                       calendarComponent: true,
                                        editable: false,
                                        type: 'string',
                                        values: params[ 0 ] === 'short' ? this.shortDayNames : this.fullDayNames
                        case 'month|0':
                        case 'day|#':
                        case 'day|0':
+                               spec = {
+                                       component: tag,
+                                       calendarComponent: true,
+                                       type: 'number',
+                                       size: 2,
+                                       zeropad: params[ 0 ] === '0'
+                               };
+                               break;
+
                        case 'hour|#':
                        case 'hour|0':
                        case 'minute|#':
                        case 'second|0':
                                spec = {
                                        component: tag,
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '0'
                        case 'hour|012':
                                spec = {
                                        component: 'hour12',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 2,
                                        zeropad: params[ 0 ] === '012'
                        case 'hour|period':
                                spec = {
                                        component: 'hour12period',
+                                       calendarComponent: false,
                                        type: 'boolean',
                                        values: this.hour12Periods
                                };
                        case 'millisecond|0':
                                spec = {
                                        component: 'millisecond',
+                                       calendarComponent: false,
                                        type: 'number',
                                        size: 3,
                                        zeropad: params[ 0 ] === '0'
index 4d90496..2fe5d3d 100644 (file)
@@ -5,6 +5,8 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 
+@import 'mediawiki.mixins';
+
 @calendarWidth: 21em;
 @calendarHeight: 14em;
 
@@ -14,7 +16,7 @@
 
 .mw-widget-calendarWidget-header {
        position: relative;
-       line-height: 2.5em;
+       line-height: 2.5;
 }
 
 .mw-widget-calendarWidget-header .oo-ui-buttonWidget {
                height: @calendarHeight;
        }
 
-       .mw-widget-calendarWidget-old-body {
-               // background: #fdd;
-       }
-
-       .mw-widget-calendarWidget-body:not(.mw-widget-calendarWidget-old-body):first-child {
+       .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
                margin-top: -@calendarHeight;
                margin-left: -@calendarWidth;
        }
 
-       .mw-widget-calendarWidget-body:not(.mw-widget-calendarWidget-old-body):last-child {
+       .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
                margin-top: 0;
                margin-left: 0;
        }
@@ -86,7 +84,7 @@
        .mw-widget-calendarWidget-body:first-child {
                margin-top: 0 !important;
                margin-left: 0 !important;
-               transition: 0.5s margin-left;
+               .transition( margin-left 500ms );
        }
 }
 
@@ -97,7 +95,7 @@
        .mw-widget-calendarWidget-body:first-child {
                margin-left: -@calendarWidth !important;
                margin-top: 0 !important;
-               transition: 0.5s margin-left;
+               .transition( margin-left 500ms );
        }
 }
 
        .mw-widget-calendarWidget-body:first-child {
                margin-left: 0 !important;
                margin-top: 0 !important;
-               transition: 0.5s margin-top;
+               .transition( margin-top 500ms );
        }
 }
 
        .mw-widget-calendarWidget-body:first-child {
                margin-left: 0 !important;
                margin-top: -@calendarHeight !important;
-               transition: 0.5s margin-top;
+               .transition( margin-top 500ms );
        }
 }
 
        width: @calendarWidth / 7;
        line-height: @calendarHeight / 7;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(7n) {
+       &:nth-child( 7n ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(7n+1) {
+       &:nth-child( 7n+1 ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(42) ~ & {
+       &:nth-child( 42 ) ~ & {
                line-height: @calendarHeight / 7 - 0.2em;
                margin-bottom: 0.2em;
        }
        width: @calendarWidth / 2;
        line-height: @calendarHeight / 6;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(2n) {
+       &:nth-child( 2n ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(2n+1) {
+       &:nth-child( 2n+1 ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(10) ~ & {
+       &:nth-child( 10 ) ~ & {
                line-height: @calendarHeight / 6 - 0.2em;
                margin-bottom: 0.2em;
        }
        width: @calendarWidth / 5;
        line-height: @calendarHeight / 4;
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
-       &:nth-child(5n) {
+       &:nth-child( 5n ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-right: 0.2em;
        }
-       &:nth-child(5n+1) {
+       &:nth-child( 5n+1 ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-left: 0.2em;
        }
-       &:nth-child(15) ~ & {
+       &:nth-child( 15 ) ~ & {
                line-height: @calendarHeight / 4 - 0.2em;
                margin-bottom: 0.2em;
        }
 
 /* Theme-specific */
 .mw-widget-calendarWidget {
-       box-shadow: inset 0 0 0 1px #ccc;
-}
+       .box-sizing( border-box );
+       border: 1px solid #a2a9b1;
+       .transition( ~'border-color 100ms, box-shadow 100ms' );
 
-.mw-widget-calendarWidget:focus {
-       outline: none;
-       box-shadow: inset 0 0 0 2px #36c;
-}
+       &:focus {
+               border-color: #36c;
+               box-shadow: inset 0 0 0 1px #36c;
+               outline: 0;
+       }
 
-.mw-widget-calendarWidget-day {
-       color: #444;
-       border-radius: 0.1em;
-}
+       &-day {
+               color: #222;
+               border-radius: 2px;
+       }
 
-.mw-widget-calendarWidget-day-heading {
-       font-weight: bold;
-       color: #555;
-}
+       &-day-heading {
+               color: #54595d;
+               font-weight: bold;
+       }
 
-.mw-widget-calendarWidget-day-additional {
-       color: #aaa;
-}
+       &-day-additional {
+               color: #a2a9b1;
 
-.mw-widget-calendarWidget-day-today {
-       box-shadow: inset 0 0 0 1px #3787fb;
-}
+               &:hover {
+                       color: #222;
+               }
+       }
 
-.mw-widget-calendarWidget-item-selected {
-       background-color: #d8e6fe;
-       color: #3787fb;
-}
+       &-day-today {
+               box-shadow: inset 0 0 0 1px #36c;
+       }
+
+       &-item {
+               .transition( ~'background-color 250ms, color 250ms' );
 
-.mw-widget-calendarWidget-item:hover {
-       background-color: #eee;
+               &:hover {
+                       background-color: #36c;
+                       color: #fff;
+               }
+
+               &-selected {
+                       background-color: #2a4b8d;
+                       color: #fff;
+               }
+       }
 }
index 46e6b62..8ba9a99 100644 (file)
@@ -21,6 +21,7 @@
 
 .oo-ui-inline-spacing( @spacing, @cancelled-spacing: 0 ) {
        margin-right: @spacing;
+
        &:last-child {
                margin-right: @cancelled-spacing;
        }
 .mw-widget-dateInputWidget {
        display: inline-block;
        position: relative;
+       width: 21em;
+       margin-top: 0.25em;
+       .oo-ui-inline-spacing( 0.5em );
+       margin-bottom: 0.25em;
+       margin-left: 0;
 
        &-handle {
-               width: 100%;
+               background-color: #fff;
                display: inline-block;
-               cursor: pointer;
                position: relative;
-
+               .oo-ui-box-sizing( border-box );
+               width: 100%;
                .oo-ui-unselectable();
-               .oo-ui-box-sizing(border-box);
+               cursor: pointer;
+               padding: 0.5em 1em;
+               border: 1px solid #a2a9b1;
+               border-radius: 2px;
+               outline: 0;
+               line-height: 1.275;
+
+               > .oo-ui-labelElement-label {
+                       padding: 0;
+               }
 
                > .oo-ui-indicatorElement-indicator {
                        display: none;
                position: absolute;
                top: 0;
                right: 0;
-               height: 100%;
-       }
-
-       &.oo-ui-widget-disabled .mw-widget-dateInputWidget-handle {
-               cursor: default;
-       }
-
-       &-calendar {
-               position: absolute;
-               z-index: 1;
-       }
-
-       // Theme-specific styles
-       width: 21em;
-       margin: 0.25em 0;
-
-       .oo-ui-inline-spacing(0.5em);
-
-       &-handle {
-               padding: 0.5em 1em;
-               border: 1px solid #ccc;
-               border-radius: 0.1em;
-               line-height: 1.275em;
-               background-color: #fff;
-
-               > .oo-ui-labelElement-label {
-                       padding: 0;
-               }
-       }
-
-       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
                width: @indicator-size;
+               height: 100%;
                margin: 0 0.775em;
        }
 
-       > .oo-ui-textInputWidget input {
-               padding-left: 1em;
-       }
-
        > .oo-ui-textInputWidget {
                z-index: 2;
+
+               & input {
+                       padding-left: 1em;
+               }
        }
 
        &-calendar {
                background-color: #fff;
+               position: absolute;
                margin-top: -2px;
+               box-shadow: 0 0.15em 0 0 rgba( 0, 0, 0, 0.15 );
+               z-index: 1;
 
                &:focus {
+                       box-shadow: inset 0 0 0 1px #36c, 0 0.15em 0 0 rgba( 0, 0, 0, 0.15 );
                        z-index: 3;
                }
        }
 
-       &.oo-ui-widget-enabled {
-               .mw-widget-dateInputWidget-handle:hover {
-                       border-color: #36c;
-               }
-       }
-
-       &.oo-ui-widget-disabled {
+       &-empty {
                .mw-widget-dateInputWidget-handle {
-                       color: #ccc;
-                       text-shadow: 0 1px 1px #fff;
-                       border-color: #ddd;
-                       background-color: #f3f3f3;
-
-                       > .oo-ui-indicatorElement-indicator {
-                               opacity: 0.2;
-                       }
+                       color: #54595d;
+                       outline: 0;
                }
-
        }
 
        &.oo-ui-flaggedElement-invalid {
                }
        }
 
-       &-empty {
+       &.oo-ui-widget-enabled {
+               .mw-widget-dateInputWidget-handle:hover {
+                       border-color: #72777d;
+               }
+       }
+
+       &.oo-ui-widget-disabled {
                .mw-widget-dateInputWidget-handle {
-                       color: #ccc;
+                       background-color: #eaecf0;
+                       color: #72777d;
+                       border-color: #c8ccd1;
+                       text-shadow: 0 1px 1px #fff;
+                       cursor: default;
+
+                       > .oo-ui-indicatorElement-indicator {
+                               opacity: 0.51;
+                       }
                }
        }
 }
index 2ac75c5..0a73bef 100755 (executable)
@@ -34,7 +34,8 @@
                        icon: 'search',
                        maxLength: undefined,
                        performSearchOnClick: true,
-                       dataLocation: 'header'
+                       dataLocation: 'header',
+                       namespace: 0
                }, config );
 
                // Parent constructor
@@ -83,7 +84,7 @@
                        self = this;
 
                // reuse the searchSuggest function from mw.searchSuggest
-               promise = mw.searchSuggest.request( api, this.getQueryValue(), $.noop, this.limit );
+               promise = mw.searchSuggest.request( api, this.getQueryValue(), $.noop, this.limit, this.getNamespace() );
 
                // tracking purposes
                promise.done( function ( data, jqXHR ) {
index 0e5e0c5..3a4581d 100644 (file)
                        cache[ key ] = api.get( {
                                action: 'query',
                                meta: 'siteinfo',
-                               siprop: 'interwikimap'
+                               siprop: 'interwikimap',
+                               // Cache client-side for a day since this info is mostly static
+                               maxage: 60 * 60 * 24,
+                               smaxage: 60 * 60 * 24,
+                               // Workaround T97096 by setting uselang=content
+                               uselang: 'content'
                        } ).then( function ( data ) {
                                return $.map( data.query.interwikimap, function ( interwiki ) {
                                        return interwiki.prefix;
index 0c08ca4..d5032da 100644 (file)
                                                        jqXHR
                                                );
                                        } else if ( result.error ) {
+                                               // errorformat=bc
                                                code = result.error.code === undefined ? 'unknown' : result.error.code;
                                                apiDeferred.reject( code, result, result, jqXHR );
+                                       } else if ( result.errors ) {
+                                               // errorformat!=bc
+                                               code = result.errors[ 0 ].code === undefined ? 'unknown' : result.errors[ 0 ].code;
+                                               apiDeferred.reject( code, result, result, jqXHR );
                                        } else {
                                                apiDeferred.resolve( result, jqXHR );
                                        }
        /**
         * @static
         * @property {Array}
-        * List of errors we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
+        * Very incomplete and outdated list of errors we might receive from the API. Do not use.
+        * @deprecated since 1.29
         */
        mw.Api.errors = [
                // occurs when POST aborted
                'stashwrongowner',
                'stashnosuchfilekey'
        ];
+       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors );
 
        /**
         * @static
         * @property {Array}
-        * List of warnings we might receive from the API.
-        * For now, this just documents our expectation that there should be similar messages
-        * available.
+        * Very incomplete and outdated list of warnings we might receive from the API. Do not use.
+        * @deprecated since 1.29
         */
        mw.Api.warnings = [
                'duplicate',
                'exists'
        ];
+       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings );
 
 }( mediaWiki, jQuery ) );
index 069fbbf..4930c4f 100644 (file)
@@ -26,7 +26,7 @@
                 * Any warnings returned by the API, including warnings about invalid option names or values,
                 * are ignored. However, do not rely on this behavior.
                 *
-                * If necessary, the options will be saved using several parallel API requests. Only one promise
+                * If necessary, the options will be saved using several sequential API requests. Only one promise
                 * is always returned that will be resolved when all requests complete.
                 *
                 * @param {Object} options Options as a `{ name: value, … }` object
@@ -35,7 +35,7 @@
                saveOptions: function ( options ) {
                        var name, value, bundleable,
                                grouped = [],
-                               deferreds = [];
+                               promise = $.Deferred().resolve();
 
                        for ( name in options ) {
                                value = options[ name ] === null ? null : String( options[ name ] );
                                        }
                                } else {
                                        if ( value !== null ) {
-                                               deferreds.push( this.postWithToken( 'csrf', {
-                                                       formatversion: 2,
-                                                       action: 'options',
-                                                       optionname: name,
-                                                       optionvalue: value
-                                               } ) );
+                                               promise = promise.then( function ( name, value ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name,
+                                                               optionvalue: value
+                                                       } );
+                                               }.bind( this, name, value ) );
                                        } else {
                                                // Omitting value resets the option
-                                               deferreds.push( this.postWithToken( 'csrf', {
-                                                       formatversion: 2,
-                                                       action: 'options',
-                                                       optionname: name
-                                               } ) );
+                                               promise = promise.then( function ( name ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name
+                                                       } );
+                                               }.bind( this, name ) );
                                        }
                                }
                        }
 
                        if ( grouped.length ) {
-                               deferreds.push( this.postWithToken( 'csrf', {
-                                       formatversion: 2,
-                                       action: 'options',
-                                       change: grouped
-                               } ) );
+                               promise = promise.then( function () {
+                                       return this.postWithToken( 'csrf', {
+                                               formatversion: 2,
+                                               action: 'options',
+                                               change: grouped
+                                       } );
+                               }.bind( this ) );
                        }
 
-                       return $.when.apply( $, deferreds );
+                       return promise;
                }
 
        } );
index 687b475..5299252 100644 (file)
@@ -19,7 +19,6 @@
         *  parameter)
         * @return {string} return.done.watch.title Full pagename
         * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
        function doWatchInternal( pages, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
@@ -27,9 +26,9 @@
                var apiPromise = this.postWithToken( 'watch',
                        $.extend(
                                {
+                                       formatversion: 2,
                                        action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       uselang: mw.config.get( 'wgUserLanguage' )
+                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages )
                                },
                                addParams
                        )
diff --git a/resources/src/mediawiki/htmlform/datetime.js b/resources/src/mediawiki/htmlform/datetime.js
deleted file mode 100644 (file)
index 2fd2396..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * HTMLForm enhancements:
- * Add minimal help for date and time fields
- */
-( function ( mw ) {
-
-       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
-               var supported = {};
-
-               $root
-                       .find( 'input.mw-htmlform-datetime-field' )
-                       .each( function () {
-                               var input,
-                                       type = this.getAttribute( 'type' );
-
-                               if ( type !== 'date' && type !== 'time' && type !== 'datetime' ) {
-                                       // WTF?
-                                       return;
-                               }
-
-                               if ( supported[ type ] === undefined ) {
-                                       // Assume that if the browser implements validation (so it
-                                       // rejects "bogus" as a value) then it supports a proper UI too.
-                                       input = document.createElement( 'input' );
-                                       input.setAttribute( 'type', type );
-                                       input.value = 'bogus';
-                                       supported[ type ] = ( input.value !== 'bogus' );
-                               }
-
-                               if ( supported[ type ] ) {
-                                       if ( !this.getAttribute( 'min' ) ) {
-                                               this.setAttribute( 'min', this.getAttribute( 'data-min' ) );
-                                       }
-                                       if ( !this.getAttribute( 'max' ) ) {
-                                               this.setAttribute( 'max', this.getAttribute( 'data-max' ) );
-                                       }
-                                       if ( !this.getAttribute( 'step' ) ) {
-                                               this.setAttribute( 'step', this.getAttribute( 'data-step' ) );
-                                       }
-                               }
-                       } );
-       } );
-
-}( mediaWiki ) );
index 5f60097..157ac06 100644 (file)
        }
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
-               $root.find( '.mw-htmlform-hide-if' ).each( function () {
-                       var v, i, fields, test, func, spec, self, modules, data, extraModules,
-                               $el = $( this );
-
+               var
+                       $fields = $root.find( '.mw-htmlform-hide-if' ),
+                       $oouiFields = $fields.filter( '[data-ooui]' ),
                        modules = [];
-                       if ( $el.is( '[data-ooui]' ) ) {
-                               modules.push( 'mediawiki.htmlform.ooui' );
+
+               if ( $oouiFields.length ) {
+                       modules.push( 'mediawiki.htmlform.ooui' );
+                       $oouiFields.each( function () {
+                               var data, extraModules,
+                                       $el = $( this );
+
                                data = $el.data( 'mw-modules' );
                                if ( data ) {
                                        // We can trust this value, 'data-mw-*' attributes are banned from user content in Sanitizer
                                        extraModules = data.split( ',' );
                                        modules.push.apply( modules, extraModules );
                                }
-                       }
+                       } );
+               }
+
+               mw.loader.using( modules ).done( function () {
+                       $fields.each( function () {
+                               var v, i, fields, test, func, spec, self,
+                                       $el = $( this );
 
-                       mw.loader.using( modules ).done( function () {
                                if ( $el.is( '[data-ooui]' ) ) {
                                        // self should be a FieldLayout that mixes in mw.htmlform.Element
                                        self = OO.ui.FieldLayout.static.infuse( $el );
                                test = v[ 1 ];
                                // The .toggle() method works mostly the same for jQuery objects and OO.ui.Widget
                                func = function () {
-                                       self.toggle( !test() );
+                                       var shouldHide = test();
+                                       self.toggle( !shouldHide );
+
+                                       // It is impossible to submit a form with hidden fields failing validation, e.g. one that
+                                       // is required. However, validity is not checked for disabled fields, as these are not
+                                       // submitted with the form. So we should also disable fields when hiding them.
+                                       if ( self instanceof jQuery ) {
+                                               // This also finds elements inside any nested fields (in case of HTMLFormFieldCloner),
+                                               // which is problematic. But it works because:
+                                               // * HTMLFormFieldCloner::createFieldsForKey() copies 'hide-if' rules to nested fields
+                                               // * jQuery collections like $fields are in document order, so we register event
+                                               //   handlers for parents first
+                                               // * Event handlers are fired in the order they were registered, so even if the handler
+                                               //   for parent messed up the child, the handle for child will run next and fix it
+                                               self.find( 'input, textarea, select' ).each( function () {
+                                                       var $this = $( this );
+                                                       if ( shouldHide ) {
+                                                               if ( $this.data( 'was-disabled' ) === undefined ) {
+                                                                       $this.data( 'was-disabled', $this.prop( 'disabled' ) );
+                                                               }
+                                                               $this.prop( 'disabled', true );
+                                                       } else {
+                                                               $this.prop( 'disabled', $this.data( 'was-disabled' ) );
+                                                       }
+                                               } );
+                                       } else {
+                                               // self is a OO.ui.FieldLayout
+                                               if ( shouldHide ) {
+                                                       if ( self.wasDisabled === undefined ) {
+                                                               self.wasDisabled = self.fieldWidget.isDisabled();
+                                                       }
+                                                       self.fieldWidget.setDisabled( true );
+                                               } else if ( self.wasDisabled !== undefined ) {
+                                                       self.fieldWidget.setDisabled( self.wasDisabled );
+                                               }
+                                       }
                                };
                                for ( i = 0; i < fields.length; i++ ) {
                                        // The .on() method works mostly the same for jQuery objects and OO.ui.Widget
index 19f8f3e..bc835b5 100644 (file)
@@ -4,4 +4,11 @@
                mw.hook( 'htmlform.enhance' ).fire( $( document ) );
        } );
 
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               // Turn HTML5 form validation back on, in cases where it was disabled server-side (see
+               // HTMLForm::needsJSForHtml5FormValidation()) because we need extra logic implemented in JS to
+               // validate correctly. Currently, this is only used for forms containing fields with 'hide-if'.
+               $root.find( '.mw-htmlform' ).removeAttr( 'novalidate' );
+       } );
+
 }( mediaWiki, jQuery ) );
index 1603130..1b9d2fb 100644 (file)
@@ -1,5 +1,9 @@
 /* HTMLForm styles */
 
+.mw-htmlform {
+       clear: both;
+}
+
 table.mw-htmlform-nolabel td.mw-label {
        display: none;
 }
index a5cf1d8..f2b6f5f 100644 (file)
                                                                        e.stopPropagation();
                                                                } );
                                                } );
+                                       }, function ( errorMsg ) {
+                                               booklet.getPage( 'upload' ).$element.msg( errorMsg );
+                                               return $.Deferred().resolve();
                                        } )
                                );
                        }
         * @return {mw.Upload}
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.createUpload = function () {
-               return new mw.ForeignStructuredUpload( this.target );
+               return new mw.ForeignStructuredUpload( this.target, {
+                       parameters: {
+                               errorformat: 'html',
+                               errorlang: mw.config.get( 'wgUserLanguage' ),
+                               errorsuselocal: 1,
+                               formatversion: 2
+                       }
+               } );
        };
 
        /* Form renderers */
index c7ebfd8..172cac2 100644 (file)
 
                return this.upload.getApi().then(
                        function ( api ) {
-                               return $.when(
-                                       booklet.upload.loadConfig().then(
-                                               null,
-                                               function ( errorMsg ) {
-                                                       booklet.getPage( 'upload' ).$element.msg( errorMsg );
-                                                       return $.Deferred().resolve();
-                                               }
-                                       ),
-                                       // If the user can't upload anything, don't give them the option to.
-                                       api.getUserInfo().then( function ( userInfo ) {
+                               // If the user can't upload anything, don't give them the option to.
+                               return api.getUserInfo().then(
+                                       function ( userInfo ) {
                                                if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
                                                        if ( mw.user.isAnon() ) {
-                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-mustbeloggedin', mw.msg( 'action-upload' ) );
                                                        } else {
-                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-badaccess-groups' );
+                                                               booklet.getPage( 'upload' ).$element.msg( 'apierror-permissiondenied', mw.msg( 'action-upload' ) );
                                                        }
                                                }
                                                return $.Deferred().resolve();
-                                       } )
-                               ).then(
-                                       null,
+                                       },
                                        // Always resolve, never reject
                                        function () { return $.Deferred().resolve(); }
                                );
         * @return {mw.Upload} Upload model
         */
        mw.Upload.BookletLayout.prototype.createUpload = function () {
-               return new mw.Upload();
+               return new mw.Upload( {
+                       parameters: {
+                               errorformat: 'html',
+                               errorlang: mw.config.get( 'wgUserLanguage' ),
+                               errorsuselocal: 1,
+                               formatversion: 2
+                       }
+               } );
        };
 
        /* Uploading */
         * @return {jQuery.Promise} A Promise that will be resolved with an OO.ui.Error.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
-               var message,
-                       state = this.upload.getState(),
+               var state = this.upload.getState(),
                        stateDetails = this.upload.getStateDetails(),
-                       error = stateDetails.error,
-                       warnings = stateDetails.upload && stateDetails.upload.warnings;
+                       error = stateDetails.errors ? stateDetails.errors[ 0 ] : false,
+                       warnings = stateDetails.upload && stateDetails.upload.warnings,
+                       $ul = $( '<ul>' );
 
                if ( state === mw.Upload.State.ERROR ) {
                        if ( !error ) {
                                // If there's an 'exception' key, this might be a timeout, or other connection problem
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
+                                       $( '<p>' ).msg( 'apierror-unknownerror', JSON.stringify( stateDetails ) ),
                                        { recoverable: false }
                                ) );
                        }
 
-                       // Errors in this format are produced by TitleBlacklist and AbuseFilter. Perhaps other
-                       // extensions will follow this format in the future.
-                       if ( error.message ) {
-                               return this.upload.getApi()
-                                       .then( function ( api ) {
-                                               // 'amenableparser' will expand templates and parser functions server-side.
-                                               // We still do the rest of wikitext parsing here (through jqueryMsg).
-                                               return api.loadMessagesIfMissing( [ error.message.key ], { amenableparser: true } )
-                                                       .then( function () {
-                                                               if ( !mw.message( error.message.key ).exists() ) {
-                                                                       return $.Deferred().reject();
-                                                               }
-                                                               return new OO.ui.Error(
-                                                                       $( '<p>' ).msg( error.message.key, error.message.params || [] ),
-                                                                       { recoverable: false }
-                                                               );
-                                                       } );
-                                       } )
-                                       .then( null, function () {
-                                               // We failed when loading the error message, or it doesn't actually exist, fall back
-                                               return $.Deferred().resolve( new OO.ui.Error(
-                                                       $( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } );
-                       }
-
-                       if ( error.code === 'protectedpage' ) {
-                               message = mw.message( 'protectedpagetext' );
-                       } else {
-                               message = mw.message( 'api-error-' + error.code );
-                               if ( !message.exists() ) {
-                                       message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
-                               }
-                       }
                        return $.Deferred().resolve( new OO.ui.Error(
-                               $( '<p>' ).append( message.parseDom() ),
+                               $( '<p>' ).html( error.html ),
                                { recoverable: false }
                        ) );
                }
                        // We could get more than one of these errors, these are in order
                        // of importance. For example fixing the thumbnail like file name
                        // won't help the fact that the file already exists.
-                       if ( warnings.stashfailed !== undefined ) {
-                               return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-stashfailed' ),
-                                       { recoverable: false }
-                               ) );
-                       } else if ( warnings.exists !== undefined ) {
+                       if ( warnings.exists !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
                                        $( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
                                        { recoverable: false }
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.duplicate !== undefined ) {
+                               $.each( warnings.duplicate, function ( i, filename ) {
+                                       var $a = $( '<a>' ).text( filename ),
+                                               href = mw.Title.makeTitle( mw.config.get( 'wgNamespaceIds' ).file, filename ).getUrl( {} );
+
+                                       $a.attr( { href: href, target: '_blank' } );
+                                       $ul.append( $( '<li>' ).append( $a ) );
+                               } );
+
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
+                                       $( '<p>' ).msg( 'file-exists-duplicate', warnings.duplicate.length ).append( $ul ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'thumb-name' ] !== undefined ) {
                                ) );
                        } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
+                                       $( '<p>' ).msg( 'file-deleted-duplicate', 'File:' + warnings[ 'duplicate-archive' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings[ 'was-deleted' ] !== undefined ) {
                                return $.Deferred().resolve( new OO.ui.Error(
-                                       $( '<p>' ).msg( 'api-error-was-deleted' ),
+                                       $( '<p>' ).msg( 'filewasdeleted', 'File:' + warnings[ 'was-deleted' ] ),
                                        { recoverable: false }
                                ) );
                        } else if ( warnings.badfilename !== undefined ) {
index e1287db..4849f5a 100644 (file)
@@ -71,6 +71,7 @@
                $notificationContent.appendTo( $notification );
 
                // Private state parameters, meant for internal use only
+               // autoHideSeconds: String alias for number of seconds for timeout of auto-hiding notifications.
                // isOpen: Set to true after .start() is called to avoid double calls.
                //         Set back to false after .close() to avoid duplicating the close animation.
                // isPaused: false after .resume(), true after .pause(). Avoids duplicating or breaking the hide timeouts.
@@ -79,6 +80,9 @@
                //          to stop replacement of a tagged notification with another notification using the same message.
                // options: The options passed to the notification with a little sanitization. Used by various methods.
                // $notification: jQuery object containing the notification DOM node.
+               this.autoHideSeconds = options.autoHideSeconds &&
+                       notification.autoHideSeconds[ options.autoHideSeconds ] ||
+                       notification.autoHideSeconds.short;
                this.isOpen = false;
                this.isPaused = true;
                this.message = message;
                                // Already finished, so don't try to re-clear it
                                delete notif.timeout;
                                notif.close();
-                       }, notification.autoHideSeconds * 1000 );
+                       }, this.autoHideSeconds * 1000 );
                }
        };
 
                 *   A boolean indicating whether the notifification should automatically
                 *   be hidden after shown. Or if it should persist.
                 *
+                * - autoHideSeconds:
+                *   Key to #autoHideSeconds for number of seconds for timeout of auto-hide
+                *   notifications.
+                *
                 * - tag:
                 *   An optional string. When a notification is tagged only one message
                 *   with that tag will be displayed. Trying to display a new notification
                 */
                defaults: {
                        autoHide: true,
+                       autoHideSeconds: 'short',
                        tag: false,
                        title: undefined,
                        type: false
                },
 
                /**
-                * @property {number}
-                * Number of seconds to wait before auto-hiding notifications.
+                * @private
+                * @property {Object}
                 */
-               autoHideSeconds: 5,
+               autoHideSeconds: {
+                       'short': 5,
+                       'long': 30
+               },
 
                /**
                 * @property {number}
-                * Maximum number of notifications to count down auto-hide timers for.
-                * Only the first #autoHideLimit notifications being displayed will
-                * auto-hide. Any notifications further down in the list will only start
-                * counting down to auto-hide after the first few messages have closed.
+                * Maximum number of simultaneous notifications to start auto-hide timers for.
+                * Only this number of notifications being displayed will be auto-hidden at one time.
+                * Any additional notifications in the list will only start counting their timeout for
+                * auto-hiding after the previous messages have been closed.
                 *
-                * This basically represents the number of notifications the user should
-                * be able to process in #autoHideSeconds time.
+                * This basically represents the minimal number of notifications the user should
+                * be able to process during the {@link #defaults default} #autoHideSeconds time.
                 */
                autoHideLimit: 3
        };
index b58cb69..d414232 100644 (file)
@@ -1,8 +1,3 @@
-/*!
- * An interface for scheduling background tasks.
- *
- * Loosely based on https://w3c.github.io/requestidlecallback/
- */
 ( function ( mw ) {
        var maxBusy = 50;
 
        /**
         * Schedule a deferred task to run in the background.
         *
+        * This allows code to perform tasks in the main thread without impacting
+        * time-critical operations such as animations and response to input events.
+        *
+        * Basic logic is as follows:
+        *
+        * - User input event should be acknowledged within 100ms per [RAIL].
+        * - Idle work should be grouped in blocks of upto 50ms so that enough time
+        *   remains for the event handler to execute and any rendering to take place.
+        * - Whenever a native event happens (e.g. user input), the deadline for any
+        *   running idle callback drops to 0.
+        * - As long as the deadline is non-zero, other callbacks pending may be
+        *   executed in the same idle period.
+        *
+        * See also:
+        *
+        * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
+        * - <https://w3c.github.io/requestidlecallback/>
+        * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
+        * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
+        *
         * @member mw
         * @param {Function} callback
+        * @param {Object} [options]
+        * @param {number} [options.timeout] If set, the callback will be scheduled for
+        *  immediate execution after this amount of time (in milliseconds) if it didn't run
+        *  by that time.
         */
        mw.requestIdleCallback = mw.requestIdleCallbackInternal;
        /*
index fa1a78c..bcb6c33 100644 (file)
@@ -4,12 +4,12 @@
 ( function ( mw, $ ) {
        mw.searchSuggest = {
                // queries the wiki and calls response with the result
-               request: function ( api, query, response, maxRows ) {
+               request: function ( api, query, response, maxRows, namespace ) {
                        return api.get( {
                                formatversion: 2,
                                action: 'opensearch',
                                search: query,
-                               namespace: 0,
+                               namespace: namespace || 0,
                                limit: maxRows,
                                suggest: true
                        } ).done( function ( data, jqXHR ) {
@@ -22,7 +22,7 @@
        };
 
        $( function () {
-               var api, map, searchboxesSelectors,
+               var api, searchboxesSelectors,
                        // Region where the suggestions box will appear directly below
                        // (using the same width). Can be a container element or the input
                        // itself, depending on what suits best in the environment.
                        $searchInput = $( '#searchInput' ),
                        previousSearchText = $searchInput.val();
 
-               // Compatibility map
-               map = {
-                       // SimpleSearch is broken in Opera < 9.6
-                       opera: [ [ '>=', 9.6 ] ],
-                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
-                       konqueror: [ [ '>=', '4.11' ] ],
-                       docomo: false,
-                       blackberry: false,
-                       // Support for iOS 6 or higher. It has not been tested on iOS 5 or lower
-                       ipod: [ [ '>=', 6 ] ],
-                       iphone: [ [ '>=', 6 ] ]
-               };
-
-               if ( !$.client.test( map ) ) {
-                       return;
-               }
-
                // Compute form data for search suggestions functionality.
                function getFormData( context ) {
                        var $form, baseHref, linkParams;
index 094c4df..e651c9c 100644 (file)
@@ -26,7 +26,7 @@
                // Initialize
                this.drawCarousel();
                this.setSizeRequirement();
-               this.toggleThumbnails( false );
+               this.toggleThumbnails( !!this.$gallery.attr( 'data-showthumbnails' ) );
                this.showCurrentImage();
 
                // Events
index cb46b11..d94b158 100644 (file)
@@ -30,6 +30,7 @@
                        $spinner = $.createSpinner( { size: 'small', type: 'inline' } );
                        $link.hide().after( $spinner );
 
+                       // @todo: data.messageHtml is no more. Convert to using errorformat=html.
                        api = new mw.Api();
                        api.rollback( page, user )
                                .then( function ( data ) {
index b860dbd..7cfe058 100644 (file)
                $links = $links.filter( ':not( #bodyContent *, #content * )' );
 
                $links.click( function ( e ) {
-                       var action, api, $link;
+                       var mwTitle, action, api, $link;
 
+                       mwTitle = mw.Title.newFromText( title );
                        action = mwUriGetAction( this.href );
 
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                       if ( !mwTitle || ( action !== 'watch' && action !== 'unwatch' ) ) {
                                // Let native browsing handle the link
                                return true;
                        }
 
                        api[ action ]( title )
                                .done( function ( watchResponse ) {
-                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
+                                       var message, otherAction = action === 'watch' ? 'unwatch' : 'watch';
 
-                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                       if ( mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1 ) {
+                                               message = action === 'watch' ? 'addedwatchtext-talk' : 'removedwatchtext-talk';
+                                       } else {
+                                               message = action === 'watch' ? 'addedwatchtext' : 'removedwatchtext';
+                                       }
+
+                                       mw.notify( mw.message( message, mwTitle.getPrefixedText() ).parseDom(), {
                                                tag: 'watch-self'
                                        } );
 
 
                                        // Update the "Watch this page" checkbox on action=edit when the
                                        // page is watched or unwatched via the tab (bug 12395).
-                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched === true );
                                } )
                                .fail( function () {
-                                       var cleanTitle, msg, link;
+                                       var msg, link;
 
                                        // Reset link to non-loading mode
                                        updateWatchLink( $link, action );
 
                                        // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
                                        link = mw.html.element(
                                                'a', {
                                                        href: mw.util.getUrl( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
+                                                       title: mwTitle.getPrefixedText()
+                                               }, mwTitle.getPrefixedText()
                                        );
                                        msg = mw.message( 'watcherrortext', link );
 
index 99d9784..017d9fb 100644 (file)
@@ -1,4 +1,5 @@
 ( function ( mw ) {
+       var isMobile;
        // Connect OOjs UI to MediaWiki's localisation system
        OO.ui.getUserLanguages = mw.language.getFallbackLanguageChain;
        OO.ui.msg = mw.msg;
@@ -7,4 +8,10 @@
                mw.track( 'mw.deprecate', 'oojs-ui' );
                mw.log.warn( message );
        };
+       OO.ui.isMobile = function () {
+               if ( isMobile === undefined ) {
+                       isMobile = mw.config.get( 'skin' ) === 'minerva';
+               }
+               return isMobile;
+       };
 }( mediaWiki ) );
index 82a00bc..20818d2 100644 (file)
@@ -75,7 +75,7 @@ function isCompatible( str ) {
                // support in the modern run-time.
                // Note: Please extend the regex instead of adding new ones
                !(
-                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$/ ) ||
+                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$|googleweblight/ ) ||
                        ua.match( /PlayStation/i )
                )
        );
index c18f087..8922234 100644 (file)
@@ -11,11 +11,11 @@ Feature: Log in
 
   Scenario: Log in without entering credentials
     When I log in without entering credentials
-    Then error box should be visible
+    Then error message should be displayed for username
 
   Scenario: Log in without entering password
     When I log in without entering password
-    Then error box should be visible
+    Then error message should be displayed for password
 
   Scenario: Log in with incorrect username
     When I log in with incorrect username
index 9b35e99..14a2d76 100644 (file)
@@ -30,6 +30,14 @@ Then(/^error box should not be visible$/) do
   expect(on(LoginPage).error_message_element).not_to exist
 end
 
+Then(/^error message should be displayed for username$/) do
+  expect(on(LoginPage).username_error_element).to exist
+end
+
+Then(/^error message should be displayed for password$/) do
+  expect(on(LoginPage).password_error_element).to exist
+end
+
 Then(/^feedback should be (.+)$/) do |feedback|
   on(LoginPage) do |page|
     page.feedback_element.when_present.click
index 20e2744..de12aee 100644 (file)
@@ -4,5 +4,5 @@ class CreateAccountPage
   page_url '<%=params[:page_title]%>'
 
   button(:create_account, id: 'wpCreateaccount')
-  element(:error_message, css: 'div#userloginForm div.error')
+  element(:error_message, css: 'input#wpName2:required:invalid')
 end
index 4727318..c119b38 100644 (file)
@@ -10,10 +10,12 @@ class LoginPage
   button(:login, id: 'wpLoginAttempt')
   li(:logout, id: 'pt-logout')
   text_field(:password, id: 'wpPassword1')
+  element(:password_error, css: 'input#wpPassword1:required:invalid')
   a(:password_strength, text: 'password strength')
   a(:phishing, text: 'phishing')
   text_field(:username, id: 'wpName1')
   a(:username_displayed, title: /Your user page/)
+  element(:username_error, css: 'input#wpName1:required:invalid')
 
   def logged_in_as_element
     @browser.div(id: 'mw-content-text').p.b
index 53e724b..38f56d2 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
-
 /**
  * Common code for test environment initialisation and teardown
  */
index 4fd1cde..6d1fdf5 100644 (file)
@@ -241,4 +241,3 @@ class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
                        array_change_key_case( $cookieJar->cookie, CASE_LOWER ) );
        }
 }
-
index 7809ab3..5ce0b34 100644 (file)
@@ -201,4 +201,3 @@ class DbTestPreviewer extends TestRecorder {
                        . " and $postDate";
        }
 }
-
index 0e94301..04a2a8d 100644 (file)
@@ -81,4 +81,3 @@ class DbTestRecorder extends TestRecorder {
                $this->db->commit( __METHOD__ );
        }
 }
-
index 4739be4..73d4a47 100644 (file)
@@ -55,4 +55,3 @@ class DjVuSupport {
                        && is_executable( $wgDjvuTxt );
        }
 }
-
index cad3a53..ac9f150 100644 (file)
@@ -323,4 +323,3 @@ class ParserTestPrinter extends TestRecorder {
                return ( $success == $total );
        }
 }
-
index a15d09e..37ed85f 100644 (file)
@@ -84,4 +84,3 @@ class ParserTestResultNormalizer {
                        [ '<body>' => '', '</body>' => '' ] );
        }
 }
-
index 281e1df..97e24b6 100644 (file)
@@ -974,7 +974,10 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [ 0 => isset( $opts['subpage'] ) ],
+                       'wgNamespacesWithSubpages' => [
+                               0 => isset( $opts['subpage'] ),
+                               2 => isset( $opts['subpage'] ),
+                       ],
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
index b6e811b..a96485d 100644 (file)
@@ -333,4 +333,3 @@ class TestFileReader {
                $this->requirements[$type][$name] = true;
        }
 }
-
index 4b81699..2731c4c 100644 (file)
@@ -91,4 +91,3 @@ class TestRecorder {
        }
 
 }
-
index 5b17eac..1563525 100644 (file)
@@ -271,6 +271,12 @@ Template:EmptyTRWithHTMLAttrTest
 </table>
 !!endarticle
 
+!! article
+Template:CircularRef
+!! text
+<ref>{{CircularRef}}</ref>
+!! endarticle
+
 ###
 ### Basic tests
 ###
@@ -280,6 +286,15 @@ Blank input
 !! html
 !! end
 
+!! test
+CircularRef
+!! wikitext
+{{CircularRef}}
+<references />
+!! html/parsoid
+<p><span about="#mwt1" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"CircularRef","href":"./Template:CircularRef"},"params":{},"i":0}}]}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">Error: Expansion loop detected at <a data-parsoid='{"a":{"href":null},"sa":{"href":"Template:CircularRef"}}'>Template:CircularRef</a></span></li></ol>
+!! end
 
 !! test
 Simple paragraph
@@ -513,6 +528,22 @@ Extra newlines between heading and content are swallowed
 </p>
 !! end
 
+!! test
+Heading with line break in nowiki
+!! options
+parsoid=wt2html
+!! wikitext
+== A <nowiki>B
+C</nowiki> ==
+!! html
+<h2><span class="mw-headline" id="A_B.0AC">A B
+C</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A B&#10;C">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! html/parsoid
+<h2 id="A_B.0AC">A <span typeof="mw:Nowiki">B
+C</span> </h2>
+!! end
+
 !! test
 Parsing an URL
 !! wikitext
@@ -902,6 +933,7 @@ Italics and bold: 5-quote opening sequence: (5,6)
 ###
 ### multiple quote sequences in a line
 ###
+
 !! test
 Italics and bold: multiple quote sequences: (2,4,2)
 !! options
@@ -911,8 +943,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -924,7 +955,6 @@ Italics and bold: multiple quote sequences: (2,4,2+3) w/ nowiki
 </p>
 !! end
 
-
 !! test
 Italics and bold: multiple quote sequences: (2,4,3)
 !! options
@@ -934,8 +964,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -947,7 +976,6 @@ Italics and bold: multiple quote sequences: (2,4,3+2) w/ nowiki
 </p>
 !! end
 
-
 !! test
 Italics and bold: multiple quote sequences: (2,4,4)
 !! options
@@ -957,8 +985,7 @@ parsoid=wt2html
 !! html/*
 <p><i>foo'<b>bar'</b></i>
 </p>
-!!end
-
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
@@ -970,7 +997,6 @@ Italics and bold: multiple quote sequences: (2,4,4+2) w/ nowiki
 </p>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,2)
@@ -984,24 +1010,21 @@ parsoid=wt2html
 !! html/parsoid
 <p><b>foo'</b>bar<i></i>
 </p>
-!!end
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
 Italics and bold: multiple quote sequences: (3,4,2+2) w/ nowiki
-!! options
-parsoid
 !! wikitext
-'''<nowiki>foo'</nowiki>'''bar''<nowiki/>''
+'''foo''''bar''<nowiki/>''
 !! html/php
 <p><b>foo'</b>bar
 </p>
 !! html/parsoid
-<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<i></i>
+<p><b>foo'</b>bar<i></i>
 </p>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: multiple quote sequences: (3,4,3)
@@ -1015,18 +1038,18 @@ parsoid=wt2html
 !! html/parsoid
 <p><b>foo'</b>bar<b></b>
 </p>
-!!end
+!! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
 !! test
 Italics and bold: multiple quote sequences: (3,4,3+3) w/ nowiki
 !! wikitext
-'''<nowiki>foo'</nowiki>'''bar'''<nowiki/>'''
+'''foo''''bar'''<nowiki/>'''
 !! html/php
 <p><b>foo'</b>bar
 </p>
 !! html/parsoid
-<p><b><span typeof="mw:Nowiki">foo'</span></b>bar<b></b>
+<p><b>foo'</b>bar<b></b>
 </p>
 !! end
 
@@ -1104,7 +1127,7 @@ The ''[[Main Page]]'''s talk page.
 <p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
 </p>
 !! html/parsoid
-<p>The <i><a rel="mw:WikiLink"  href="Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
+<p>The <i><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
 !! end
 
 !! test
@@ -1427,6 +1450,8 @@ Don't parse <nowiki><span class="error"></nowiki> (T149622)
 !! html/php
 <p>&lt;span class="error"&gt;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">&lt;span class="error"></span></p>
 !! end
 
 !! test
@@ -2727,6 +2752,10 @@ Templates: Handle comments in the target
 <!-- should be ignored -->
 |foo}}
 
+{{echo
+<!-- should be ignored and spaces on next line should not trip us up (T147742) -->
+  |foo}}
+
 {{echo<!-- should be ignored -->
 |foo}}
 
@@ -2738,10 +2767,13 @@ Templates: Handle comments in the target
 </p><p>foo
 </p><p>foo
 </p><p>foo
+</p><p>foo
 </p>
 !! html/parsoid
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
 
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored and spaces on next line should not trip us up (T147742) -->\n  ","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
 
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
@@ -2821,9 +2853,9 @@ Parsoid: pipe in transclusion parameter
 !! html/php+tidy
 <p><a rel="nofollow" class="external free" href="http://foo.com/a%7Cb">http://foo.com/a%7Cb</a></p>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+<p><a rel="mw:ExtLink" href="http://foo.com/a%7Cb" about="#mwt1"
 typeof="mw:Transclusion"
-data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a%7Cb</a></p>
 !! end
 
 !! test
@@ -3686,7 +3718,6 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 !! end
 
 !! test
-
 Definition list with empty definition and following paragraph
 !! wikitext
 ; term:
@@ -4759,6 +4790,17 @@ news:'a'b''c''d e
 <p><a rel="mw:ExtLink" href="news:'a'b">news:'a'b</a><i>c</i>d e</p>
 !! end
 
+!! test
+External links: with entity
+!! wikitext
+[http://&#x20;www.librarieswithoutborders.org Libraries without borders]
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://+www.librarieswithoutborders.org">Libraries without borders</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://+www.librarieswithoutborders.org" data-parsoid='{"a":{"href":"http://+www.librarieswithoutborders.org"},"sa":{"href":"http://&amp;#x20;www.librarieswithoutborders.org"}}'>Libraries without borders</a></p>
+!! end
+
 !! test
 External links: Lone protocols are never linked (T105697)
 !! wikitext
@@ -5421,7 +5463,7 @@ http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a></p>
 
-<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid[]=bar">http://example.com/index.php?foozoid[]=bar</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar" data-parsoid='{"stx":"url","a":{"href":"http://example.com/index.php?foozoid%5B%5D=bar"},"sa":{"href":"http://example.com/index.php?foozoid&amp;#x5B;&amp;#x5D;=bar"}}'>http://example.com/index.php?foozoid%5B%5D=bar</a></p>
 !! end
 
 !! test
@@ -6368,7 +6410,7 @@ parsoid=wt2html,html2html
 !! html/parsoid
 <table><tbody>
 <tr>
-<td data-parsoid='{"startTagSrc":"| ","attrSepSrc":"|","autoInsertedEnd":true}'><a rel="mw:ExtLink" href="ftp://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
+<td data-parsoid='{"startTagSrc":"| ","attrSepSrc":"|","autoInsertedEnd":true}'>[<a rel="mw:ExtLink" href="ftp://%7Cx" data-parsoid='{"stx":"url","a":{"href":"ftp://%7Cx"},"sa":{"href":"ftp://|x"}}'>ftp://%7Cx</a></td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'>]" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
 !! test
@@ -6442,6 +6484,26 @@ parsoid=wt2html,html2html
 <span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho\">ha&lt;/div>"}},"i":0}}]}'>ho">ha</span>
 !! end
 
+!! test
+Break on | in element attribute name in template
+!! wikitext
+{{echo|<div cla|ss="hiho">ha</div>}}
+!! html/parsoid
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"},{"k":"ss","named":true}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div cla"},"ss":{"wt":"\"hiho\">ha&lt;/div>"}},"i":0}}]}'>&lt;div cla</p>
+!! end
+
+!! test
+Don't break on | in extension attribute in template
+!! wikitext
+{{echo|<ref name="hi|ho">ha</ref>}}
+
+<references />
+!! html/parsoid
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-hi.7Cho_1-0" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref name=\"hi|ho\">ha&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-hi.7Cho-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-hi.7Cho-1" id="cite_note-hi.7Cho-1"><a href="./Main_Page#cite_ref-hi.7Cho_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-hi.7Cho-1" class="mw-reference-text">ha</span></li></ol>
+!! end
+
 ## We don't support roundtripping of these attributes in Parsoid.
 ## Selective serialization takes care of preventing dirty diffs.
 ## But, on edits, we dirty-diff the invalid attribute text.
@@ -6612,9 +6674,9 @@ T107652: <ref>s in templates that also generate table cell attributes should be
 <references />
 !! html/parsoid
 <table>
-<tbody><tr><td style="background:#f9f9f9;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_7","href":"./Template:Table_attribs_7"},"params":{},"i":0}}]}'>Foo<span class="mw-ref" id="cite_ref-1" rel="dc:references" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></td></tr>
+<tbody><tr><td style="background:#f9f9f9;" typeof="mw:Transclusion" about="#mwt1" data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_7","href":"./Template:Table_attribs_7"},"params":{},"i":0}}]}'>Foo<span class="mw-ref" id="cite_ref-1" rel="dc:references" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></td></tr>
 </tbody></table>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -7426,7 +7488,7 @@ Piped link with multiple pipe characters in link text
 <p><a href="/wiki/Main_Page" title="Main Page">|The|Main|Page|</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Main_Page" title="Main Page">|The|Main|Page|</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">|The|Main|Page|</a></p>
 !! end
 
 !! test
@@ -7596,8 +7658,6 @@ Link with multiple pipes
 </p>
 !! end
 
-# Note that parsoid does not munge anchor text; all non-space
-# characters are valid in HTML5 ids.
 !! test
 Anchor containing a #. (bug 63430)
 !! wikitext
@@ -7606,7 +7666,7 @@ Anchor containing a #. (bug 63430)
 <p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link" title="Main Page">Main Page#And#Link</a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#And.23Link" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#And.23Link"},"sa":{"href":"Main Page#And#Link"}}'>Main Page#And#Link</a></p>
 !! end
 
 !! test
@@ -7721,18 +7781,16 @@ Link containing % as a double hex sequence interpreted to hex sequence
 </p>
 !!end
 
-# note that parsoid does not munge anchor text; all non-space
-# characters are valid in HTML5 anchors.
+## Example for such a section: == < ==
 !! test
 Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
-Example for such a section: == < ==
 !! wikitext
 [[%23%3c]][[%23%3e]]
 !! html/php
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#%3E" title="Main Page">#></a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#.3C" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#.3C"},"sa":{"href":"%23%3c"}}'>#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#.3E" title="Main Page" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#.3E"},"sa":{"href":"%23%3e"}}'>#></a></p>
 !! end
 
 !! test
@@ -7786,6 +7844,17 @@ Link containing double-single-quotes '' (bug 4598)
 <p><a rel="mw:WikiLink" href="./Lista_d''e_paise_d''o_munno" title="Lista d''e paise d''o munno">Lista d''e paise d''o munno</a></p>
 !! end
 
+!! test
+Link containing double quotes and spaces
+!! wikitext
+[[Cool "Gator"]]
+!! html/php
+<p><a href="/index.php?title=Cool_%22Gator%22&amp;action=edit&amp;redlink=1" class="new" title="Cool &quot;Gator&quot; (page does not exist)">Cool "Gator"</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Cool_%22Gator%22" title='Cool "Gator"'>Cool "Gator"</a></p>
+!! end
+
 !! test
 Link containing double-single-quotes '' in text (bug 4598 sanity check)
 !! wikitext
@@ -7794,7 +7863,7 @@ Some [[Link|pretty ''italics'' and stuff]]!
 <p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
 </p>
 !! html/parsoid
-<p>Some <a rel="mw:WikiLink" href="Link" title="Link">pretty <i>italics</i> and stuff</a>!</p>
+<p>Some <a rel="mw:WikiLink" href="./Link" title="Link">pretty <i>italics</i> and stuff</a>!</p>
 !! end
 
 !! test
@@ -7824,9 +7893,9 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 </p>
 !! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Denys_Savchenko_''Pentecoste''.jpg"><img resource="./File:Denys_Savchenko_''Pentecoste''.jpg" src="./Special:FilePath/Denys_Savchenko_''Pentecoste''.jpg" height="220" width="220"/></a></span></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">''Pentecoste''</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''">Pentecoste</a></p>
-<p><a rel="mw:WikiLink" href="''Pentecoste''" title="''Pentecoste''"><i>Pentecoste</i></a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''">''Pentecoste''</a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''">Pentecoste</a></p>
+<p><a rel="mw:WikiLink" href="./''Pentecoste''" title="''Pentecoste''"><i>Pentecoste</i></a></p>
 !! end
 
 !! test
@@ -7921,7 +7990,7 @@ Piped link to URL: [[http://www.example.com|an example URL]]
 <p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
 </p>
 !! html/parsoid
-<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com|an">example URL</a>]</p>
+<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com%7Can" data-parsoid='{"a":{"href":"http://www.example.com%7Can"},"sa":{"href":"http://www.example.com|an"}}'>example URL</a>]</p>
 !! end
 
 !! test
@@ -8079,19 +8148,32 @@ Link with multiple ":" in a subpage-supporting namespace (bug 63636)
 Handle title parsing for subpages
 !! options
 title=[[/123123]]
+subpage
 !! wikitext
 123
+!! html/php
+<p>123
+</p>
 !! html/parsoid
 <p>123</p>
 !! end
 
-## FIXME: Add a working php section here
+!! article
+User:Test/123
+!! text
+test 123
+!! endarticle
+
 !! test
 Link to a subpage from a namespace other than main
 !! options
-title=[[User:test]]
+title=[[User:Test]]
+subpage
 !! wikitext
 [[/123]]
+!! html/php
+<p><a href="/wiki/User:Test/123" title="User:Test/123">/123</a>
+</p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./User:Test/123" title="User:Test/123" data-parsoid='{"stx":"simple","a":{"href":"./User:Test/123"},"sa":{"href":"/123"}}'>/123</a></p>
 !! end
@@ -8113,7 +8195,8 @@ parsoid=wt2html
 !! test
 Purely hash wikilink
 !! options
-title=[[User:test/123]]
+title=[[User:Test/123]]
+subpage
 !! wikitext
 [[#a|b]]
 !! html/php
@@ -8125,12 +8208,10 @@ title=[[User:test/123]]
 
 !! test
 1. Interaction of linktrail and template encapsulation
-!! options
-parsoid
 !! wikitext
 {{echo|[[Foo]]}}l
-!! html
-<p><a rel="mw:WikiLink" href="Foo" title="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Foo]]"}},"i":0}},"l"]}'>Fool</a></p>
 !! end
 
 !! test
@@ -8200,7 +8281,7 @@ Parsoid link trail escaping
 !! options
 parsoid=html2wt,html2html
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Apple" title="Apple">apple</a>s</p>
+<p><a rel="mw:WikiLink" href="./Apple" title="Apple">apple</a>s</p>
 !! wikitext
 [[apple]]<nowiki/>s
 !! end
@@ -8211,7 +8292,7 @@ Parsoid link prefix escaping
 language=is
 parsoid=html2wt,html2html
 !! html/parsoid
-<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður">söfnuður</a></p>
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="./Söfnuður" title="Söfnuður">söfnuður</a></p>
 !! wikitext
 Aðrir mótmælenda<nowiki/>[[söfnuður]]
 !! end
@@ -8236,12 +8317,10 @@ Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 
 !! test
 Parsoid: Scoped parsing should handle mixed transclusions and plain text
-!! options
-parsoid
 !! wikitext
 [[Foo|{{echo|a}} b {{echo|c}}]]
-!! html
-<p><a rel="mw:WikiLink" href="Foo" title="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo"><span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span> b <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c"}},"i":0}}]}'>c</span></a></p>
 !! end
 
 !! test
@@ -8252,7 +8331,7 @@ Link with angle bracket after anchor
 <p><a href="/wiki/Foo#.3Cbar.3E" title="Foo">Foo#&lt;bar&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Foo#%3Cbar%3E" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#%3Cbar%3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
+<p><a rel="mw:WikiLink" href="./Foo#.3Cbar.3E" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#.3Cbar.3E"},"sa":{"href":"Foo#&lt;bar>"}}'>Foo#&lt;bar></a></p>
 !! end
 
 ###
@@ -8310,6 +8389,23 @@ Interwiki link with fragment (bug 2130)
 </p>
 !! end
 
+!! test
+Link scenarios with escaped fragments
+!! wikitext
+[[#Is this great?]]
+[[Foo#Is this great?]]
+[[meatball:Foo#Is this great?]]
+!! html/php
+<p><a href="#Is_this_great.3F">#Is this great?</a>
+<a href="/wiki/Foo#Is_this_great.3F" title="Foo">Foo#Is this great?</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F" class="extiw" title="meatball:Foo">meatball:Foo#Is this great?</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page#Is_this_great.3F" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#Is_this_great.3F"},"sa":{"href":"#Is this great?"}}'>#Is this great?</a>
+<a rel="mw:WikiLink" href="./Foo#Is_this_great.3F" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo#Is_this_great.3F"},"sa":{"href":"Foo#Is this great?"}}'>Foo#Is this great?</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F" title="meatball:Foo" data-parsoid='{"stx":"simple","a":{"href":"http://www.usemod.com/cgi-bin/mb.pl?Foo#Is_this_great.3F"},"sa":{"href":"meatball:Foo#Is this great?"},"isIW":true}'>meatball:Foo#Is this great?</a></p>
+!! end
+
 # Ideally the wikipedia: prefix here should be proto-relative too
 # [CSA]: this is kind of a bogus test, as the PHP parser test doesn't
 # define the 'en' prefix, and originally the test used 'wikipedia',
@@ -8518,6 +8614,22 @@ Blah blah blah
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
 !! end
 
+!! test
+Escaping of interlanguage links
+!! wikitext
+Blah blah blah
+[[:es:Spanish]]
+[[ : zh : Chinese ]]
+!! html/php
+<p>Blah blah blah
+<a href="http://es.wikipedia.org/wiki/Spanish" class="extiw" title="es:Spanish">es:Spanish</a>
+<a href="http://zh.wikipedia.org/wiki/Chinese" class="extiw" title="zh:Chinese"> zh : Chinese </a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
+<a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese"> zh : Chinese </a></p>
+!! end
+
 ## parsoid html2wt will normalize the space to _
 !! test
 Space and question mark encoding in interlanguage links (T95473)
@@ -8623,8 +8735,8 @@ Parsoid bug 53221: Wikilinks should be properly entity-escaped
 !! options
 parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
-<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
-<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="./Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="./He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! wikitext
 He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
 
@@ -10217,6 +10329,26 @@ Magic Word: {{SITENAME}}
 </p>
 !! end
 
+!! test
+Magic Word: {{PAGELANGUAGE}}
+!! options
+language=fr
+!! wikitext
+{{PAGELANGUAGE}}
+!! html
+<p>fr
+</p>
+!! end
+
+!! test
+Magic Word: {{PAGELANGUAGE}} on a page with no explicitly set language
+!! wikitext
+{{PAGELANGUAGE}}
+!! html
+<p>en
+</p>
+!! end
+
 !! test
 Case-sensitive magic words, when cased differently, should just be template transclusions
 !! wikitext
@@ -10253,7 +10385,7 @@ Parsoid: Page property magic word with magic word contents
 !! wikitext
 {{DISPLAYTITLE:''{{PAGENAME}}''}}
 !! html/parsoid
-<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
+<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt3" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
 !! end
 
 !! test
@@ -10374,7 +10506,6 @@ language=de
 </p>
 !! end
 
-
 !! test
 Urlencode
 !! wikitext
@@ -10382,7 +10513,7 @@ Urlencode
 {{urlencode:hi world?!|WIKI}}
 {{urlencode:hi world?!|PATH}}
 {{urlencode:hi world?!|QUERY}}
-!! html
+!! html/php
 <p>hi+world%3F%21
 hi_world%3F!
 hi%20world%3F%21
@@ -10875,7 +11006,8 @@ BUG 553: link with two variables in a piped link
 
 !! html/parsoid
 <table>
-<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-parsoid='{"src":"{{{1}}}"}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-parsoid='{"src":"{{{2}}}"}'>{{{2}}}</span>]]</td></tr>
+<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"1"},"params":{},"i":0}}]}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"2"},"params":{},"i":0}}]}'>{{{2}}}</span>]]</td></tr>
+</tbody></table>
 !! end
 
 # See: T2553
@@ -11567,7 +11699,7 @@ parsoid=wt2html
 |c
 |}
 !!html/parsoid
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}' data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"dsr\":[31,38,null,null],\"src\":\"{{{b}}}\"}&#39;>{{{b}}}&lt;/span>"},{"html":""}]]}'>
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"&lt;includeonly>a&lt;/includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><table about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"a":{"{{{b}}}":null},"sa":{"{{{b}}}":""}}' data-mw='{"attribs":[[{"txt":"{{{b}}}","html":"&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[31,38,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"b\"},\"params\":{},\"i\":0}}]}&#39;>{{{b}}}&lt;/span>"},{"html":""}]]}'>
 <tbody><tr><td>c</td></tr>
 </tbody></table>
 !!end
@@ -12252,11 +12384,11 @@ Templates: Wiki Tables: 7. Fosterable <ref>s should get fostered
 
 <references />
 !!html/parsoid
-<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span><table about="#mwt2">
+<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span><table about="#mwt2">
 <tbody>
 </tbody></table>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !!end
 
 !! test
@@ -12456,11 +12588,16 @@ Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of t
 Templates: Parameters substituted at the top-level
 !! wikitext
 {{{foo|''who'' {{echo|me}}? '''never!'''}}}
+
+{{{foo|bar|baz}}}
 !! html/php
 <p><i>who</i> me? <b>never!</b>
+</p><p>bar
 </p>
 !! html/parsoid
-<p about="#mwt2" typeof="mw:Param" data-parsoid="{&quot;src&quot;:&quot;{{{foo|''who'' {{echo|me}}? '''never!'''}}}&quot;}"><i>who</i> me? <b>never!</b></p>
+<p about="#mwt2" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"foo"},"params":{"1":{"wt":"&#39;&#39;who&#39;&#39; {{echo|me}}? &#39;&#39;&#39;never!&#39;&#39;&#39;"}},"i":0}}]}'><i>who</i> me? <b>never!</b></p>
+
+<p about="#mwt3" typeof="mw:Param" data-mw='{"parts":[{"templatearg":{"target":{"wt":"foo"},"params":{"1":{"wt":"bar"},"2":{"wt":"baz"}},"i":0}}]}'>bar</p>
 !! end
 
 !!test
@@ -13464,7 +13601,7 @@ Image with link parameter, wiki target
 <p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image"><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
 # parsoid bug 49293 (part 1)
@@ -13571,7 +13708,7 @@ Image with link parameter (wiki target) and unnamed parameter
 <p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
 !! test
@@ -13623,7 +13760,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
@@ -13665,7 +13802,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-mw='{"thumb":"Thumb.png"}'><a href="./Main_Page"><img alt="alttext" resource="./File:Foobar.jpg" src="//example.com/images/e/ea/Thumb.png" data-file-width="135" data-file-height="135" data-file-type="bitmap" height="135" width="135"/></a><figcaption>Title</figcaption></figure>
 !! end
 
 !! test
@@ -13678,7 +13815,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -13691,7 +13828,7 @@ parsoid=wt2html,wt2wt,html2html
 <div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="Main_Page" title="Main Page">Main Page</a></figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Frame"><a href="./File:Foobar.jpg"><img alt="Altitude" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>This is a test image <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></figcaption></figure>
 !! end
 
 !! test
@@ -14110,6 +14247,19 @@ Escape HTML special chars in image alt text
 <p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 !! end
 
+!! test
+Escape HTML special chars in image alt text with LanguageConverter
+!! options
+language=zh
+!! wikitext
+[[File:Foobar.jpg|& < > "]]
+!! html/php
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp; &lt; > \""}]}' data-mw='{"caption":"&amp;amp; &amp;lt; > \""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+!! end
+
 !! test
 Entities in file name and attributes
 !! wikitext
@@ -14142,7 +14292,7 @@ parsoid=wt2html,wt2wt,html2html
 <p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
 </p>
 !! html/parsoid
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="Main_Page" title="Main Page">this</a> is just an ordinary link.</p>
+<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">this</a> is just an ordinary link.</p>
 !! end
 
 !! test
@@ -14255,7 +14405,7 @@ language=es
 <div class="thumb tleft"><div class="thumbinner" style="width:222px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"></a></div>caption</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+<figure class="mw-default-size mw-halign-left" typeof="mw:Image/Thumb"><a href="./Foo"><img resource="./Archivo:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
@@ -14549,9 +14699,9 @@ T93580: 1. Templated <ref> inside block images
 
 <references />
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption with templated ref: {{echo|&lt;ref>foo&lt;/ref>}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption with templated ref: <span about="#mwt5" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption with templated ref: {{echo|&lt;ref>foo&lt;/ref>}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption with templated ref: <span about="#mwt5" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></figcaption></figure>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -14561,9 +14711,9 @@ T93580: 2. <ref> inside inline images
 
 <references />
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,78,5,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}&#39;>&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,78,5,6]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,78,5,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}&#39;>&lt;a href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,78,5,6]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 !! test
@@ -14573,9 +14723,9 @@ T93580: 3. Templated <ref> inside inline images
 
 <references />
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;>&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;>&lt;a href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=&#39;{\"group\":\"\",\"name\":\"\",\"content\":\"foo\",\"hasRefInRef\":false,\"dsr\":[64,96,null,null],\"pi\":[[{\"k\":\"1\"}]]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&amp;lt;ref>{{echo|foo}}&amp;lt;/ref>\"}},\"i\":0}}]}&#39;/>"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
 !! end
 
 ###
@@ -14629,8 +14779,8 @@ subpage title=[[Subpage test/1/2/3/4]]
 </p><p><a href="/wiki/Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage test/1/2/subpage</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">subpage</a></p>
-<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
+<p><a rel="mw:WikiLink" href="./Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">subpage</a></p>
+<p><a rel="mw:WikiLink" href="./Subpage_test/1/2/subpage" title="Subpage test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
 !! end
 
 !! test
@@ -14920,12 +15070,12 @@ Bar
 Bar
 </p>
 !! html/parsoid
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
-<link rel="mw:PageProp/Category" href="Category:Baz"/>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz"/> <link rel="mw:PageProp/Category" href="./Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
+<link rel="mw:PageProp/Category" href="./Category:Baz"/>
 !! end
 
 ## We used to, but no longer wt2wt this test since the default serializer
@@ -15929,7 +16079,7 @@ parsoid=wt2html,html2html
 <div id="title.3D">HTML rocks</div>
 
 !! html/parsoid
-<div id="title=" data-parsoid='{"stx":"html"}'>HTML rocks</div>
+<div id="title.3D" data-parsoid='{"stx":"html"}'>HTML rocks</div>
 !! end
 
 !! test
@@ -15957,7 +16107,7 @@ div with braces in attribute value
 !! wikitext
 <div title="{}">Foo</div>
 !! html/php
-<div title="&#123;}">Foo</div>
+<div title="&#123;&#125;">Foo</div>
 
 !! html/parsoid
 <div title="{}">Foo</div>
@@ -16397,9 +16547,11 @@ Template:Div style
 Bug 2304: HTML attribute safety (safe template; regression bug 2309)
 !! wikitext
 <div title="{{test}}"></div>
-!! html
+!! html/php
 <div title="This is a test template"></div>
 
+!! html/parsoid
+<div title="This is a test template" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"title":"This is a test template"},"sa":{"title":"{{test}}"}}' data-mw='{"attribs":[[{"txt":"title"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[12,20,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"test\",\"href\":\"./Template:Test\"},\"params\":{},\"i\":0}}]}&#39;>This is a test template&lt;/span>"}]]}'></div>
 !! end
 
 # Parsoid has enough context to handle this case
@@ -16418,29 +16570,36 @@ Bug 2304: HTML attribute safety (dangerous template; 2309)
 Bug 2304: HTML attribute safety (dangerous style template; 2309)
 !! wikitext
 <div style="{{dangerous style attribute}}"></div>
-!! html
+!! html/php
 <div style="/* insecure input */"></div>
 
+!! html/parsoid
+<div style="/* insecure input */" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"{{dangerous style attribute}}"}}' data-mw='{"attribs":[[{"txt":"style"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[12,41,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"dangerous style attribute\",\"href\":\"./Template:Dangerous_style_attribute\"},\"params\":{},\"i\":0}}]}&#39;>border-size: expression(alert(document.cookie))&lt;/span>"}]]}'></div>
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (safe parameter; 2309)
 !! wikitext
 {{div style|width: 200px}}
-!! html
+!! html/php
 <div style="float: right; width: 200px">Magic div</div>
 
+!! html/parsoid
+<div style="float: right; width: 200px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","a":{"style":"float: right; width: 200px"},"sa":{"style":"float: right; {{{1}}}"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"div style","href":"./Template:Div_style"},"params":{"1":{"wt":"width: 200px"}},"i":0}}]}'>Magic div</div>
 !! end
 
 !! test
 Bug 2304: HTML attribute safety (unsafe parameter; 2309)
 !! wikitext
 {{div style|width: expression(alert(document.cookie))}}
-!! html
+!! html/php
 <div style="/* insecure input */">Magic div</div>
 
+!! html/parsoid
+<div style="/* insecure input */" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"float: right; {{{1}}}"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"div style","href":"./Template:Div_style"},"params":{"1":{"wt":"width: expression(alert(document.cookie))"}},"i":0}}]}'>Magic div</div>
 !! end
 
+## Parsoid output here differs; needs investigation.
 !! test
 Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
 !! wikitext
@@ -16450,6 +16609,7 @@ Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
 
 !! end
 
+## Parsoid output here differs; needs investigation.
 !! test
 Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! wikitext
@@ -16486,7 +16646,6 @@ Bug 2304: HTML attribute safety (bold)
 
 !! end
 
-
 !! test
 Bug 2304: HTML attribute safety (ISBN)
 !! wikitext
@@ -16536,18 +16695,22 @@ Bug 2304: HTML attribute safety (named web link)
 Bug 3244: HTML attribute safety (extension; safe)
 !! wikitext
 <div style="<nowiki>background:blue</nowiki>"></div>
-!! html
+!! html/php
 <div style="background:blue"></div>
 
+!! html/parsoid
+<div style="background:blue" data-parsoid='{"stx":"html","a":{"style":"background:blue"},"sa":{"style":"&lt;nowiki>background:blue&lt;/nowiki>"}}'></div>
 !! end
 
 !! test
 Bug 3244: HTML attribute safety (extension; unsafe)
 !! wikitext
 <div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! html
+!! html/php
 <div style="/* insecure input */"></div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"&lt;nowiki>border-left:expression(alert(document.cookie))&lt;/nowiki>"}}'></div>
 !! end
 
 # More MSIE fun discovered by Tom Gilder
@@ -16556,45 +16719,55 @@ Bug 3244: HTML attribute safety (extension; unsafe)
 MSIE CSS safety test: spurious slash
 !! wikitext
 <div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="/* insecure input */">evil</div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:u\\rl(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: hex code
 !! wikitext
 <div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="/* insecure input */">evil</div>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:u\\72l(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: comment in url
 !! wikitext
 <div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! html
+!! html/php
 <div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
 
+!! html/parsoid
+<div style="background-image:u rl(javascript:alert('boo'))" data-parsoid='{"stx":"html","a":{"style":"background-image:u rl(javascript:alert(&#39;boo&#39;))"},"sa":{"style":"background-image:u/**/rl(javascript:alert(&#39;boo&#39;))"}}'>evil</div>
 !! end
 
 !! test
 MSIE CSS safety test: comment in expression
 !! wikitext
 <div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! html
+!! html/php
 <div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
 
+!! html/parsoid
+<div style="background-image:expres sion(alert('boo4'))" data-parsoid='{"stx":"html","a":{"style":"background-image:expres sion(alert(&#39;boo4&#39;))"},"sa":{"style":"background-image:expres/**/sion(alert(&#39;boo4&#39;))"}}'>evil4</div>
 !! end
 
 !! test
 CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
 !! wikitext
 <p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! html
+!! html/php
 <p style="/* invalid control char */">A</p>
 
+!! html/parsoid
+<p style="/* invalid control char */" data-parsoid='{"stx":"html","a":{"style":"/* invalid control char */"},"sa":{"style":"font-size: 100px; background-image:url\\b(https://www.google.com/images/srpr/logo6w.png)"}}'>A</p>
 !! end
 
 !! test
@@ -16602,10 +16775,13 @@ MSIE 6 CSS safety test: Fullwidth (bug 55332)
 !! wikitext
 <p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
 <div style="top:EXPRESSION(alert())">B</div>
-!! html
+!! html/php
 <p style="/* insecure input */">A</p>
 <div style="/* insecure input */">B</div>
 
+!! html/parsoid
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expression((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>A</p>
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"top:EXPRESSION(alert())"}}'>B</div>
 !! end
 
 !! test
@@ -16613,10 +16789,13 @@ MSIE 6 CSS safety test: IPA extensions (bug 55332)
 !! wikitext
 <div style="background-image:uʀʟ(javascript:alert())">A</div>
 <p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! html
+!! html/php
 <div style="/* insecure input */">A</div>
 <p style="/* insecure input */">B</p>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:uʀʟ(javascript:alert())"}}'>A</div>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expʀessɪoɴ((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>B</p>
 !! end
 
 !! test
@@ -16625,23 +16804,30 @@ MSIE 6 CSS safety test: sup/sub script (bug 55332)
 <div style="background-image:url⁽javascript:alert())">A</div>
 <div style="background-image:url₍javascript:alert())">B</div>
 <p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
-!! html
+!! html/php
 <div style="/* insecure input */">A</div>
 <div style="/* insecure input */">B</div>
 <p style="/* insecure input */">C</p>
 
+!! html/parsoid
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:url⁽javascript:alert())"}}'>A</div>
+<div style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"background-image:url₍javascript:alert())"}}'>B</div>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expressioⁿ((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>C</p>
 !! end
 
-# FIXME: Parsoid fails to sanitize this! See T58846.
 !! test
 Opera -o-link CSS
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <div
 title="&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#60;&#105;&#109;&#103;&#32;&#115;&#114;&#99;&#61;&#49;&#32;&#111;&#110;&#101;&#114;&#114;&#111;&#114;&#61;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#62;"
 style="-o-link:attr(title);-o-link-source:current">X</div>
-!! html
+!! html/php
 <div title="data:text/html,&lt;img src=1 onerror=alert(1)&gt;" style="/* insecure input */">X</div>
 
+!! html/parsoid
+<div title="data:text/html,&lt;img src=1 onerror=alert(1)>" style="/* insecure input */" data-parsoid='{"stx":"html","a":{"title":"data:text/html,&lt;img src=1 onerror=alert(1)>","style":"/* insecure input */"},"sa":{"title":"&amp;#100;&amp;#97;&amp;#116;&amp;#97;&amp;#58;&amp;#116;&amp;#101;&amp;#120;&amp;#116;&amp;#47;&amp;#104;&amp;#116;&amp;#109;&amp;#108;&amp;#44;&amp;#60;&amp;#105;&amp;#109;&amp;#103;&amp;#32;&amp;#115;&amp;#114;&amp;#99;&amp;#61;&amp;#49;&amp;#32;&amp;#111;&amp;#110;&amp;#101;&amp;#114;&amp;#114;&amp;#111;&amp;#114;&amp;#61;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#49;&amp;#41;&amp;#62;","style":"-o-link:attr(title);-o-link-source:current"}}'>X</div>
 !! end
 
 !! test
@@ -16654,7 +16840,7 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 <p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
 <p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
 <p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">G</p>
-!! html
+!! html/php
 <p style="/* insecure input */">A</p>
 <p style="/* insecure input */">B</p>
 <p style="/* insecure input */">C</p>
@@ -16663,6 +16849,14 @@ MSIE 6 CSS safety test: Repetition markers (bug 55332)
 <p style="/* insecure input */">F</p>
 <p style="/* insecure input */">G</p>
 
+!! html/parsoid
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expres〱ion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>A</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresゝion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>B</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresーion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>C</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresヽion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>D</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresﹽion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>E</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresﹼion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>F</p>
+<p style="/* insecure input */" data-parsoid='{"stx":"html","a":{"style":"/* insecure input */"},"sa":{"style":"font-size: 100px; color: expresーion((title=&#39;XSSed&#39;),&#39;red&#39;)"}}'>G</p>
 !! end
 
 !! test
@@ -16726,7 +16920,6 @@ Expansion of multi-line templates in attribute values (bug 6255)
 
 !! end
 
-
 !! test
 Expansion of multi-line templates in attribute values (bug 6255 sanity check)
 !! wikitext
@@ -16760,6 +16953,7 @@ Tags which are hidden from Tidy cannot pass through the Sanitizer
 ###
 ### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
 ###
+
 !! test
 Parser hook: empty input
 !! wikitext
@@ -17107,9 +17301,11 @@ Table not started</td></tr></table>
 Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
 !! wikitext
 <span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! html
+!! html/php
 <p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
 </p>
+!! html/parsoid
+<p><span id=".C3.A6:_v" data-parsoid='{"stx":"html","a":{"id":".C3.A6:_v"},"sa":{"id":"æ: v"}}'>byte</span><a rel="mw:WikiLink" href="./Main_Page#.C3.A6:_v" data-parsoid='{"stx":"piped","a":{"href":"./Main_Page#.C3.A6:_v"},"sa":{"href":"#æ: v"}}'>backlink</a></p>
 !! end
 
 # In HTML5, the restrictions are that id must contain at least one character,
@@ -17616,6 +17812,8 @@ http://===r:::https://b
 # Known to produce bad XML for now
 !! test
 Fuzz testing: Parser24
+!! options
+parsoid=wt2html
 !! wikitext
 {|
 {{{|
@@ -17625,7 +17823,7 @@ Fuzz testing: Parser24
 
 MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 |
-!! html
+!! html/php
 <table>
 {{{|
 <u class="&#124;">}}}} &gt;
@@ -17638,6 +17836,14 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 </tr>
 </table>
 
+!! html/parsoid
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>{{{|
+<u class="|" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":""},"autoInsertedEnd":true}' data-mw='{"attribs":[[{"txt":"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}}","html":"{&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[21,79,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&amp;lt;noinclude>\"},\"params\":{},\"i\":0}}]}&#39;>{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}&lt;/span>}"},{"html":""}]]}'>
+<br style="onmouseover='alert(document.cookie);' " data-parsoid='{"stx":"html","selfClose":true}'/></u></p><p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><u class="|" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&lt;noinclude>}}}}":""},"autoInsertedEnd":true,"autoInsertedStart":true}' data-mw='{"attribs":[[{"txt":"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}}","html":"{&lt;span about=\"#mwt1\" typeof=\"mw:Param\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[21,79,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"templatearg\":{\"target\":{\"wt\":\"SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->&amp;lt;noinclude>\"},\"params\":{},\"i\":0}}]}&#39;>{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx-->}}}&lt;/span>}"},{"html":""}]]}'>MOVE YOUR MOUSE CURSOR OVER THIS TEXT</u></p><table data-parsoid='{"autoInsertedEnd":true}'>
+
+
+
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'></td></tr></tbody></table>
 !! end
 
 # Note: the current result listed for this is not what the original one was,
@@ -17656,9 +17862,12 @@ Fuzz testing: Parser25 (bug 6055)
 <LI CLASS=||
  >
 }}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! html
+!! html/php
 <p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 </p>
+!! html/parsoid
+<span about="#mwt1" typeof="mw:Param" data-parsoid='{"pi":[[{"k":"1"},{"k":"2"},{"k":"3"}]]}' data-mw='{"parts":[{"templatearg":{"target":{"wt":"\n"},"params":{"1":{"wt":" \n&lt;LI CLASS="},"2":{"wt":""},"3":{"wt":"\n >\n"}},"i":0}},"blah\" onmouseover=\"alert(&#39;hello world&#39;);\" align=\"left\"&#39;&#39;&#39;MOVE MOUSE CURSOR OVER HERE"]}'> 
+</span><p about="#mwt1">&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b></p>
 !! end
 
 !!test
@@ -18715,7 +18924,6 @@ stuff
 xxx
 !! end
 
-
 !! test
 Handling of &#x0A; in URLs
 !! wikitext
@@ -18724,9 +18932,7 @@ Handling of &#x0A; in URLs
 <ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 
 !! html/parsoid
-<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://
-a">irc://
-a</a></li></ul></li></ul>
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa" data-parsoid='{"stx":"url","a":{"href":"irc://%0Aa"},"sa":{"href":"irc://&amp;#x0A;a"}}'>irc://%0Aa</a></li></ul></li></ul>
 !! end
 
 !! test
@@ -18740,7 +18946,6 @@ Handling of %0A in URLs
 <ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
 !! end
 
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 5 quotes, code coverage +1 line
@@ -18858,8 +19063,14 @@ title=[[Parser test]]
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
 
+## Parsoid thinks the "centre" here is a property, not a caption.
 !! test
 Gallery
+!! options
+parsoid={
+  "modes": ["wt2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 image1.png |
@@ -18871,7 +19082,7 @@ image4    |300px| centre
 [[x|xx]]]]
 * image6
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Image1.png</div>
@@ -18909,19 +19120,33 @@ image4    |300px| centre
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image1.png </span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image2.gif</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image3</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">image4    </span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;"> image5.svg</span></div><div class="gallerytext"> <a rel="mw:ExtLink" href="http://///////">http://///////</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">* image6</span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 !! test
-Gallery (with options)
+Gallery (with options, html)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
-<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
+<gallery widths="70px" heights="40px" perrow="2" caption="Foo [[Main Page]]">
 File:Nonexistent.jpg|caption
 File:Nonexistent.jpg
 image:foobar.jpg|some '''caption''' [[Main Page]]
 image:foobar.jpg
 image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
        <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
                <li class="gallerybox" style="width: 105px"><div style="width: 105px">
@@ -18957,30 +19182,105 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px; _width: 226px;" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{"widths":"70px","heights":"40px","perrow":"2"},"body":{}}'>
+<li class="gallerycaption">Foo <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext">caption</div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext">some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="This is a foo-bar." 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></span></div><div class="gallerytext">blabla.</div></li>
+</ul>
 !! end
 
 !! test
-Gallery with link that has fragment
+Gallery (with options, extsrc)
+!! options
+parsoid={
+  "nativeGallery": false
+}
 !! wikitext
-<gallery>
-image:foobar.jpg|link=Main_Page
-image:foobar.jpg|link=Main_Page#section
-image:foobar.jpg|link=Main Page#section|caption
+<gallery widths="70px" heights="40px" perrow="2" caption="Foo [[Main Page]]">
+File:Nonexistent.jpg|caption
+File:Nonexistent.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+image:foobar.jpg
+image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </gallery>
-!! html
-<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/Main_Page"><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>
+!! html/php
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
+       <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
+<p>caption
+</p>
                        </div>
                </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><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>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="height: 70px;">Nonexistent.jpg</div>
                        <div class="gallerytext">
                        </div>
                </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="" 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>
+               <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="" 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">
+<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p>
+                       </div>
+               </div></li>
+               <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>
+               <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="This is a foo-bar." 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">
+<p>blabla.
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px; _width: 226px;" typeof="mw:Extension/gallery" about="#mwt3" data-parsoid='{}' data-mw='{"name":"gallery","attrs":{"widths":"70px","heights":"40px","perrow":"2","caption":"Foo [[Main Page]]"},"body":{"extsrc":"\nFile:Nonexistent.jpg|caption\nFile:Nonexistent.jpg\nimage:foobar.jpg|some &#39;&#39;&#39;caption&#39;&#39;&#39; [[Main Page]]\nimage:foobar.jpg\nimage:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.\n"}}'>
+<li class="gallerycaption">Foo <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext">caption</div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext">some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 105px;"><div class="thumb" style="width: 100px; height: 70px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="This is a foo-bar." 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></span></div><div class="gallerytext">blabla.</div></li>
+</ul>
+!! end
+
+!! test
+Gallery with link that has fragment
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+image:foobar.jpg|link=Main_Page
+image:foobar.jpg|link=Main_Page#section
+image:foobar.jpg|link=Main Page#section|caption
+</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/Main_Page"><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>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><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>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/Main_Page#section"><img alt="" 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">
 <p>caption
 </p>
@@ -18988,16 +19288,56 @@ image:foobar.jpg|link=Main Page#section|caption
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page"><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></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page#section"><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></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./Main_Page#section"><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></span></div><div class="gallerytext">caption</div></li>
+</ul>
+!! end
+
+## Whoops, Parsoid shouldn't be parsing templates in the attribute caption!
+!! test
+Gallery with template inside caption
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery caption="{{echo|hi}}">
+File:Foobar.jpg|{{echo|ho}}
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional">
+       <li class='gallerycaption'>{{echo|hi}}</li>
+               <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="" 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">
+<p>ho
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt6" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerycaption"><span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi"}},"i":0}}]}'>hi</span></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"><span about="#mwt5" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho"}},"i":0}}]}'>ho</span></div></li>
+</ul>
 !! end
 
 !! test
 Gallery with wikitext inside caption
+!! options
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
-File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
-File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
+File:Foobar.jpg|alt=galleryalt|[[File:Foobar.jpg|alt=inneralt|20x20px|desc]]
+File:Foobar.jpg|alt=galleryalt|{{Test|unamedParam|alt=param}}
 </gallery>
-!! html
+!! 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="galleryalt" 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>
@@ -19015,18 +19355,27 @@ File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt6" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="galleryalt" 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></span></div><div class="gallerytext"><span typeof="mw:Image" data-mw='{"caption":"desc"}'><a href="./File:Foobar.jpg"><img alt="inneralt" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="2" width="20"/></a></span></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img alt="galleryalt" 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></span></div><div class="gallerytext"><span about="#mwt4" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Test","href":"./Template:Test"},"params":{"1":{"wt":"unamedParam"},"alt":{"wt":"param"}},"i":0}}]}'>This is a test template</span></div></li>
+</ul>
 !! end
 
 !! test
-gallery (with showfilename option)
+Gallery (with showfilename option)
+!! options
+parsoid={
+  "nativeGallery": true
+}
 !! wikitext
-<gallery showfilename>
+<gallery showfilename="">
 File:Nonexistent.jpg|caption
 File:Nonexistent.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
+File:Foobar.jpg|some '''caption''' [[Main Page]]
 File:Foobar.jpg
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
@@ -19060,10 +19409,23 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt3" data-mw='{"name":"gallery","attrs":{"showfilename":""},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"><a href="./File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">File:Nonexistent.jpg</a>caption</div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"><a href="./File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">File:Nonexistent.jpg</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"><a href="./File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">File:Foobar.jpg</a>some <b>caption</b> <a rel="mw:WikiLink" href="./Main_Page" title="Main Page">Main Page</a></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"><a href="./File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">File:Foobar.jpg</a></div></li>
+</ul>
 !! end
 
+## Should Parsoid be preserving these variations?
 !! test
 Gallery (with namespace-less filenames)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
 !! wikitext
 <gallery>
 File:Nonexistent.jpg
@@ -19071,7 +19433,7 @@ Nonexistent.jpg
 image:foobar.jpg
 foobar.jpg
 </gallery>
-!! html
+!! html/php
 <ul class="gallery mw-gallery-traditional">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
@@ -19095,6 +19457,154 @@ foobar.jpg
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">Nonexistent.jpg</span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"></div></li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery override link with WikiLink (T36852)
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=InterWikiLink
+</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/InterWikiLink"><img alt="galleryalt" 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-parsoid='{"dsr":[0,70,2,2]}' data-mw='{"name":"gallery","attrs":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./InterWikiLink"><img alt="galleryalt" 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></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery override link with absolute external link (T36852)
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=http://www.example.org
+</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="http://www.example.org"><img alt="galleryalt" 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":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="http://www.example.org"><img alt="galleryalt" 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></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery override link with absolute external link with LanguageConverter
+!! options
+language=zh
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<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="http://www.example.org"><img alt="galleryalt" 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">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!! test
+Gallery override link with malicious javascript (T36852)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</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/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" 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":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./%22_onclick=%22alert('malicious_javascript_code!');"><img alt="galleryalt" 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></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery with invalid title as link (T45964)
+!! options
+parsoid={
+  "modes": ["wt2html", "html2html"],
+  "nativeGallery": true
+}
+!! wikitext
+<gallery>
+File:Foobar.jpg|link=<
+</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":{},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><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></span></div><div class="gallerytext">link=&lt;</div></li>
+</ul>
+!! end
+
+!! test
+Serialize gallery without attrs in data-mw
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "nativeGallery": true
+}
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","body":{}}'>
+<li class="gallerycaption">123</li>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:Test.png</span></div><div class="gallerytext"></div></li>
+</ul>
+!! wikitext
+<gallery caption="123">
+File:Test.png
+</gallery>
 !! end
 
 !! test
@@ -19380,7 +19890,6 @@ dt/dd/dl test
 
 !!end
 
-
 # Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
 !! test
 Images with the "|" character in the comment
@@ -19390,7 +19899,7 @@ Images with the "|" character in the comment
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx" data-parsoid='{"a":{"href":"http://test/?param1=%7Cleft%7C&amp;param2=%7Cx"},"sa":{"href":"http://test/?param1=|left|&amp;param2=|x"}}'>external</a> URL</figcaption></figure>
 !! end
 
 !! test
@@ -19942,8 +20451,8 @@ parsoid=wt2html
 !! html/php
 cat=分类 sort=
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="A" title="A">A</a></p>
-<link rel="mw:PageProp/Category" href="Category:分类"/>
+<p><a rel="mw:WikiLink" href="./A" title="A">A</a></p>
+<link rel="mw:PageProp/Category" href="./Category:分类"/>
 !! end
 
 !! test
@@ -20218,6 +20727,28 @@ Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiw
 # Since Parsoid is starting to emit canonical wikitext for links,
 # [http://example.com http://example.com] will not RT back to that
 # form anymore.
+!! test
+HTML markups with conversion syntax in attribs, nested in other conversion blocks
+!! options
+language=zh variant=zh-cn
+!! wikitext
+-{zh;zh-hans;zh-hant|<span title="-{X}-">A</span>}-
+!! html
+<p><span title="X">A</span>
+</p>
+!! end
+
+!! test
+HTML markups with conversion syntax in attribs, nested in other conversion blocks (not working yet)
+!! options
+language=zh variant=zh-cn disabled
+!! wikitext
+-{<span title="-{X}-">A</span>}-
+!! html
+<p><span title="X">A</span>
+</p>
+!! end
+
 !! test
 Proper conversion of text in external links
 !! options
@@ -20294,16 +20825,72 @@ language=sr variant=sr-ec
 </p>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
+# FIXME: This test is currently broken in the PHP parser T153761
 !! test
-Don't break image parsing if language converter markup is in the caption.
+T146304: Don't break template parsing if language converter markup is in the parameter.
+!! options
+language=sr variant=sr-ec
+disabled
+!! wikitext
+{{echo|-{R|foo}-}}
+!! html/php
+<p>foo
+</p>
+!! end
+
+!! test
+T146305: Don't break image parsing if language converter markup is in the caption.
 !! options
 language=sr
 !! wikitext
-[[File:Foobar.jpg|-{R|caption}-]]
+[[File:Foobar.jpg|thumb|-{R|caption:}-]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:Foobar.jpg" class="internal" title="Повећај"></a></div>caption:</div></div></div>
+
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./Датотека:Foobar.jpg"><img resource="./Датотека:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw='{"disabled":true,"show":true,"text":"caption:"}'></span></figcaption></figure>
+!! end
+
+!! test
+T146305: Don't break image parsing if nested language converter markup is in the caption.
+!! options
+language=zh variant=zh-cn
+!! wikitext
+[[File:Foobar.jpg|thumb|-{zh-cn:blog (hk: -{zh-hans|WEBJOURNAL}-, tw: -{zh-hans|WEBLOG}-)}-]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="放大"></a></div>blog (hk: WEBJOURNAL, tw: WEBLOG)</div></div></div>
+
 !! html/parsoid
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"blog (hk: &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[42,64,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"WEBJOURNAL\"}&#39;>&lt;/span>, tw: &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[70,88,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"WEBLOG\"}&#39;>&lt;/span>)"}],"show":true}'></span></figcaption></figure>
+!! end
+
+!! test
+Don't break gallery if language converter markup is inside.
+!! options
+language=zh
+!! wikitext
+<gallery>
+File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=-{R|foo}-|-{R|bar}-]]|alt=-{R|bat}-
+File:foobar.jpg|{{Test|unamedParam|alt=-{R|param}-}}|alt=galleryalt
+</gallery>
+!! html
+<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="bat" 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">
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="bar"><img alt="foo" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
 </p>
+                       </div>
+               </div></li>
+               <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="galleryalt" 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">
+<p>This is a test template
+</p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 # FIXME: This test is currently broken in the PHP parser (bug 52661)
@@ -20321,9 +20908,8 @@ language=zh variant=zh-cn
 </dt></dl>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
 !! test
-Don't break table handling if language converter markup is in the cell.
+T153140: Don't break table handling if language converter markup is in the cell.
 !! options
 language=sr variant=sr-ec
 !! wikitext
@@ -20335,7 +20921,7 @@ language=sr variant=sr-ec
 <table>
 
 <tr>
-<td>Б}-
+<td> B
 </td></tr></table>
 
 !! html/parsoid
@@ -20954,7 +21540,7 @@ Edit comment with link with more than one pipe (T99346)
 comment
 !! wikitext
 [[Main Page|Many|pipes]]
-!! html
+!! html/php
 <a href="/wiki/Main_Page" title="Main Page">Many|pipes</a>
 !! end
 
@@ -20964,7 +21550,7 @@ Complex edit comment with link with more than one pipe (T99346)
 comment
 !! wikitext
 Created page with "<noinclude>[[Category:Requests for permissions/Bot|{{subst:#titleparts:{{subst:PAGENAME}}|1|3}}]]</noinclude> === [[User:MineoBot|]] 8=== {{Request for permissions/links|Mineo..."
-!! html
+!! html/php
 Created page with &quot;&lt;noinclude&gt;<a href="/index.php?title=Category:Requests_for_permissions/Bot&amp;action=edit&amp;redlink=1" class="new" title="Category:Requests for permissions/Bot (page does not exist)">{{subst:#titleparts:{{subst:PAGENAME}}|1|3}}</a>&lt;/noinclude&gt; === <a href="/index.php?title=User:MineoBot&amp;action=edit&amp;redlink=1" class="new" title="User:MineoBot (page does not exist)">User:MineoBot</a> 8=== {{Request for permissions/links|Mineo...&quot;
 !! end
 
@@ -21765,7 +22351,7 @@ Strip marker in urlencode
 {{urlencode:x<nowiki/>y|wiki}}
 {{urlencode:x<nowiki/>y|path}}
 {{urlencode:x<pre id="one">two</pre>y}}
-!! html
+!! html/php
 <p>xy
 xy
 xy
@@ -21922,61 +22508,6 @@ File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
 
 !! end
 
-!!test
-Gallery override link with absolute external link (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
-!! html
-<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="http://www.example.org"><img alt="galleryalt" 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">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with malicious javascript (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
-</gallery>
-!! html
-<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/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" 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">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery with invalid title as link (bug 43964)
-!! wikitext
-<gallery>
-File:foobar.jpg|link=<
-</gallery>
-!! html
-<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>
-
-!! end
-
 !!test
 Language parser function
 !! wikitext
@@ -22173,13 +22704,13 @@ B <ref name="x">foo</ref>
 C <ref name="y" />
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="./Main_Page#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><a href="#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><a href="#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-x-2" id="cite_note-x-2"><a href="./Main_Page#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-y-3" id="cite_note-y-3"><a href="./Main_Page#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
 </ol>
 !!end
 
@@ -22190,10 +22721,10 @@ A <ref name="x">foo</ref>
 B <ref name="x" />
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -22205,11 +22736,11 @@ B <ref name=" x " />
 C <ref name= x  />
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -22220,9 +22751,9 @@ Ref: 4. 'constructor' should be accepted as a valid ref-name
 A <ref name="constructor">foo</ref>
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="./Main_Page#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="./Main_Page#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -22235,10 +22766,10 @@ A <ref>
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </span></li>
 </ol>
 !!end
@@ -22254,10 +22785,10 @@ A <ref>
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
  bar
  baz
 </span></li>
@@ -22282,10 +22813,10 @@ booz
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
 
 bar
 
@@ -22306,9 +22837,9 @@ A <ref> foo {{echo|</ref> B C}}
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
 </ol>
 !!end
 
@@ -22318,9 +22849,9 @@ Ref: 9. unclosed comments should not leak out of ref-body
 A <ref> foo <!--</ref> B C
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
 </ol>
 !!end
 
@@ -22331,11 +22862,11 @@ A <ref> <b> foo </ref> B C
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
 
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
 </ol>
 !!end
 
@@ -22346,11 +22877,11 @@ A <ref>foo</ref> B
 C <ref>bar</ref> D
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
-C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
+C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
 <!--the newline at the end of this line moves out of the p tag--><p>a</p>
 
 
-<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
+<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
 <p>c</p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
 !!end
 
 !!test
@@ -22385,28 +22916,29 @@ Ref: 13. ref-tags are not SOL-transparent and block indent-pres
 </ref> B
 <references />
 !! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
+<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
 </span></li>
 </ol>
 !!end
 
-!!test
+## Roundtripping fails because of nowiki'ing
+!! test
 Ref: 14. A nested ref-tag should be emitted as plain text
+!! options
+parsoid=wt2html
 !! wikitext
 <ref>foo <ref>bar</ref> baz</ref>
 
 <references />
 !! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo &lt;ref>bar&lt;/ref> baz</span></li>
-</ol>
-!!end
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span> baz&lt;/ref></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo &lt;ref>bar</span></li></ol>
+!! end
 
 !!test
 Ref: 15. ref-tags with identical names should get identical indexes
@@ -22416,10 +22948,10 @@ B1 <ref name="b" /> B2 <ref name="b">bar</ref>
 
 <references />
 !! html/parsoid
-<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
+<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
+B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
@@ -22433,24 +22965,24 @@ A <ref >foo</ref >
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !!end
 
 !!test
 Ref: 17. Generate valid HTML5 id/about attributes
 !!wikitext
 <ref name="a b">foo</ref>
+<ref name=":0">ve-created name</ref>
 
 <references />
 !!html/parsoid
-<p><span class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="#cite_note-a_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="./Main_Page#cite_note-a_b-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span>
+<span about="#mwt4" class="mw-ref" id="cite_ref-:0_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-:0-2"},"attrs":{"name":":0"}}'><a href="./Main_Page#cite_note-:0-2" style="counter-reset: mw-Ref 2;"><span class="mw-reflink-text">[2]</span></a></span>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="./Main_Page#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li><li about="#cite_note-:0-2" id="cite_note-:0-2"><a href="./Main_Page#cite_ref-:0_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-:0-2" class="mw-reference-text">ve-created name</span></li></ol>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li>
-</ol>
 !!end
 
 !!test
@@ -22460,11 +22992,11 @@ Ref: 18. T58916: Extension attributes should be parsed as plain text
 
 <references />
 !!html/parsoid
-<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
+<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="./Main_Page#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="./Main_Page#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -22475,10 +23007,10 @@ Ref: 19. ref-tags with identical name encodings should get identical indexes
 
 <references />
 !! html/parsoid
-<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
+<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
 </p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
 </ol>
 !!end
 
@@ -22491,11 +23023,11 @@ C <ref name="foo" />
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
+C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
 </ol>
 !!end
 
@@ -22518,18 +23050,18 @@ C <ref>baz</ref>
 <references />
 <references group="b" />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
-C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="./Main_Page#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
+C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
+<li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
 </ol>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
@@ -22544,15 +23076,15 @@ B <ref>bar</ref>
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
 
-<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !!end
 
@@ -22568,15 +23100,15 @@ C <ref>cfoo</ref>
 
 <references />
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
 </ol>
 
-<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
+<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
 </ol>
 !!end
 
@@ -22594,11 +23126,11 @@ B <ref name="b">bar</ref>
 This should just get lost.
 </references>
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
 
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="./Main_Page#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
 </ol>
 !! end
 
@@ -22607,7 +23139,7 @@ References: 6. <references /> from a transclusion
 !! wikitext
 <ref>Foo</ref> {{echo|<references />}}
 !! html/parsoid
-<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
+<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
 </ol>
 !! end
 
@@ -22623,16 +23155,16 @@ B <ref group="X" name="b" />
 <ref name="b">foo</ref>
 </references>
 !! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
+<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="./Main_Page#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
 </p>
 
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
 </ol>
 
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"}}'>
+<li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
 </ol>
 !! end
 
@@ -22642,8 +23174,8 @@ References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself
 X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
 <references />
 !! html/parsoid
-<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
+<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
 </ol>
 !!end
 
@@ -22657,12 +23189,12 @@ References: 9. Generate missing references list at the end
 A <ref>foo</ref>
 B <ref group="inexistent">bar</ref>
 !! html/parsoid
-<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
+<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="./Main_Page#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
 </ol>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"},"autoGenerated":true}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
+<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
 </ol>
 !! end
 
@@ -22688,9 +23220,9 @@ Entities in ref name
 <ref name="test &amp; me">hi</ref>
 <references />
 !! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="./Main_Page#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
+<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="./Main_Page#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
 </ol>
 !! end
 
@@ -22708,10 +23240,10 @@ a<ref>foo</ref>
 
 <references>
 !! html/parsoid
-<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
 
 <p>&lt;references></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
 !! end
 
 !! test
@@ -22731,10 +23263,14 @@ foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data
 #### https://www.mediawiki.org/wiki/Parsoid/HTML_based_LST
 #### ----------------------------------------------------------------
 
+## We still need to support serializing the older format while content is stored.
 !! test
-LST Sections: 1. Simple section start and end
+LST Sections: Backwards compatibility
 !! options
-parsoid={ "suppressErrors": true }
+parsoid={
+  "suppressErrors": true,
+  "modes": ["html2wt"]
+}
 !! wikitext
 <section begin="2011-05-16" />
 <section end="2014-04-10 (MW 1.23wmf22)" />
@@ -22743,6 +23279,21 @@ parsoid={ "suppressErrors": true }
 <meta typeof="mw:Extension/LabeledSectionTransclusion/end" content="2014-04-10 (MW 1.23wmf22)"/></p>
 !! end
 
+## The unconventional output is the result of `usePHPPreProcessor` being
+## disabled in parserTests.js.  This test is mainly just to show <section> is
+## recognized as an extension tag w/o a native handler.
+!! test
+LST Sections: Newfangled approach
+!! options
+parsoid={ "suppressErrors": true }
+!! wikitext
+<section begin="2011-05-16" />
+<section end="2014-04-10 (MW 1.23wmf22)" />
+!! html/parsoid
+<p><span typeof="mw:Extension/section" about="#mwt1" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section begin=\"2011-05-16\" />","tagWidths":[30,0]}'>&lt;section begin="2011-05-16" /></span>
+<span typeof="mw:Extension/section" about="#mwt2" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section end=\"2014-04-10 (MW 1.23wmf22)\" />","tagWidths":[43,0]}'>&lt;section end="2014-04-10 (MW 1.23wmf22)" /></span></p>
+!! end
+
 #--------- Test stripping of empty nodes in template content ----------
 !!test
 Empty LI and TR nodes should be stripped from template content
@@ -24081,11 +24632,11 @@ parsoid=html2wt
 <i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
 <a rel="mw:WikiLink" href="Foo" title="Foo">foo</a> x'<i><a href="Bar" rel="mw:WikiLink" title="Bar">bar</a></i>
-'<i>foo</i> <span class="mw-ref" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
+'<i>foo</i> <span class="mw-ref" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
 '<i>foo</i> <div title="name">test</div>
 '<i>foo</i> and <br data-parsoid='{"stx":"html","noClose":true}'/> bar
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
 </ol>
 !! wikitext
 '''a'' foo ''[[bar]]''
 !! options
 parsoid=html2wt
 !! html/parsoid
-<p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
+<p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i>a</i>
+<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i>a</i>
  b</span></li>
 </ol>
 !! wikitext
@@ -25741,9 +26292,9 @@ parsoid={
   "scrubWikitext": true
 }
 !! html/parsoid
-<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
 !! wikitext
 == foo <ref>bar 
 [[Category:Baz]] </ref> ==
@@ -25831,9 +26382,9 @@ parsoid=html2wt
 <h2> hi <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bogus","href":"./Template:Bogus"},"params":{"1":{"wt":"there\nyou"}},"i":0}}]}'>there</span><span about="#mwt1">
 </span><span about="#mwt1">you</span> </h2>
 
-<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
 there</span></li></ol>
 
 <ul><li>asd
@@ -26395,6 +26946,100 @@ parsoid=html2wt,wt2wt
 </table>
 !! end
 
+!! test
+T149209: WTS: Handle newlines in table cells properly
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody>
+<tr><td>a
+b
+</td><td data-parsoid='{"stx_v":"row"}'>c</td></tr>
+<tr><td><p>x</p>
+</td><td data-parsoid='{"stx_v":"row", "startTagSrc": "{{!}}{{!}}"}'>y</td></tr>
+</tbody></table>
+<table>
+<tbody>
+<tr><th>a
+b
+</th><th data-parsoid='{"stx_v":"row"}'>c</th></tr>
+<tr><th><p>x</h>
+</th><th data-parsoid='{"stx_v":"row"}'>y</th></tr>
+</tbody></table>
+!! wikitext
+{|
+|a
+b
+|c
+|-
+|x
+{{!}}y
+|}
+{|
+!a
+b
+!c
+|-
+!x
+!y
+|}
+!! end
+
+!! test
+T149209: Selser: Handle newlines in table cells properly
+!! options
+parsoid={
+  "modes": ["selser"],
+  "changes": [
+    [ "#h1", "html", "a\nb\n" ],
+    [ "#h2", "html", "a\nb\n" ],
+    [ "#c1", "html", "a\nb\n" ],
+    [ "#c2", "html", "<p>a</p>" ],
+    [ "#c3", "html", "<p>a</p>" ],
+    [ "#c4", "html", "edit-me<p>a</p>" ]
+  ]
+}
+!! wikitext
+{|
+! id="h1" |edit-me!!1
+|-
+! id="h2" |edit-me||2
+|-
+| id="c1" |edit-me||3
+|-
+| id="c2" |edit-me||4
+|-
+| id="c3" |edit-me||p||q||r
+|-
+| id="c4" |edit-me||p||q||r
+|}
+!! wikitext/edited
+{|
+! id="h1" |a
+b
+!1
+|-
+! id="h2" |a
+b
+!2
+|-
+| id="c1" |a
+b
+|3
+|-
+| id="c2" |a
+|4
+|-
+| id="c3" |a
+|p||q||r
+|-
+| id="c4" |edit-me
+a
+|p||q||r
+|}
+!! end
+
 !! test
 HTML id attribute with Parsoid-like element ids should not be serialized to wikitext
 !! options
diff --git a/tests/phan/bin/phan b/tests/phan/bin/phan
new file mode 100755 (executable)
index 0000000..ad06823
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/bash
+
+# mediawiki-vagrant installs dont have realpath by default
+if ! which realpath > /dev/null; then
+       realpath() {
+               php -r "echo realpath('$*');"
+       }
+fi
+
+if hash php7.0 2>/dev/null; then
+       export PHP="php7.0"
+else
+       export PHP="php"
+fi
+
+# Note that this isn't loaded in via composer because then composer can
+# only be run with php7.0
+if [ ! -f "$PHAN" ]; then
+       # If no PHAN is specified then try to get location from PATH
+       export PHAN="$(which phan)"
+       if [ ! -f "$PHAN" ]; then
+               echo "The environment variable PHAN must point to the 'phan' file"
+               echo "in a checkout of https://github.com/etsy/phan.git"
+               echo "Or phan must be included in your PATH"
+               exit 1
+       fi
+else
+       export PHAN="$PHP $PHAN"
+fi
+
+if [ -z "$MW_INSTALL_PATH" ]; then
+       # Figure out where mediawiki is based on the location of this script
+       pushd "$(dirname "$0")" > /dev/null
+       export MW_INSTALL_PATH="$(git rev-parse --show-toplevel)"
+       popd >/dev/null
+fi
+
+# If the first argument doesn't start with a -, then it's a path
+# to another project (extension, skin, etc.) to analyze
+if [[ -n "$1" && "$1" != "-"* ]]; then
+       cd $1
+       shift
+else
+       cd "$(dirname "$0")"
+fi
+
+# Root directory of project
+export ROOT="$(git rev-parse --show-toplevel)"
+
+# Go to the root of this git repo
+cd "$ROOT"
+
+export CONFIG_FILE="$ROOT/tests/phan/config.php"
+if [ ! -f "$CONFIG_FILE" ]; then
+       echo "Could not find a phan config file to apply in"
+       echo "$CONFIG_FILE"
+       exit 1
+fi
+
+# Phan's issues directory
+export ISSUES="${ROOT}/tests/phan/issues"
+mkdir -p "$ISSUES"
+
+# Get the current hash of HEAD
+export REV="$(git rev-parse HEAD)"
+
+# Destination for issues found
+export RUN="${ISSUES}/issues-${REV}"
+
+
+# Run the analysis, emitting output to the
+# issues file.
+$PHAN \
+       --project-root-directory "$ROOT" \
+       --config-file "$CONFIG_FILE" \
+       --output "php://stdout" \
+       "${@}" \
+       | php "$MW_INSTALL_PATH/tests/phan/bin/postprocess-phan.php" "${@}" \
+       > $RUN
+
+EXIT_CODE="$?"
+
+# Re-link the latest file
+rm -f "${ISSUES}/latest"
+ln -s "${RUN}" "${ISSUES}/latest"
+
+# Output any issues that were found
+cat "${RUN}"
+
+exit $EXIT_CODE
diff --git a/tests/phan/bin/postprocess-phan.php b/tests/phan/bin/postprocess-phan.php
new file mode 100644 (file)
index 0000000..3e80598
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+abstract class Suppressor {
+       /**
+        * @param string $input
+        * @return bool do errors remain
+        */
+       abstract public function suppress( $input );
+
+       /**
+        * @param string[] $source
+        * @param string $type
+        * @param int $lineno
+        * @return bool
+        */
+       protected function isSuppressed( array $source, $type, $lineno ) {
+               return $lineno > 0 && preg_match(
+                       "|/\*\* @suppress {$type} |",
+                       $source[$lineno - 1]
+               );
+       }
+}
+
+class TextSuppressor extends Suppressor {
+       /**
+        * @param string $input
+        * @return bool do errors remain
+        */
+       public function suppress( $input ) {
+               $hasErrors = false;
+               $errors = [];
+               foreach ( explode( "\n", $input ) as $error ) {
+                       if ( empty( $error ) ) {
+                               continue;
+                       }
+                       if ( !preg_match( '/^(.*):(\d+) (Phan\w+) (.*)$/', $error, $matches ) ) {
+                               echo "Failed to parse line: $error\n";
+                               continue;
+                       }
+                       list( $source, $file, $lineno, $type, $message ) = $matches;
+                       $errors[$file][] = [
+                               'orig' => $error,
+                               // convert from 1 indexed to 0 indexed
+                               'lineno' => $lineno - 1,
+                               'type' => $type,
+                       ];
+               }
+               foreach ( $errors  as $file => $fileErrors ) {
+                       $source = file( $file );
+                       foreach ( $fileErrors as $error ) {
+                               if ( !$this->isSuppressed( $source, $error['type'], $error['lineno'] ) ) {
+                                       echo $error['orig'], "\n";
+                                       $hasErrors = true;
+                               }
+                       }
+               }
+
+               return $hasErrors;
+       }
+}
+
+class CheckStyleSuppressor extends Suppressor {
+       /**
+        * @param string $input
+        * @return bool True do errors remain
+        */
+       public function suppress( $input ) {
+               $dom = new DOMDocument();
+               $dom->loadXML( $input );
+               $hasErrors = false;
+               // DOMNodeList's are "live", convert to an array so it works as expected
+               $files = [];
+               foreach ( $dom->getElementsByTagName( 'file' ) as $file ) {
+                       $files[] = $file;
+               }
+               foreach ( $files as $file ) {
+                       $errors = [];
+                       foreach ( $file->getElementsByTagName( 'error' ) as $error ) {
+                               $errors[] = $error;
+                       }
+                       $source = file( $file->getAttribute( 'name' ) );
+                       $fileHasErrors = false;
+                       foreach ( $errors as $error ) {
+                               $lineno = $error->getAttribute( 'line' ) - 1;
+                               $type = $error->getAttribute( 'source' );
+                               if ( $this->isSuppressed( $source, $type, $lineno ) ) {
+                                       $error->parentNode->removeChild( $error );
+                               } else {
+                                       $fileHasErrors = true;
+                                       $hasErrors = true;
+                               }
+                       }
+                       if ( !$fileHasErrors ) {
+                               $file->parentNode->removeChild( $file );
+                       }
+               }
+               echo $dom->saveXML();
+
+               return $hasErrors;
+       }
+}
+
+class NoopSuppressor extends Suppressor {
+       private $mode;
+
+       public function __construct( $mode ) {
+               $this->mode = $mode;
+       }
+       public function suppress( $input ) {
+               echo "Unsupported output mode: {$this->mode}\n$input";
+               return true;
+       }
+}
+
+$opt = getopt( "m:", [ "output-mode:" ] );
+// if provided multiple times getopt returns an array
+if ( isset( $opt['m'] ) ) {
+       $mode = $opt['m'];
+} elseif ( isset( $mode['output-mode'] ) ) {
+       $mode = $opt['output-mode'];
+} else {
+       $mode = 'text';
+}
+if ( is_array( $mode ) ) {
+       // If an option is passed multiple times getopt returns an
+       // array. Just take the last one.
+       $mode = end( $mode );
+}
+
+switch ( $mode ) {
+case 'text':
+       $suppressor = new TextSuppressor();
+       break;
+case 'checkstyle':
+       $suppressor = new CheckStyleSuppressor();
+       break;
+default:
+       $suppressor = new NoopSuppressor( $mode );
+}
+
+$input = file_get_contents( 'php://stdin' );
+$hasErrors = $suppressor->suppress( $input );
+
+if ( $hasErrors ) {
+       exit( 1 );
+}
diff --git a/tests/phan/config.php b/tests/phan/config.php
new file mode 100644 (file)
index 0000000..19469d9
--- /dev/null
@@ -0,0 +1,462 @@
+<?php
+
+use \Phan\Config;
+
+// If xdebug is enabled, we need to increase the nesting level for phan
+ini_set( 'xdebug.max_nesting_level', 1000 );
+
+/**
+ * This configuration will be read and overlayed on top of the
+ * default configuration. Command line arguments will be applied
+ * after this file is read.
+ *
+ * @see src/Phan/Config.php
+ * See Config for all configurable options.
+ *
+ * A Note About Paths
+ * ==================
+ *
+ * Files referenced from this file should be defined as
+ *
+ * ```
+ *   Config::projectPath('relative_path/to/file')
+ * ```
+ *
+ * where the relative path is relative to the root of the
+ * project which is defined as either the working directory
+ * of the phan executable or a path passed in via the CLI
+ * '-d' flag.
+ */
+return [
+       /**
+        * A list of individual files to include in analysis
+        * with a path relative to the root directory of the
+        * project. directory_list won't find .inc files so
+        * we augment it here.
+        */
+       'file_list' => array_merge(
+               function_exists( 'register_postsend_function' ) ? [] : [ 'tests/phan/stubs/hhvm.php' ],
+               function_exists( 'wikidiff2_do_diff' ) ? [] : [ 'tests/phan/stubs/wikidiff.php' ],
+               class_exists( PEAR::class ) ? [] : [ 'tests/phan/stubs/mail.php' ],
+               [
+                       'maintenance/7zip.inc',
+                       'maintenance/backupPrefetch.inc',
+                       'maintenance/commandLine.inc',
+                       'maintenance/sqlite.inc',
+                       'maintenance/userOptions.inc',
+                       'maintenance/backup.inc',
+                       'maintenance/cleanupTable.inc',
+                       'maintenance/importImages.inc',
+                       'maintenance/userDupes.inc',
+                       'maintenance/language/checkLanguage.inc',
+                       'maintenance/language/languages.inc',
+               ]
+       ),
+
+       /**
+        * A list of directories that should be parsed for class and
+        * method information. After excluding the directories
+        * defined in exclude_analysis_directory_list, the remaining
+        * files will be statically analyzed for errors.
+        *
+        * Thus, both first-party and third-party code being used by
+        * your application should be included in this list.
+        */
+       'directory_list' => [
+               'includes/',
+               'languages/',
+               'maintenance/',
+               'mw-config/',
+               'resources/',
+               'skins/',
+               'vendor/',
+       ],
+
+       /**
+        * A file list that defines files that will be excluded
+        * from parsing and analysis and will not be read at all.
+        *
+        * This is useful for excluding hopelessly unanalyzable
+        * files that can't be removed for whatever reason.
+        */
+       'exclude_file_list' => function_exists( 'xcache_get' ) ? [] : [
+               // References xcache which probably isn't installed
+               'includes/libs/objectcache/XCacheBagOStuff.php'
+       ],
+
+       /**
+        * A list of directories holding code that we want
+        * to parse, but not analyze. Also works for individual
+        * files.
+        */
+       "exclude_analysis_directory_list" => [
+               'vendor/',
+               'tests/phan/stubs/',
+               // The referenced classes are not available in vendor, only when
+               // included from composer.
+               'includes/composer/',
+               // Directly references classes that only exist in Translate extension
+               'maintenance/language/',
+               // External class
+               'includes/libs/jsminplus.php',
+               // separate repositories
+               'skins/',
+       ],
+
+       /**
+        * Backwards Compatibility Checking. This is slow
+        * and expensive, but you should consider running
+        * it before upgrading your version of PHP to a
+        * new version that has backward compatibility
+        * breaks.
+        */
+       'backward_compatibility_checks' => false,
+
+       /**
+        * A set of fully qualified class-names for which
+        * a call to parent::__construct() is required
+        */
+       'parent_constructor_required' => [
+       ],
+
+       /**
+        * Run a quick version of checks that takes less
+        * time at the cost of not running as thorough
+        * an analysis. You should consider setting this
+        * to true only when you wish you had more issues
+        * to fix in your code base.
+        *
+        * In quick-mode the scanner doesn't rescan a function
+        * or a method's code block every time a call is seen.
+        * This means that the problem here won't be detected:
+        *
+        * ```php
+        * <?php
+        * function test($arg):int {
+        *    return $arg;
+        * }
+        * test("abc");
+        * ```
+        *
+        * This would normally generate:
+        *
+        * ```sh
+        * test.php:3 TypeError return string but `test()` is declared to return int
+        * ```
+        *
+        * The initial scan of the function's code block has no
+        * type information for `$arg`. It isn't until we see
+        * the call and rescan test()'s code block that we can
+        * detect that it is actually returning the passed in
+        * `string` instead of an `int` as declared.
+        */
+       'quick_mode' => false,
+
+       /**
+        * By default, Phan will not analyze all node types
+        * in order to save time. If this config is set to true,
+        * Phan will dig deeper into the AST tree and do an
+        * analysis on all nodes, possibly finding more issues.
+        *
+        * See \Phan\Analysis::shouldVisit for the set of skipped
+        * nodes.
+        */
+       'should_visit_all_nodes' => true,
+
+       /**
+        * If enabled, check all methods that override a
+        * parent method to make sure its signature is
+        * compatible with the parent's. This check
+        * can add quite a bit of time to the analysis.
+        */
+       'analyze_signature_compatibility' => true,
+
+       // Emit all issues. They are then suppressed via
+       // suppress_issue_types, rather than a minimum
+       // severity.
+       "minimum_severity" => 0,
+
+       /**
+        * If true, missing properties will be created when
+        * they are first seen. If false, we'll report an
+        * error message if there is an attempt to write
+        * to a class property that wasn't explicitly
+        * defined.
+        */
+       'allow_missing_properties' => false,
+
+       /**
+        * Allow null to be cast as any type and for any
+        * type to be cast to null. Setting this to false
+        * will cut down on false positives.
+        */
+       'null_casts_as_any_type' => true,
+
+       /**
+        * If enabled, scalars (int, float, bool, string, null)
+        * are treated as if they can cast to each other.
+        *
+        * MediaWiki is pretty lax and uses many scalar
+        * types interchangably.
+        */
+       'scalar_implicit_cast' => true,
+
+       /**
+        * If true, seemingly undeclared variables in the global
+        * scope will be ignored. This is useful for projects
+        * with complicated cross-file globals that you have no
+        * hope of fixing.
+        */
+       'ignore_undeclared_variables_in_global_scope' => true,
+
+       /**
+        * Set to true in order to attempt to detect dead
+        * (unreferenced) code. Keep in mind that the
+        * results will only be a guess given that classes,
+        * properties, constants and methods can be referenced
+        * as variables (like `$class->$property` or
+        * `$class->$method()`) in ways that we're unable
+        * to make sense of.
+        */
+       'dead_code_detection' => false,
+
+       /**
+        * If true, the dead code detection rig will
+        * prefer false negatives (not report dead code) to
+        * false positives (report dead code that is not
+        * actually dead) which is to say that the graph of
+        * references will create too many edges rather than
+        * too few edges when guesses have to be made about
+        * what references what.
+        */
+       'dead_code_detection_prefer_false_negative' => true,
+
+       /**
+        * If disabled, Phan will not read docblock type
+        * annotation comments (such as for @return, @param,
+        * @var, @suppress, @deprecated) and only rely on
+        * types expressed in code.
+        */
+       'read_type_annotations' => true,
+
+       /**
+        * If a file path is given, the code base will be
+        * read from and written to the given location in
+        * order to attempt to save some work from being
+        * done. Only changed files will get analyzed if
+        * the file is read
+        */
+       'stored_state_file_path' => null,
+
+       /**
+        * Set to true in order to ignore issue suppression.
+        * This is useful for testing the state of your code, but
+        * unlikely to be useful outside of that.
+        */
+       'disable_suppression' => false,
+
+       /**
+        * If set to true, we'll dump the AST instead of
+        * analyzing files
+        */
+       'dump_ast' => false,
+
+       /**
+        * If set to a string, we'll dump the fully qualified lowercase
+        * function and method signatures instead of analyzing files.
+        */
+       'dump_signatures_file' => null,
+
+       /**
+        * If true (and if stored_state_file_path is set) we'll
+        * look at the list of files passed in and expand the list
+        * to include files that depend on the given files
+        */
+       'expand_file_list' => false,
+
+       // Include a progress bar in the output
+       'progress_bar' => false,
+
+       /**
+        * The probability of actually emitting any progress
+        * bar update. Setting this to something very low
+        * is good for reducing network IO and filling up
+        * your terminal's buffer when running phan on a
+        * remote host.
+        */
+       'progress_bar_sample_rate' => 0.005,
+
+       /**
+        * The number of processes to fork off during the analysis
+        * phase.
+        */
+       'processes' => 1,
+
+       /**
+        * Add any issue types (such as 'PhanUndeclaredMethod')
+        * to this black-list to inhibit them from being reported.
+        */
+       'suppress_issue_types' => [
+               // approximate error count: 8
+               "PhanDeprecatedClass",
+               // approximate error count: 441
+               "PhanDeprecatedFunction",
+               // approximate error count: 24
+               "PhanDeprecatedProperty",
+               // approximate error count: 12
+               "PhanParamReqAfterOpt",
+               // approximate error count: 748
+               "PhanParamSignatureMismatch",
+               // approximate error count: 7
+               "PhanParamSignatureMismatchInternal",
+               // approximate error count: 308
+               "PhanParamTooMany",
+               // approximate error count: 3
+               "PhanParamTooManyInternal",
+               // approximate error count: 1
+               "PhanRedefineFunctionInternal",
+               // approximate error count: 2
+               "PhanTraitParentReference",
+               // approximate error count: 4
+               "PhanTypeComparisonFromArray",
+               // approximate error count: 3
+               "PhanTypeInvalidRightOperand",
+               // approximate error count: 563
+               "PhanTypeMismatchArgument",
+               // approximate error count: 39
+               "PhanTypeMismatchArgumentInternal",
+               // approximate error count: 16
+               "PhanTypeMismatchForeach",
+               // approximate error count: 63
+               "PhanTypeMismatchProperty",
+               // approximate error count: 95
+               "PhanTypeMismatchReturn",
+               // approximate error count: 11
+               "PhanTypeMissingReturn",
+               // approximate error count: 5
+               "PhanTypeNonVarPassByRef",
+               // approximate error count: 27
+               "PhanUndeclaredConstant",
+               // approximate error count: 185
+               "PhanUndeclaredMethod",
+               // approximate error count: 1342
+               "PhanUndeclaredProperty",
+               // approximate error count: 3
+               "PhanUndeclaredStaticMethod",
+       ],
+
+       /**
+        * If empty, no filter against issues types will be applied.
+        * If this white-list is non-empty, only issues within the list
+        * will be emitted by Phan.
+        */
+       'whitelist_issue_types' => [
+               // 'PhanAccessMethodPrivate',
+               // 'PhanAccessMethodProtected',
+               // 'PhanAccessNonStaticToStatic',
+               // 'PhanAccessPropertyPrivate',
+               // 'PhanAccessPropertyProtected',
+               // 'PhanAccessSignatureMismatch',
+               // 'PhanAccessSignatureMismatchInternal',
+               // 'PhanAccessStaticToNonStatic',
+               // 'PhanCompatibleExpressionPHP7',
+               // 'PhanCompatiblePHP7',
+               // 'PhanContextNotObject',
+               // 'PhanDeprecatedClass',
+               // 'PhanDeprecatedFunction',
+               // 'PhanDeprecatedProperty',
+               // 'PhanEmptyFile',
+               // 'PhanNonClassMethodCall',
+               // 'PhanNoopArray',
+               // 'PhanNoopClosure',
+               // 'PhanNoopConstant',
+               // 'PhanNoopProperty',
+               // 'PhanNoopVariable',
+               // 'PhanParamRedefined',
+               // 'PhanParamReqAfterOpt',
+               // 'PhanParamSignatureMismatch',
+               // 'PhanParamSignatureMismatchInternal',
+               // 'PhanParamSpecial1',
+               // 'PhanParamSpecial2',
+               // 'PhanParamSpecial3',
+               // 'PhanParamSpecial4',
+               // 'PhanParamTooFew',
+               // 'PhanParamTooFewInternal',
+               // 'PhanParamTooMany',
+               // 'PhanParamTooManyInternal',
+               // 'PhanParamTypeMismatch',
+               // 'PhanParentlessClass',
+               // 'PhanRedefineClass',
+               // 'PhanRedefineClassInternal',
+               // 'PhanRedefineFunction',
+               // 'PhanRedefineFunctionInternal',
+               // 'PhanStaticCallToNonStatic',
+               // 'PhanSyntaxError',
+               // 'PhanTraitParentReference',
+               // 'PhanTypeArrayOperator',
+               // 'PhanTypeArraySuspicious',
+               // 'PhanTypeComparisonFromArray',
+               // 'PhanTypeComparisonToArray',
+               // 'PhanTypeConversionFromArray',
+               // 'PhanTypeInstantiateAbstract',
+               // 'PhanTypeInstantiateInterface',
+               // 'PhanTypeInvalidLeftOperand',
+               // 'PhanTypeInvalidRightOperand',
+               // 'PhanTypeMismatchArgument',
+               // 'PhanTypeMismatchArgumentInternal',
+               // 'PhanTypeMismatchDefault',
+               // 'PhanTypeMismatchForeach',
+               // 'PhanTypeMismatchProperty',
+               // 'PhanTypeMismatchReturn',
+               // 'PhanTypeMissingReturn',
+               // 'PhanTypeNonVarPassByRef',
+               // 'PhanTypeParentConstructorCalled',
+               // 'PhanTypeVoidAssignment',
+               // 'PhanUnanalyzable',
+               // 'PhanUndeclaredClass',
+               // 'PhanUndeclaredClassCatch',
+               // 'PhanUndeclaredClassConstant',
+               // 'PhanUndeclaredClassInstanceof',
+               // 'PhanUndeclaredClassMethod',
+               // 'PhanUndeclaredClassReference',
+               // 'PhanUndeclaredConstant',
+               // 'PhanUndeclaredExtendedClass',
+               // 'PhanUndeclaredFunction',
+               // 'PhanUndeclaredInterface',
+               // 'PhanUndeclaredMethod',
+               // 'PhanUndeclaredProperty',
+               // 'PhanUndeclaredStaticMethod',
+               // 'PhanUndeclaredStaticProperty',
+               // 'PhanUndeclaredTrait',
+               // 'PhanUndeclaredTypeParameter',
+               // 'PhanUndeclaredTypeProperty',
+               // 'PhanUndeclaredVariable',
+               // 'PhanUnreferencedClass',
+               // 'PhanUnreferencedConstant',
+               // 'PhanUnreferencedMethod',
+               // 'PhanUnreferencedProperty',
+               // 'PhanVariableUseClause',
+       ],
+
+       /**
+        * Override to hardcode existence and types of (non-builtin) globals in the global scope.
+        * Class names must be prefixed with '\\'.
+        * (E.g. ['_FOO' => '\\FooClass', 'page' => '\\PageClass', 'userId' => 'int'])
+        */
+       'globals_type_map' => [
+               'IP' => 'string',
+       ],
+
+       // Emit issue messages with markdown formatting
+       'markdown_issue_messages' => false,
+
+       /**
+        * Enable or disable support for generic templated
+        * class types.
+        */
+       'generic_types_enabled' => true,
+
+       // A list of plugin files to execute
+       'plugins' => [
+       ],
+];
diff --git a/tests/phan/issues/.gitkeep b/tests/phan/issues/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/phan/stubs/README b/tests/phan/stubs/README
new file mode 100644 (file)
index 0000000..c458ab5
--- /dev/null
@@ -0,0 +1,3 @@
+These stubs describe how code that is not available at analysis time should be
+used. No implementations are necessary, just define the classes and their
+methods and use phpdoc to describe what arguments are allowed.
diff --git a/tests/phan/stubs/hhvm.php b/tests/phan/stubs/hhvm.php
new file mode 100644 (file)
index 0000000..79feaa0
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+// @codingStandardsIgnoreFile
+
+/**
+ * @param callable $callback
+ * @param mixed ...$parameters
+ */
+function register_postsend_function( $callback ) {
+}
diff --git a/tests/phan/stubs/mail.php b/tests/phan/stubs/mail.php
new file mode 100644 (file)
index 0000000..7cd9016
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * Minimal set of classes necessary for UserMailer to be happy. Types
+ * taken from documentation at pear.php.net.
+ * @codingStandardsIgnoreFile
+ */
+
+class PEAR {
+       /**
+        * @param mixed $data
+        * @return bool
+        */
+       public static function isError( $data ) {
+       }
+}
+
+class PEAR_Error {
+       /**
+        * @return string
+        */
+       public function getMessage() {
+       }
+}
+
+class Mail {
+       /**
+        * @param string $driver
+        * @param array $params
+        * @return self
+        */
+       static public function factory( $driver, array $params = [] ) {
+       }
+
+       /**
+        * @param mixed $recipients
+        * @param array $headers
+        * @param string $body
+        * @return bool|PEAR_Error
+        */
+       public function send( $recipients, array $headers, $body ) {
+       }
+}
+
+class Mail_smtp extends Mail {
+}
+
+class Mail_mime {
+       /**
+        * @param mixed $params
+        */
+       public function __construct( $params = [] ) {
+       }
+
+       /**
+        * @param string $data
+        * @param bool $isfile
+        * @param bool $append
+        * @return bool|PEAR_Error
+        */
+       public function setTXTBody( $data, $isfile = false, $append = false ) {
+       }
+
+       /**
+        * @param string $data
+        * @param bool $isfile
+        * @return bool|PEAR_Error
+        */
+       public function setHTMLBody( $data, $isfile = false ) {
+       }
+
+       /**
+        * @param array|null $parms
+        * @param mixed $filename
+        * @param bool $skip_head
+        * @return string|bool|PEAR_Error
+        */
+       public function get( $params = null, $filename = null, $skip_head = false ) {
+       }
+
+       /**
+        * @param array|null $xtra_headers
+        * @param bool $overwrite
+        * @param bool $skip_content
+        * @return array
+        */
+       public function headers( array $xtra_headers = null, $overwrite = false, $skip_content = false ) {
+       }
+}
diff --git a/tests/phan/stubs/wikidiff.php b/tests/phan/stubs/wikidiff.php
new file mode 100644 (file)
index 0000000..9bd5d8d
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+// @codingStandardsIgnoreFile
+
+/**
+ * @param string $text1
+ * @param string $text2
+ * @param int $numContextLines
+ * @return string
+ */
+function wikidiff2_do_diff( $text1, $text2, $numContextLines ) {
+}
index db1df5c..37f76ff 100644 (file)
@@ -255,6 +255,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                CACHE_ACCEL => $hashCache,
                                CACHE_MEMCACHED => $hashCache,
                                'apc' => $hashCache,
+                               'apcu' => $hashCache,
                                'xcache' => $hashCache,
                                'wincache' => $hashCache,
                        ] + $baseConfig->get( 'ObjectCaches' );
@@ -582,6 +583,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * Make sure MediaWikiTestCase extending classes have called their
         * parent setUp method
+        *
+        * With strict coverage activated in PHP_CodeCoverage, this test would be
+        * marked as risky without the following annotation (T152923).
+        * @coversNothing
         */
        final public function testMediaWikiTestCaseParentSetupCalled() {
                $this->assertArrayHasKey( 'setUp', $this->called,
@@ -1087,11 +1092,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Clones all tables in the given database (whatever database that connection has
         * open), to versions with the test prefix.
         *
-        * @param Database $db Database to use
+        * @param IMaintainableDatabase $db Database to use
         * @param string $prefix Prefix to use for test tables
         * @return bool True if tables were cloned, false if only the prefix was changed
         */
-       protected static function setupDatabaseWithTestPrefix( Database $db, $prefix ) {
+       protected static function setupDatabaseWithTestPrefix( IMaintainableDatabase $db, $prefix ) {
                $tablesCloned = self::listTables( $db );
                $dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
                $dbClone->useTemporaryTables( self::$useTemporaryTables );
@@ -1210,9 +1215,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                list( $proto, $cluster ) = explode( '://', $url, 2 );
                                // Avoid getMaster() because setupDatabaseWithTestPrefix()
                                // requires Database instead of plain DBConnRef/IDatabase
-                               $lb = $externalStoreDB->getLoadBalancer( $cluster );
-                               $dbw = $lb->getConnection( DB_MASTER );
-                               $dbws[] = $dbw;
+                               $dbws[] = $externalStoreDB->getMaster( $cluster );
                        }
                }
 
@@ -1326,11 +1329,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * @since 1.18
         *
-        * @param Database $db
+        * @param IMaintainableDatabase $db
         *
         * @return array
         */
-       public static function listTables( Database $db ) {
+       public static function listTables( IMaintainableDatabase $db ) {
                $prefix = $db->tablePrefix();
                $tables = $db->listTables( $prefix, __METHOD__ );
 
@@ -1378,6 +1381,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( PHPUnitMaintClass::$additionalOptions[$offset] ) ) {
                        return PHPUnitMaintClass::$additionalOptions[$offset];
                }
+
+               return null;
        }
 
        /**
index 45cfdbf..68b91bf 100644 (file)
@@ -14,9 +14,12 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
         * @param array|string $options Language code or options array
         * - string 'lang' Language code
         * - string 'dir' Language direction (ltr or rtl)
+        * - string 'modules' Pipe-separated list of module names
+        * - string|null 'only' "scripts" (unwrapped script), "styles" (stylesheet), or null
+        *    (mw.loader.implement).
         * @return ResourceLoaderContext
         */
-       protected function getResourceLoaderContext( $options = [] ) {
+       protected function getResourceLoaderContext( $options = [], ResourceLoader $rl = null ) {
                if ( is_string( $options ) ) {
                        // Back-compat for extension tests
                        $options = [ 'lang' => $options ];
@@ -24,12 +27,14 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                $options += [
                        'lang' => 'en',
                        'dir' => 'ltr',
+                       'modules' => 'startup',
+                       'only' => 'scripts',
                ];
-               $resourceLoader = new ResourceLoader();
+               $resourceLoader = $rl ?: new ResourceLoader();
                $request = new FauxRequest( [
                                'lang' => $options['lang'],
-                               'modules' => 'startup',
-                               'only' => 'scripts',
+                               'modules' => $options['modules'],
+                               'only' => $options['only'],
                                'skin' => 'vector',
                                'target' => 'phpunit',
                ] );
@@ -151,6 +156,12 @@ class EmptyResourceLoader extends ResourceLoader {
        public function __construct( Config $config = null, LoggerInterface $logger = null ) {
                $this->setLogger( $logger ?: new NullLogger() );
                $this->config = $config ?: MediaWikiServices::getInstance()->getMainConfig();
+               // Source "local" is required by StartupModule
+               $this->addSource( 'local', $this->config->get( 'LoadScript' ) );
                $this->setMessageBlobStore( new MessageBlobStore( $this, $this->getLogger() ) );
        }
+
+       public function getErrors() {
+               return $this->errors;
+       }
 }
diff --git a/tests/phpunit/data/media/say-test.opus b/tests/phpunit/data/media/say-test.opus
new file mode 100644 (file)
index 0000000..168d218
Binary files /dev/null and b/tests/phpunit/data/media/say-test.opus differ
index 9f38659..12b277e 100644 (file)
@@ -409,4 +409,33 @@ class BlockTest extends MediaWikiLangTestCase {
                        "Account creation should not be blocked by default"
                );
        }
+
+       public function testSystemBlocks() {
+               $blockOptions = [
+                       'address' => 'UTBlockee',
+                       'reason' => 'test system block',
+                       'timestamp' => wfTimestampNow(),
+                       'expiry' => $this->db->getInfinity(),
+                       'byText' => 'MetaWikiUser',
+                       'systemBlock' => 'test',
+                       'enableAutoblock' => true,
+               ];
+               $block = new Block( $blockOptions );
+
+               $this->assertSame( 'test', $block->getSystemBlockType() );
+
+               try {
+                       $block->insert();
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( MWException $ex ) {
+                       $this->assertSame( 'Cannot insert a system block into the database', $ex->getMessage() );
+               }
+
+               try {
+                       $block->doAutoblock( '192.0.2.2' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( MWException $ex ) {
+                       $this->assertSame( 'Cannot autoblock from a system block', $ex->getMessage() );
+               }
+       }
 }
index dcaf1f7..0c853e0 100644 (file)
@@ -23,8 +23,6 @@ class FormOptionsExposed extends FormOptions {
  * Test class for FormOptions initialization
  * Ensure the FormOptions::add() does what we want it to do.
  *
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
- *
  * Copyright © 2011, Antoine Musso
  *
  * @author Antoine Musso
index e491d61..2ee8b98 100644 (file)
@@ -10,7 +10,6 @@
 
 /**
  * Test class for FormOptions methods.
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
  *
  * Copyright © 2011, Antoine Musso
  *
index cbe2e2f..09c1040 100644 (file)
@@ -28,7 +28,6 @@ class WfUrlencodeTest extends MediaWikiTestCase {
        /**
         * Internal helper that actually run the test.
         * Called by the public methods testEncodingUrlWith...()
-        *
         */
        private function verifyEncodingFor( $server, $input, $expectations ) {
                $expected = $this->extractExpect( $server, $expectations );
index e2ee193..b7249e5 100644 (file)
@@ -633,35 +633,6 @@ class HtmlTest extends MediaWikiTestCase {
                return $ret;
        }
 
-       /**
-        * @covers Html::expandAttributes
-        */
-       public function testFormValidationBlacklist() {
-               $this->assertEmpty(
-                       Html::expandAttributes( [
-                               'min' => 1,
-                               'max' => 100,
-                               'pattern' => 'abc',
-                               'required' => true,
-                               'step' => 2
-                       ] ),
-                       'Blacklist form validation attributes.'
-               );
-               $this->assertEquals(
-                       ' step="any"',
-                       Html::expandAttributes(
-                               [
-                                       'min' => 1,
-                                       'max' => 100,
-                                       'pattern' => 'abc',
-                                       'required' => true,
-                                       'step' => 'any'
-                               ],
-                               'Allow special case "step=any".'
-                       )
-               );
-       }
-
        public function testWrapperInput() {
                $this->assertEquals(
                        '<input type="radio" value="testval" name="testname"/>',
index 24db445..092d57b 100644 (file)
@@ -7,10 +7,8 @@
 
 /**
  * Test class for MWNamespace.
- * Generated by PHPUnit on 2011-02-20 at 21:01:55.
  * @todo covers tags
  * @todo FIXME: this test file is a mess
- *
  */
 class MWNamespaceTest extends MediaWikiTestCase {
        protected function setUp() {
index 4fe806c..1de9c23 100644 (file)
@@ -51,6 +51,10 @@ class MessageTest extends MediaWikiLangTestCase {
                                [],
                                [],
                        ],
+                       [
+                               [],
+                               [ [] ],
+                       ],
                        [
                                [ 'foo' ],
                                [ 'foo' ],
@@ -68,19 +72,37 @@ class MessageTest extends MediaWikiLangTestCase {
                                [ [ 'baz', 'foo' ] ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ Message::rawParam( 'baz' ) ],
+                               [ Message::rawParam( 'baz' ) ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ) ],
+                               [ [ Message::rawParam( 'baz' ) ] ],
+                       ],
+                       [
+                               [ Message::rawParam( 'baz' ), 'foo' ],
+                               [ [ Message::rawParam( 'baz' ), 'foo' ] ],
+                       ],
+
+                       // Test handling of erroneous input, to detect if it changes
+                       [
+                               [ [ 'baz', 'foo' ], 'hhh' ],
                                [ [ 'baz', 'foo' ], 'hhh' ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ [ 'baz', 'foo' ], 'hhh', [ 'ahahahahha' ] ],
                                [ [ 'baz', 'foo' ], 'hhh', [ 'ahahahahha' ] ],
                        ],
                        [
-                               [ 'baz', 'foo' ],
+                               [ [ 'baz', 'foo' ], [ 'ahahahahha' ] ],
                                [ [ 'baz', 'foo' ], [ 'ahahahahha' ] ],
                        ],
                        [
-                               [ 'baz' ],
+                               [ [ 'baz' ], [ 'ahahahahha' ] ],
                                [ [ 'baz' ], [ 'ahahahahha' ] ],
                        ],
                ];
@@ -192,6 +214,14 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testWfMessageParams() {
                $this->assertSame( 'Return to $1.', wfMessage( 'returnto' )->text() );
                $this->assertSame( 'Return to $1.', wfMessage( 'returnto', [] )->text() );
+               $this->assertSame(
+                       'Return to 1,024.',
+                       wfMessage( 'returnto', Message::numParam( 1024 ) )->text()
+               );
+               $this->assertSame(
+                       'Return to 1,024.',
+                       wfMessage( 'returnto', [ Message::numParam( 1024 ) ] )->text()
+               );
                $this->assertSame(
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
@@ -200,6 +230,27 @@ class MessageTest extends MediaWikiLangTestCase {
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', [ 'foo', 'bar' ] )->text()
                );
+               $this->assertSame(
+                       'You have 1,024 (bar).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               Message::numParam( 1024 ), 'bar'
+                       )->text()
+               );
+               $this->assertSame(
+                       'You have foo (2,048).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               'foo', Message::numParam( 2048 )
+                       )->text()
+               );
+               $this->assertSame(
+                       'You have 1,024 (2,048).',
+                       wfMessage(
+                               'youhavenewmessages',
+                               [ Message::numParam( 1024 ), Message::numParam( 2048 ) ]
+                       )->text()
+               );
        }
 
        /**
index 6269872..371731b 100644 (file)
@@ -7,12 +7,50 @@
  * @group Output
  *
  * @todo factor tests in this class into providers and test methods
- *
  */
 class OutputPageTest extends MediaWikiTestCase {
        const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
        const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
 
+       /**
+        * @covers OutputPage::addMeta
+        * @covers OutputPage::getMetaTags
+        * @covers OutputPage::getHeadLinksArray
+        */
+       public function testMetaTags() {
+               $outputPage = $this->newInstance();
+               $outputPage->addMeta( 'http:expires', '0' );
+               $outputPage->addMeta( 'keywords', 'first' );
+               $outputPage->addMeta( 'keywords', 'second' );
+
+               $expected = [
+                       [ 'http:expires', '0' ],
+                       [ 'keywords', 'first' ],
+                       [ 'keywords', 'second' ],
+               ];
+               $this->assertSame( $expected, $outputPage->getMetaTags() );
+
+               $links = $outputPage->getHeadLinksArray();
+               $this->assertContains( '<meta http-equiv="expires" content="0"/>', $links );
+               $this->assertContains( '<meta name="keywords" content="first"/>', $links );
+               $this->assertContains( '<meta name="keywords" content="second"/>', $links );
+               $this->assertArrayNotHasKey( 'meta-robots', $links );
+       }
+
+       /**
+        * @covers OutputPage::setIndexPolicy
+        * @covers OutputPage::setFollowPolicy
+        * @covers OutputPage::getHeadLinksArray
+        */
+       public function testRobotsPolicies() {
+               $outputPage = $this->newInstance();
+               $outputPage->setIndexPolicy( 'noindex' );
+               $outputPage->setFollowPolicy( 'nofollow' );
+
+               $links = $outputPage->getHeadLinksArray();
+               $this->assertContains( '<meta name="robots" content="noindex,nofollow"/>', $links );
+       }
+
        /**
         * Tests a particular case of transformCssMedia, using the given input, globals,
         * expected return, and message
@@ -136,6 +174,45 @@ class OutputPageTest extends MediaWikiTestCase {
                ] );
        }
 
+       public static function provideTransformFilePath() {
+               $baseDir = dirname( __DIR__ ) . '/data/media';
+               return [
+                       // File that matches basePath, and exists. Hash found and appended.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/w/test.jpg', '/w/test.jpg?edcf2' ],
+                       // File that matches basePath, but not found on disk. Empty query.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/w/unknown.png', '/w/unknown.png?' ],
+                       // File not matching basePath. Ignored.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/files/test.jpg' ],
+                       // Empty string. Ignored.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '', '' ],
+                       // Similar path, but with domain component. Ignored.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '//example.org/w/test.jpg' ],
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', 'https://example.org/w/test.jpg' ],
+                       // Unrelated path with domain component. Ignored.
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', 'https://example.org/files/test.jpg' ],
+                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '//example.org/files/test.jpg' ],
+                       // Unrelated path with domain, and empty base path (root mw install). Ignored.
+                       [ 'baseDir' => $baseDir, 'basePath' => '', 'https://example.org/files/test.jpg' ],
+                       [ 'baseDir' => $baseDir, 'basePath' => '', '//example.org/files/test.jpg' ], // T155310
+               ];
+       }
+
+       /**
+        * @dataProvider provideTransformFilePath
+        * @covers OutputPage::transformFilePath
+        * @covers OutputPage::transformResourcePath
+        */
+       public function testTransformResourcePath( $baseDir, $basePath, $path, $expected = null ) {
+               $this->setMwGlobals( 'IP', $baseDir );
+               $conf = new HashConfig( [ 'ResourceBasePath' => $basePath ] );
+
+               MediaWiki\suppressWarnings();
+               $actual = OutputPage::transformResourcePath( $conf, $path );
+               MediaWiki\restoreWarnings();
+
+               $this->assertEquals( $expected ?: $path, $actual );
+       }
+
        public static function provideMakeResourceLoaderLink() {
                // @codingStandardsIgnoreStart Generic.Files.LineLength
                return [
@@ -288,7 +365,7 @@ class OutputPageTest extends MediaWikiTestCase {
        /**
         * @covers OutputPage::haveCacheVaryCookies
         */
-       function testHaveCacheVaryCookies() {
+       public function testHaveCacheVaryCookies() {
                $request = new FauxRequest();
                $context = new RequestContext();
                $context->setRequest( $request );
@@ -310,7 +387,7 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::addCategoryLinks
         * @covers OutputPage::getCategories
         */
-       function testGetCategories() {
+       public function testGetCategories() {
                $fakeResultWrapper = new FakeResultWrapper( [
                        (object) [
                                'pp_value' => 1,
@@ -336,6 +413,29 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertEquals( [ 0 => 'Test2' ], $outputPage->getCategories( 'normal' ) );
                $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
        }
+
+       /**
+        * @return OutputPage
+        */
+       private function newInstance() {
+               $context = new RequestContext();
+
+               $context->setConfig( new HashConfig( [
+                       'AppleTouchIcon' => false,
+                       'DisableLangConversion' => true,
+                       'EnableAPI' => false,
+                       'EnableCanonicalServerLink' => false,
+                       'Favicon' => false,
+                       'Feed' => false,
+                       'LanguageCode' => false,
+                       'ReferrerPolicy' => false,
+                       'RightsPage' => false,
+                       'RightsUrl' => false,
+                       'UniversalEditButton' => false,
+               ] ) );
+
+               return new OutputPage( $context );
+       }
 }
 
 /**
index 7d3007b..642ada2 100644 (file)
@@ -274,18 +274,6 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertEquals( $page->getId(), $rev->getPage() );
        }
 
-       /**
-        * @covers Revision::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( 'Revision::getText' );
-
-               $orig = $this->makeRevision( [ 'text' => 'hello hello.' ] );
-               $rev = Revision::newFromId( $orig->getId() );
-
-               $this->assertEquals( 'hello hello.', $rev->getText() );
-       }
-
        /**
         * @covers Revision::getContent
         */
index 767c963..c971a40 100644 (file)
@@ -311,28 +311,6 @@ class RevisionTest extends MediaWikiTestCase {
                );
        }
 
-       function dataGetText() {
-               // NOTE: we expect the help namespace to always contain wikitext
-               return [
-                       [ 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ],
-                       [ serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ],
-                       [ serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, null ],
-               ];
-       }
-
-       /**
-        * @group Database
-        * @dataProvider dataGetText
-        * @covers Revision::getText
-        */
-       public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
-               $this->hideDeprecated( 'Revision::getText' );
-
-               $rev = $this->newTestRevision( $text, $title, $model, $format );
-
-               $this->assertEquals( $expectedText, $rev->getText( $audience ) );
-       }
-
        public function dataGetSize() {
                return [
                        [ "hello world.", CONTENT_MODEL_WIKITEXT, 12 ],
@@ -375,14 +353,11 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers Revision::__construct
         */
        public function testConstructWithText() {
-               $this->hideDeprecated( "Revision::getText" );
-
                $rev = new Revision( [
                        'text' => 'hello world.',
                        'content_model' => CONTENT_MODEL_JAVASCRIPT
                ] );
 
-               $this->assertNotNull( $rev->getText(), 'no content text' );
                $this->assertNotNull( $rev->getContent(), 'no content object available' );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
@@ -392,15 +367,12 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers Revision::__construct
         */
        public function testConstructWithContent() {
-               $this->hideDeprecated( "Revision::getText" );
-
                $title = Title::newFromText( 'RevisionTest_testConstructWithContent' );
 
                $rev = new Revision( [
                        'content' => ContentHandler::makeContent( 'hello world.', $title, CONTENT_MODEL_JAVASCRIPT ),
                ] );
 
-               $this->assertNotNull( $rev->getText(), 'no content text' );
                $this->assertNotNull( $rev->getContent(), 'no content object available' );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
index 3cb20e1..7086a92 100644 (file)
@@ -33,16 +33,18 @@ use Psr\Log\LogLevel;
  */
 class TestLogger extends \Psr\Log\AbstractLogger {
        private $collect = false;
+       private $collectContext = false;
        private $buffer = [];
        private $filter = null;
 
        /**
         * @param bool $collect Whether to collect logs
         * @param callable $filter Filter logs before collecting/printing. Signature is
-        *  string|null function ( string $message, string $level );
+        *  string|null function ( string $message, string $level, array $context );
         */
-       public function __construct( $collect = false, $filter = null ) {
+       public function __construct( $collect = false, $filter = null, $collectContext = false ) {
                $this->collect = $collect;
+               $this->collectContext = $collectContext;
                $this->filter = $filter;
        }
 
@@ -56,7 +58,8 @@ class TestLogger extends \Psr\Log\AbstractLogger {
 
        /**
         * Return the collected logs
-        * @return array Array of array( string $level, string $message )
+        * @return array Array of array( string $level, string $message ), or
+        *   array( string $level, string $message, array $context ) if $collectContext was true.
         */
        public function getBuffer() {
                return $this->buffer;
@@ -73,14 +76,18 @@ class TestLogger extends \Psr\Log\AbstractLogger {
                $message = trim( $message );
 
                if ( $this->filter ) {
-                       $message = call_user_func( $this->filter, $message, $level );
+                       $message = call_user_func( $this->filter, $message, $level, $context );
                        if ( $message === null ) {
                                return;
                        }
                }
 
                if ( $this->collect ) {
-                       $this->buffer[] = [ $level, $message ];
+                       if ( $this->collectContext ) {
+                               $this->buffer[] = [ $level, $message, $context ];
+                       } else {
+                               $this->buffer[] = [ $level, $message ];
+                       }
                } else {
                        switch ( $level ) {
                                case LogLevel::DEBUG:
index 5ecdf56..9121178 100644 (file)
@@ -787,5 +787,21 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
                #   $user->mBlock->mExpiry == 'infinity'
+
+               $this->user->mBlockedby = $this->user->getName();
+               $this->user->mBlock = new Block( [
+                       'address' => '127.0.8.1',
+                       'by' => $this->user->getId(),
+                       'reason' => 'no reason given',
+                       'timestamp' => $now,
+                       'auto' => false,
+                       'expiry' => 10,
+                       'systemBlock' => 'test',
+               ] );
+               $this->assertEquals( [ [ 'systemblockedtext',
+                               '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
+                               'Useruser', 'test', '23:00, 31 December 1969', '127.0.8.1',
+                               $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ],
+                       $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
        }
 }
index 93687df..bdec0a5 100644 (file)
@@ -1233,7 +1233,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                        ->with( 'watchlisttoken' )
                        ->willReturn( '0123456789abcdef' );
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
                $queryService->getWatchedItemsWithRecentChangeInfo(
                        $user,
                        [ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => $token ]
index ba47059..0bd0bcc 100644 (file)
@@ -2404,6 +2404,35 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                );
        }
 
+       public function testSetNotificationTimestampsForUser_nullTimestamp() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $timestamp = null;
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'update' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_notificationtimestamp' => null ],
+                               [ 'wl_user' => 1 ]
+                       )
+                       ->will( $this->returnValue( true ) );
+               $mockDb->expects( $this->exactly( 0 ) )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return 'TS' . $value . 'TS';
+                       } ) );
+
+               $store = $this->newWatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $this->getMockCache()
+               );
+
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, $timestamp )
+               );
+       }
+
        public function testSetNotificationTimestampsForUser_specificTargets() {
                $user = $this->getMockNonAnonUserWithId( 1 );
                $timestamp = '20100101010101';
index 8b75d56..7327e85 100644 (file)
@@ -20,7 +20,7 @@ class ApiBaseTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         * @covers ApiBase::requireOnlyOneParameter
         */
        public function testRequireOnlyOneParameterZero() {
@@ -32,7 +32,7 @@ class ApiBaseTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         * @covers ApiBase::requireOnlyOneParameter
         */
        public function testRequireOnlyOneParameterTrue() {
@@ -58,10 +58,10 @@ class ApiBaseTest extends ApiTestCase {
                $context->setRequest( new FauxRequest( $input !== null ? [ 'foo' => $input ] : [] ) );
                $wrapper->mMainModule = new ApiMain( $context );
 
-               if ( $expected instanceof UsageException ) {
+               if ( $expected instanceof ApiUsageException ) {
                        try {
                                $wrapper->getParameterFromSettings( 'foo', $paramSettings, true );
-                       } catch ( UsageException $ex ) {
+                       } catch ( ApiUsageException $ex ) {
                                $this->assertEquals( $expected, $ex );
                        }
                } else {
@@ -73,9 +73,7 @@ class ApiBaseTest extends ApiTestCase {
 
        public static function provideGetParameterFromSettings() {
                $warnings = [
-                       'The value passed for \'foo\' contains invalid or non-normalized data. Textual data should ' .
-                       'be valid, NFC-normalized Unicode without C0 control characters other than ' .
-                       'HT (\\t), LF (\\n), and CR (\\r).'
+                       [ 'apiwarn-badutf8', 'foo' ],
                ];
 
                $c0 = '';
@@ -96,7 +94,7 @@ class ApiBaseTest extends ApiTestCase {
                        'String param, required, empty' => [
                                '',
                                [ ApiBase::PARAM_DFLT => 'default', ApiBase::PARAM_REQUIRED => true ],
-                               new UsageException( 'The foo parameter must be set', 'nofoo' ),
+                               ApiUsageException::newWithMessage( null, [ 'apierror-missingparam', 'foo' ] ),
                                []
                        ],
                        'Multi-valued parameter' => [
@@ -126,4 +124,52 @@ class ApiBaseTest extends ApiTestCase {
                ];
        }
 
+       public function testErrorArrayToStatus() {
+               $mock = new MockApi();
+
+               // Sanity check empty array
+               $expect = Status::newGood();
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [] ) );
+
+               // No blocked $user, so no special block handling
+               $expect = Status::newGood();
+               $expect->fatal( 'blockedtext' );
+               $expect->fatal( 'autoblockedtext' );
+               $expect->fatal( 'systemblockedtext' );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [
+                       [ 'blockedtext' ],
+                       [ 'autoblockedtext' ],
+                       [ 'systemblockedtext' ],
+                       'mainpage',
+                       [ 'parentheses', 'foobar' ],
+               ] ) );
+
+               // Has a blocked $user, so special block handling
+               $user = $this->getMutableTestUser()->getUser();
+               $block = new \Block( [
+                       'address' => $user->getName(),
+                       'user' => $user->getID(),
+                       'reason' => __METHOD__,
+                       'expiry' => time() + 100500,
+               ] );
+               $block->insert();
+               $blockinfo = [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ];
+
+               $expect = Status::newGood();
+               $expect->fatal( ApiMessage::create( 'apierror-blocked', 'blocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-autoblocked', 'autoblocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-systemblocked', 'blocked', $blockinfo ) );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $this->assertEquals( $expect, $mock->errorArrayToStatus( [
+                       [ 'blockedtext' ],
+                       [ 'autoblockedtext' ],
+                       [ 'systemblockedtext' ],
+                       'mainpage',
+                       [ 'parentheses', 'foobar' ],
+               ], $user ) );
+       }
+
 }
index d2dccf9..832a113 100644 (file)
@@ -13,6 +13,14 @@ class ApiBlockTest extends ApiTestCase {
                $this->doLogin();
        }
 
+       protected function tearDown() {
+               $block = Block::newFromTarget( 'UTApiBlockee' );
+               if ( !is_null( $block ) ) {
+                       $block->delete();
+               }
+               parent::tearDown();
+       }
+
        protected function getTokens() {
                return $this->getTokenList( self::$users['sysop'] );
        }
@@ -65,8 +73,37 @@ class ApiBlockTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
-        * @expectedExceptionMessage The token parameter must be set
+        * Block by user ID
+        */
+       public function testMakeNormalBlockId() {
+               $tokens = $this->getTokens();
+               $user = User::newFromName( 'UTApiBlockee' );
+
+               if ( !$user->getId() ) {
+                       $this->markTestIncomplete( "The user UTApiBlockee does not exist." );
+               }
+
+               if ( !array_key_exists( 'blocktoken', $tokens ) ) {
+                       $this->markTestIncomplete( "No block token found" );
+               }
+
+               $data = $this->doApiRequest( [
+                       'action' => 'block',
+                       'userid' => $user->getId(),
+                       'reason' => 'Some reason',
+                       'token' => $tokens['blocktoken'] ], null, false, self::$users['sysop']->getUser() );
+
+               $block = Block::newFromTarget( 'UTApiBlockee' );
+
+               $this->assertTrue( !is_null( $block ), 'Block is valid.' );
+               $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
+               $this->assertEquals( 'Some reason', $block->mReason );
+               $this->assertEquals( 'infinity', $block->mExpiry );
+       }
+
+       /**
+        * @expectedException ApiUsageException
+        * @expectedExceptionMessage The "token" parameter must be set
         */
        public function testBlockingActionWithNoToken() {
                $this->doApiRequest(
index 3ad16d1..bb4ea75 100644 (file)
@@ -160,10 +160,8 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                try {
                        self::getManager( 'foo', $allModules, [ 'mock1', 'mock2' ] );
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $ex ) {
-                       $this->assertSame(
-                               'Invalid continue param. You should pass the original value returned by the previous query',
-                               $ex->getMessage(),
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'badcontinue' ),
                                'Expected exception'
                        );
                }
index 02d0a0d..0ffcbca 100644 (file)
@@ -195,9 +195,9 @@ class ApiEditPageTest extends ApiTestCase {
                                'section' => '9999',
                                'text' => 'text',
                        ] );
-                       $this->fail( "Should have raised a UsageException" );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nosuchsection', $e->getCodeString() );
+                       $this->fail( "Should have raised an ApiUsageException" );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'nosuchsection' ) );
                }
        }
 
@@ -333,8 +333,8 @@ class ApiEditPageTest extends ApiTestCase {
                        ], null, self::$users['sysop']->getUser() );
 
                        $this->fail( 'redirect-appendonly error expected' );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'redirect-appendonly', $ex->getCodeString() );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $ex, 'redirect-appendonly' ) );
                }
        }
 
@@ -369,8 +369,8 @@ class ApiEditPageTest extends ApiTestCase {
                        ], null, self::$users['sysop']->getUser() );
 
                        $this->fail( 'edit conflict expected' );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $ex, 'editconflict' ) );
                }
        }
 
@@ -474,7 +474,7 @@ class ApiEditPageTest extends ApiTestCase {
 
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
-                       'UsageException',
+                       'ApiUsageException',
                        'Direct editing via API is not supported for content model ' .
                                'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
index d13b00b..eaa4d17 100644 (file)
@@ -5,6 +5,30 @@
  */
 class ApiErrorFormatterTest extends MediaWikiLangTestCase {
 
+       /**
+        * @covers ApiErrorFormatter
+        */
+       public function testErrorFormatterBasics() {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'de' ), 'wikitext', false );
+               $this->assertSame( 'de', $formatter->getLanguage()->getCode() );
+
+               $formatter->addMessagesFromStatus( null, Status::newGood() );
+               $this->assertSame(
+                       [ ApiResult::META_TYPE => 'assoc' ],
+                       $result->getResultData()
+               );
+
+               $this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
+
+               $wrappedFormatter = TestingAccessWrapper::newFromObject( $formatter );
+               $this->assertSame(
+                       'Blah "kbd" <X> 😊',
+                       $wrappedFormatter->stripMarkup( 'Blah <kbd>kbd</kbd> <b>&lt;X&gt;</b> &#x1f60a;' ),
+                       'stripMarkup'
+               );
+       }
+
        /**
         * @covers ApiErrorFormatter
         * @dataProvider provideErrorFormatter
@@ -22,7 +46,7 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
 
                $formatter->addWarning( 'string', 'mainpage' );
                $formatter->addError( 'err', 'mainpage' );
-               $this->assertSame( $expect1, $result->getResultData(), 'Simple test' );
+               $this->assertEquals( $expect1, $result->getResultData(), 'Simple test' );
 
                $result->reset();
                $formatter->addWarning( 'foo', 'mainpage' );
@@ -35,6 +59,17 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter->addError( 'errWithData', $msg2 );
                $this->assertSame( $expect2, $result->getResultData(), 'Complex test' );
 
+               $this->assertEquals(
+                       $this->removeModuleTag( $expect2['warnings'][2] ),
+                       $formatter->formatMessage( $msg1 ),
+                       'formatMessage test 1'
+               );
+               $this->assertEquals(
+                       $this->removeModuleTag( $expect2['warnings'][3] ),
+                       $formatter->formatMessage( $msg2 ),
+                       'formatMessage test 2'
+               );
+
                $result->reset();
                $status = Status::newGood();
                $status->warning( 'mainpage' );
@@ -47,245 +82,256 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame( $expect3, $result->getResultData(), 'Status test' );
 
                $this->assertSame(
-                       $expect3['errors']['status'],
+                       array_map( [ $this, 'removeModuleTag' ], $expect3['errors'] ),
                        $formatter->arrayFromStatus( $status, 'error' ),
                        'arrayFromStatus test for error'
                );
                $this->assertSame(
-                       $expect3['warnings']['status'],
+                       array_map( [ $this, 'removeModuleTag' ], $expect3['warnings'] ),
                        $formatter->arrayFromStatus( $status, 'warning' ),
                        'arrayFromStatus test for warning'
                );
        }
 
+       private function removeModuleTag( $s ) {
+               if ( is_array( $s ) ) {
+                       unset( $s['module'] );
+               }
+               return $s;
+       }
+
        public static function provideErrorFormatter() {
-               $mainpagePlain = wfMessage( 'mainpage' )->useDatabase( false )->plain();
-               $parensPlain = wfMessage( 'parentheses', 'foobar' )->useDatabase( false )->plain();
-               $mainpageText = wfMessage( 'mainpage' )->inLanguage( 'de' )->text();
-               $parensText = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'de' )->text();
+               $mainpageText = wfMessage( 'mainpage' )->inLanguage( 'de' )->useDatabase( false )->text();
+               $parensText = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'de' )
+                       ->useDatabase( false )->text();
+               $mainpageHTML = wfMessage( 'mainpage' )->inLanguage( 'en' )->parse();
+               $parensHTML = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'en' )->parse();
                $C = ApiResult::META_CONTENT;
                $I = ApiResult::META_INDEXED_TAG_NAME;
+               $overriddenData = [ 'overriddenData' => true, ApiResult::META_TYPE => 'assoc' ];
 
                return [
-                       [ 'wikitext', 'de', true,
+                       $tmp = [ 'wikitext', 'de', false,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'err', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'string', $C => 'text' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'errWithData', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'message' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'foo' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'foo', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'foo', $C => 'text' ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'message', $C => 'text' ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'messageWithData', $C => 'text' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'status', $C => 'text' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ],
-                                                       [ 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ],
-                                                       [ 'code' => 'overriddenCode', 'text' => $mainpageText,
-                                                               'overriddenData' => true, $C => 'text' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'text' => $mainpageText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'parentheses', 'text' => $parensText, 'module' => 'status', $C => 'text' ],
+                                               [ 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                       'data' => $overriddenData, 'module' => 'status', $C => 'text' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                       ],
+                       [ 'plaintext' ] + $tmp, // For these messages, plaintext and wikitext are the same
+                       [ 'html', 'en', true,
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'err', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'string', $C => 'html' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'errWithData', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'foo', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'foo', $C => 'html' ],
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'message', $C => 'html' ],
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'messageWithData', $C => 'html' ],
+                                               $I => 'warning',
+                                       ],
+                               ],
+                               [
+                                       'errors' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'status', $C => 'html' ],
+                                               $I => 'error',
+                                       ],
+                                       'warnings' => [
+                                               [ 'code' => 'mainpage', 'html' => $mainpageHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'parentheses', 'html' => $parensHTML, 'module' => 'status', $C => 'html' ],
+                                               [ 'code' => 'overriddenCode', 'html' => $mainpageHTML,
+                                                       'data' => $overriddenData, 'module' => 'status', $C => 'html' ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
                        [ 'raw', 'fr', true,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'err',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'string',
                                                ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'errWithData',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'foo',
                                                ],
-                                               'message' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'foo',
                                                ],
-                                               'foo' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'message',
                                                ],
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'messageWithData',
+                                               ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       $I => 'error',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'status',
                                                ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [
-                                                               'code' => 'mainpage',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'parentheses',
-                                                               'key' => 'parentheses',
-                                                               'params' => [ 'foobar', $I => 'param' ]
-                                                       ],
-                                                       [
-                                                               'code' => 'overriddenCode',
-                                                               'key' => 'mainpage',
-                                                               'params' => [ $I => 'param' ],
-                                                               'overriddenData' => true
-                                                       ],
-                                                       $I => 'warning',
+                                               [
+                                                       'code' => 'mainpage',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'parentheses',
+                                                       'key' => 'parentheses',
+                                                       'params' => [ 'foobar', $I => 'param' ],
+                                                       'module' => 'status',
+                                               ],
+                                               [
+                                                       'code' => 'overriddenCode',
+                                                       'key' => 'mainpage',
+                                                       'params' => [ $I => 'param' ],
+                                                       'data' => $overriddenData,
+                                                       'module' => 'status',
                                                ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
                        [ 'none', 'fr', true,
                                [
                                        'errors' => [
-                                               'err' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'err' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'string' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'string' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'errWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData,
+                                                       'module' => 'errWithData' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'messageWithData' => [
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'warning',
-                                               ],
-                                               'message' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       $I => 'warning',
-                                               ],
-                                               'foo' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'foo' ],
+                                               [ 'code' => 'parentheses', 'module' => 'foo' ],
+                                               [ 'code' => 'mainpage', 'module' => 'message' ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData,
+                                                       'module' => 'messageWithData' ],
+                                               $I => 'warning',
                                        ],
                                ],
                                [
                                        'errors' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       $I => 'error',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'status' ],
+                                               [ 'code' => 'parentheses', 'module' => 'status' ],
+                                               $I => 'error',
                                        ],
                                        'warnings' => [
-                                               'status' => [
-                                                       [ 'code' => 'mainpage' ],
-                                                       [ 'code' => 'parentheses' ],
-                                                       [ 'code' => 'overriddenCode', 'overriddenData' => true ],
-                                                       $I => 'warning',
-                                               ],
+                                               [ 'code' => 'mainpage', 'module' => 'status' ],
+                                               [ 'code' => 'parentheses', 'module' => 'status' ],
+                                               [ 'code' => 'overriddenCode', 'data' => $overriddenData, 'module' => 'status' ],
+                                               $I => 'warning',
                                        ],
                                ],
                        ],
@@ -302,7 +348,14 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
+               $this->assertSame( 'en', $formatter->getLanguage()->getCode() );
+
+               $this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
+
                $formatter->addWarning( 'string', 'mainpage' );
+               $formatter->addWarning( 'raw',
+                       new RawMessage( 'Blah <kbd>kbd</kbd> <b>&lt;X&gt;</b> &#x1f61e;' )
+               );
                $formatter->addError( 'err', 'mainpage' );
                $this->assertSame( [
                        'error' => [
@@ -310,6 +363,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                                'info' => $mainpagePlain,
                        ],
                        'warnings' => [
+                               'raw' => [
+                                       'warnings' => 'Blah "kbd" <X> 😞',
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ],
                                'string' => [
                                        'warnings' => $mainpagePlain,
                                        ApiResult::META_CONTENT => 'warnings',
@@ -321,12 +378,13 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $result->reset();
                $formatter->addWarning( 'foo', 'mainpage' );
                $formatter->addWarning( 'foo', 'mainpage' );
-               $formatter->addWarning( 'foo', [ 'parentheses', 'foobar' ] );
+               $formatter->addWarning( 'xxx+foo', [ 'parentheses', 'foobar' ] );
                $msg1 = wfMessage( 'mainpage' );
                $formatter->addWarning( 'message', $msg1 );
                $msg2 = new ApiMessage( 'mainpage', 'overriddenCode', [ 'overriddenData' => true ] );
                $formatter->addWarning( 'messageWithData', $msg2 );
                $formatter->addError( 'errWithData', $msg2 );
+               $formatter->addWarning( null, 'mainpage' );
                $this->assertSame( [
                        'error' => [
                                'code' => 'overriddenCode',
@@ -334,6 +392,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                                'overriddenData' => true,
                        ],
                        'warnings' => [
+                               'unknown' => [
+                                       'warnings' => $mainpagePlain,
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ],
                                'messageWithData' => [
                                        'warnings' => $mainpagePlain,
                                        ApiResult::META_CONTENT => 'warnings',
@@ -350,6 +412,22 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                        ApiResult::META_TYPE => 'assoc',
                ], $result->getResultData(), 'Complex test' );
 
+               $this->assertSame(
+                       [
+                               'code' => 'mainpage',
+                               'info' => 'Main Page',
+                       ],
+                       $formatter->formatMessage( $msg1 )
+               );
+               $this->assertSame(
+                       [
+                               'code' => 'overriddenCode',
+                               'info' => 'Main Page',
+                               'overriddenData' => true,
+                       ],
+                       $formatter->formatMessage( $msg2 )
+               );
+
                $result->reset();
                $status = Status::newGood();
                $status->warning( 'mainpage' );
@@ -361,8 +439,8 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter->addMessagesFromStatus( 'status', $status );
                $this->assertSame( [
                        'error' => [
-                               'code' => 'parentheses',
-                               'info' => $parensPlain,
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
                        ],
                        'warnings' => [
                                'status' => [
@@ -377,14 +455,16 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame(
                        [
                                [
-                                       'type' => 'error',
                                        'message' => 'mainpage',
-                                       'params' => [ $I => 'param' ]
+                                       'params' => [ $I => 'param' ],
+                                       'code' => 'mainpage',
+                                       'type' => 'error',
                                ],
                                [
-                                       'type' => 'error',
                                        'message' => 'parentheses',
-                                       'params' => [ 'foobar', $I => 'param' ]
+                                       'params' => [ 'foobar', $I => 'param' ],
+                                       'code' => 'parentheses',
+                                       'type' => 'error',
                                ],
                                $I => 'error',
                        ],
@@ -394,30 +474,157 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $this->assertSame(
                        [
                                [
-                                       'type' => 'warning',
                                        'message' => 'mainpage',
-                                       'params' => [ $I => 'param' ]
+                                       'params' => [ $I => 'param' ],
+                                       'code' => 'mainpage',
+                                       'type' => 'warning',
                                ],
                                [
-                                       'type' => 'warning',
                                        'message' => 'parentheses',
-                                       'params' => [ 'foobar', $I => 'param' ]
+                                       'params' => [ 'foobar', $I => 'param' ],
+                                       'code' => 'parentheses',
+                                       'type' => 'warning',
                                ],
                                [
                                        'message' => 'mainpage',
                                        'params' => [ $I => 'param' ],
-                                       'type' => 'warning'
+                                       'code' => 'mainpage',
+                                       'type' => 'warning',
                                ],
                                [
                                        'message' => 'mainpage',
                                        'params' => [ $I => 'param' ],
-                                       'type' => 'warning'
+                                       'code' => 'overriddenCode',
+                                       'type' => 'warning',
                                ],
                                $I => 'warning',
                        ],
                        $formatter->arrayFromStatus( $status, 'warning' ),
                        'arrayFromStatus test for warning'
                );
+
+               $result->reset();
+               $result->addValue( null, 'error', [ 'bogus' ] );
+               $formatter->addError( 'err', 'mainpage' );
+               $this->assertSame( [
+                       'error' => [
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
+                       ],
+                       ApiResult::META_TYPE => 'assoc',
+               ], $result->getResultData(), 'Overwrites bogus "error" value with real error' );
+       }
+
+       /**
+        * @dataProvider provideGetMessageFromException
+        * @covers ApiErrorFormatter::getMessageFromException
+        * @covers ApiErrorFormatter::formatException
+        * @param Exception $exception
+        * @param array $options
+        * @param array $expect
+        */
+       public function testGetMessageFromException( $exception, $options, $expect ) {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'html', false );
+
+               $msg = $formatter->getMessageFromException( $exception, $options );
+               $this->assertInstanceOf( Message::class, $msg );
+               $this->assertInstanceOf( IApiMessage::class, $msg );
+               $this->assertSame( $expect, [
+                       'text' => $msg->parse(),
+                       'code' => $msg->getApiCode(),
+                       'data' => $msg->getApiData(),
+               ] );
+
+               $expectFormatted = $formatter->formatMessage( $msg );
+               $formatted = $formatter->formatException( $exception, $options );
+               $this->assertSame( $expectFormatted, $formatted );
+       }
+
+       /**
+        * @dataProvider provideGetMessageFromException
+        * @covers ApiErrorFormatter_BackCompat::formatException
+        * @param Exception $exception
+        * @param array $options
+        * @param array $expect
+        */
+       public function testGetMessageFromException_BC( $exception, $options, $expect ) {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter_BackCompat( $result );
+
+               $msg = $formatter->getMessageFromException( $exception, $options );
+               $this->assertInstanceOf( Message::class, $msg );
+               $this->assertInstanceOf( IApiMessage::class, $msg );
+               $this->assertSame( $expect, [
+                       'text' => $msg->parse(),
+                       'code' => $msg->getApiCode(),
+                       'data' => $msg->getApiData(),
+               ] );
+
+               $expectFormatted = $formatter->formatMessage( $msg );
+               $formatted = $formatter->formatException( $exception, $options );
+               $this->assertSame( $expectFormatted, $formatted );
+               $formatted = $formatter->formatException( $exception, $options + [ 'bc' => true ] );
+               $this->assertSame( $expectFormatted['info'], $formatted );
+       }
+
+       public static function provideGetMessageFromException() {
+               return [
+                       'Normal exception' => [
+                               new RuntimeException( '<b>Something broke!</b>' ),
+                               [],
+                               [
+                                       'text' => '&#60;b&#62;Something broke!&#60;/b&#62;',
+                                       'code' => 'internal_api_error_RuntimeException',
+                                       'data' => [],
+                               ]
+                       ],
+                       'Normal exception, wrapped' => [
+                               new RuntimeException( '<b>Something broke!</b>' ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => '(&#60;b&#62;Something broke!&#60;/b&#62;)',
+                                       'code' => 'some-code',
+                                       'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+                               ]
+                       ],
+                       'UsageException' => [
+                               new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+                               [],
+                               [
+                                       'text' => '&#60;b&#62;Something broke!&#60;/b&#62;',
+                                       'code' => 'ue-code',
+                                       'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
+                               ]
+                       ],
+                       'UsageException, wrapped' => [
+                               new UsageException( '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ] ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => '(&#60;b&#62;Something broke!&#60;/b&#62;)',
+                                       'code' => 'some-code',
+                                       'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
+                               ]
+                       ],
+                       'LocalizedException' => [
+                               new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+                               [],
+                               [
+                                       'text' => 'Return to <b>FooBar</b>.',
+                                       'code' => 'returnto',
+                                       'data' => [],
+                               ]
+                       ],
+                       'LocalizedException, wrapped' => [
+                               new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
+                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
+                               [
+                                       'text' => 'Return to <b>FooBar</b>.',
+                                       'code' => 'some-code',
+                                       'data' => [ 'foo' => 'bar', 'baz' => 42 ],
+                               ]
+                       ],
+               ];
        }
 
 }
index c111949..71dafce 100644 (file)
@@ -53,8 +53,8 @@ class ApiMainTest extends ApiTestCase {
                                'assert' => $assert,
                        ], null, null, $user );
                        $this->assertFalse( $error ); // That no error was expected
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( $e->getCodeString(), $error );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, $error ) );
                }
        }
 
@@ -76,8 +76,8 @@ class ApiMainTest extends ApiTestCase {
                                'assertuser' => $user->getName() . 'X',
                        ], null, null, $user );
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( $e->getCodeString(), 'assertnameduserfailed' );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'assertnameduserfailed' ) );
                }
        }
 
@@ -85,20 +85,15 @@ class ApiMainTest extends ApiTestCase {
         * Test if all classes in the main module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
-
-               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-
                $api = new ApiMain(
                        new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] )
                );
                $modules = $api->getModuleManager()->getNamesWithClasses();
+
                foreach ( $modules as $name => $class ) {
-                       $this->assertArrayHasKey(
-                               $class,
-                               $classes,
-                               'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
+                       $this->assertTrue(
+                               class_exists( $class ),
+                               'Class ' . $class . ' for api module ' . $name . ' does not exist (with exact case)'
                        );
                }
        }
@@ -305,4 +300,274 @@ class ApiMainTest extends ApiTestCase {
                $main = new ApiMain( new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] ) );
                $this->assertTrue( $main->lacksSameOriginSecurity(), 'Hook, should lack security' );
        }
+
+       /**
+        * Test proper creation of the ApiErrorFormatter
+        * @covers ApiMain::__construct
+        * @dataProvider provideApiErrorFormatterCreation
+        * @param array $request Request parameters
+        * @param array $expect Expected data
+        *  - uselang: ApiMain language
+        *  - class: ApiErrorFormatter class
+        *  - lang: ApiErrorFormatter language
+        *  - format: ApiErrorFormatter format
+        *  - usedb: ApiErrorFormatter use-database flag
+        */
+       public function testApiErrorFormatterCreation( array $request, array $expect ) {
+               $context = new RequestContext();
+               $context->setRequest( new FauxRequest( $request ) );
+               $context->setLanguage( 'ru' );
+
+               $main = new ApiMain( $context );
+               $formatter = $main->getErrorFormatter();
+               $wrappedFormatter = TestingAccessWrapper::newFromObject( $formatter );
+
+               $this->assertSame( $expect['uselang'], $main->getLanguage()->getCode() );
+               $this->assertInstanceOf( $expect['class'], $formatter );
+               $this->assertSame( $expect['lang'], $formatter->getLanguage()->getCode() );
+               $this->assertSame( $expect['format'], $wrappedFormatter->format );
+               $this->assertSame( $expect['usedb'], $wrappedFormatter->useDB );
+       }
+
+       public static function provideApiErrorFormatterCreation() {
+               global $wgContLang;
+
+               return [
+                       'Default (BC)' => [ [], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'BC ignores fields' => [ [ 'errorlang' => 'de', 'errorsuselocal' => 1 ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'Explicit BC' => [ [ 'errorformat' => 'bc' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+                       'Basic' => [ [ 'errorformat' => 'wikitext' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter::class,
+                               'lang' => 'ru',
+                               'format' => 'wikitext',
+                               'usedb' => false,
+                       ] ],
+                       'Follows uselang' => [ [ 'uselang' => 'fr', 'errorformat' => 'plaintext' ], [
+                               'uselang' => 'fr',
+                               'class' => ApiErrorFormatter::class,
+                               'lang' => 'fr',
+                               'format' => 'plaintext',
+                               'usedb' => false,
+                       ] ],
+                       'Explicitly follows uselang' => [
+                               [ 'uselang' => 'fr', 'errorlang' => 'uselang', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => 'fr',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'fr',
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'uselang=content' => [
+                               [ 'uselang' => 'content', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => $wgContLang->getCode(),
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => $wgContLang->getCode(),
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'errorlang=content' => [
+                               [ 'errorlang' => 'content', 'errorformat' => 'plaintext' ],
+                               [
+                                       'uselang' => 'ru',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => $wgContLang->getCode(),
+                                       'format' => 'plaintext',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Explicit parameters' => [
+                               [ 'errorlang' => 'de', 'errorformat' => 'html', 'errorsuselocal' => 1 ],
+                               [
+                                       'uselang' => 'ru',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'de',
+                                       'format' => 'html',
+                                       'usedb' => true,
+                               ]
+                       ],
+                       'Explicit parameters override uselang' => [
+                               [ 'errorlang' => 'de', 'uselang' => 'fr', 'errorformat' => 'raw' ],
+                               [
+                                       'uselang' => 'fr',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'de',
+                                       'format' => 'raw',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Bogus language doesn\'t explode' => [
+                               [ 'errorlang' => '<bogus1>', 'uselang' => '<bogus2>', 'errorformat' => 'none' ],
+                               [
+                                       'uselang' => 'en',
+                                       'class' => ApiErrorFormatter::class,
+                                       'lang' => 'en',
+                                       'format' => 'none',
+                                       'usedb' => false,
+                               ]
+                       ],
+                       'Bogus format doesn\'t explode' => [ [ 'errorformat' => 'bogus' ], [
+                               'uselang' => 'ru',
+                               'class' => ApiErrorFormatter_BackCompat::class,
+                               'lang' => 'en',
+                               'format' => 'none',
+                               'usedb' => false,
+                       ] ],
+               ];
+       }
+
+       /**
+        * @covers ApiMain::errorMessagesFromException
+        * @covers ApiMain::substituteResultWithError
+        * @dataProvider provideExceptionErrors
+        * @param Exception $exception
+        * @param array $expectReturn
+        * @param array $expectResult
+        */
+       public function testExceptionErrors( $error, $expectReturn, $expectResult ) {
+               $context = new RequestContext();
+               $context->setRequest( new FauxRequest( [ 'errorformat' => 'plaintext' ] ) );
+               $context->setLanguage( 'en' );
+               $context->setConfig( new MultiConfig( [
+                       new HashConfig( [ 'ShowHostnames' => true, 'ShowSQLErrors' => false ] ),
+                       $context->getConfig()
+               ] ) );
+
+               $main = new ApiMain( $context );
+               $main->addWarning( new RawMessage( 'existing warning' ), 'existing-warning' );
+               $main->addError( new RawMessage( 'existing error' ), 'existing-error' );
+
+               $ret = TestingAccessWrapper::newFromObject( $main )->substituteResultWithError( $error );
+               $this->assertSame( $expectReturn, $ret );
+
+               // PHPUnit sometimes adds some SplObjectStorage garbage to the arrays,
+               // so let's try ->assertEquals().
+               $this->assertEquals(
+                       $expectResult,
+                       $main->getResult()->getResultData( [], [ 'Strip' => 'all' ] )
+               );
+       }
+
+       // Not static so $this->getMock() can be used
+       public function provideExceptionErrors() {
+               $reqId = WebRequest::getRequestId();
+               $doclink = wfExpandUrl( wfScript( 'api' ) );
+
+               $ex = new InvalidArgumentException( 'Random exception' );
+               $trace = wfMessage( 'api-exception-trace',
+                       get_class( $ex ),
+                       $ex->getFile(),
+                       $ex->getLine(),
+                       MWExceptionHandler::getRedactedTraceAsString( $ex )
+               )->inLanguage( 'en' )->useDatabase( false )->text();
+
+               $dbex = new DBQueryError( $this->getMock( 'IDatabase' ), 'error', 1234, 'SELECT 1', __METHOD__ );
+               $dbtrace = wfMessage( 'api-exception-trace',
+                       get_class( $dbex ),
+                       $dbex->getFile(),
+                       $dbex->getLine(),
+                       MWExceptionHandler::getRedactedTraceAsString( $dbex )
+               )->inLanguage( 'en' )->useDatabase( false )->text();
+
+               $apiEx1 = new ApiUsageException( null,
+                       StatusValue::newFatal( new ApiRawMessage( 'An error', 'sv-error1' ) ) );
+               TestingAccessWrapper::newFromObject( $apiEx1 )->modulePath = 'foo+bar';
+               $apiEx1->getStatusValue()->warning( new ApiRawMessage( 'A warning', 'sv-warn1' ) );
+               $apiEx1->getStatusValue()->warning( new ApiRawMessage( 'Another warning', 'sv-warn2' ) );
+               $apiEx1->getStatusValue()->fatal( new ApiRawMessage( 'Another error', 'sv-error2' ) );
+
+               return [
+                       [
+                               $ex,
+                               [ 'existing-error', 'internal_api_error_InvalidArgumentException' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [
+                                                       'code' => 'internal_api_error_InvalidArgumentException',
+                                                       'text' => "[$reqId] Exception caught: Random exception",
+                                               ]
+                                       ],
+                                       'trace' => $trace,
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               $dbex,
+                               [ 'existing-error', 'internal_api_error_DBQueryError' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [
+                                                       'code' => 'internal_api_error_DBQueryError',
+                                                       'text' => "[$reqId] Database query error.",
+                                               ]
+                                       ],
+                                       'trace' => $dbtrace,
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               new UsageException( 'Usage exception!', 'ue', 0, [ 'foo' => 'bar' ] ),
+                               [ 'existing-error', 'ue' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [ 'code' => 'ue', 'text' => "Usage exception!", 'data' => [ 'foo' => 'bar' ] ]
+                                       ],
+                                       'docref' => "See $doclink for API usage.",
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+                       [
+                               $apiEx1,
+                               [ 'existing-error', 'sv-error1', 'sv-error2' ],
+                               [
+                                       'warnings' => [
+                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
+                                               [ 'code' => 'sv-warn1', 'text' => 'A warning', 'module' => 'foo+bar' ],
+                                               [ 'code' => 'sv-warn2', 'text' => 'Another warning', 'module' => 'foo+bar' ],
+                                       ],
+                                       'errors' => [
+                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
+                                               [ 'code' => 'sv-error1', 'text' => 'An error', 'module' => 'foo+bar' ],
+                                               [ 'code' => 'sv-error2', 'text' => 'Another error', 'module' => 'foo+bar' ],
+                                       ],
+                                       'docref' => "See $doclink for API usage.",
+                                       'servedby' => wfHostname(),
+                               ]
+                       ],
+               ];
+       }
 }
index 8764b41..e405b3b 100644 (file)
@@ -23,6 +23,56 @@ class ApiMessageTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers ApiMessageTrait
+        */
+       public function testCodeDefaults() {
+               $msg = new ApiMessage( 'foo' );
+               $this->assertSame( 'foo', $msg->getApiCode() );
+
+               $msg = new ApiMessage( 'apierror-bar' );
+               $this->assertSame( 'bar', $msg->getApiCode() );
+
+               $msg = new ApiMessage( 'apiwarn-baz' );
+               $this->assertSame( 'baz', $msg->getApiCode() );
+
+               // BC case
+               $msg = new ApiMessage( 'actionthrottledtext' );
+               $this->assertSame( 'ratelimited', $msg->getApiCode() );
+
+               $msg = new ApiMessage( [ 'apierror-missingparam', 'param' ] );
+               $this->assertSame( 'noparam', $msg->getApiCode() );
+       }
+
+       /**
+        * @covers ApiMessageTrait
+        * @dataProvider provideInvalidCode
+        * @param mixed $code
+        */
+       public function testInvalidCode( $code ) {
+               $msg = new ApiMessage( 'foo' );
+               try {
+                       $msg->setApiCode( $code );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertTrue( true );
+               }
+
+               try {
+                       new ApiMessage( 'foo', $code );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertTrue( true );
+               }
+       }
+
+       public static function provideInvalidCode() {
+               return [
+                       [ '' ],
+                       [ 42 ],
+               ];
+       }
+
        /**
         * @covers ApiMessage
         * @covers ApiMessageTrait
@@ -105,14 +155,32 @@ class ApiMessageTest extends MediaWikiTestCase {
         * @covers ApiMessage::create
         */
        public function testApiMessageCreate() {
-               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( new Message( 'mainpage' ) ) );
-               $this->assertInstanceOf( 'ApiRawMessage', ApiMessage::create( new RawMessage( 'mainpage' ) ) );
-               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( 'mainpage' ) );
+               $this->assertInstanceOf( ApiMessage::class, ApiMessage::create( new Message( 'mainpage' ) ) );
+               $this->assertInstanceOf(
+                       ApiRawMessage::class, ApiMessage::create( new RawMessage( 'mainpage' ) )
+               );
+               $this->assertInstanceOf( ApiMessage::class, ApiMessage::create( 'mainpage' ) );
+
+               $msg = new ApiMessage( [ 'parentheses', 'foobar' ] );
+               $msg2 = new Message( 'parentheses', [ 'foobar' ] );
 
-               $msg = new ApiMessage( 'mainpage' );
                $this->assertSame( $msg, ApiMessage::create( $msg ) );
+               $this->assertEquals( $msg, ApiMessage::create( $msg2 ) );
+               $this->assertEquals( $msg, ApiMessage::create( [ 'parentheses', 'foobar' ] ) );
+               $this->assertEquals( $msg,
+                       ApiMessage::create( [ 'message' => 'parentheses', 'params' => [ 'foobar' ] ] )
+               );
+               $this->assertSame( $msg,
+                       ApiMessage::create( [ 'message' => $msg, 'params' => [ 'xxx' ] ] )
+               );
+               $this->assertEquals( $msg,
+                       ApiMessage::create( [ 'message' => $msg2, 'params' => [ 'xxx' ] ] )
+               );
+               $this->assertSame( $msg,
+                       ApiMessage::create( [ 'message' => $msg ] )
+               );
 
-               $msg = new ApiRawMessage( 'mainpage' );
+               $msg = new ApiRawMessage( [ 'parentheses', 'foobar' ] );
                $this->assertSame( $msg, ApiMessage::create( $msg ) );
        }
 
index 5358f29..23fa7bc 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
-
 class ApiOpenSearchTest extends MediaWikiTestCase {
        public function testGetAllowedParams() {
                $config = $this->replaceSearchEngineConfig();
index 0a577c1..ef70626 100644 (file)
@@ -30,7 +30,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->any() )
                        ->method( 'getEffectiveGroups' )->will( $this->returnValue( [ '*', 'user' ] ) );
                $this->mUserMock->expects( $this->any() )
-                       ->method( 'isAllowed' )->will( $this->returnValue( true ) );
+                       ->method( 'isAllowedAny' )->will( $this->returnValue( true ) );
 
                // Set up callback for User::getOptionKinds
                $this->mUserMock->expects( $this->any() )
@@ -146,7 +146,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         */
        public function testNoToken() {
                $request = $this->getSampleRequest( [ 'token' => null ] );
@@ -163,13 +163,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest();
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'notloggedin', $e->getCodeString() );
-                       $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'notloggedin' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testNoOptionname() {
@@ -177,13 +175,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest( [ 'optionvalue' => '1' ] );
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nooptionname', $e->getCodeString() );
-                       $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'nooptionname' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testNoChanges() {
@@ -200,13 +196,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $request = $this->getSampleRequest();
 
                        $this->executeQuery( $request );
-               } catch ( UsageException $e ) {
-                       $this->assertEquals( 'nochanges', $e->getCodeString() );
-                       $this->assertEquals( 'No changes were requested', $e->getMessage() );
-
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $e, 'nochanges' ) );
                        return;
                }
-               $this->fail( "UsageException was not thrown" );
+               $this->fail( "ApiUsageException was not thrown" );
        }
 
        public function testReset() {
@@ -400,7 +394,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => [
                                'options' => [
-                                       'warnings' => "Validation error for 'special': cannot be set by this module"
+                                       'warnings' => "Validation error for \"special\": cannot be set by this module."
                                ]
                        ]
                ], $response );
@@ -423,7 +417,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => [
                                'options' => [
-                                       'warnings' => "Validation error for 'unknownOption': not a valid preference"
+                                       'warnings' => "Validation error for \"unknownOption\": not a valid preference."
                                ]
                        ]
                ], $response );
index b72a4f8..f01a670 100644 (file)
@@ -23,12 +23,10 @@ class ApiParseTest extends ApiTestCase {
                                'page' => $somePage ] );
 
                        $this->fail( "API did not return an error when parsing a nonexistent page" );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals(
-                               'missingtitle',
-                               $ex->getCodeString(),
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'missingtitle' ),
                                "Parse request for nonexistent page must give 'missingtitle' error: "
-                                       . var_export( $ex->getMessageArray(), true )
+                                       . var_export( self::getErrorFormatter()->arrayFromStatus( $ex->getStatusValue() ), true )
                        );
                }
        }
index eaeb3ae..0a2cd83 100644 (file)
@@ -1498,7 +1498,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $otherUser->setOption( 'watchlisttoken', '1234567890' );
                $otherUser->saveSettings();
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRequest( [
                        'wlowner' => $otherUser->getName(),
@@ -1507,7 +1507,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testOwnerAndTokenParams_noWatchlistTokenSet() {
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRequest( [
                        'wlowner' => $this->getNonLoggedInTestUser()->getName(),
index d6f315d..0f01664 100644 (file)
@@ -503,7 +503,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
                $otherUser->setOption( 'watchlisttoken', '1234567890' );
                $otherUser->saveSettings();
 
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRawRequest( [
                        'wrowner' => $otherUser->getName(),
@@ -512,7 +512,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
        }
 
        public function testOwnerAndTokenParams_userHasNoWatchlistToken() {
-               $this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
+               $this->setExpectedException( ApiUsageException::class, 'Incorrect watchlist token provided' );
 
                $this->doListWatchlistRawRequest( [
                        'wrowner' => $this->getNotLoggedInTestUser()->getName(),
index d8282be..a4ca8a1 100644 (file)
@@ -43,9 +43,9 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertEquals( $out['status'], 'Success' );
                $this->assertArrayHasKey( 'items', $out );
                $item = $out['items'][0];
-               $this->assertArrayHasKey( 'userhidden', $item );
-               $this->assertArrayHasKey( 'commenthidden', $item );
-               $this->assertArrayHasKey( 'texthidden', $item );
+               $this->assertTrue( $item['userhidden'], 'userhidden' );
+               $this->assertTrue( $item['commenthidden'], 'commenthidden' );
+               $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
 
                // Now check that that revision was actually hidden
@@ -70,9 +70,9 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertArrayHasKey( 'items', $out2 );
                $item = $out2['items'][0];
 
-               $this->assertArrayNotHasKey( 'userhidden', $item );
-               $this->assertArrayNotHasKey( 'commenthidden', $item );
-               $this->assertArrayNotHasKey( 'texthidden', $item );
+               $this->assertFalse( $item['userhidden'], 'userhidden' );
+               $this->assertFalse( $item['commenthidden'], 'commenthidden' );
+               $this->assertFalse( $item['texthidden'], 'texthidden' );
 
                $this->assertEquals( $item['id'], $revid );
 
@@ -107,11 +107,11 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertEquals( $out['status'], 'Success' );
                $this->assertArrayHasKey( 'items', $out );
                $item = $out['items'][0];
-               // Check it has userhidden & texthidden keys
-               // but no commenthidden key
-               $this->assertArrayHasKey( 'userhidden', $item );
-               $this->assertArrayNotHasKey( 'commenthidden', $item );
-               $this->assertArrayHasKey( 'texthidden', $item );
+               // Check it has userhidden & texthidden
+               // but not commenthidden
+               $this->assertTrue( $item['userhidden'], 'userhidden' );
+               $this->assertFalse( $item['commenthidden'], 'commenthidden' );
+               $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
        }
 }
index 7e1f9d8..6b299c9 100644 (file)
@@ -3,6 +3,8 @@
 abstract class ApiTestCase extends MediaWikiLangTestCase {
        protected static $apiUrl;
 
+       protected static $errorFormatter = null;
+
        /**
         * @var ApiTestContext
         */
@@ -196,6 +198,26 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                return $data[0]['tokens'];
        }
 
+       protected static function getErrorFormatter() {
+               if ( self::$errorFormatter === null ) {
+                       self::$errorFormatter = new ApiErrorFormatter(
+                               new ApiResult( false ),
+                               Language::factory( 'en' ),
+                               'none'
+                       );
+               }
+               return self::$errorFormatter;
+       }
+
+       public static function apiExceptionHasCode( ApiUsageException $ex, $code ) {
+               return (bool)array_filter(
+                       self::getErrorFormatter()->arrayFromStatus( $ex->getStatusValue() ),
+                       function ( $e ) use ( $code ) {
+                               return is_array( $e ) && $e['code'] === $code;
+                       }
+               );
+       }
+
        public function testApiTestGroup() {
                $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
                $constraint = PHPUnit_Framework_Assert::logicalOr(
index b63bf2e..971b63c 100644 (file)
@@ -14,7 +14,7 @@ class ApiUnblockTest extends ApiTestCase {
        }
 
        /**
-        * @expectedException UsageException
+        * @expectedException ApiUsageException
         */
        public function testWithNoToken() {
                $this->doApiRequest(
index de2b56b..9b79e6c 100644 (file)
@@ -67,9 +67,9 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->doApiRequest( [
                                'action' => 'upload'
                        ] );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
-                       $this->assertEquals( "The token parameter must be set", $e->getMessage() );
+                       $this->assertEquals( 'The "token" parameter must be set', $e->getMessage() );
                }
                $this->assertTrue( $exception, "Got exception" );
        }
@@ -83,7 +83,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->doApiRequestWithToken( [
                                'action' => 'upload',
                        ], $session, self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "One of the parameters filekey, file, url is required",
                                $e->getMessage() );
@@ -129,7 +129,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -168,7 +168,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $exception = false;
                try {
                        $this->doApiRequestWithToken( $params, $session, self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $this->assertContains( 'The file you submitted was empty', $e->getMessage() );
                        $exception = true;
                }
@@ -218,7 +218,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -235,7 +235,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -289,7 +289,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -314,7 +314,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
@@ -371,7 +371,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertFalse( $exception );
@@ -400,12 +400,12 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception, "No UsageException exception." );
+               $this->assertFalse( $exception, "No ApiUsageException exception." );
 
                // clean up
                $this->deleteFileByFileName( $fileName );
@@ -476,7 +476,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                                try {
                                        list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                                self::$users['uploader']->getUser() );
-                               } catch ( UsageException $e ) {
+                               } catch ( ApiUsageException $e ) {
                                        $this->markTestIncomplete( $e->getMessage() );
                                }
                                // Make sure we got a valid chunk continue:
@@ -504,7 +504,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        try {
                                list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                        self::$users['uploader']->getUser() );
-                       } catch ( UsageException $e ) {
+                       } catch ( ApiUsageException $e ) {
                                $this->markTestIncomplete( $e->getMessage() );
                        }
                        // Make sure we got a valid chunk continue:
@@ -544,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                try {
                        list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->getUser() );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                }
                $this->assertTrue( isset( $result['upload'] ) );
index 19afc14..7b91094 100644 (file)
@@ -16,8 +16,6 @@ class ApiWatchTest extends ApiTestCase {
                return $this->getTokenList( self::$users['sysop'] );
        }
 
-       /**
-        */
        public function testWatchEdit() {
                $tokens = $this->getTokens();
 
@@ -74,8 +72,6 @@ class ApiWatchTest extends ApiTestCase {
                return $data;
        }
 
-       /**
-        */
        public function testWatchProtect() {
                $tokens = $this->getTokens();
 
@@ -92,8 +88,6 @@ class ApiWatchTest extends ApiTestCase {
                $this->assertArrayHasKey( 'edit', $data[0]['protect']['protections'][0] );
        }
 
-       /**
-        */
        public function testGetRollbackToken() {
                $this->getTokens();
 
@@ -146,11 +140,11 @@ class ApiWatchTest extends ApiTestCase {
 
                        $this->assertArrayHasKey( 'rollback', $data[0] );
                        $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
-               } catch ( UsageException $ue ) {
-                       if ( $ue->getCodeString() == 'onlyauthor' ) {
+               } catch ( ApiUsageException $ue ) {
+                       if ( self::apiExceptionHasCode( $ue, 'onlyauthor' ) ) {
                                $this->markTestIncomplete( "Only one author to 'Help:UTPage', cannot test rollback" );
                        } else {
-                               $this->fail( "Received error '" . $ue->getCodeString() . "'" );
+                               $this->fail( "Received error '" . $ue->getMessage() . "'" );
                        }
                }
        }
index d7db538..1407c10 100644 (file)
@@ -9,7 +9,11 @@ class MockApi extends ApiBase {
        public function __construct() {
        }
 
-       public function setWarning( $warning ) {
+       public function getModulePath() {
+               return $this->getModuleName();
+       }
+
+       public function addWarning( $warning, $code = null, $data = null ) {
                $this->warnings[] = $warning;
        }
 
index f5b50e5..9915a38 100644 (file)
@@ -12,4 +12,8 @@ class MockApiQueryBase extends ApiQueryBase {
        public function getModuleName() {
                return $this->name;
        }
+
+       public function getModulePath() {
+               return 'query+' . $this->getModuleName();
+       }
 }
index 0028bbb..3aa1db3 100644 (file)
@@ -133,12 +133,10 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                        $printer->closePrinter();
                        ob_end_clean();
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( UsageException $ex ) {
+               } catch ( ApiUsageException $ex ) {
                        ob_end_clean();
-                       $this->assertSame(
-                               'This response cannot be represented using format=php. ' .
-                                       'See https://phabricator.wikimedia.org/T68776',
-                               $ex->getMessage(),
+                       $this->assertTrue(
+                               $ex->getStatusValue()->hasMessage( 'apierror-formatphp' ),
                                'Expected exception'
                        );
                }
index 3fef0b0..0f8c8ee 100644 (file)
@@ -105,11 +105,11 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
                                [ 'includexmlnamespace' => 1 ] ],
 
                        // xslt param
-                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified</xml></warnings></api>',
+                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Invalid or non-existent stylesheet specified.</xml></warnings></api>',
                                [ 'xslt' => 'DoesNotExist' ] ],
                        [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should be in the MediaWiki namespace.</xml></warnings></api>',
                                [ 'xslt' => 'ApiFormatXmlTest' ] ],
-                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have .xsl extension.</xml></warnings></api>',
+                       [ [], '<?xml version="1.0"?><api><warnings><xml xml:space="preserve">Stylesheet should have &quot;.xsl&quot; extension.</xml></warnings></api>',
                                [ 'xslt' => 'MediaWiki:ApiFormatXmlTest' ] ],
                        [ [],
                                '<?xml version="1.0"?><?xml-stylesheet href="' .
index 8cb2327..8026e54 100644 (file)
@@ -99,11 +99,11 @@ class ApiQueryTest extends ApiTestCase {
                $exceptionCaught = false;
                try {
                        $this->assertEquals( $expected, $api->titlePartToKey( $titlePart, $namespace ) );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exceptionCaught = true;
                }
                $this->assertEquals( $expectException, $exceptionCaught,
-                       'UsageException thrown by titlePartToKey' );
+                       'ApiUsageException thrown by titlePartToKey' );
        }
 
        function provideTestTitlePartToKey() {
@@ -123,21 +123,16 @@ class ApiQueryTest extends ApiTestCase {
         * Test if all classes in the query module manager exists
         */
        public function testClassNamesInModuleManager() {
-               global $wgAutoloadLocalClasses, $wgAutoloadClasses;
-
-               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-               $classes = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-
                $api = new ApiMain(
                        new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] )
                );
                $queryApi = new ApiQuery( $api, 'query' );
                $modules = $queryApi->getModuleManager()->getNamesWithClasses();
+
                foreach ( $modules as $name => $class ) {
-                       $this->assertArrayHasKey(
-                               $class,
-                               $classes,
-                               'Class ' . $class . ' for api module ' . $name . ' not in autoloader (with exact case)'
+                       $this->assertTrue(
+                               class_exists( $class ),
+                               'Class ' . $class . ' for api module ' . $name . ' does not exist (with exact case)'
                        );
                }
        }
index 39948ca..91d2297 100644 (file)
@@ -367,22 +367,6 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertFalse( $handler->supportsDirectEditing(), 'direct editing is not supported' );
        }
 
-       /**
-        * @covers ContentHandler::runLegacyHooks
-        */
-       public function testRunLegacyHooks() {
-               Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
-
-               $content = new WikitextContent( 'test text' );
-               $ok = ContentHandler::runLegacyHooks(
-                       'testRunLegacyHooks',
-                       [ 'foo', &$content, 'bar' ]
-               );
-
-               $this->assertTrue( $ok, "runLegacyHooks should have returned true" );
-               $this->assertEquals( "TEST TEXT", $content->getNativeData() );
-       }
-
        public static function dummyHookHandler( $foo, &$text, $bar ) {
                if ( $text === null || $text === false ) {
                        return false;
index dbb126f..81b75de 100644 (file)
@@ -170,7 +170,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
        }
 
        function getMockForViews() {
-               $db = $this->getMockBuilder( 'DatabaseMysql' )
+               $db = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->setMethods( [ 'fetchRow', 'query' ] )
                        ->getMock();
@@ -314,7 +314,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
         * @dataProvider provideLagAmounts
         */
        function testPtHeartbeat( $lag ) {
-               $db = $this->getMockBuilder( 'DatabaseMysql' )
+               $db = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->setMethods( [
                                'getLagDetectionMethod', 'getHeartbeatData', 'getMasterServerInfo' ] )
index d8773f8..573b395 100644 (file)
@@ -29,7 +29,7 @@ class LBFactoryTest extends MediaWikiTestCase {
         * @dataProvider getLBFactoryClassProvider
         */
        public function testGetLBFactoryClass( $expected, $deprecated ) {
-               $mockDB = $this->getMockBuilder( 'DatabaseMysql' )
+               $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
@@ -178,7 +178,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $mPos = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
 
                $now = microtime( true );
-               $mockDB = $this->getMockBuilder( 'DatabaseMysql' )
+               $mockDB = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mockDB->method( 'writesOrCallbacksPending' )->willReturn( true );
index 8366541..6c93c79 100644 (file)
@@ -112,7 +112,8 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
        }
 
        protected function getMocks() {
-               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
+                       ->disableOriginalClone()
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 92a54fa..d3f9374 100644 (file)
@@ -25,7 +25,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        ]
                ] );
 
-               $dbMock = $this->getMockBuilder( 'DatabaseMysql' )
+               $dbMock = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
index 4dc8fec..337c65c 100644 (file)
@@ -15,7 +15,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                global $wgFileBackends;
                parent::setUp();
 
-               # Forge a FSRepo object to not have to rely on local wiki settings
+               # Forge a FileRepo object to not have to rely on local wiki settings
                $tmpPrefix = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        $name = $this->getCliArg( 'use-filebackend' );
@@ -63,7 +63,7 @@ class StoreBatchTest extends MediaWikiTestCase {
         * @param string $originalName The title of the image
         * @param string $srcPath The filepath or virtual URL
         * @param int $flags Flags to pass into repo::store().
-        * @return FileRepoStatus
+        * @return Status
         */
        private function storeit( $originalName, $srcPath, $flags ) {
                $hashPath = $this->repo->getHashPath( $originalName );
index 137dfb7..b1ad77a 100644 (file)
@@ -82,31 +82,32 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( false );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
                $this->assertEquals(
                        [ $dewiki ],
-                       Interwiki::getAllPrefixes( true ),
+                       $interwikiLookup->getAllPrefixes( true ),
                        'getAllPrefixes()'
                );
                $this->assertEquals(
                        [ $zzwiki ],
-                       Interwiki::getAllPrefixes( false ),
+                       $interwikiLookup->getAllPrefixes( false ),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertFalse( $interwikiLookup->isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
 
-               $this->assertNull( Interwiki::fetch( null ), 'no prefix' );
-               $this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
+               $this->assertNull( $interwikiLookup->fetch( null ), 'no prefix' );
+               $this->assertFalse( $interwikiLookup->fetch( 'xyz' ), 'unknown prefix' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
-               $this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
+               $this->assertSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'in-process caching' );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
@@ -115,7 +116,7 @@ class InterwikiTest extends MediaWikiTestCase {
                $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
 
                Interwiki::invalidateCache( 'de' );
-               $this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
+               $this->assertNotSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'invalidate cache' );
        }
 
        /**
@@ -190,22 +191,23 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( $cdbFile );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
-               $interwiki = Interwiki::fetch( 'zz' );
+               $interwiki = $interwikiLookup->fetch( 'zz' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
@@ -236,22 +238,23 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->setWgInterwikiCache( $cdbData );
 
+               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
-                       Interwiki::getAllPrefixes(),
+                       $interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
 
-               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
 
-               $interwiki = Interwiki::fetch( 'de' );
+               $interwiki = $interwikiLookup->fetch( 'de' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
                $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
 
-               $interwiki = Interwiki::fetch( 'zz' );
+               $interwiki = $interwikiLookup->fetch( 'zz' );
                $this->assertInstanceOf( 'Interwiki', $interwiki );
 
                $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
index 85927a3..53a36c5 100644 (file)
@@ -59,4 +59,14 @@ class MimeMagicTest extends PHPUnit_Framework_TestCase {
                $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
                $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
        }
+
+       /**
+        * Test to make sure that Opus audio files don't trigger
+        * MEDIATYPE_MULTIMEDIA (bug T151352)
+        */
+       function testOpusRecognize() {
+               $oggFile = __DIR__ . '/../../../data/media/say-test.opus';
+               $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
+               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
+       }
 }
index e854ab5..196f688 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 /**
- * Specificly for testing Media handlers. Sets up a FSFile backend
+ * Specificly for testing Media handlers. Sets up a FileRepo backend
  */
 abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
 
-       /** @var FSRepo */
+       /** @var FileRepo */
        protected $repo;
        /** @var FSFileBackend */
        protected $backend;
@@ -19,7 +19,7 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
                if ( $this->createsThumbnails() ) {
                        // We need a temp directory for the thumbnails
                        // the container is named 'temp-thumb' because it is the
-                       // thumb directory for a FSRepo named "temp".
+                       // thumb directory for a repo named "temp".
                        $containers['temp-thumb'] = $this->getNewTempDirectory();
                }
 
@@ -29,11 +29,11 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
                        'containerPaths' => $containers,
                        'tmpDirectory' => $this->getNewTempDirectory()
                ] );
-               $this->repo = new FSRepo( $this->getRepoOptions() );
+               $this->repo = new FileRepo( $this->getRepoOptions() );
        }
 
        /**
-        * @return array Argument for FSRepo constructor
+        * @return array Argument for FileRepo constructor
         */
        protected function getRepoOptions() {
                return [
index 49d9fd2..e778270 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  * @group medium
- **/
+ */
 class WikiPageTest extends MediaWikiLangTestCase {
 
        protected $pages_to_delete;
@@ -155,67 +155,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
-       /**
-        * @covers WikiPage::doEdit
-        * @deprecated since 1.21. Should be removed when WikiPage::doEdit() gets removed
-        */
-       public function testDoEdit() {
-               $this->hideDeprecated( "WikiPage::doEdit" );
-               $this->hideDeprecated( "WikiPage::getText" );
-               $this->hideDeprecated( "Revision::getText" );
-
-               // NOTE: assume help namespace will default to wikitext
-               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
-
-               $page = $this->newPage( $title );
-
-               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
-
-               $page->doEdit( $text, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
-
-               $page->doEdit( $text, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
        /**
         * @covers WikiPage::doDeleteArticle
         */
@@ -242,10 +181,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $page->getContent(),
                        "WikiPage::getContent should return null after page was deleted"
                );
-               $this->assertFalse(
-                       $page->getText(),
-                       "WikiPage::getText should return false after page was deleted"
-               );
 
                $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
                $this->assertFalse(
@@ -332,24 +267,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( "some text", $content->getNativeData() );
        }
 
-       /**
-        * @covers WikiPage::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( "WikiPage::getText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetText" );
-
-               $text = $page->getText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getText();
-               $this->assertEquals( "some text", $text );
-       }
-
        /**
         * @covers WikiPage::getContentModel
         */
index fc5d660..eb163d3 100644 (file)
@@ -66,4 +66,3 @@ class ReverseChronologicalPagerTest extends MediaWikiLangTestCase {
                }
        }
 }
-
diff --git a/tests/phpunit/includes/registration/CoreVersionCheckerTest.php b/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
deleted file mode 100644 (file)
index 1dfcd82..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @covers CoreVersionChecker
- */
-class CoreVersionCheckerTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @dataProvider provideCheck
-        */
-       public function testCheck( $coreVersion, $constraint, $expected ) {
-               $checker = new CoreVersionChecker( $coreVersion );
-               $this->assertEquals( $expected, $checker->check( $constraint ) );
-       }
-
-       public static function provideCheck() {
-               return [
-                       // [ $wgVersion, constraint, expected ]
-                       [ '1.25alpha', '>= 1.26', false ],
-                       [ '1.25.0', '>= 1.26', false ],
-                       [ '1.26alpha', '>= 1.26', true ],
-                       [ '1.26alpha', '>= 1.26.0', true ],
-                       [ '1.26alpha', '>= 1.26.0-stable', false ],
-                       [ '1.26.0', '>= 1.26.0-stable', true ],
-                       [ '1.26.1', '>= 1.26.0-stable', true ],
-                       [ '1.27.1', '>= 1.26.0-stable', true ],
-                       [ '1.26alpha', '>= 1.26.1', false ],
-                       [ '1.26alpha', '>= 1.26alpha', true ],
-                       [ '1.26alpha', '>= 1.25', true ],
-                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
-                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
-                       [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
-                       [ '1.26.1', '^1.26.2', false ],
-                       // Accept anything for un-parsable version strings
-                       [ '1.26mwf14', '== 1.25alpha', true ],
-                       [ 'totallyinvalid', '== 1.0', true ],
-               ];
-       }
-}
index 11995de..71f760d 100644 (file)
@@ -450,8 +450,9 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $globalSettings = TestingAccessWrapper::newFromClass(
                        ExtensionProcessor::class )->globalSettings;
 
+               $version = ExtensionRegistry::MANIFEST_VERSION;
                $schema = FormatJson::decode(
-                       file_get_contents( "$IP/docs/extension.schema.json" ),
+                       file_get_contents( "$IP/docs/extension.schema.v$version.json" ),
                        true
                );
                $missing = [];
diff --git a/tests/phpunit/includes/registration/VersionCheckerTest.php b/tests/phpunit/includes/registration/VersionCheckerTest.php
new file mode 100644 (file)
index 0000000..9ee5881
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * @covers VersionChecker
+ */
+class VersionCheckerTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @dataProvider provideCheck
+        */
+       public function testCheck( $coreVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( $coreVersion );
+               $this->assertEquals( $expected, !(bool)$checker->checkArray( [
+                       'FakeExtension' => [
+                               'MediaWiki' => $constraint,
+                       ],
+               ] )
+               );
+       }
+
+       public static function provideCheck() {
+               return [
+                       // [ $wgVersion, constraint, expected ]
+                       [ '1.25alpha', '>= 1.26', false ],
+                       [ '1.25.0', '>= 1.26', false ],
+                       [ '1.26alpha', '>= 1.26', true ],
+                       [ '1.26alpha', '>= 1.26.0', true ],
+                       [ '1.26alpha', '>= 1.26.0-stable', false ],
+                       [ '1.26.0', '>= 1.26.0-stable', true ],
+                       [ '1.26.1', '>= 1.26.0-stable', true ],
+                       [ '1.27.1', '>= 1.26.0-stable', true ],
+                       [ '1.26alpha', '>= 1.26.1', false ],
+                       [ '1.26alpha', '>= 1.26alpha', true ],
+                       [ '1.26alpha', '>= 1.25', true ],
+                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
+                       [ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
+                       [ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
+                       [ '1.26.1', '^1.26.2', false ],
+                       // Accept anything for un-parsable version strings
+                       [ '1.26mwf14', '== 1.25alpha', true ],
+                       [ 'totallyinvalid', '== 1.0', true ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideType
+        */
+       public function testType( $given, $expected ) {
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => '1.0.0',
+                               ],
+                       ] );
+               $this->assertEquals( $expected, $checker->checkArray( [
+                       'FakeExtension' => $given,
+               ] )
+               );
+       }
+
+       public static function provideType() {
+               return [
+                       // valid type
+                       [
+                               [
+                                       'extensions' => [
+                                               'FakeDependency' => '1.0.0'
+                                       ]
+                               ],
+                               []
+                       ],
+                       [
+                               [
+                                       'MediaWiki' => '1.0.0'
+                               ],
+                               []
+                       ],
+               ];
+       }
+
+       /**
+        * Check, if a non-parsable version constraint does not throw an exception or
+        * returns any error message.
+        */
+       public function testInvalidConstraint() {
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => 'not really valid',
+                               ],
+                       ] );
+               $this->assertEquals( [ "FakeDependency does not have a valid version string." ],
+                       $checker->checkArray( [
+                               'FakeExtension' => [
+                                       'extensions' => [
+                                               'FakeDependency' => '1.24.3',
+                                       ],
+                               ],
+                       ] )
+               );
+
+               $checker = new VersionChecker( '1.0.0' );
+               $checker
+                       ->setLoadedExtensionsAndSkins( [
+                               'FakeDependency' => [
+                                       'version' => '1.24.3',
+                               ],
+                       ] );
+
+               $this->setExpectedException( 'UnexpectedValueException' );
+               $checker->checkArray( [
+                       'FakeExtension' => [
+                               'FakeDependency' => 'not really valid',
+                       ]
+               ] );
+       }
+}
index baf0b69..b658efb 100644 (file)
@@ -14,6 +14,7 @@ class ResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
                        'ResourceLoaderDebug' => false,
                        'DefaultSkin' => 'fallback',
                        'LanguageCode' => 'nl',
+                       'LoadScript' => '/w/load.php',
                ] ) );
        }
 
index 1ecdf21..cde1e5a 100644 (file)
@@ -14,6 +14,10 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                                'Foo' => '#eeeeee',
                                'bar' => 5,
                        ],
+                       // Clear ResourceLoaderGetConfigVars hooks (called by StartupModule)
+                       // to avoid notices during testMakeModuleResponse for missing
+                       // wgResourceLoaderLESSVars keys in extension hooks.
+                       'wgHooks' => [],
                ] );
        }
 
@@ -441,4 +445,135 @@ mw.example();
                        $this->assertTrue( true );
                }
        }
+
+       protected function getFailFerryMock() {
+               $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
+                       ->setMethods( [ 'getScript' ] )
+                       ->getMock();
+               $mock->method( 'getScript' )->will( $this->throwException(
+                       new Exception( 'Ferry not found' )
+               ) );
+               return $mock;
+       }
+
+       protected function getSimpleModuleMock( $script = '' ) {
+               $mock = $this->getMockBuilder( ResourceLoaderTestModule::class )
+                       ->setMethods( [ 'getScript' ] )
+                       ->getMock();
+               $mock->method( 'getScript' )->willReturn( $script );
+               return $mock;
+       }
+
+       /**
+        * @covers ResourceLoader::getCombinedVersion
+        */
+       public function testGetCombinedVersion() {
+               $rl = new EmptyResourceLoader();
+               $rl->register( [
+                       'foo' => self::getSimpleModuleMock(),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock(),
+               ] );
+               $context = $this->getResourceLoaderContext( [], $rl );
+
+               $this->assertEquals(
+                       ResourceLoader::makeHash( self::BLANK_VERSION ),
+                       $rl->getCombinedVersion( $context, [ 'foo' ] ),
+                       'compute foo'
+               );
+
+               // Verify that getCombinedVersion() does not throw when ferry fails.
+               // Instead it gracefully continues to combine the remaining modules.
+               $this->assertEquals(
+                       ResourceLoader::makeHash( self::BLANK_VERSION . self::BLANK_VERSION ),
+                       $rl->getCombinedVersion( $context, [ 'foo', 'ferry', 'bar' ] ),
+                       'compute foo+ferry+bar (T152266)'
+               );
+       }
+
+       /**
+        * Verify that when building module content in a load.php response,
+        * an exception from one module will not break script output from
+        * other modules.
+        */
+       public function testMakeModuleResponseError() {
+               $modules = [
+                       'foo' => self::getSimpleModuleMock( 'foo();' ),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock( 'bar();' ),
+               ];
+               $rl = new EmptyResourceLoader();
+               $rl->register( $modules );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => 'foo|ferry|bar',
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $errors = $rl->getErrors();
+
+               $this->assertCount( 1, $errors );
+               $this->assertRegExp( '/Ferry not found/', $errors[0] );
+               $this->assertEquals(
+                       'foo();bar();mw.loader.state( {
+    "ferry": "error",
+    "foo": "ready",
+    "bar": "ready"
+} );',
+                       $response
+               );
+       }
+
+       /**
+        * Verify that when building the startup module response,
+        * an exception from one module class will not break the entire
+        * startup module response. See T152266.
+        */
+       public function testMakeModuleResponseStartupError() {
+               $rl = new EmptyResourceLoader();
+               $rl->register( [
+                       'foo' => self::getSimpleModuleMock( 'foo();' ),
+                       'ferry' => self::getFailFerryMock(),
+                       'bar' => self::getSimpleModuleMock( 'bar();' ),
+                       'startup' => [ 'class' => 'ResourceLoaderStartUpModule' ],
+               ] );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => 'startup',
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $this->assertEquals(
+                       [ 'foo', 'ferry', 'bar', 'startup' ],
+                       $rl->getModuleNames(),
+                       'getModuleNames'
+               );
+
+               $modules = [ 'startup' => $rl->getModule( 'startup' ) ];
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $errors = $rl->getErrors();
+
+               $this->assertRegExp( '/Ferry not found/', $errors[0] );
+               $this->assertCount( 1, $errors );
+               $this->assertRegExp(
+                       '/isCompatible.*function startUp/s',
+                       $response,
+                       'startup response undisrupted (T152266)'
+               );
+               $this->assertRegExp(
+                       '/register\([^)]+"ferry",\s*""/s',
+                       $response,
+                       'startup response registers broken module'
+               );
+               $this->assertRegExp(
+                       '/state\([^)]+"ferry":\s*"error"/s',
+                       $response,
+                       'startup response sets state to error'
+               );
+       }
 }
index 6273f47..50394f4 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace MediaWiki\Session;
 
-use AuthPlugin;
 use MediaWikiTestCase;
 use Psr\Log\LogLevel;
 use User;
index edb8f9f..7e37907 100644 (file)
@@ -148,6 +148,11 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $sites->count() );
        }
 
+       /**
+        * @param Site[] $sites
+        *
+        * @return SiteStore
+        */
        private function getHashSiteStore( array $sites ) {
                $siteStore = new HashSiteStore();
                $siteStore->saveSites( $sites );
index c1083af..1208a20 100644 (file)
  */
 class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
+       /**
+        * @var SpecialPage[]
+        */
+       private $queryPages;
+
        /** List query pages that can not be tested automatically */
        protected $manualTest = [
                'LinkSearchPage'
@@ -36,8 +41,9 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 
                foreach ( QueryPage::getPages() as $page ) {
                        $class = $page[0];
+                       $name = $page[1];
                        if ( !in_array( $class, $this->manualTest ) ) {
-                               $this->queryPages[$class] = new $class;
+                               $this->queryPages[$class] = SpecialPageFactory::getPage( $name );
                        }
                }
        }
index cd84d79..ab3ac55 100644 (file)
@@ -33,7 +33,7 @@ class SpecialEditWatchlistTest extends SpecialPageTestBase {
                $user = new TestUser( __METHOD__ );
                list( $html, ) = $this->executeSpecialPage( 'clear', null, 'qqx', $user->getUser() );
                $this->assertRegExp(
-                       '/<form action=".*?Special:EditWatchlist\/clear" method="post" class="visualClear">/',
+                       '/<form class="mw-htmlform" action=".*?Special:EditWatchlist\/clear" method="post">/',
                        $html
                );
        }
index c51217c..ab92aee 100644 (file)
@@ -48,12 +48,24 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $expected,
-                       $queryConditions,
+                       self::normalizeCondition( $expected ),
+                       self::normalizeCondition( $queryConditions ),
                        $message
                );
        }
 
+       private static function normalizeCondition( $conds ) {
+               $normalized = array_map(
+                       function ( $k, $v ) {
+                               return is_numeric( $k ) ? $v : "$k = $v";
+                       },
+                       array_keys( $conds ),
+                       $conds
+               );
+               sort( $normalized );
+               return $normalized;
+       }
+
        /** return false if condition begin with 'rc_timestamp ' */
        private static function filterOutRcTimestampCondition( $var ) {
                return ( false === strpos( $var, 'rc_timestamp ' ) );
@@ -63,8 +75,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => "rc_namespace = '0'",
+                               "rc_type != '6'",
+                               "rc_namespace = '0'",
                        ],
                        [
                                'namespace' => NS_MAIN,
@@ -77,8 +89,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
+                               "rc_type != '6'",
+                               "rc_namespace != '0'",
                        ],
                        [
                                'namespace' => NS_MAIN,
@@ -96,8 +108,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
+                               "rc_type != '6'",
+                               "(rc_namespace = '$ns1' OR rc_namespace = '$ns2')",
                        ],
                        [
                                'namespace' => $ns1,
@@ -115,8 +127,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_type != '6'",
-                               1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
+                               "rc_type != '6'",
+                               "(rc_namespace != '$ns1' AND rc_namespace != '$ns2')",
                        ],
                        [
                                'namespace' => $ns1,
@@ -143,8 +155,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_user != '{$user->getId()}'",
-                               1 => "rc_type != '6'",
+                               "rc_user != '{$user->getId()}'",
+                               "rc_type != '6'",
                        ],
                        [
                                'hidemyself' => 1,
@@ -157,8 +169,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_user_text != '10.11.12.13'",
-                               1 => "rc_type != '6'",
+                               "rc_user_text != '10.11.12.13'",
+                               "rc_type != '6'",
                        ],
                        [
                                'hidemyself' => 1,
@@ -173,8 +185,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_user = '{$user->getId()}'",
-                               1 => "rc_type != '6'",
+                               "rc_user = '{$user->getId()}'",
+                               "rc_type != '6'",
                        ],
                        [
                                'hidebyothers' => 1,
@@ -187,8 +199,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_user_text = '10.11.12.13'",
-                               1 => "rc_type != '6'",
+                               "rc_user_text = '10.11.12.13'",
+                               "rc_type != '6'",
                        ],
                        [
                                'hidebyothers' => 1,
@@ -203,9 +215,9 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        [ # expected
                                'rc_bot' => 0,
-                               0 => "rc_user != '{$user->getId()}'",
-                               1 => "rc_user = '{$user->getId()}'",
-                               2 => "rc_type != '6'",
+                               "rc_user != '{$user->getId()}'",
+                               "rc_user = '{$user->getId()}'",
+                               "rc_type != '6'",
                        ],
                        [
                                'hidemyself' => 1,
@@ -215,4 +227,302 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                        $user
                );
        }
+
+       public function testRcHidepageedits() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '0'",
+                       ],
+                       [
+                               'hidepageedits' => 1,
+                       ],
+                       "rc conditions: hidepageedits=1"
+               );
+       }
+
+       public function testRcHidenewpages() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '1'",
+                       ],
+                       [
+                               'hidenewpages' => 1,
+                       ],
+                       "rc conditions: hidenewpages=1"
+               );
+       }
+
+       public function testRcHidelog() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                               "rc_type != '3'",
+                       ],
+                       [
+                               'hidelog' => 1,
+                       ],
+                       "rc conditions: hidelog=1"
+               );
+       }
+
+       public function testRcHidehumans() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 1,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidebots' => 0,
+                               'hidehumans' => 1,
+                       ],
+                       "rc conditions: hidebots=0 hidehumans=1"
+               );
+       }
+
+       public function testRcHidepatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+       public function testRcHidepatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 0",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideminorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_minor = 0",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hideminor' => 1,
+                       ],
+                       "rc conditions: hideminor=1"
+               );
+       }
+
+       public function testRcHidemajorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_minor = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidemajor' => 1,
+                       ],
+                       "rc conditions: hidemajor=1"
+               );
+       }
+
+       // This is probably going to change when we do auto-fix of
+       // filters combinations that don't make sense but for now
+       // it's the behavior therefore it's the test.
+       public function testRcHidepatrolledHideunpatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               "rc_patrolled = 0",
+                               "rc_patrolled = 1",
+                               "rc_type != '6'",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1 hideunpatrolled=1",
+                       $user
+               );
+       }
+
+       public function testFilterUserExpLevel() {
+               $this->setMwGlobals( [
+                       'wgLearnerEdits' => 10,
+                       'wgLearnerMemberSince' => 4,
+                       'wgExperiencedUserEdits' => 500,
+                       'wgExperiencedUserMemberSince' => 30,
+               ] );
+
+               $this->createUsers( [
+                       'Newcomer1' => [ 'edits' => 2, 'days' => 2 ],
+                       'Newcomer2' => [ 'edits' => 12, 'days' => 3 ],
+                       'Newcomer3' => [ 'edits' => 8, 'days' => 5 ],
+                       'Learner1' => [ 'edits' => 15, 'days' => 10 ],
+                       'Learner2' => [ 'edits' => 450, 'days' => 20 ],
+                       'Learner3' => [ 'edits' => 460, 'days' => 33 ],
+                       'Learner4' => [ 'edits' => 525, 'days' => 28 ],
+                       'Experienced1' => [ 'edits' => 538, 'days' => 33 ],
+               ] );
+
+               // newcomers only
+               $this->assertArrayEquals(
+                       [ 'Newcomer1', 'Newcomer2', 'Newcomer3' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer' ] )
+               );
+
+               // newcomers and learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,learner' ] )
+               );
+
+               // newcomers and more learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,experienced' ] )
+               );
+
+               // learner only
+               $this->assertArrayEquals(
+                       [ 'Learner1', 'Learner2', 'Learner3', 'Learner4' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'learner' ] )
+               );
+
+               // more experienced only
+               $this->assertArrayEquals(
+                       [ 'Experienced1' ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'experienced' ] )
+               );
+
+               // learner and more experienced
+               $this->assertArrayEquals(
+                       [
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'learner,experienced' ] )
+               );
+
+               // newcomers, learner, and more experienced
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'newcomer,learner,experienced' ] )
+               );
+
+               // 'all'
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'userExpLevel' => 'all' ] )
+               );
+       }
+
+       private function createUsers( $specs ) {
+               $dbw = wfGetDB( DB_MASTER );
+               foreach ( $specs as $name => $spec ) {
+                       User::createNew(
+                               $name,
+                               [
+                                       'editcount' => $spec['edits'],
+                                       'registration' => $dbw->timestamp( $this->daysAgo( $spec['days'] ) ),
+                                       'email' => 'ut',
+                               ]
+                       );
+               }
+       }
+
+       private function fetchUsers( $filters ) {
+               $specialRC = new SpecialRecentChanges();
+
+               $tables = [];
+               $conds = [];
+               $join_conds = [];
+
+               $specialRC->filterOnUserExperienceLevel(
+                       $tables,
+                       $conds,
+                       $join_conds,
+                       $filters
+               );
+
+               $result = wfGetDB( DB_MASTER )->select(
+                       'user',
+                       'user_name',
+                       array_filter( $conds ) + [ 'user_email' => 'ut' ]
+               );
+
+               $usernames = [];
+               foreach ( $result as $row ) {
+                       $usernames[] = $row->user_name;
+               }
+
+               return $usernames;
+       }
+
+       private function daysAgo( $days ) {
+               $secondsPerDay = 86400;
+               return time() - $days * $secondsPerDay;
+       }
 }
index 3fa8a9f..e9cf6a3 100644 (file)
@@ -121,13 +121,15 @@ class SpecialSearchTest extends MediaWikiTestCase {
                ] );
 
                # Initialize [[Special::Search]]
+               $ctx = new RequestContext();
+               $term = '{{SITENAME}}';
+               $ctx->setRequest( new FauxRequest( [ 'search' => $term, 'fulltext' => 1 ] ) );
+               $ctx->setTitle( Title::newFromText( 'Special:Search' ) );
                $search = new SpecialSearch();
-               $search->getContext()->setTitle( Title::newFromText( 'Special:Search' ) );
-               $search->load();
+               $search->setContext( $ctx );
 
                # Simulate a user searching for a given term
-               $term = '{{SITENAME}}';
-               $search->showResults( $term );
+               $search->execute( '' );
 
                # Lookup the HTML page title set for that page
                $pageTitle = $search
diff --git a/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php b/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php
new file mode 100644 (file)
index 0000000..64e78f2
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Tests for Special:Uncategorizedcategories
+ */
+class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideTestGetQueryInfoData
+        */
+       public function testGetQueryInfo( $msgContent, $expected ) {
+               $msg = new RawMessage( $msgContent );
+               $mockContext = $this->getMockBuilder( 'RequestContext' )->getMock();
+               $mockContext->method( 'msg' )->willReturn( $msg );
+               $special = new UncategorizedCategoriesPage();
+               $special->setContext( $mockContext );
+               $this->assertEquals( [
+                       'tables' => [
+                               0 => 'page',
+                               1 => 'categorylinks',
+                       ],
+                       'fields' => [
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title',
+                       ],
+                       'conds' => [
+                               0 => 'cl_from IS NULL',
+                               'page_namespace' => 14,
+                               'page_is_redirect' => 0,
+                       ] + $expected,
+                       'join_conds' => [
+                               'categorylinks' => [
+                                       0 => 'LEFT JOIN',
+                                       1 => 'cl_from = page_id',
+                               ],
+                       ],
+               ], $special->getQueryInfo() );
+       }
+
+       public function provideTestGetQueryInfoData() {
+               return [
+                       [
+                               "* Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Stubs','Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "* StubsTest\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'StubsTest','*','*_test123' )" ]
+                       ],
+                       [ "", [] ],
+                       [ "\n\n\n", [] ],
+                       [ "\n", [] ],
+                       [ "Test\n*Test2", [ 1 => "page_title not in ( 'Test2' )" ] ],
+                       [ "Test", [] ],
+                       [ "*Test\nTest2", [ 1 => "page_title not in ( 'Test' )" ] ],
+                       [ "Test\nTest2", [] ],
+               ];
+       }
+}
index f69ecaf..d93181c 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class BalancerTest extends MediaWikiTestCase {
-       private $balancer;
 
        /**
         * Anything that needs to happen before your tests should go here.
@@ -11,20 +10,20 @@ class BalancerTest extends MediaWikiTestCase {
                // This makes sure that all the various cleanup and restorations
                // happen as they should (including the restoration for setMwGlobals).
                parent::setUp();
-               $this->balancer = new MediaWiki\Tidy\Balancer( [
-                       'strict' => false, /* not strict */
-                       'allowedHtmlElements' => null, /* no sanitization */
-                       'tidyCompat' => false, /* standard parser */
-                       'allowComments' => true, /* comment parsing */
-               ] );
        }
 
        /**
         * @covers MediaWiki\Tidy\Balancer::balance
         * @dataProvider provideBalancerTests
         */
-       public function testBalancer( $description, $input, $expected ) {
-               $output = $this->balancer->balance( $input );
+       public function testBalancer( $description, $input, $expected, $useTidy ) {
+               $balancer = new MediaWiki\Tidy\Balancer( [
+                       'strict' => false, /* not strict */
+                       'allowedHtmlElements' => null, /* no sanitization */
+                       'tidyCompat' => $useTidy, /* standard parser */
+                       'allowComments' => true, /* comment parsing */
+               ] );
+               $output = $balancer->balance( $input );
 
                // Ignore self-closing tags
                $output = preg_replace( '/\s*\/>/', '>', $output );
@@ -86,7 +85,7 @@ class BalancerTest extends MediaWikiTestCase {
                                        // Skip tests involving unusual doctypes.
                                        continue;
                                }
-                               $literalre = "~ <rdar: | <isindex | < /? (
+                               $literalre = "~ <rdar: | < /? (
                                        html | head | body | frame | frameset | plaintext
                                ) > ~xi";
                                if ( preg_match( $literalre, $case['data'] ) ) {
@@ -146,10 +145,20 @@ class BalancerTest extends MediaWikiTestCase {
                                $tests[] = [
                                        $filename, # use better description?
                                        $data,
-                                       $html
+                                       $html,
+                                       false # strict HTML5 compat mode, no tidy
                                ];
                        }
                }
+
+               # Some additional tests for mediawiki-specific features
+               $tests[] = [
+                       'Round-trip serialization for <pre>/<listing>/<textarea>',
+                       "<pre>\n\na</pre><listing>\n\nb</listing><textarea>\n\nc</textarea>",
+                       "<pre>\n\na</pre><listing>\n\nb</listing><textarea>\n\nc</textarea>",
+                       true # use the tidy-compatible mode
+               ];
+
                return $tests;
        }
 }
index beb3659..2b1c3e8 100644 (file)
         "html": "<html><head></head><body><p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p></body></html>",
         "noQuirksBodyHtml": "<p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p>"
       }
+    },
+    {
+      "data": "<b><em><foo><foob><fooc><aside></b></em>",
+      "errors": [
+        "(1,35): adoption-agency-1.3",
+        "(1,40): adoption-agency-1.3",
+        "(1,40): expected-closing-tag-but-got-eof"
+      ],
+      "fragment": {
+        "name": "div"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "b": true,
+            "em": true,
+            "foo": true,
+            "foob": true,
+            "fooc": true,
+            "aside": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "b",
+            "children": [
+              {
+                "tag": "em",
+                "children": [
+                  {
+                    "tag": "foo",
+                    "children": [
+                      {
+                        "tag": "foob",
+                        "children": [
+                          {
+                            "tag": "fooc"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          },
+          {
+            "tag": "aside",
+            "children": [
+              {
+                "tag": "b"
+              }
+            ]
+          }
+        ],
+        "html": "<b><em><foo><foob><fooc></fooc></foob></foo></em></b><aside><b></b></aside>",
+        "noQuirksBodyHtml": "<b><em><foo><foob><fooc></fooc></foob></foo></em></b><aside><b></b></aside>"
+      }
     }
   ],
   "adoption02.dat": [
       "data": "FOO&#11111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,16): numeric-entity-without-semicolon",
+        "(1,16): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
       "data": "FOO&#1111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,15): numeric-entity-without-semicolon",
+        "(1,15): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
       "data": "FOO&#111111111111ZOO",
       "errors": [
         "(1,3): expected-doctype-but-got-chars",
-        "(1,13): illegal-codepoint-for-numeric-entity"
+        "(1,17): numeric-entity-without-semicolon",
+        "(1,17): illegal-codepoint-for-numeric-entity"
       ],
       "document": {
         "props": {
     {
       "data": "<plaintext><foo>",
       "errors": [
-        "16: End of file seen and there were open elements.",
-        "11: Unclosed element “plaintext”."
+        "(1,16): expected-closing-tag-but-got-eof"
       ],
       "fragment": {
         "name": "desc",
       "data": "<isindex>",
       "errors": [
         "(1,9): expected-doctype-but-got-start-tag",
-        "(1,9): deprecated-tag"
+        "(1,9): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
+                    "tag": "isindex"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+        "html": "<html><head></head><body><isindex></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex></isindex>"
       }
     },
     {
       "data": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\">",
       "errors": [
         "(1,48): expected-doctype-but-got-start-tag",
-        "(1,48): deprecated-tag"
+        "(1,48): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
+                    "tag": "isindex",
                     "attrs": [
                       {
                         "name": "action",
                         "value": "B"
-                      }
-                    ],
-                    "children": [
+                      },
                       {
-                        "tag": "hr"
+                        "name": "foo",
+                        "value": "D"
                       },
                       {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "C"
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "foo",
-                                "value": "D"
-                              },
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
+                        "name": "name",
+                        "value": "A"
                       },
                       {
-                        "tag": "hr"
+                        "name": "prompt",
+                        "value": "C"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<html><head></head><body><form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form>"
+        "html": "<html><head></head><body><isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\"></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\"></isindex>"
       }
     },
     {
       "data": "<form><isindex>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,15): deprecated-tag",
         "(1,15): expected-closing-tag-but-got-eof"
       ],
       "document": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true
+            "form": true,
+            "isindex": true
           }
         },
         "tree": [
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form"
+                    "tag": "form",
+                    "children": [
+                      {
+                        "tag": "isindex"
+                      }
+                    ]
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><form></form></body></html>",
-        "noQuirksBodyHtml": "<form></form>"
+        "html": "<html><head></head><body><form><isindex></isindex></form></body></html>",
+        "noQuirksBodyHtml": "<form><isindex></isindex></form>"
+      }
+    },
+    {
+      "data": "<!doctype html><isindex>x</isindex>x",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "isindex": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "isindex",
+                    "children": [
+                      {
+                        "text": "x"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><isindex>x</isindex>x</body></html>",
+        "noQuirksBodyHtml": "<isindex>x</isindex>x"
       }
     }
   ],
       }
     },
     {
-      "data": "<!doctype html><main><p>foo</main>bar",
-      "errors": [],
+      "data": "<!doctype html><main><p>foo</main>bar",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "main": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "main",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "foo"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "text": "bar"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
+        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
+      "errors": [
+        " * (1,42) unexpected HTML-like start tag token in foreign content",
+        " * (1,42) unexpected end of file"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true,
+            "svg x": true,
+            "svg g": true,
+            "svg a": true,
+            "svg main": true,
+            "b": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "xxx"
+                  },
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "children": [
+                      {
+                        "tag": "x",
+                        "ns": "http://www.w3.org/2000/svg",
+                        "children": [
+                          {
+                            "tag": "g",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "tag": "a",
+                                "ns": "http://www.w3.org/2000/svg",
+                                "children": [
+                                  {
+                                    "tag": "main",
+                                    "ns": "http://www.w3.org/2000/svg"
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
+        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
+      }
+    }
+  ],
+  "math.dat": [
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "td"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><tr><td><mo><tr>",
+      "errors": [],
+      "fragment": {
+        "name": "tr"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tr": true,
+            "math td": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tr",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "td",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "mo",
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tr><td><mo></mo></td></tr></math>",
+        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "thead"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo><tbody>",
+      "errors": [],
+      "fragment": {
+        "name": "tfoot"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo><tfoot>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><tbody><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tbody": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tbody",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tbody><mo></mo></tbody></math>",
+        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+      }
+    },
+    {
+      "data": "<math><thead><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math thead": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "thead",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><thead><mo></mo></thead></math>",
+        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+      }
+    },
+    {
+      "data": "<math><tfoot><mo></table>",
+      "errors": [],
+      "fragment": {
+        "name": "tbody"
+      },
+      "document": {
+        "props": {
+          "tags": {
+            "math math": true,
+            "math tfoot": true,
+            "math mo": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "math",
+            "ns": "http://www.w3.org/1998/Math/MathML",
+            "children": [
+              {
+                "tag": "tfoot",
+                "ns": "http://www.w3.org/1998/Math/MathML",
+                "children": [
+                  {
+                    "tag": "mo",
+                    "ns": "http://www.w3.org/1998/Math/MathML"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<math><tfoot><mo></mo></tfoot></math>",
+        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+      }
+    }
+  ],
+  "menuitem-element.dat": [
+    {
+      "data": "<menuitem>",
+      "errors": [
+        "10: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "</menuitem>",
+      "errors": [
+        "11: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.",
+        "11: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<menuitem>B",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "B"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><menuitem>B</menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><menuitem>B</menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<menu>B</menu>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "menu": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "menu",
+                    "children": [
+                      {
+                        "text": "B"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><menu>B</menu></body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><menu>B</menu>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><menuitem>A<hr>B",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "hr": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "text": "A"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "hr"
+                  },
+                  {
+                    "text": "B"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</menuitem><hr>B</body></html>",
+        "noQuirksBodyHtml": "<menuitem>A</menuitem><hr>B"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><li><menuitem><li>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "li": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "li",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "li"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><li><menuitem></menuitem></li><li></li></body></html>",
+        "noQuirksBodyHtml": "<li><menuitem></menuitem></li><li></li>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><p></menuitem>x",
+      "errors": [
+        "39: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "p",
+                        "children": [
+                          {
+                            "text": "x"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><p>x</p></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><p>x</p></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><p><b></p><menuitem>",
+      "errors": [
+        "25: End tag “p” seen, but there were open elements.",
+        "21: Unclosed element “b”.",
+        "35: End of file seen and there were open elements."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "p": true,
+            "b": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "tag": "b"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "b",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><p><b></b></p><b><menuitem></menuitem></b></body></html>",
+        "noQuirksBodyHtml": "<p><b></b></p><b><menuitem></menuitem></b>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><asdf></menuitem>x",
+      "errors": [
+        "40: End tag “menuitem” seen, but there were open elements.",
+        "31: Unclosed element “asdf”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "asdf": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "asdf"
+                      }
+                    ]
+                  },
+                  {
+                    "text": "x"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><asdf></asdf></menuitem>x</body></html>",
+        "noQuirksBodyHtml": "<menuitem><asdf></asdf></menuitem>x"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><html></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><head></menuitem>",
+      "errors": [
+        "26: Stray end tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
+        "noQuirksBodyHtml": ""
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><select><menuitem></select>",
+      "errors": [
+        "33: Stray start tag “menuitem”."
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "select": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "select"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
+        "noQuirksBodyHtml": "<select></select>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><option><menuitem>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "option": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "option",
+                    "children": [
+                      {
+                        "tag": "menuitem"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><option><menuitem></menuitem></option></body></html>",
+        "noQuirksBodyHtml": "<option><menuitem></menuitem></option>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><option>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "option": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "option"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><option></option></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><option></option></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem></body>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem></html>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><p>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "p": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "p"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><p></p></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><p></p></menuitem>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><menuitem><li>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "menuitem": true,
+            "li": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "menuitem",
+                    "children": [
+                      {
+                        "tag": "li"
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><menuitem><li></li></menuitem></body></html>",
+        "noQuirksBodyHtml": "<menuitem><li></li></menuitem>"
+      }
+    }
+  ],
+  "namespace-sensitivity.dat": [
+    {
+      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "table": true,
+            "tbody": true,
+            "tr": true,
+            "td": true,
+            "svg svg": true,
+            "svg td": true,
+            "svg foreignObject": true,
+            "span": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "Foo"
+                  },
+                  {
+                    "tag": "table",
+                    "children": [
+                      {
+                        "tag": "tbody",
+                        "children": [
+                          {
+                            "tag": "tr",
+                            "children": [
+                              {
+                                "tag": "td",
+                                "children": [
+                                  {
+                                    "tag": "svg",
+                                    "ns": "http://www.w3.org/2000/svg",
+                                    "children": [
+                                      {
+                                        "tag": "td",
+                                        "ns": "http://www.w3.org/2000/svg",
+                                        "children": [
+                                          {
+                                            "tag": "foreignObject",
+                                            "ns": "http://www.w3.org/2000/svg",
+                                            "children": [
+                                              {
+                                                "tag": "span"
+                                              }
+                                            ]
+                                          }
+                                        ]
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
+        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
+      }
+    }
+  ],
+  "noscript01.dat": [
+    {
+      "data": "<head><noscript><!doctype html><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 31 Unexpected DOCTYPE. Ignored."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><html class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 html needs to be the first start tag."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "attrs": [
+              {
+                "name": "class",
+                "value": "foo"
+              }
+            ],
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html class=\"foo\"><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript></noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript>   </noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "no_escape": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "text": "   ",
+                        "no_escape": true
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript>   </noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript>   </noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><!--foo--></noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag"
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><basefont><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "basefont": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "tag": "basefont"
+                      },
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><basefont><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><basefont><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><bgsound><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "bgsound": true,
+            "body": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head",
+                "children": [
+                  {
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "tag": "bgsound"
+                      },
+                      {
+                        "comment": "foo"
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tag": "body"
+              }
+            ]
+          }
+        ],
+        "html": "<html><head><noscript><bgsound><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><bgsound><!--foo--></noscript>"
+      }
+    },
+    {
+      "data": "<head><noscript><link><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "main": true,
-            "p": true
+            "noscript": true,
+            "link": true,
+            "body": true
           },
-          "doctype": true
+          "comment": true
         },
         "tree": [
-          {
-            "doctype": "html"
-          },
           {
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "main",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "p",
-                        "children": [
-                          {
-                            "text": "foo"
-                          }
-                        ]
+                        "tag": "link"
+                      },
+                      {
+                        "comment": "foo"
                       }
                     ]
-                  },
-                  {
-                    "text": "bar"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
-        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
+        "html": "<html><head><noscript><link><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><link><!--foo--></noscript>"
       }
     },
     {
-      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
+      "data": "<head><noscript><meta><!--foo--></noscript>",
       "errors": [
-        " * (1,42) unexpected HTML-like start tag token in foreign content",
-        " * (1,42) unexpected end of file"
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
       ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "svg svg": true,
-            "svg x": true,
-            "svg g": true,
-            "svg a": true,
-            "svg main": true,
-            "b": true
+            "noscript": true,
+            "meta": true,
+            "body": true
           },
-          "doctype": true
+          "comment": true
         },
         "tree": [
-          {
-            "doctype": "html"
-          },
           {
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "text": "xxx"
-                  },
-                  {
-                    "tag": "svg",
-                    "ns": "http://www.w3.org/2000/svg",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "x",
-                        "ns": "http://www.w3.org/2000/svg",
-                        "children": [
-                          {
-                            "tag": "g",
-                            "ns": "http://www.w3.org/2000/svg",
-                            "children": [
-                              {
-                                "tag": "a",
-                                "ns": "http://www.w3.org/2000/svg",
-                                "children": [
-                                  {
-                                    "tag": "main",
-                                    "ns": "http://www.w3.org/2000/svg"
-                                  }
-                                ]
-                              }
-                            ]
-                          }
-                        ]
+                        "tag": "meta"
+                      },
+                      {
+                        "comment": "foo"
                       }
                     ]
-                  },
-                  {
-                    "tag": "b"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
-        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
+        "html": "<html><head><noscript><meta><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><meta><!--foo--></noscript>"
       }
-    }
-  ],
-  "math.dat": [
+    },
     {
-      "data": "<math><tr><td><mo><tr>",
-      "errors": [],
-      "fragment": {
-        "name": "td"
-      },
+      "data": "<head><noscript><noframes>XXX</noscript></noframes></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tr": true,
-            "math td": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "noframes": true,
+            "body": true
+          },
+          "no_escape": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tr",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "td",
-                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "mo",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "tag": "noframes",
+                        "children": [
+                          {
+                            "text": "XXX</noscript>",
+                            "no_escape": true
+                          }
+                        ]
                       }
                     ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tr><td><mo></mo></td></tr></math>",
-        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+        "html": "<html><head><noscript><noframes>XXX</noscript></noframes></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><noframes>XXX</noscript></noframes></noscript>"
       }
     },
     {
-      "data": "<math><tr><td><mo><tr>",
-      "errors": [],
-      "fragment": {
-        "name": "tr"
-      },
+      "data": "<head><noscript><style>XXX</style></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tr": true,
-            "math td": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "style": true,
+            "body": true
+          },
+          "no_escape": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tr",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "td",
-                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "tag": "noscript",
                     "children": [
                       {
-                        "tag": "mo",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "tag": "style",
+                        "children": [
+                          {
+                            "text": "XXX",
+                            "no_escape": true
+                          }
+                        ]
                       }
                     ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tr><td><mo></mo></td></tr></math>",
-        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
+        "html": "<html><head><noscript><style>XXX</style></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><style>XXX</style></noscript>"
       }
     },
     {
-      "data": "<math><thead><mo><tbody>",
-      "errors": [],
-      "fragment": {
-        "name": "thead"
-      },
+      "data": "<head><noscript></br><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 21 Element br not allowed in a inhead-noscript context",
+        "Line: 1 Col: 21 Unexpected end tag (br). Treated as br element.",
+        "Line: 1 Col: 42 Unexpected end tag (noscript). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math thead": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "br": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "thead",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "br"
+                  },
+                  {
+                    "comment": "foo"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><thead><mo></mo></thead></math>",
-        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+        "html": "<html><head><noscript></noscript></head><body><br><!--foo--></body></html>",
+        "noQuirksBodyHtml": "<noscript><br><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><tfoot><mo><tbody>",
-      "errors": [],
-      "fragment": {
-        "name": "tfoot"
-      },
+      "data": "<head><noscript><head class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 Unexpected start tag (head)."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tfoot": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tfoot",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tfoot><mo></mo></tfoot></math>",
-        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><tbody><mo><tfoot>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript><noscript class=\"foo\"><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 34 Unexpected start tag (noscript)."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tbody": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tbody",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tbody><mo></mo></tbody></math>",
-        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><noscript class=\"foo\"><!--foo--></noscript></noscript>"
       }
     },
     {
-      "data": "<math><tbody><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript></p><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 20 Unexpected end tag (p). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tbody": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tbody",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<math><tbody><mo></mo></tbody></math>",
-        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
+        "html": "<html><head><noscript><!--foo--></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript><p></p><!--foo--></noscript>"
       }
     },
     {
-      "data": "<math><thead><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript><p><!--foo--></noscript>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 19 Element p not allowed in a inhead-noscript context",
+        "Line: 1 Col: 40 Unexpected end tag (noscript). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math thead": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true,
+            "p": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "thead",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "p",
+                    "children": [
+                      {
+                        "comment": "foo"
+                      }
+                    ]
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><thead><mo></mo></thead></math>",
-        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
+        "html": "<html><head><noscript></noscript></head><body><p><!--foo--></p></body></html>",
+        "noQuirksBodyHtml": "<noscript><p><!--foo--></p></noscript>"
       }
     },
     {
-      "data": "<math><tfoot><mo></table>",
-      "errors": [],
-      "fragment": {
-        "name": "tbody"
-      },
+      "data": "<head><noscript>XXX<!--foo--></noscript></head>",
+      "errors": [
+        "Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.",
+        "Line: 1 Col: 19 Unexpected non-space character. Expected inhead-noscript content",
+        "Line: 1 Col: 30 Unexpected end tag (noscript). Ignored.",
+        "Line: 1 Col: 37 Unexpected end tag (head). Ignored."
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
-            "math math": true,
-            "math tfoot": true,
-            "math mo": true
-          }
+            "html": true,
+            "head": true,
+            "noscript": true,
+            "body": true
+          },
+          "comment": true
         },
         "tree": [
           {
-            "tag": "math",
-            "ns": "http://www.w3.org/1998/Math/MathML",
+            "tag": "html",
             "children": [
               {
-                "tag": "tfoot",
-                "ns": "http://www.w3.org/1998/Math/MathML",
+                "tag": "head",
                 "children": [
                   {
-                    "tag": "mo",
-                    "ns": "http://www.w3.org/1998/Math/MathML"
+                    "tag": "noscript"
+                  }
+                ]
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "text": "XXX"
+                  },
+                  {
+                    "comment": "foo"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<math><tfoot><mo></mo></tfoot></math>",
-        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
+        "html": "<html><head><noscript></noscript></head><body>XXX<!--foo--></body></html>",
+        "noQuirksBodyHtml": "<noscript>XXX<!--foo--></noscript>"
       }
-    }
-  ],
-  "namespace-sensitivity.dat": [
+    },
     {
-      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
-      "errors": [],
+      "data": "<head><noscript>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-tag",
+        "(1,6): eof-in-head-noscript"
+      ],
+      "script": "off",
       "document": {
         "props": {
           "tags": {
             "html": true,
             "head": true,
-            "body": true,
-            "table": true,
-            "tbody": true,
-            "tr": true,
-            "td": true,
-            "svg svg": true,
-            "svg td": true,
-            "svg foreignObject": true,
-            "span": true
+            "noscript": true,
+            "body": true
           }
         },
         "tree": [
             "tag": "html",
             "children": [
               {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
+                "tag": "head",
                 "children": [
                   {
-                    "text": "Foo"
-                  },
-                  {
-                    "tag": "table",
-                    "children": [
-                      {
-                        "tag": "tbody",
-                        "children": [
-                          {
-                            "tag": "tr",
-                            "children": [
-                              {
-                                "tag": "td",
-                                "children": [
-                                  {
-                                    "tag": "svg",
-                                    "ns": "http://www.w3.org/2000/svg",
-                                    "children": [
-                                      {
-                                        "tag": "td",
-                                        "ns": "http://www.w3.org/2000/svg",
-                                        "children": [
-                                          {
-                                            "tag": "foreignObject",
-                                            "ns": "http://www.w3.org/2000/svg",
-                                            "children": [
-                                              {
-                                                "tag": "span"
-                                              }
-                                            ]
-                                          }
-                                        ]
-                                      }
-                                    ]
-                                  }
-                                ]
-                              }
-                            ]
-                          }
-                        ]
-                      }
-                    ]
+                    "tag": "noscript"
                   }
                 ]
+              },
+              {
+                "tag": "body"
               }
             ]
           }
         ],
-        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
-        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
+        "html": "<html><head><noscript></noscript></head><body></body></html>",
+        "noQuirksBodyHtml": "<noscript></noscript>"
       }
     }
   ],
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
     {
       "data": "<html><ruby>a<rb>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
     {
       "data": "<html><ruby>a<rt>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
     {
       "data": "<html><ruby>a<rp>b<span></ruby></html>",
       "errors": [
-        "(1,6): expected-doctype-but-got-start-tag"
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,31): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "(1,11): unexpected-start-tag-in-select",
         "(1,27): unexpected-select-in-select",
         "(1,39): unexpected-end-tag",
-        "(1,48): unexpected-end-tag",
-        "(1,49): expected-closing-tag-but-got-eof"
+        "(1,48): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "(1,11): unexpected-start-tag-in-select",
         "(1,27): unexpected-select-in-select",
         "(1,39): unexpected-end-tag",
-        "(1,48): unexpected-end-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,48): unexpected-end-tag"
       ],
       "document": {
         "props": {
         "noQuirksBodyHtml": "<math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math>"
       }
     },
+    {
+      "data": "<!DOCTYPE html><body><svg contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' EXTERNALRESOURCESREQUIRED='' FILTERRES=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><svg contentscripttype='' contentstyletype='' externalresourcesrequired='' filterres=''></svg>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "svg svg": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "svg",
+                    "ns": "http://www.w3.org/2000/svg",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><svg contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></svg></body></html>",
+        "noQuirksBodyHtml": "<svg contentScriptType=\"\" contentStyleType=\"\" externalResourcesRequired=\"\" filterres=\"\"></svg>"
+      }
+    },
+    {
+      "data": "<!DOCTYPE html><body><math contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></math>",
+      "errors": [],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true
+          },
+          "doctype": true
+        },
+        "tree": [
+          {
+            "doctype": "html"
+          },
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "attrs": [
+                      {
+                        "name": "contentscripttype",
+                        "value": ""
+                      },
+                      {
+                        "name": "contentstyletype",
+                        "value": ""
+                      },
+                      {
+                        "name": "externalresourcesrequired",
+                        "value": ""
+                      },
+                      {
+                        "name": "filterres",
+                        "value": ""
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<!DOCTYPE html><html><head></head><body><math contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></math></body></html>",
+        "noQuirksBodyHtml": "<math contentscripttype=\"\" contentstyletype=\"\" externalresourcesrequired=\"\" filterres=\"\"></math>"
+      }
+    },
     {
       "data": "<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>",
       "errors": [],
     {
       "data": "<!doctype html><script><!",
       "errors": [
+        "(1,25): expected-script-data-but-got-eof",
         "(1,25): expected-named-closing-tag-but-got-eof"
       ],
       "document": {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript><iframe></noscript></head><body>X</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
           }
         ],
         "html": "<!DOCTYPE html><html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
       "data": "<script><!",
       "errors": [
         "(1,8): expected-doctype-but-got-start-tag",
+        "(1,10): expected-script-data-but-got-eof",
         "(1,10): expected-named-closing-tag-but-got-eof"
       ],
       "document": {
           }
         ],
         "html": "<html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--<noscript></noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>X<noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><iframe></noscript></head><body>X</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
+        "noQuirksBodyHtml": "<noscript><iframe></noscript>X</iframe></noscript>"
       }
     },
     {
         "noQuirksBodyHtml": "<p></p><h1></h1>"
       }
     },
-    {
-      "data": "<!doctype html><form><isindex>",
-      "errors": [
-        "(1,30): deprecated-tag",
-        "(1,30): expected-closing-tag-but-got-eof"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form></form></body></html>",
-        "noQuirksBodyHtml": "<form></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex action=\"POST\">",
-      "errors": [
-        "(1,38): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "attrs": [
-                      {
-                        "name": "action",
-                        "value": "POST"
-                      }
-                    ],
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex prompt=\"this is isindex\">",
-      "errors": [
-        "(1,49): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "this is isindex"
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form>"
-      }
-    },
     {
       "data": "<!doctype html><isindex type=\"hidden\">",
       "errors": [
-        "(1,38): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              },
-                              {
-                                "name": "type",
-                                "value": "hidden"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form>"
-      }
-    },
-    {
-      "data": "<!doctype html><isindex name=\"foo\">",
-      "errors": [
-        "(1,35): deprecated-tag"
+        "(1,38): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "html": true,
             "head": true,
             "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
+            "isindex": true
           },
           "doctype": true
         },
                 "tag": "body",
                 "children": [
                   {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              }
-                            ]
-                          }
-                        ]
-                      },
+                    "tag": "isindex",
+                    "attrs": [
                       {
-                        "tag": "hr"
+                        "name": "type",
+                        "value": "hidden"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
+        "html": "<!DOCTYPE html><html><head></head><body><isindex type=\"hidden\"></isindex></body></html>",
+        "noQuirksBodyHtml": "<isindex type=\"hidden\"></isindex>"
       }
     },
     {
     {
       "data": "<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>",
       "errors": [
-        "(1,68): unexpected-select-in-select",
-        "(1,76): expected-closing-tag-but-got-eof"
+        "(1,68): unexpected-select-in-select"
       ],
       "document": {
         "props": {
         "noQuirksBodyHtml": "<!-- XXX - XXX - XXX -->"
       }
     },
-    {
-      "data": "<isindex test=x name=x>",
-      "errors": [
-        "(1,23): expected-doctype-but-got-start-tag",
-        "(1,23): deprecated-tag"
-      ],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          }
-        },
-        "tree": [
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "form",
-                    "children": [
-                      {
-                        "tag": "hr"
-                      },
-                      {
-                        "tag": "label",
-                        "children": [
-                          {
-                            "text": "This is a searchable index. Enter search keywords: "
-                          },
-                          {
-                            "tag": "input",
-                            "attrs": [
-                              {
-                                "name": "name",
-                                "value": "isindex"
-                              },
-                              {
-                                "name": "test",
-                                "value": "x"
-                              }
-                            ]
-                          }
-                        ]
-                      },
-                      {
-                        "tag": "hr"
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form></body></html>",
-        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form>"
-      }
-    },
     {
       "data": "test\ntest",
       "errors": [
     {
       "data": "<option><option>",
       "errors": [
-        "(1,8): expected-doctype-but-got-start-tag",
-        "(1,16): expected-closing-tag-but-got-eof"
+        "(1,8): expected-doctype-but-got-start-tag"
       ],
       "document": {
         "props": {
                     "children": [
                       {
                         "tag": "annotation-xml",
-                        "ns": "http://www.w3.org/1998/Math/MathML"
+                        "ns": "http://www.w3.org/1998/Math/MathML"
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,58): unexpected-html-element-in-foreign-content",
+        "(1,58): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/svg+xml"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "tag": "div"
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "application/xhtml+xml"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,60): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "aPPlication/xhtmL+xMl"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,48): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true,
+            "div": true
+          }
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
+                        "attrs": [
+                          {
+                            "name": "encoding",
+                            "value": "text/html"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
+                          }
+                        ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
+      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,58): unexpected-html-element-in-foreign-content",
-        "(1,58): expected-closing-tag-but-got-eof"
+        "(1,48): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
                         "attrs": [
                           {
                             "name": "encoding",
-                            "value": "application/svg+xml"
+                            "value": "Text/htmL"
+                          }
+                        ],
+                        "children": [
+                          {
+                            "tag": "div"
                           }
                         ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
+      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,60): expected-closing-tag-but-got-eof"
+        "(1,50): unexpected-html-element-in-foreign-content",
+        "(1,50): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
                         "attrs": [
                           {
                             "name": "encoding",
-                            "value": "application/xhtml+xml"
-                          }
-                        ],
-                        "children": [
-                          {
-                            "tag": "div"
+                            "value": " text/html "
                           }
                         ]
                       }
                     ]
+                  },
+                  {
+                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
+      "data": "<math><annotation-xml> </annotation-xml>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,60): expected-closing-tag-but-got-eof"
+        "(1,40): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
-                          {
-                            "name": "encoding",
-                            "value": "aPPlication/xhtmL+xMl"
-                          }
-                        ],
                         "children": [
                           {
-                            "tag": "div"
+                            "text": " "
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml</annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
+      "data": "<math><annotation-xml>c</annotation-xml>",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,40): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
+                        "children": [
                           {
-                            "name": "encoding",
-                            "value": "text/html"
+                            "text": "c"
                           }
-                        ],
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        "html": "<html><head></head><body><math><annotation-xml>c</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml>c</annotation-xml></math>"
+      }
+    },
+    {
+      "data": "<math><annotation-xml><!--foo-->",
+      "errors": [
+        "(1,6): expected-doctype-but-got-start-tag",
+        "(1,32): expected-closing-tag-but-got-eof"
+      ],
+      "document": {
+        "props": {
+          "tags": {
+            "html": true,
+            "head": true,
+            "body": true,
+            "math math": true,
+            "math annotation-xml": true
+          },
+          "comment": true
+        },
+        "tree": [
+          {
+            "tag": "html",
+            "children": [
+              {
+                "tag": "head"
+              },
+              {
+                "tag": "body",
+                "children": [
+                  {
+                    "tag": "math",
+                    "ns": "http://www.w3.org/1998/Math/MathML",
+                    "children": [
+                      {
+                        "tag": "annotation-xml",
+                        "ns": "http://www.w3.org/1998/Math/MathML",
                         "children": [
                           {
-                            "tag": "div"
+                            "comment": "foo"
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml><!--foo--></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><!--foo--></annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
+      "data": "<math><annotation-xml></svg>x",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,48): expected-closing-tag-but-got-eof"
+        "(1,28): unexpected-end-tag",
+        "(1,29): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "head": true,
             "body": true,
             "math math": true,
-            "math annotation-xml": true,
-            "div": true
+            "math annotation-xml": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
-                          {
-                            "name": "encoding",
-                            "value": "Text/htmL"
-                          }
-                        ],
                         "children": [
                           {
-                            "tag": "div"
+                            "text": "x"
                           }
                         ]
                       }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml>x</annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml>x</annotation-xml></math>"
       }
     },
     {
-      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
+      "data": "<math><annotation-xml><svg>x",
       "errors": [
         "(1,6): expected-doctype-but-got-start-tag",
-        "(1,50): unexpected-html-element-in-foreign-content",
-        "(1,50): expected-closing-tag-but-got-eof"
+        "(1,28): expected-closing-tag-but-got-eof"
       ],
       "document": {
         "props": {
             "body": true,
             "math math": true,
             "math annotation-xml": true,
-            "div": true
+            "svg svg": true
           }
         },
         "tree": [
                       {
                         "tag": "annotation-xml",
                         "ns": "http://www.w3.org/1998/Math/MathML",
-                        "attrs": [
+                        "children": [
                           {
-                            "name": "encoding",
-                            "value": " text/html "
+                            "tag": "svg",
+                            "ns": "http://www.w3.org/2000/svg",
+                            "children": [
+                              {
+                                "text": "x"
+                              }
+                            ]
                           }
                         ]
                       }
                     ]
-                  },
-                  {
-                    "tag": "div"
                   }
                 ]
               }
             ]
           }
         ],
-        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
-        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
+        "html": "<html><head></head><body><math><annotation-xml><svg>x</svg></annotation-xml></math></body></html>",
+        "noQuirksBodyHtml": "<math><annotation-xml><svg>x</svg></annotation-xml></math>"
       }
     }
   ],
         "noQuirksBodyHtml": "<command>A</command>"
       }
     },
-    {
-      "data": "<!DOCTYPE html><body><menuitem>A",
-      "errors": [],
-      "document": {
-        "props": {
-          "tags": {
-            "html": true,
-            "head": true,
-            "body": true,
-            "menuitem": true
-          },
-          "doctype": true
-        },
-        "tree": [
-          {
-            "doctype": "html"
-          },
-          {
-            "tag": "html",
-            "children": [
-              {
-                "tag": "head"
-              },
-              {
-                "tag": "body",
-                "children": [
-                  {
-                    "tag": "menuitem"
-                  },
-                  {
-                    "text": "A"
-                  }
-                ]
-              }
-            ]
-          }
-        ],
-        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</body></html>",
-        "noQuirksBodyHtml": "<menuitem>A"
-      }
-    },
     {
       "data": "<!DOCTYPE html><body><embed>A",
       "errors": [],
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nfoo",
-                        "extraNL": true
+                        "text": "\nfoo"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nfoo</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nfoo</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nfoo</pre>"
       }
     },
     {
             "body": true,
             "pre": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "pre",
                     "children": [
                       {
-                        "text": "\nA",
-                        "extraNL": true
+                        "text": "\nA"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
-        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
+        "html": "<!DOCTYPE html><html><head></head><body><pre>\nA</pre></body></html>",
+        "noQuirksBodyHtml": "<pre>\nA</pre>"
       }
     },
     {
             "body": true,
             "textarea": true
           },
-          "doctype": true,
-          "extraNL": true
+          "doctype": true
         },
         "tree": [
           {
                     "tag": "textarea",
                     "children": [
                       {
-                        "text": "\nfoo",
-                        "extraNL": true
+                        "text": "\nfoo"
                       }
                     ]
                   }
             ]
           }
         ],
-        "html": "<!DOCTYPE html><html><head></head><body><textarea>\n\nfoo</textarea></body></html>",
-        "noQuirksBodyHtml": "<textarea>\n\nfoo</textarea>"
+        "html": "<!DOCTYPE html><html><head></head><body><textarea>\nfoo</textarea></body></html>",
+        "noQuirksBodyHtml": "<textarea>\nfoo</textarea>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript></head><body>--&gt;</body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>--></noscript>"
       }
     },
     {
           }
         ],
         "html": "<html><head><noscript><!--</noscript>--></noscript></head><body></body></html>",
-        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
+        "noQuirksBodyHtml": "<noscript><!--</noscript>--></noscript>"
       }
     }
   ],
         "(1,14): foster-parenting-character",
         "(1,20): foster-parenting-character",
         "(1,25): unexpected-end-tag",
+        "(1,25): unexpected-end-tag-in-special-element",
         "(1,26): foster-parenting-character"
       ],
       "document": {
     {
       "data": "</select><option>",
       "errors": [
-        "(1,9): XXX-undefined-error",
-        "(1,17): eof-in-select"
+        "(1,9): XXX-undefined-error"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<input><option>",
       "errors": [
-        "(1,7): unexpected-input-in-select",
-        "(1,15): eof-in-select"
+        "(1,7): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<keygen><option>",
       "errors": [
-        "(1,8): unexpected-input-in-select",
-        "(1,16): eof-in-select"
+        "(1,8): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
     {
       "data": "<textarea><option>",
       "errors": [
-        "(1,10): unexpected-input-in-select",
-        "(1,18): eof-in-select"
+        "(1,10): unexpected-input-in-select"
       ],
       "fragment": {
         "name": "select"
         "(1,25): unexpected-select-in-select",
         "(1,59): unexpected-select-in-select",
         "(1,93): unexpected-select-in-select",
-        "(1,127): unexpected-select-in-select",
-        "(1,127): expected-closing-tag-but-got-eof"
+        "(1,127): unexpected-select-in-select"
       ],
       "document": {
         "props": {
           }
         ],
         "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
-        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>"
       }
     },
     {
           }
         ],
         "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
-        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
+        "noQuirksBodyHtml": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>"
       }
     },
     {
         "noQuirksBodyHtml": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>"
       }
     },
-    {
-      "data": "<isindex action=\"x\">",
-      "errors": [],
-      "fragment": {
-        "name": "table"
-      },
-      "document": {
-        "props": {
-          "tags": {
-            "form": true,
-            "hr": true,
-            "label": true,
-            "input": true
-          }
-        },
-        "tree": [
-          {
-            "tag": "form",
-            "attrs": [
-              {
-                "name": "action",
-                "value": "x"
-              }
-            ],
-            "children": [
-              {
-                "tag": "hr"
-              },
-              {
-                "tag": "label",
-                "children": [
-                  {
-                    "text": "This is a searchable index. Enter search keywords: "
-                  },
-                  {
-                    "tag": "input",
-                    "attrs": [
-                      {
-                        "name": "name",
-                        "value": "isindex"
-                      }
-                    ]
-                  }
-                ]
-              },
-              {
-                "tag": "hr"
-              }
-            ]
-          }
-        ],
-        "html": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>",
-        "noQuirksBodyHtml": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
-      }
-    },
     {
       "data": "<option><XH<optgroup></optgroup>",
       "errors": [],
       }
     }
   ]
-}
+}
\ No newline at end of file
index 6d17a68..62081aa 100644 (file)
@@ -58,7 +58,7 @@ class UploadFromUrlTest extends ApiTestCase {
                        $this->doApiRequest( [
                                'action' => 'upload',
                        ] );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "The token parameter must be set", $e->getMessage() );
                }
@@ -70,7 +70,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'action' => 'upload',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "One of the parameters sessionkey, file, url is required",
                                $e->getMessage() );
@@ -84,7 +84,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'url' => 'http://www.example.com/test.png',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "The filename parameter must be set", $e->getMessage() );
                }
@@ -99,7 +99,7 @@ class UploadFromUrlTest extends ApiTestCase {
                                'filename' => 'UploadFromUrlTest.png',
                                'token' => $token,
                        ], $data );
-               } catch ( UsageException $e ) {
+               } catch ( ApiUsageException $e ) {
                        $exception = true;
                        $this->assertEquals( "Permission denied", $e->getMessage() );
                }
index 0819bf2..fe56d27 100644 (file)
@@ -345,18 +345,18 @@ class UserTest extends MediaWikiTestCase {
                $user = $this->getMutableTestUser()->getUser();
 
                $user->setOption( 'userjs-someoption', 'test' );
-               $user->setOption( 'cols', 200 );
+               $user->setOption( 'rclimit', 200 );
                $user->saveSettings();
 
                $user = User::newFromName( $user->getName() );
                $user->load( User::READ_LATEST );
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
-               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+               $this->assertEquals( 200, $user->getOption( 'rclimit' ) );
 
                $user = User::newFromName( $user->getName() );
                MediaWikiServices::getInstance()->getMainWANObjectCache()->clearProcessCache();
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
-               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+               $this->assertEquals( 200, $user->getOption( 'rclimit' ) );
        }
 
        /**
@@ -367,7 +367,7 @@ class UserTest extends MediaWikiTestCase {
        public function testAnonOptions() {
                global $wgDefaultUserOptions;
                $this->user->setOption( 'userjs-someoption', 'test' );
-               $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
+               $this->assertEquals( $wgDefaultUserOptions['rclimit'], $this->user->getOption( 'rclimit' ) );
                $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
        }
 
@@ -603,10 +603,10 @@ class UserTest extends MediaWikiTestCase {
                $user1tmp = $this->getTestUser()->getUser();
                $request1 = new FauxRequest();
                $request1->getSession()->setUser( $user1tmp );
-               $expiryFiveDays = time() + ( 5 * 24 * 60 * 60 );
+               $expiryFiveHours = wfTimestamp() + ( 5 * 60 * 60 );
                $block = new Block( [
                        'enableAutoblock' => true,
-                       'expiry' => wfTimestamp( TS_MW, $expiryFiveDays ),
+                       'expiry' => wfTimestamp( TS_MW, $expiryFiveHours ),
                ] );
                $block->setTarget( $user1tmp );
                $block->insert();
@@ -625,7 +625,7 @@ class UserTest extends MediaWikiTestCase {
                $cookies = $request1->response()->getCookies();
                $this->assertArrayHasKey( 'wmsitetitleBlockID', $cookies );
                $this->assertEquals( $block->getId(), $cookies['wmsitetitleBlockID']['value'] );
-               $this->assertEquals( $expiryFiveDays, $cookies['wmsitetitleBlockID']['expire'] );
+               $this->assertEquals( $expiryFiveHours, $cookies['wmsitetitleBlockID']['expire'] );
 
                // 2. Create a new request, set the cookies, and see if the (anon) user is blocked.
                $request2 = new FauxRequest();
@@ -696,14 +696,12 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * When a user is autoblocked and a cookie is set to track them, the expiry time of the cookie
-        * should match the block's expiry. If the block is infinite, the cookie expiry time should
-        * match $wgCookieExpiration. If the expiry time is changed, the cookie's should change with it.
+        * should match the block's expiry, to a maximum of 24 hours. If the expiry time is changed,
+        * the cookie's should change with it.
         */
        public function testAutoblockCookieInfiniteExpiry() {
-               $cookieExpiration = 20 * 24 * 60 * 60; // 20 days
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
-                       'wgCookieExpiration' => $cookieExpiration,
                        'wgCookiePrefix' => 'wm_infinite_block',
                ] );
                // 1. Log in a test user, and block them indefinitely.
@@ -724,12 +722,19 @@ class UserTest extends MediaWikiTestCase {
                $this->assertTrue( $block->isAutoblocking() );
                $this->assertGreaterThanOrEqual( 1, $user1->getBlockId() );
                $cookies = $request1->response()->getCookies();
-               // Calculate the expected cookie expiry date.
+               // Test the cookie's expiry to the nearest minute.
                $this->assertArrayHasKey( 'wm_infinite_blockBlockID', $cookies );
-               $this->assertEquals( time() + $cookieExpiration, $cookies['wm_infinite_blockBlockID']['expire'] );
+               $expOneDay = wfTimestamp() + ( 24 * 60 * 60 );
+               // Check for expiry dates in a 10-second window, to account for slow testing.
+               $this->assertEquals(
+                       $expOneDay,
+                       $cookies['wm_infinite_blockBlockID']['expire'],
+                       'Expiry date',
+                       5.0
+               );
 
-               // 3. Change the block's expiry (to 2 days), and the cookie's should be changed also.
-               $newExpiry = time() + 2 * 24 * 60 * 60;
+               // 3. Change the block's expiry (to 2 hours), and the cookie's should be changed also.
+               $newExpiry = wfTimestamp() + 2 * 60 * 60;
                $block->mExpiry = wfTimestamp( TS_MW, $newExpiry );
                $block->update();
                $user2tmp = $this->getTestUser()->getUser();
@@ -739,9 +744,40 @@ class UserTest extends MediaWikiTestCase {
                $user2->mBlock = $block;
                $user2->load();
                $cookies = $request2->response()->getCookies();
+               $this->assertEquals( wfTimestamp( TS_MW, $newExpiry ), $block->getExpiry() );
                $this->assertEquals( $newExpiry, $cookies['wm_infinite_blockBlockID']['expire'] );
 
                // Clean up.
                $block->delete();
        }
+
+       public function testSoftBlockRanges() {
+               global $wgUser;
+
+               $this->setMwGlobals( [
+                       'wgSoftBlockRanges' => [ '10.0.0.0/8' ],
+                       'wgUser' => null,
+               ] );
+
+               // IP isn't in $wgSoftBlockRanges
+               $request = new FauxRequest();
+               $request->setIP( '192.168.0.1' );
+               $wgUser = User::newFromSession( $request );
+               $this->assertNull( $wgUser->getBlock() );
+
+               // IP is in $wgSoftBlockRanges
+               $request = new FauxRequest();
+               $request->setIP( '10.20.30.40' );
+               $wgUser = User::newFromSession( $request );
+               $block = $wgUser->getBlock();
+               $this->assertInstanceOf( Block::class, $block );
+               $this->assertSame( 'wgSoftBlockRanges', $block->getSystemBlockType() );
+
+               // Make sure the block is really soft
+               $request->getSession()->setUser( $this->getTestUser()->getUser() );
+               $wgUser = User::newFromSession( $request );
+               $this->assertFalse( $wgUser->isAnon(), 'sanity check' );
+               $this->assertNull( $wgUser->getBlock() );
+       }
+
 }
index cb1b3d2..6506d58 100644 (file)
@@ -237,7 +237,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        protected function mockDb() {
                // @TODO: mock from Database
                // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
-               $databaseMysql = $this->getMockBuilder( 'DatabaseMysql' )
+               $databaseMysql = $this->getMockBuilder( 'DatabaseMysqli' )
                        ->disableOriginalConstructor()
                        ->getMock();
                $databaseMysql->expects( $this->any() )
index 771cda5..c1b774a 100644 (file)
@@ -5,7 +5,7 @@
  * @file
  */
 
-/** Tests for MediaWiki languages/classes/LanguageHe.php */
+/** Tests for MediaWiki Hebrew grammar transformation handling */
 class LanguageHeTest extends LanguageClassesTestCase {
        /**
         * The most common usage for the plural forms is two forms,
index cbf94d6..cb3d227 100644 (file)
@@ -24,7 +24,6 @@ use MediaWiki\MediaWikiServices;
  * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
  * finally call simulateShutdown on MaintenanceFixup instance before a test
  * ends.
- *
  */
 class MaintenanceFixup extends Maintenance {
 
index 2e35eca..5a28bfb 100644 (file)
@@ -75,11 +75,11 @@ class FetchTextTest extends MediaWikiTestCase {
 
        // We add 5 Revisions for this test. Their corresponding text id's
        // are stored in the following 5 variables.
-       private $textId1;
-       private $textId2;
-       private $textId3;
-       private $textId4;
-       private $textId5;
+       protected static $textId1;
+       protected static $textId2;
+       protected static $textId3;
+       protected static $textId4;
+       protected static $textId5;
 
        /**
         * @var Exception|null As the current MediaWikiTestCase::run is not
@@ -88,7 +88,7 @@ class FetchTextTest extends MediaWikiTestCase {
         * we catch the exception and store it until we are in setUp and may
         * finally rethrow the exception without crashing the test suite.
         */
-       private $exceptionFromAddDBData;
+       protected static $exceptionFromAddDBDataOnce;
 
        /**
         * @var FetchText The (mocked) FetchText that is to test
@@ -123,17 +123,13 @@ class FetchTextTest extends MediaWikiTestCase {
                throw new MWException( "Could not determine text id" );
        }
 
-       function addDBData() {
-               $this->tablesUsed[] = 'page';
-               $this->tablesUsed[] = 'revision';
-               $this->tablesUsed[] = 'text';
-
+       function addDBDataOnce() {
                $wikitextNamespace = $this->getDefaultWikitextNS();
 
                try {
                        $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId1 = $this->addRevision(
+                       self::$textId1 = $this->addRevision(
                                $page,
                                "FetchTextTestPage1Text1",
                                "FetchTextTestPage1Summary1"
@@ -141,30 +137,30 @@ class FetchTextTest extends MediaWikiTestCase {
 
                        $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId2 = $this->addRevision(
+                       self::$textId2 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text1",
                                "FetchTextTestPage2Summary1"
                        );
-                       $this->textId3 = $this->addRevision(
+                       self::$textId3 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text2",
                                "FetchTextTestPage2Summary2"
                        );
-                       $this->textId4 = $this->addRevision(
+                       self::$textId4 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text3",
                                "FetchTextTestPage2Summary3"
                        );
-                       $this->textId5 = $this->addRevision(
+                       self::$textId5 = $this->addRevision(
                                $page,
                                "FetchTextTestPage2Text4 some additional Text  ",
                                "FetchTextTestPage2Summary4 extra "
                        );
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
-                       // documentation of exceptionFromAddDBData
-                       $this->exceptionFromAddDBData = $e;
+                       // documentation of exceptionFromAddDBDataOnce
+                       self::$exceptionFromAddDBDataOnce = $e;
                }
        }
 
@@ -172,8 +168,8 @@ class FetchTextTest extends MediaWikiTestCase {
                parent::setUp();
 
                // Check if any Exception is stored for rethrowing from addDBData
-               if ( $this->exceptionFromAddDBData !== null ) {
-                       throw $this->exceptionFromAddDBData;
+               if ( self::$exceptionFromAddDBDataOnce !== null ) {
+                       throw self::$exceptionFromAddDBDataOnce;
                }
 
                $this->fetchText = new SemiMockedFetchText();
@@ -198,24 +194,29 @@ class FetchTextTest extends MediaWikiTestCase {
        // provider would not know the required ids.
 
        function testExistingSimple() {
-               $this->assertFilter( $this->textId2,
-                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+               $this->assertFilter( self::$textId2,
+                       self::$textId2 . "\n23\nFetchTextTestPage2Text1" );
        }
 
        function testExistingSimpleWithNewline() {
-               $this->assertFilter( $this->textId2 . "\n",
-                       $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
+               $this->assertFilter( self::$textId2 . "\n",
+                       self::$textId2 . "\n23\nFetchTextTestPage2Text1" );
        }
 
        function testExistingSeveral() {
-               $this->assertFilter( "$this->textId1\n$this->textId5\n"
-                               . "$this->textId3\n$this->textId3",
-                       implode( "", [
-                               $this->textId1 . "\n23\nFetchTextTestPage1Text1",
-                               $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
+               $this->assertFilter(
+                       join( "\n", [
+                               self::$textId1,
+                               self::$textId5,
+                               self::$textId3,
+                               self::$textId3,
+                       ] ),
+                       implode( '', [
+                               self::$textId1 . "\n23\nFetchTextTestPage1Text1",
+                               self::$textId5 . "\n44\nFetchTextTestPage2Text4 "
                                        . "some additional Text",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2",
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2"
                        ] ) );
        }
 
@@ -224,7 +225,7 @@ class FetchTextTest extends MediaWikiTestCase {
        }
 
        function testNonExisting() {
-               $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
+               $this->assertFilter( self::$textId5 + 10, ( self::$textId5 + 10 ) . "\n-1\n" );
        }
 
        function testNegativeInteger() {
@@ -233,13 +234,13 @@ class FetchTextTest extends MediaWikiTestCase {
 
        function testFloatingPointNumberExisting() {
                // float -> int -> revision
-               $this->assertFilter( $this->textId3 + 0.14159,
-                       $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
+               $this->assertFilter( self::$textId3 + 0.14159,
+                       self::$textId3 . "\n23\nFetchTextTestPage2Text2" );
        }
 
        function testFloatingPointNumberNonExisting() {
-               $this->assertFilter( $this->textId5 + 3.14159,
-                       ( $this->textId5 + 3 ) . "\n-1\n" );
+               $this->assertFilter( self::$textId5 + 3.14159,
+                       ( self::$textId5 + 3 ) . "\n-1\n" );
        }
 
        function testCharacters() {
@@ -247,15 +248,15 @@ class FetchTextTest extends MediaWikiTestCase {
        }
 
        function testMix() {
-               $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
-                               . "\n" . $this->textId3,
+               $this->assertFilter( "ab\n" . self::$textId4 . ".5cd\n\nefg\n" . self::$textId2
+                               . "\n" . self::$textId3,
                        implode( "", [
                                "0\n-1\n",
-                               $this->textId4 . "\n23\nFetchTextTestPage2Text3",
+                               self::$textId4 . "\n23\nFetchTextTestPage2Text3",
                                "0\n-1\n",
                                "0\n-1\n",
-                               $this->textId2 . "\n23\nFetchTextTestPage2Text1",
-                               $this->textId3 . "\n23\nFetchTextTestPage2Text2"
+                               self::$textId2 . "\n23\nFetchTextTestPage2Text1",
+                               self::$textId3 . "\n23\nFetchTextTestPage2Text2"
                        ] ) );
        }
 }
index 6ed4495..d712254 100644 (file)
@@ -34,7 +34,6 @@ class DummyContentHandlerForTesting extends ContentHandler {
 
        /**
         * Creates an empty Content object of the type supported by this ContentHandler.
-        *
         */
        public function makeEmptyContent() {
                return new DummyContentForTesting( '' );
index e11fd8a..b19376d 100644 (file)
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-use Composer\Spdx\SpdxLicenses;
-use JsonSchema\Validator;
-
 /**
  * Validates all loaded extensions and skins using the ExtensionRegistry
  * against the extension.json schema in the docs/ folder.
  */
 class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @var ExtensionJsonValidator
+        */
+       protected $validator;
+
        public function setUp() {
                parent::setUp();
-               if ( !class_exists( Validator::class ) ) {
-                       $this->markTestSkipped(
-                               'The JsonSchema library cannot be found,' .
-                               ' please install it through composer to run extension.json validation tests.'
-                       );
-               }
+
+               $this->validator = new ExtensionJsonValidator( [ $this, 'markTestSkipped' ] );
+               $this->validator->checkDependencies();
 
                if ( !ExtensionRegistry::getInstance()->getAllThings() ) {
                        $this->markTestSkipped(
@@ -55,56 +54,12 @@ class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
         * @param string $path Path to thing's json file
         */
        public function testPassesValidation( $path ) {
-               $data = json_decode( file_get_contents( $path ) );
-               $this->assertInstanceOf( 'stdClass', $data, "$path is not valid JSON" );
-
-               $this->assertObjectHasAttribute( 'manifest_version', $data,
-                       "$path does not have manifest_version set." );
-               $version = $data->manifest_version;
-               if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) {
-                       $schemaPath = __DIR__ . "/../../../docs/extension.schema.v$version.json";
-               } else {
-                       $schemaPath = __DIR__ . '/../../../docs/extension.schema.json';
-               }
-
-               // Not too old
-               $this->assertTrue(
-                       $version >= ExtensionRegistry::OLDEST_MANIFEST_VERSION,
-                       "$path is using a non-supported schema version"
-               );
-               // Not too new
-               $this->assertTrue(
-                       $version <= ExtensionRegistry::MANIFEST_VERSION,
-                       "$path is using a non-supported schema version"
-               );
-
-               $licenseError = false;
-               if ( class_exists( SpdxLicenses::class ) && isset( $data->{'license-name'} )
-                       // Check if it's a string, if not, schema validation will display an error
-                       && is_string( $data->{'license-name'} )
-               ) {
-                       $licenses = new SpdxLicenses();
-                       $valid = $licenses->validate( $data->{'license-name'} );
-                       if ( !$valid ) {
-                               $licenseError = '[license-name] Invalid SPDX license identifier, '
-                                       . 'see <https://spdx.org/licenses/>';
-                       }
-               }
-
-               $validator = new Validator;
-               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
-               if ( $validator->isValid() && !$licenseError ) {
-                       // All good.
+               try {
+                       $this->validator->validate( $path );
+                       // All good
                        $this->assertTrue( true );
-               } else {
-                       $out = "$path did pass validation.\n";
-                       foreach ( $validator->getErrors() as $error ) {
-                               $out .= "[{$error['property']}] {$error['message']}\n";
-                       }
-                       if ( $licenseError ) {
-                               $out .= "$licenseError\n";
-                       }
-                       $this->assertTrue( false, $out );
+               } catch ( ExtensionJsonValidationError $e ) {
+                       $this->assertEquals( false, $e->getMessage() );
                }
        }
 }
index 2e6bf37..2fba76b 100644 (file)
@@ -11,7 +11,6 @@
  * @copyright © 2012, Niklas Laxström
  * @copyright © 2012, Santhosh Thottingal
  * @copyright © 2012, Timo Tijhof
- *
  */
 class ResourcesTest extends MediaWikiTestCase {
 
index e48a116..7a33a22 100644 (file)
@@ -7,4 +7,3 @@ class CoreParserTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
 }
-
index e30088d..f31a646 100644 (file)
@@ -93,6 +93,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
+                       'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
@@ -136,6 +137,7 @@ return [
                        'mediawiki.util',
                        'mediawiki.viewport',
                        'mediawiki.special.recentchanges',
+                       'mediawiki.rcfilters.filters',
                        'mediawiki.language',
                        'mediawiki.cldr',
                        'mediawiki.cookie',
index 532a6ce..0fb7d9a 100644 (file)
                        [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
                        [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
                        [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
+                       [ 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136', 'Win64', 'alt-' ],
                        // Firefox
                        [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
                        [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
                        [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
+                       [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0', 'MacIntel', 'ctrl-option-' ],
+                       [ 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1', 'Linux 1686', 'alt-shift-' ],
+                       [ 'Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0', 'Win32', 'alt-' ],
                        // Safari / Konqueror
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-' ],
+                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-option-' ],
+                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3', 'MacIntel', 'ctrl-' ],
+                       [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29', 'Win32', 'alt-' ],
                        [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
                        [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
                        // Opera
                        [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
                        // Chrome
                        [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
-                       [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ]
+                       [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ],
+                       // Unknown! Note: These aren't necessarily *right*, this is just
+                       // testing that we're getting the expected output based on the
+                       // platform.
+                       [ 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021111 Chimera/0.6', 'MacPPC', 'ctrl-' ],
+                       [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5', 'Linux i686', 'alt-' ]
                ],
                // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
                updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
index 11ceeea..5203def 100644 (file)
@@ -88,7 +88,7 @@
                [ '1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
                [ '238.27.1', false, 238027001, 'A malformed IP Address' ],
                [ '1', false, 1, 'A super malformed IP Address' ],
-               [ 'Just text', false, 0, 'A line with just text' ],
+               [ 'Just text', false, -Infinity, 'A line with just text' ],
                [ '45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
                [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
        ];
                [ '2000',               false, 0, 'Plain 4-digit year' ],
                [ '2000-01',            false, 0, 'Year with month' ],
                [ '2000-01-01', true, 946684800000, 'Year with month and day' ],
-               [ '2000-13-01', true, 0, 'Non existant month' ],
-               [ '2000-01-32', true, 0, 'Non existant day' ],
+               [ '2000-13-01', true, -Infinity, 'Non existant month' ],
+               [ '2000-01-32', true, -Infinity, 'Non existant day' ],
                [ '2000-01-01T12:30:30',                true, 946729830000, 'Date with a time' ],
                [ '2000-01-01T12:30:30Z',       true, 946729830000, 'Date with a UTC+0 time' ],
-               [ '2000-01-01T24:30:30Z',       true, 0, 'Date with invalid hours' ],
-               [ '2000-01-01T12:60:30Z',       true, 0, 'Date with invalid minutes' ],
+               [ '2000-01-01T24:30:30Z',       true, -Infinity, 'Date with invalid hours' ],
+               [ '2000-01-01T12:60:30Z',       true, -Infinity, 'Date with invalid minutes' ],
                [ '2000-01-01T12:30:61Z',       true, 946729800000, 'Date with invalid amount of seconds, drops seconds' ],
                [ '2000-01-01T23:59:59Z',       true, 946771199000, 'Edges of time' ],
                [ '2000-01-01T12:30:30.111Z',   true, 946729830111, 'Date with milliseconds' ],
                [ '2000-01-01T12:30:30.11111Z', true, 946729830111, 'Date with too high precision' ],
-               [ '2000-01-01T12:30:30,111Z',   true, 0, 'Date with milliseconds and , separator' ],
+               [ '2000-01-01T12:30:30,111Z',   true, -Infinity, 'Date with milliseconds and , separator' ],
                [ '2000-01-01T12:30:30+01:00',  true, 946726230000, 'Date time in UTC+1' ],
                [ '2000-01-01T12:30:30+01:30',  true, 946724430000, 'Date time in UTC+1:30' ],
                [ '2000-01-01T12:30:30-01:00',  true, 946733430000, 'Date time in UTC-1' ],
                [ '2000-01-01T12:30:30-01:30',  true, 946735230000, 'Date time in UTC-1:30' ],
-               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ],
+               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1' ],
                [ '2000-01-01Postfix', true, 946684800000, 'Date with appended postfix' ],
                [ '2000-01-01 Postfix', true, 946684800000, 'Date with separate postfix' ]
                /* Disable testcases, because behavior is browser dependant */
index ca26aaf..483a37d 100644 (file)
 
                assert.equal(
                        parsers[ 1 ].format( $table.find( 'tbody > tr > td:eq(1)' ).text() ),
-                       0,
-                       'empty cell is sorted as number 0'
+                       -Infinity,
+                       'empty cell is sorted as number -Infinity'
                );
        } );
 
index 3a959a3..6a00ac9 100644 (file)
@@ -44,7 +44,7 @@
                } );
        } );
 
-       QUnit.test( 'API error', function ( assert ) {
+       QUnit.test( 'API error errorformat=bc', function ( assert ) {
                var api = new mw.Api();
 
                this.server.respond( [ 200, { 'Content-Type': 'application/json' },
                        .always( assert.async() );
        } );
 
+       QUnit.test( 'API error errorformat!=bc', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' },
+                       '{ "errors": [ { "code": "unknown_action", "key": "unknown-error", "params": [] } ] }'
+               ] );
+
+               api.get( { action: 'doesntexist' } )
+                       .fail( function ( errorCode ) {
+                               assert.equal( errorCode, 'unknown_action', 'API error should reject the deferred' );
+                       } )
+                       .always( assert.async() );
+       } );
+
        QUnit.test( 'FormData support', function ( assert ) {
                var api = new mw.Api();
 
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
new file mode 100644 (file)
index 0000000..62d247a
--- /dev/null
@@ -0,0 +1,1015 @@
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.rcfilters - FiltersViewModel' );
+
+       QUnit.test( 'Setting up filters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group1filter1',
+                                                       label: 'Group 1: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'group1filter2',
+                                                       label: 'Group 1: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group2filter1',
+                                                       label: 'Group 2: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'group2filter2',
+                                                       label: 'Group 2: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       filters: [
+                                               {
+                                                       name: 'group3filter1',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'group3filter2',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.ok(
+                       model.getItemByName( 'group1filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group1filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3filter2' ) instanceof mw.rcfilters.dm.FilterItem,
+                       'Filters instantiated and stored correctly'
+               );
+
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       {
+                               group1filter1: false,
+                               group1filter2: false,
+                               group2filter1: false,
+                               group2filter2: false,
+                               group3filter1: false,
+                               group3filter2: false
+                       },
+                       'Initial state of filters'
+               );
+
+               model.updateFilters( {
+                       group1filter1: true,
+                       group2filter2: true,
+                       group3filter1: true
+               } );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       {
+                               group1filter1: true,
+                               group1filter2: false,
+                               group2filter1: false,
+                               group2filter2: true,
+                               group3filter1: true,
+                               group3filter2: false
+                       },
+                       'Updating filter states correctly'
+               );
+       } );
+
+       QUnit.test( 'Finding matching filters', function ( assert ) {
+               var matches,
+                       definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group1filter1',
+                                                       label: 'Group 1: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'group1filter2',
+                                                       label: 'Group 1: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'group2filter1',
+                                                       label: 'Group 2: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'group2filter2',
+                                                       label: 'Group 2: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               matches = model.findMatches( 'group 1' );
+               assert.equal(
+                       matches.group1.length,
+                       2,
+                       'findMatches finds correct group with correct number of results'
+               );
+
+               assert.deepEqual(
+                       matches.group1.map( function ( item ) { return item.getName(); } ),
+                       [ 'group1filter1', 'group1filter2' ],
+                       'findMatches finds the correct items within a single group'
+               );
+
+               matches = model.findMatches( 'filter 1' );
+               assert.ok(
+                       matches.group1.length === 1 && matches.group2.length === 1,
+                       'findMatches finds correct number of results in multiple groups'
+               );
+
+               assert.deepEqual(
+                       [
+                               matches.group1.map( function ( item ) { return item.getName(); } ),
+                               matches.group2.map( function ( item ) { return item.getName(); } )
+                       ],
+                       [
+                               [ 'group1filter1' ],
+                               [ 'group2filter1' ]
+                       ],
+                       'findMatches finds the correct items within multiple groups'
+               );
+
+               matches = model.findMatches( 'foo' );
+               assert.ok(
+                       $.isEmptyObject( matches ),
+                       'findMatches returns an empty object when no results found'
+               );
+       } );
+
+       QUnit.test( 'getParametersFromFilters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter1',
+                                                       label: 'Group 1: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter2',
+                                                       label: 'Group 1: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter3',
+                                                       label: 'Group 1: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 1'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter4',
+                                                       label: 'Group 2: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter5',
+                                                       label: 'Group 2: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter6',
+                                                       label: 'Group 2: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       separator: ',',
+                                       filters: [
+                                               {
+                                                       name: 'filter7',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter8',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter9',
+                                                       label: 'Group 3: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               // Starting with all filters unselected
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all',
+                       },
+                       'Unselected filters return all parameters falsey or \'all\'.'
+               );
+
+               // Select 1 filter
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: false,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // Only one filter in one group
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (one selected, the others are true)
+                               hidefilter1: 0,
+                               hidefilter2: 1,
+                               hidefilter3: 1,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+               );
+
+               // Select 2 filters
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: true,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // Two selected filters in one group
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (two selected, the others are true)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 1,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+               );
+
+               // Select 3 filters
+               model.updateFilters( {
+                       hidefilter1: true,
+                       hidefilter2: true,
+                       hidefilter3: true,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all false)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'All filters selected in one "send_unselected_if_any" group returns all parameters falsy.'
+               );
+
+               // Select 1 filter from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: false,
+                       filter9: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'filter7'
+                       },
+                       'One filter selected in "string_option" group returns that filter in the value.'
+               );
+
+               // Select 2 filters from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: true,
+                       filter9: false
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'filter7,filter8'
+                       },
+                       'Two filters selected in "string_option" group returns those filters in the value.'
+               );
+
+               // Select 3 filters from string_options
+               model.updateFilters( {
+                       filter7: true,
+                       filter8: true,
+                       filter9: true
+               } );
+               // All filters of the group are selected == this is the same as not selecting any
+               assert.deepEqual(
+                       model.getParametersFromFilters(),
+                       {
+                               // Group 1 (all selected, all)
+                               hidefilter1: 0,
+                               hidefilter2: 0,
+                               hidefilter3: 0,
+                               // Group 2 (nothing is selected, all false)
+                               hidefilter4: 0,
+                               hidefilter5: 0,
+                               hidefilter6: 0,
+                               group3: 'all'
+                       },
+                       'All filters selected in "string_option" group returns \'all\'.'
+               );
+
+       } );
+
+       QUnit.test( 'getFiltersFromParameters', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter1',
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter2',
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter3',
+                                                       label: 'Show filter 3',
+                                                       description: 'Description of Filter 3 in Group 1',
+                                                       default: true
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter4',
+                                                       label: 'Show filter 4',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter5',
+                                                       label: 'Show filter 5',
+                                                       description: 'Description of Filter 2 in Group 2',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter6',
+                                                       label: 'Show filter 6',
+                                                       description: 'Description of Filter 3 in Group 2'
+                                               }
+                                       ]
+                               },
+                               group3: {
+                                       title: 'Group 3',
+                                       type: 'string_options',
+                                       separator: ',',
+                                       filters: [
+                                               {
+                                                       name: 'filter7',
+                                                       label: 'Group 3: Filter 1',
+                                                       description: 'Description of Filter 1 in Group 3'
+                                               },
+                                               {
+                                                       name: 'filter8',
+                                                       label: 'Group 3: Filter 2',
+                                                       description: 'Description of Filter 2 in Group 3',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'filter9',
+                                                       label: 'Group 3: Filter 3',
+                                                       description: 'Description of Filter 3 in Group 3'
+                                               }
+                                       ]
+                               }
+                       },
+                       defaultFilterRepresentation = {
+                               // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
+                               hidefilter1: false,
+                               hidefilter2: true,
+                               hidefilter3: false,
+                               hidefilter4: true,
+                               hidefilter5: false,
+                               hidefilter6: true,
+                               // Group 3, "string_options", default values correspond to parameters and filters
+                               filter7: false,
+                               filter8: true,
+                               filter9: false
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               // Empty query = only default values
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {} ),
+                       defaultFilterRepresentation,
+                       'Empty parameter query results in filters in initial default state'
+               );
+
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {
+                               hidefilter2: '1'
+                       } ),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter1: false, // The text is "show filter 1"
+                               hidefilter2: false, // The text is "show filter 2"
+                               hidefilter3: false // The text is "show filter 3"
+                       } ),
+                       'One truthy parameter in a group whose other parameters are true by default makes the rest of the filters in the group false (unchecked)'
+               );
+
+               assert.deepEqual(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1',
+                               hidefilter2: '1',
+                               hidefilter3: '1'
+                       } ),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter1: false, // The text is "show filter 1"
+                               hidefilter2: false, // The text is "show filter 2"
+                               hidefilter3: false // The text is "show filter 3"
+                       } ),
+                       'All paremeters in the same \'send_unselected_if_any\' group false is equivalent to none are truthy (checked) in the interface'
+               );
+
+               // The ones above don't update the model, so we have a clean state.
+               // getFiltersFromParameters is stateless; any change is unaffected by the current state
+               // This test is demonstrating wrong usage of the method;
+               // We should be aware that getFiltersFromParameters is stateless,
+               // so each call gives us a filter state that only reflects the query given.
+               // This means that the two calls to updateFilters() below collide.
+               // The result of the first is overridden by the result of the second,
+               // since both get a full state object from getFiltersFromParameters that **only** relates
+               // to the input it receives.
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1'
+                       } )
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter6: '1'
+                       } )
+               );
+
+               // The result here is ignoring the first updateFilters call
+               // We should receive default values + hidefilter6 as false
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               hidefilter5: false,
+                               hidefilter6: false
+                       } ),
+                       'getFiltersFromParameters does not care about previous or existing state.'
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '0'
+                       } )
+               );
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               hidefilter1: '1'
+                       } )
+               );
+
+               // Simulates minor edits being hidden in preferences, then unhidden via URL
+               // override.
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       defaultFilterRepresentation,
+                       'After checking and then unchecking a \'send_unselected_if_any\' filter (without touching other filters in that group), results are default'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing 1 value, results in the corresponding filter as checked'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,filter8'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: true,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing 2 values, results in both corresponding filters as checked'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,filter8,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: false,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,all,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: false,
+                               filter8: false,
+                               filter9: false
+                       } ),
+                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
+               );
+
+               model.updateFilters(
+                       model.getFiltersFromParameters( {
+                               group3: 'filter7,foo,filter9'
+                       } )
+               );
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       $.extend( {}, defaultFilterRepresentation, {
+                               filter7: true,
+                               filter8: false,
+                               filter9: true
+                       } ),
+                       'A \'string_options\' parameter containing an invalid value, results in the invalid value ignored and the valid corresponding filters checked.'
+               );
+       } );
+
+       QUnit.test( 'sanitizeStringOptionGroup', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'string_options',
+                                       filters: [
+                                               {
+                                                       name: 'filter1',
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter2',
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter3',
+                                                       label: 'Show filter 3',
+                                                       description: 'Description of Filter 3 in Group 1'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'filter1', 'filter2' ] ),
+                       [ 'filter1', 'filter2' ],
+                       'Remove duplicate values'
+               );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'foo', 'filter2' ] ),
+                       [ 'filter1', 'filter2' ],
+                       'Remove invalid values'
+               );
+
+               assert.deepEqual(
+                       model.sanitizeStringOptionGroup( 'group1', [ 'filter1', 'all', 'filter2' ] ),
+                       [ 'all' ],
+                       'If any value is "all", the only value is "all".'
+               );
+       } );
+
+       QUnit.test( 'setFiltersToDefaults', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       exclusionType: 'default',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter1',
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter2',
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'hidefilter3',
+                                                       label: 'Show filter 3',
+                                                       description: 'Description of Filter 3 in Group 1',
+                                                       default: true
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'hidefilter4',
+                                                       label: 'Show filter 4',
+                                                       description: 'Description of Filter 1 in Group 2'
+                                               },
+                                               {
+                                                       name: 'hidefilter5',
+                                                       label: 'Show filter 5',
+                                                       description: 'Description of Filter 2 in Group 2',
+                                                       default: true
+                                               },
+                                               {
+                                                       name: 'hidefilter6',
+                                                       label: 'Show filter 6',
+                                                       description: 'Description of Filter 3 in Group 2'
+                                               }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               // Group 1
+                               hidefilter1: { selected: true, active: true },
+                               hidefilter2: { selected: false, active: true },
+                               hidefilter3: { selected: true, active: true },
+                               // Group 2
+                               hidefilter4: { selected: false, active: true },
+                               hidefilter5: { selected: true, active: true },
+                               hidefilter6: { selected: false, active: true },
+                       },
+                       'Initial state: all filters are active, and select states are default.'
+               );
+
+               // Default behavior for 'exclusion' type with only 1 item selected, means that:
+               // - The items in the same group that are *not* selected are *not* active
+               // - Items in other groups are unaffected (all active)
+               model.updateFilters( {
+                       hidefilter1: false,
+                       hidefilter2: false,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: false,
+                       hidefilter6: true
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               // Group 1: not affected
+                               hidefilter1: { selected: false, active: true },
+                               hidefilter2: { selected: false, active: true },
+                               hidefilter3: { selected: false, active: true },
+                               // Group 2: affected
+                               hidefilter4: { selected: false, active: false },
+                               hidefilter5: { selected: false, active: false },
+                               hidefilter6: { selected: true, active: true },
+                       },
+                       'Default exclusion behavior with 1 item selected in the group.'
+               );
+
+               // Default behavior for 'exclusion' type with multiple items selected, but not all, means that:
+               // - The items in the same group that are *not* selected are *not* active
+               // - Items in other groups are unaffected (all active)
+               model.updateFilters( {
+                       // Literally updating filters to create a clean state
+                       hidefilter1: false,
+                       hidefilter2: false,
+                       hidefilter3: false,
+                       hidefilter4: false,
+                       hidefilter5: true,
+                       hidefilter6: true
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               // Group 1: not affected
+                               hidefilter1: { selected: false, active: true },
+                               hidefilter2: { selected: false, active: true },
+                               hidefilter3: { selected: false, active: true },
+                               // Group 2: affected
+                               hidefilter4: { selected: false, active: false },
+                               hidefilter5: { selected: true, active: true },
+                               hidefilter6: { selected: true, active: true },
+                       },
+                       'Default exclusion behavior with multiple items (but not all) selected in the group.'
+               );
+
+               // Default behavior for 'exclusion' type with all items in the group selected, means that:
+               // - All items in the group are NOT active
+               // - Items in other groups are unaffected (all active)
+               model.updateFilters( {
+                       // Literally updating filters to create a clean state
+                       hidefilter1: false,
+                       hidefilter2: false,
+                       hidefilter3: false,
+                       hidefilter4: true,
+                       hidefilter5: true,
+                       hidefilter6: true
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               // Group 1: not affected
+                               hidefilter1: { selected: false, active: true },
+                               hidefilter2: { selected: false, active: true },
+                               hidefilter3: { selected: false, active: true },
+                               // Group 2: affected
+                               hidefilter4: { selected: true, active: false },
+                               hidefilter5: { selected: true, active: false },
+                               hidefilter6: { selected: true, active: false },
+                       },
+                       'Default exclusion behavior with all items in the group.'
+               );
+       } );
+
+       QUnit.test( 'reapplyActiveFilters - "explicit" exclusion rules', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'send_unselected_if_any',
+                                       exclusionType: 'explicit',
+                                       filters: [
+                                               {
+                                                       name: 'filter1',
+                                                       excludes: [ 'filter2', 'filter3' ],
+                                                       label: 'Show filter 1',
+                                                       description: 'Description of Filter 1 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter2',
+                                                       excludes: [ 'filter3' ],
+                                                       label: 'Show filter 2',
+                                                       description: 'Description of Filter 2 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter3',
+                                                       label: 'Show filter 3',
+                                                       excludes: [ 'filter1' ],
+                                                       description: 'Description of Filter 3 in Group 1'
+                                               },
+                                               {
+                                                       name: 'filter4',
+                                                       label: 'Show filter 4',
+                                                       description: 'Description of Filter 4 in Group 1'
+                                               }
+                                       ]
+                               }
+                       },
+                       defaultFilterRepresentation = {
+                               // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
+                               hidefilter1: false,
+                               hidefilter2: true,
+                               hidefilter3: false,
+                               hidefilter4: true,
+                               hidefilter5: false,
+                               hidefilter6: true,
+                               // Group 3, "string_options", default values correspond to parameters and filters
+                               filter7: false,
+                               filter8: true,
+                               filter9: false
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: false, active: true },
+                               filter2: { selected: false, active: true },
+                               filter3: { selected: false, active: true },
+                               filter4: { selected: false, active: true }
+                       },
+                       'Initial state: all filters are active.'
+               );
+
+               // "Explicit" behavior for 'exclusion' with one item checked:
+               // - Items in the 'excluded' list of the selected filter are inactive
+               model.updateFilters( {
+                       // Literally updating filters to create a clean state
+                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
+                       filter2: false, // Excludes 'hidefilter3'
+                       filter3: false, // Excludes 'hidefilter1'
+                       filter4: false // No exclusion list
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: true, active: true },
+                               filter2: { selected: false, active: false },
+                               filter3: { selected: false, active: false },
+                               filter4: { selected: false, active: true }
+                       },
+                       '"Explicit" exclusion behavior with one item selected that has an exclusion list.'
+               );
+
+               // "Explicit" behavior for 'exclusion' with two item checked:
+               // - Items in the 'excluded' list of each of the selected filter are inactive
+               model.updateFilters( {
+                       // Literally updating filters to create a clean state
+                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
+                       filter2: false, // Excludes 'hidefilter3'
+                       filter3: true, // Excludes 'hidefilter1'
+                       filter4: false // No exclusion list
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: true, active: false },
+                               filter2: { selected: false, active: false },
+                               filter3: { selected: true, active: false },
+                               filter4: { selected: false, active: true }
+                       },
+                       '"Explicit" exclusion behavior with two selected items that both have an exclusion list.'
+               );
+
+               // "Explicit behavior" with two filters that exclude the same item
+
+               // Two filters selected, both exclude 'hidefilter3'
+               model.updateFilters( {
+                       // Literally updating filters to create a clean state
+                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
+                       filter2: true, // Excludes 'hidefilter3'
+                       filter3: false, // Excludes 'hidefilter1'
+                       filter4: false // No exclusion list
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: true, active: true },
+                               filter2: { selected: true, active: false }, // Excluded by filter1
+                               filter3: { selected: false, active: false }, // Excluded by both filter1 and filter2
+                               filter4: { selected: false, active: true }
+                       },
+                       '"Explicit" exclusion behavior with two selected items that both exclude another item.'
+               );
+
+               // Unselect filter2: filter3 should still be excluded, because filter1 excludes it and is selected
+               model.updateFilters( {
+                       filter2: false, // Excludes 'hidefilter3'
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: true, active: true },
+                               filter2: { selected: false, active: false }, // Excluded by filter1
+                               filter3: { selected: false, active: false }, // Still excluded by filter1
+                               filter4: { selected: false, active: true }
+                       },
+                       '"Explicit" exclusion behavior unselecting one item that excludes another item, that is being excluded by a third active item.'
+               );
+
+               // Unselect filter1: filter3 should now be active, since both filters that exclude it are unselected
+               model.updateFilters( {
+                       filter1: false, // Excludes 'hidefilter3' and 'hidefilter2'
+               } );
+               assert.deepEqual(
+                       model.getFullState(),
+                       {
+                               filter1: { selected: false, active: true },
+                               filter2: { selected: false, active: true }, // No longer excluded by filter1
+                               filter3: { selected: false, active: true }, // No longer excluded by either filter1 nor filter2
+                               filter4: { selected: false, active: true }
+                       },
+                       '"Explicit" exclusion behavior unselecting both items that excluded the same third item.'
+               );
+
+       } );
+}( mediaWiki, jQuery ) );
index b2fac3c..2171f34 100644 (file)
@@ -3,11 +3,11 @@
 
        QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.liveLangData = mw.language.data.values;
-                       mw.language.data.values = $.extend( true, {}, this.liveLangData );
+                       this.liveLangData = mw.language.data;
+                       mw.language.data = {};
                },
                teardown: function () {
-                       mw.language.data.values = this.liveLangData;
+                       mw.language.data = this.liveLangData;
                },
                messages: {
                        // mw.language.listToText test
index 045b633..e6e798b 100644 (file)
                        // MeeGo
                        'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
                        // UC Mini (speed mode on)
-                       'Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/'
+                       'Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/',
+                       // Google Web Light proxy
+                       'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19'
                ]
        };
 
diff --git a/wiki.phtml b/wiki.phtml
deleted file mode 100644 (file)
index a197545..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// Stub file for compatibility with older versions of MediaWiki
-include_once './index.php';